Encerrado - Elaboração de plataforma para projeto de programação

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
desenvolvimento da bolsa
Estudos USB

Quarta-feira - 17/04/2013

-Tentativas de enviar sinal pra a porta através do código C da biblioteca "hidapi.h"

-Git - http://fabio-fernandes.com/blog/instalando-e-usando-o-git-no-ubuntu/

-Instalei o programa VB (cedido pela Cerne) no linux(Ubuntu 12.04), através do Wine, porém ele nao funcionou como ja tinha funcionado no Windows. (Estive pensando se o problema seria no linux ou no Wine, pois talvez o wine nao ofereça a comunicaçao necessária ao programa, ou até nao sei se a instalaçao no Wine é 100% equivalente a instalaçao diretamente no Windows)

-Leitura de documentos sobre o Pic 18F2550 (18f2550.h) OBS: Fiquei com dúvida se isso pode servir nesse projeto, pois muitos falam em gravação do microcontrolador. E nao sei se a gravaçao nos interessa.

http://www.vivaolinux.com.br/artigo/Gravacao-de-microcontroladores-PIC-via-USB-pelo-terminal-do-Linux

"Para que os programas em C possam ser gravados no microcontrolador via USB, é necessário compilá-los, ou seja, transformá-los em linguagem de máquina hexadecimal. 

Existem diversos compiladores que podem ser utilizados por esta ferramenta, entre eles o SDCC, o C18, o Hi-Tech e o CCS"

http://www.cerne-tec.com.br/artigousbparte2.pdf

http://burningsmell.org/pic18f2550/

http://www.eletrica.ufpr.br/ufpr2/tccs/150.pdf


Sexta-feira 19/04/2013

Leituras sobre USB Links interessantes: http://www.infowester.com/usb.php

http://www.infowester.com/usb30.php

http://computer.howstuffworks.com/usb1.htm



Segunda-feira 22/04/2013 e terça-feira

Leituras USB:

Capitulo 13 do livro "linux device drivers"

http://bbs.dianyuan.com/bbs/u/34/1129334558.pdf

http://www.beyondlogic.org/usbnutshell/usb1.shtml

http://www.freebsd.org/doc/en/books/arch-handbook/usb-dev.html

citações interessantes:

"Endpoints are the unidirectional access points for communicating with a device. They provide buffers to temporarily store incoming or outgoing data from the device."

Endpoint do tipo interrupt :"Interrupt endpoints transfer small amounts of data at a fixed rate every time the USB host asks the device for data. These endpoints are the primary transport method for USB keyboards and mice. They are also commonly used to send data to USB devices to control the device, but are not generally used to transfer large amounts of data. These transfers are guaranteed by the USB protocol to always have enough reserved bandwidth to make it through."

http://www.beyondlogic.org/usbnutshell/usb4.shtml#Interrupt

"A device interface is a collection of endpoints. For example USB speakers can have an interface for the audio data (Audio Class) and an interface for the knobs, dials and buttons (HID Class). All interfaces in a configuration are active at the same time and can be attached to by different drivers."

"USB interfaces are themselves bundled up into configurations [...]So to summarize, USB devices are quite complex and are made up of lots of different logical units. The relationships among these units can be simply described as follows: • Devices usually have one or more configurations. • Configurations often have one or more interfaces. • Interfaces usually have one or more settings. • Interfaces have zero or more endpoints."


prints do software, para windows, que analiza a comunicaçao USB

https://lh6.googleusercontent.com/epD232KXyedfyV2r_7LLZRQ70bn9gEWPXBxrKLuuMv2gZoexTtcoc_bstDvj-Jg-VA=w1600

https://lh4.googleusercontent.com/f1GPV21XYjF0ZOaL4gIda5OK2CZGP9H1ifx9bDMBSMv-Yrnbybi7YZmMalHCmVRW6Q=w1600

https://lh4.googleusercontent.com/eC1tw7vsLzk0OYylqKx1iYxqdE6O86c-IleXmCCqpbiwDn34FylNniG_Pw9K67wG7g=w1600

documentos com algumas informaçoes que estão auxiliando no estudo da comunicaçao entre host e o device USB:



https://docs.google.com/document/d/1-y3Ze_V60gTRnhb7FxVc1gmjkX2RaLGmtfopfyV2-d0/edit (ultima atualizaçao no dia 05/05/2013)

leitura complementar sobre URBs http://www.makelinux.net/ldd3/chp-13-sect-3


Domingo 5/5/2013 instalaçõ do GCC no windows

http://www.franciscosouza.com.br/2009/04/07/instalando-um-compilador-cc-no-windows/

Comunicão em C com a placa de aquisição de dados

Primeira comunicação feita com sucesso utilizando a linguagem C

Para rodar o programa leia otutorial

Tutorial de conexão e comunicação com a placa de aquisição de dados

O primeiro passo para conseguir se conectar à placa de aquisição de dados, utilizando a liguagem C é fazer todas a configurações necessárias para conseguir compilar o programa utilizando a biblioteca HID.

Links úteis:

Link principal para a biblioteca: http://www.signal11.us/oss/hidapi/
Read-me com explicações mais detalhadas sobre as configurações abaixo: https://docs.google.com/document/d/1LsqJdvBf6gg5KQLJULJwQus9NVtZsaCNOQudspGmFLs/edit

Página de downloads: https://github.com/signal11/hidapi/downloads

1 - Baixe o pacote com os arquivos necessários:

https://github.com/downloads/signal11/hidapi/hidapi-0.7.0.zip

2 - Instale o pacote Libusb 1.0

  1. sudo apt-get install libusb-1.0-0-dev

3 - Instale o pacote Libudev (cabeçalho e biblioteca)

  1. sudo apt-get install libudev-dev

4 - Descompacte o arquivo .zip hidapi-0.7.0.zip baixado no passo 1. Você pode fazer isso manualmente, ou no terminal: No meu caso o arquivo está na pasta Downloads:

  1. cd ~/Downloads

E então:

  1. unzip -a hidapi-0.7.0.zip

5 - entre em hidapi-0.7.0 hidapi-0.7.0/hidapi/ e copie ou mova o arquivo hidapi.h para a pasta linux: (manualmente, ou pelo terminal)

#cd hidapi-0.7.0/hidapi/

E então

  1. mv hidapi.h ../linux/



6 - após descompactar, entre na pasta hidapi-0.7.0/linux e faça o comando make

  1. cd hidapi-0.7.0/linux/
  1. make


7 - Crie um documento com o código C abaixo salve-o dentro do diretório linux:

Código

~/Downloads/hidapi-0.7.0/linux):

8 - Compile o programa: (certifique-se que você esta dentro do diretório “linux” (~/Downloads/hidapi-0.7.0/linux))

gcc prog.c hid-libusb.o `pkg-config libusb-1.0 libudev --libs` -o prog

9 - Rode o programa:

sudo ./prog


Configuração em versões anteriores a 12.04

- Ao entrar no diretório drivers (/sys/bus/usb/drivers) é possível ver todos os driver que estão sendo utilizados no momento no PC;

- para a plaquinha, o objetivo é usar o driver usbtouchscreen. Para ver se este driver existe na versão do ubuntu sendo utilizada:

modinfo usbtouchscreen

- Para ver todos os driver instalados no PC basta acessar /lib/modules/3.0.0-12-generic/kernel/drivers/ (OBS: pode ser que tenha que mudar a versão ali onde no meu ubuntu (11.10) mostra 3.0.0-12-generic, mas como só existe um diretório dentro do modules, fica fácil)

- Quando conectado, automaticamente o PC bota o driver USBHID, temos que tirar ele, com o unbind:

echo -n "1-4.4:1.0" > /sys/bus/usb/drivers/usbhid/unbind

OBS: achei o endereço "1-4.4:1.0" dentro do diretório usbhid com o comando ls (esse endereço talvez varie de PC para PC)

e para botar a plaquinha no usbtouchscreen temos que levantar o driver usbtouchscreen:

modprobe usbtouchscreen

e entao:

echo -n "1-4.4:1.0" > /sys/bus/usb/drivers/usbtouchscreen/bind

- Após fazer isso, verifique se funcionou, desconectando e conectando a plaquinha do PC e utilizando o comando dmesg; pode ser que não funcione de primeira, acredito que os drivers fiquem ``brigando``, então eu fiz a seguinte ordem de comandos:

​​rmmod usbhid modprobe usbtouchscreen echo -n "1-4.4:1.0" > /sys/bus/usb/drivers/usbhid/unbind modprobe usbhid echo -n "1-4.4:1.0" > /sys/bus/usb/drivers/usbtouchscreen/bind modprobe usbhid

ATENÇÃO: tive que fazer o comando rmmod USBHID para que a plaquinha nao tivesse nenhuma chance de conectar nesse driver, porem isso fez com que meu mouse USB parasse de funcionar, para ele voltar a funcionar tive que fazer modprobe USBHID no final, resolvendo meu problema. Mas isso é um problema nos computadores que usam mouse e teclado usb, pois quando o comando rmmode for dado, eles serão desconectados, a soluçao é escrever esses comandos, em lista, como fiz acima, e colá-los todos juntos no terminal, fazendo com que o terminal execute todos de uma vez, ou criar um arquivo .sh

Após essas configurações,desconectando e conectando a plaquinha e utilizando o comando dmesg,ja deve ser possível ver que ela esta utilizando "input..." e nao mais "generic-usb..."


link interessante:Adding new vendor and product IDs to an existing USB driver on Linux

  1. su
  1. modprobe usbtouchscreen echo 1234 0001 > /sys/bus/usb/drivers/usbtouchscreen/new_id


Pontos a serem verificados

  • Versão e drivers do linux que estão sendo usados;

modinfo usbtouchscreen > usbtouchscreen

usbtouchscreen

modinfo input >

input



  • Fazer um teste no Redes II e Inf para verificar se placa funciona (falar com Ricardo - ricardo.ifsc@gmail.com );



  • Documentar o driver da usb que está sendo usado (input) e verificar como trocar o driver dinamicamente para testar em outros PC;
  • Testar as entradas e saídas analógicas;

Saída: modificar a função enviar():


buf[0] = 'D';

buf[1] = '1';

buf[2] = '2';

buf[3] = '5';

buf[4] = '5';

res = hid_write(handle, &buf[0], 5);


Onde 1 é o numero da saída e 255 representa 5V 127 = 2,5V 0 = 0V e assim por diante.

  • Especificar a "biblioteca" a ser disponibilizada para os alunos;
  • estudar como construir uma biblioteca no Linux (lib ver [1]);
  • testes de desempenho
  • Biblioteca em C e Código .sh para conectar corretamente a plaquinha ao driver
Biblioteca em C para programção

Todos os arquivos utilizados neste tópico podem ser baixados aqui (LINK1):

Os passos para criar esta biblioteca estão melhores explicados neste link. Para esta biblioteca em particular, foram utilizados 3 arquivos.o (que podem ser baixados no LINK1), são eles:

prog.o (contém as funções da biblioteca feita para a disciplina de programação e também a biblioteca Hidapi;

hid-libusb.o (contém a biblioteca hid-libusb);

libusb.o (contém a biblioteca libusb);

Estes arquivos foram então colocados dentro do arquivo "bibprg.a"

Para utilizar a plaquinha então, é necessário ter o arquivo bibprg.a, e do arquivo bibprg.h que terá que ser utilizado como cabeçalho em todos os códigos que usem a biblioteca bibprg

Rodando programas em C

1: fazer o download da biblioteca: (upar no google docs


Passo 1a: Versões em que o driver sendo utilizado pelo pc é o usbhid: OBS: O driver pode ser visto com o comando usb-devices (procurando pelo device com nome: Cerne Tec) com o comando dmesg é possivel ver outro "erro", a saída correta para este comando deve ser "input: Cerne..." e nao "Generic-USB..."

Se o driver sendo utilizado é o usbhid (generic-usb), siga os passos abaixo: - Descompacte a pasta biblioteca; - Entre no diretório biblioteca; - Como root, execute o arquivo .sh (MELHORAR para nao precisar ser root)

ATENÇÃO: não adianta seguir em frente se o driver ainda nao foi reconhecido corretamente, confirme isso conectando
(ou tirando e reconectando a placa) e entao com o comando dmesg: veja se existe esta linha:
input: Cerne Tec...
se nao, repita o passo 1a.

Passo2:

2 - Instale o pacote Libusb 1.0

  1. sudo apt-get install libusb-1.0-0-dev

3 - Instale o pacote Libudev (cabeçalho e biblioteca)

  1. sudo apt-get install libudev-dev

4 - Existem 2 programas para testes, eles podem ser compilados:

gcc ptest.c libprg.a -lusb-1.0 -o teste

e

gcc analo.c libprg.a -lusb-1.0 -o analogic

OBS: Caso o seu sistema seja 64bits, utilize no lugar de libprg.a a bibprg.a


Botar o script shell pra rodar ja no boot; (Feito no meu PC pessoal, testarei no IFSC);

Mudar a permissão de acesso a plaquinha (feito com chmod); construir uma regra udev;

"Mais uma dica é que, normalmente, novos dispositivos são criados com permissão de escrita somente para o root, até que você as modifique manualmente, usando o comando "chmod". O udev permite ajustar as permissões, modificando o dono, grupo e permissões de acesso do dispositivo. Isso pode ser usado para que scanners e outros dispositivos fiquem automaticamente acessíveis para todos os usuários do sistema, evitando dores de cabeça em geral, ou fazer com que um pendrive ou outro dispositivo em particular fique disponível apenas para um determinado usuário, mas não para os demais."[2]

metas -semana

Termometro digital: http://www.arnerobotics.com.br/eletronica/termometro_digital_w_PIC_DS1620.htm


Estudo Blutooth no linux; socket e funções;

http://www-usr.inf.ufsm.br/~giovani/sockets/sockets.txt

http://www-usr.inf.ufsm.br/~giovani/sockets/sockets1.pdf

Criando biblioteca em C

utilizando as informaçoes deste site, criei a bilibioteca com as funções do projeto

tendo os arquivos ".o", hid-libusb.o, libusb.o, e prog.o criei a bilbioteca libprg.a:

ar rvs libprg.a hid-libusb.o, libusb.o, e prog.o

e utilizando o arquivo libprg.h ja foi possível rodar os programas, apenas lembrando de compilar o programa da seguinte forma

gcc programa.c libprg.a -lusb-1.0 -o programa

para que a biblioteca possa ser utilizada como uma padrao do sistem (-l...), basta copiar o arquivo "libprg.a" e entao compilar o programa utilizando "-lprg"

Sensor de temperatura LM35

O LM35 é um sensor de temperatura linear que fornece 10mV para cada grau celcius que ele medir. Ou seja, se ele fornecer 100mV, significa que ele está medindo 10ºC.[3]

EmbedVideo received the bad id "l9n-8wzex7I#!" for the service "youtube".

Por retornar um tensão e ser ligado em 5V, acredito que seja uma boa opção para trabalharmos com medidas de temperaturas.



Comunicação bluetooth (Appinventor e C)

Fonte: Uso do Bluetooth com App Inventor e programa C

How to play with Bluetooth under Linux

Comandos iniciais:

instalar ferramentas e bibliotecas

 sudo apt-get install bluez-utils
 sudo apt-get install libbluetooth3-dev

Configurar a porta serial (SP), neste exemplo o canal 3 :

sdptool add --channel=3 SP

Código C, funcionando, (com o canal 3, pode ser mudado, se necessário, na linha 33)

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
#include <errno.h>
#include <sys/types.h>
#include <netinet/in.h>
 
 
int main(int argc, char **argv)
{
    struct sockaddr_rc loc_addr = { 0 } , rem_addr = { 0 };
    char buf[1024] = { 0 };
    int s, client, bytes_read;
    socklen_t opt = sizeof(rem_addr);
 
    // allocate socket http://www.br-c.org/doku.php?id=socket
    if ((s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM))==-1){
		printf("Problemas na criação do socket\n");
		exit(-1);
    }
 
    // bind socket to port 1 of the first available 
    // local bluetooth adapter
    //http://www.br-c.org/doku.php?id=bind
    
    loc_addr.rc_family = AF_BLUETOOTH;
    loc_addr.rc_bdaddr = *BDADDR_ANY;
    //str2ba( endereco, &loc_addr.rc_bdaddr );
    loc_addr.rc_channel = (uint8_t) 3;
    if (bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr))==-1){
		printf("Problemas no bind\n");
		exit(-1);
    }
    
 
    //listen http://www.br-c.org/doku.php?id=listen
    printf("Preparando para listen..\n");
    // put socket into listening mode
    if (listen(s, 1)<0)
		printf("Problemas de listen...\n");
 
    //http://www.br-c.org/doku.php?id=accept
    printf("Preparando para accept..\n");
    // accept one connection

    if ((client = accept(s, (struct sockaddr *)&rem_addr, &opt))<0){
         perror("accept: ");
         exit(1);
    }
 
    printf("Preparando para leitura..\n");
   // ba2str( &rem_addr.rc_bdaddr, buf );
    fprintf(stderr, "accepted connection from %s\n", buf);
    memset(buf, 0, sizeof(buf));
 
    // read data from the client
    bytes_read = read(client, buf, sizeof(buf)+1);
    if( bytes_read > 0 ) {
        printf("received [%s]\n", buf);
    }
 
    //envia uma resposta
    strcpy(buf,"ALO CELULAR!");
    write (client, buf, sizeof(buf));
    sleep(10);
    // close connection
    close(client);
    close(s);
    return 0;
}

Para compilar o programa:

 gcc rcomm-server.c -lbluetooth  -o rcomm-server


APPINVENTOR:

Dowload do .apk (primeira versão funcional) Note que a variável MAC deverá conter o endereço MAC do computador em uso.

MACappinventor.jpg

Para saber o seu endereço MAC:

 hcitool dev
Ao usuário

Placa de aquisição de dados

  • Saídas digitais

Existem 3 saídas digitais na placa, e essas são chamadas de OUT1, OUT2 e OUT3.

Saida digital.jpg

Essas saídas são energizadas, e quando estão ligadas enviam 5V a saída escolhida.


  • Entradas digitais

Existem, também, 3 entradas digitais, que são nomeadas INP1, INP2 e INP3.

Entrada digital.jpg

Essas entradas são do tipo seco, o que significa que elas ficam ativas quando aterradas(GND).


  • Saídas analógicas

Existem 2 saídas analógicas, e essas nomeadas DA1 e DA2.

Saida analogica.jpg

Essas saídas podem ser ajustadas para mandar tensões entre 0V e 5V.


  • Entradas analógicas

As 8 entradas analógicas existentes na placa são nomeadas como AD1, AD2, AD3...AD8

Entrada analogica.jpg

Estas entradas suportam tensões de até 10V

Instalação

Fazer o dowload do arquivo bibprg neste link: Download

Intruções para instalação:

Na pasta make:

-Dentro do arquivo shell.sh, no campo "SENHA". Botar senha de root do PC em uso;

-Dentro do arquivo Perm-Cerne.rules, na segunda linha, no campo OWNER="Aluno". Mudar "Aluno" para o nome do usuário do computador.

feito isso, basta que, a partir do terminal, seja feito o comando make dentro da pasta make.

Criando programas em C utilizando a biblioteca prg

As seguintes funções estão disponíveis nesta biblioteca:

  • função conectar:

esta função conecta a plaquinha ao host PC

Parâmetros: não possui

como utilizar:

conectar (); 


  • Função "info"

esta função retorna informações da placa. Pode retornar o nome do fabricante e o string do produto. Parâmetros: não possui

como utilizar:

info (); 


  • Função "enviar_digital"

Envia um sinal para uma das 3 saídas digitais da placa de aquisição

como utilizar:

Parâmetros: 2 parâmetros do tipo char, onde o primeiro representa uma saída digital (1, 2 ou 3) e o segundo representa o estado da saída, podendo ser 1(nível alto) ou 0(nível baixo).

enviar_digital (saída, estado); 

/*IMPORTANTE: as varíaveis saída e estado, sao do tipo CHAR*/ ou

enviar_digital (‘1’, ‘1’)

/*saída 1 é colocada em nivel alto(5V)*/


  • Função "enviar_analogica"

função utilizada para enviar um sinal para uma das 2 saídas analógicas da placa de aquisição

como utilizar: Parâmetros: 2 parâmetros do tipo char, onde o primeiro representa uma saída analógica (1 ou 2) e o segundo é uma string que representa o estado da saída, podendo esta variar de “000” a “255”. Onde “000” é 0V e 255 é 5V. Outras tensões podem ser encontradas através de calculos simples, como 2,5V “127”

enviar_analogica (saida, estado);

/*Onde a variavel saida e estado sao do tipo CHAR*/

ou

enviar_analogica (‘1’, “127”);

/*onde a saída analógica 1 está sendo energizada com aproximadamente 2.5V*/


  • Função "receber_digital"

Função utilizada para receber infotrmações das entradas analógicas; A entrada digital desta placa é do tipo seco. Ela retornará 0 caso a entrada NÃO estiver aterrada, e 1 se estiver.


como utilizar:

Parâmetros: receber(nº da saída); Retorno: o retorno desta função é um inteiro (int)

receber_digital (char saida) ;

ou

receber_digital (‘1’) ;

/*onde a função retornará 0 ou 1 da entrada 1 */ /*Existem 3 entradas digitais, portanto a variavel saída pode ser 1, 2 ou 3*/


  • Função "receber_analogica"

Função utilizada para receber infotrmações das entradas analógicas; As entradas analógicas retornam valores de 0,00V a 9,99V;

como utilizar:

Parâmetros: receber(nº da saída); Retorno: o retorno desta função é um número real (float)

receber_analogica (char saida) ;

ou

receber_analogica (‘1’) ;

/*onde a função retornará retornará um valor entre 0,00 e 9,99 */ /*Existem 8 entradas analogicas, portanto a variavel saída pode ser 1, 2, 3, 4, 5, 6, 7 ou 8*/


  • Função "print_display"

/*Função utilizada para imprimir um mensagem no display lcd*/

como utilizar:

//Parâmetros: print_display(linha,"mensagem");

print_display (int linha, char mensagem[]); 


  • Função "limpar_display" limpa o display

/*Função utilizada para limpar o display*/

como utilizar:

//Parâmetros: não possui

limpar_display();

Exemplos

Sempre lembrando do arquivo de cabeçalho "bibprg.h" que está dentro da pasta que foi baixada

Saída digital

#include <stdio.h>
#include "bibprg.h"

main (){

 char saida='1', estado='0';
 
 conectar ();
 
 enviar_digital ('1','1');
 sleep (1);
 enviar_digital (saida,estado);
 }

Lembrando que o dois parâmetros são do tipo CHAR


Saída analógica

#include <stdio.h>
#include "bibprg.h"

main (){

 char saida='1', estado[3]="000";

 conectar ();
 
 enviar_analogica('1', "130");
 sleep(2);
 enviar_analogica(saida, estado);
 }

Os dois parâmetros são do tipo CHAR, sendo o segundo uma cadeia de caracteres que varia de 000 á 255


Entrada digital

#include <stdio.h>
#include "bibprg.h"

main (){

 char saida='1';

 conectar ();
 
 printf ("%d\n", receber_digital ('1'));
 sleep (3);
 printf ("%d\n", receber_digital (saida));
}

Parâmetro do tipo CHAR


Entrada analógica

#include <stdio.h>
#include "bibprg.h"

 main (){

 conectar ();
 
 printf("%f\n",receber_analogica('1'));
 sleep (2);
 printf("%f\n",receber_analogica('1'));
}

Parâmetro do tipo CHAR

Display

#include <stdio.h>
#include "bibprg.h"

main(){

 int i=12;
 char mensagem[50]="Fim";
 
 conectar();
 
 for(;;){
    print_display (1,"Linha 1 display LCD");
    sleep(1);
 
    print_display (2,"Linha 2 display LCD");
    sleep(1);

    print_display (12,"Linhas 1 e 2 display LCD");
    sleep(1);

    print_display (i, mensagem);
    sleep(1);

 }
}

Onde a variável "i" é do tipo inteiro e a "mensagem" é uma cadeia de caracteres

Ao fim, basta compilar da seguinte forma:

gcc arquivo.c -lprg -lusb-1.0 -o arquivo

Comunicação bluetooth (Appinventor e C)

Fonte: Uso do Bluetooth com App Inventor e programa C

How to play with Bluetooth under Linux

Comandos iniciais:

instalar ferramentas e bibliotecas

 sudo apt-get install bluez-utils
 sudo apt-get install libbluetooth3-dev

Configurar a porta serial (SP), neste exemplo o canal 3 :

sdptool add --channel=3 SP

Código C, funcionando, (com o canal 3, pode ser mudado, se necessário, na linha 33)

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
#include <errno.h>
#include <sys/types.h>
#include <netinet/in.h>
 
 
int main(int argc, char **argv)
{
    struct sockaddr_rc loc_addr = { 0 } , rem_addr = { 0 };
    char buf[1024] = { 0 };
    int s, client, bytes_read;
    socklen_t opt = sizeof(rem_addr);
 
    // allocate socket http://www.br-c.org/doku.php?id=socket
    if ((s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM))==-1){
		printf("Problemas na criação do socket\n");
		exit(-1);
    }
 
    // bind socket to port 1 of the first available 
    // local bluetooth adapter
    //http://www.br-c.org/doku.php?id=bind
    
    loc_addr.rc_family = AF_BLUETOOTH;
    loc_addr.rc_bdaddr = *BDADDR_ANY;
    //str2ba( endereco, &loc_addr.rc_bdaddr );
    loc_addr.rc_channel = (uint8_t) 3;
    if (bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr))==-1){
		printf("Problemas no bind\n");
		exit(-1);
    }
    
 
    //listen http://www.br-c.org/doku.php?id=listen
    printf("Preparando para listen..\n");
    // put socket into listening mode
    if (listen(s, 1)<0)
		printf("Problemas de listen...\n");
 
    //http://www.br-c.org/doku.php?id=accept
    printf("Preparando para accept..\n");
    // accept one connection

    if ((client = accept(s, (struct sockaddr *)&rem_addr, &opt))<0){
         perror("accept: ");
         exit(1);
    }
 
    printf("Preparando para leitura..\n");
   // ba2str( &rem_addr.rc_bdaddr, buf );
    fprintf(stderr, "accepted connection from %s\n", buf);
    memset(buf, 0, sizeof(buf));
 
    // read data from the client
    bytes_read = read(client, buf, sizeof(buf)+1);
    if( bytes_read > 0 ) {
        printf("received [%s]\n", buf);
    }
 
    //envia uma resposta
    strcpy(buf,"ALO CELULAR!");
    write (client, buf, sizeof(buf));
    sleep(10);
    // close connection
    close(client);
    close(s);
    return 0;
}

Para compilar o programa:

 gcc rcomm-server.c -lbluetooth  -o rcomm-server


APPINVENTOR:

Dowload do .apk (primeira versão funcional) Note que a variável MAC deverá conter o endereço MAC do computador em uso.

MACappinventor.jpg

Para saber o seu endereço MAC:

 hcitool dev