Programação de Periféricos
Faculdade de Informática / Faculdade de Engenharia, PUC-RS
Porto Alegre, 13 de maio de 2009.
Prof.Eduardo Augusto Bezerra, eduardo.bezerra @ pucrs.br
Aula prática sobre Bluetooth no Linux
- O objetivo dessa aula prática é propiciar aos alunos a experiência de realizar a instalação e utilização do Bluetooth no ambiente Linux disponível no laboratório
- Após instalado e configurado o BlueZ na máquina em uso, realizar testes com periféricos Bluetooth disponíveis (celulares, mouse, teclado, ...)
- Desafio! Como seria a transferência de arquivos (ou dados em geral tipo chat, ...) entre dois equipamentos Bluetooth (PC e celular? duas máquinas Linux no laboratório?)
utilizando o BlueZ? Dica: OpenOBEX
- Preparar um tutorial de instalação e utilização do BlueZ, semelhante ao material disponível a seguir para o RedHat
Obs: Possível solução para o exercício - ESTÁ BLOQUEADO ATÉ A CONCLUSÃO DO EXERCÍCIO POR PARTE DA TURMA
Tutorial para instalação e utilização do BlueZ no RedHat
- Para realizar a instalação, usar o comando Linux do RedHat: rpm –ivh *.rpm
- BlueZ-libs-2.4-1.i386.rpm
- BlueZ-utils-2.3-1.i386.rpm
- BlueZ-sdp-1.2-1.i386.rpm
- BlueZ-hcidump-1.5-1.i386.rpm
- BlueZ-pan-1.1-1.i386.rpm
- BlueZ-bluefw-1.0.i386.rpm
- Distribuições disponíveis:
- Para carregar no kernel, editar /etc/modules.conf
- alias net-pf-31 blueZ - inicia a pilha BlueZ
- alias bt-proto-0 l2cap - inicia o protocolo L2CAP
- alias bt-proto-2 sco - inicia o protocolo SCO
- alias bt-proto-3 rfcomm - inicia o protocolo RFCOMM
- Para ativar módulos, editar /etc/rc.local
- modprobe bluez - pilha BlueZ
- modprobe hci_usb - interface USB
- modprobe ppp_async
- modprobe ppp_deflate
- modprobe bnep - Ativa protocolo BNEP
- hcid - HCI
- hciconfig hci0 up - Inicia o dispositivo bluetooth
- Exemplo de Script para iniciar os módulos:
#!/bin/sh
if [ "$1" == "restart" ]
then
echo "Killing dund process..."
killall dund
echo "Killing sdpd process..."
killall sdpd
echo "Killing hcid process..."
killall hcid
fi
echo "Starting the BLUEZ modules and services..."
modprobe bluez
modprobe hci_usb
modprobe ppp_async
modprobe ppp_deflate
modprobe bnep
hcid -f /etc/bluetooth/hcid.conf
hciconfig hci0 up
sdpd
echo "Starting dund..."
sleep 2
dund --listen --channel 1 noauth
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j ACCEPT
- Ferramentas de auxílio:
- hciconfig
- Configuração (nome, classe,...)
- hcitool
- scan
- Inquiry
- sdptool
- browse
- l2ping
- Teste de conexão
- LAN
- Disponibiliza um serviço de LAN Access Point
- Configurando o DUND:
- Criando os dispositivos /dev/rfcommX (máximo 7 dispositivos)
mknod –m 666 /dev/rfcomm0 c 216 0
mknod –m 666 /dev/rfcomm1 c 216 1
mknod –m 666 /dev/rfcomm2 c 216 2
mknod –m 666 /dev/rfcomm3 c 216 3
mknod –m 666 /dev/rfcomm4 c 216 4
mknod –m 666 /dev/rfcomm5 c 216 5
mknod –m 666 /dev/rfcomm6 c 216 6
- Configurando o PPP
- /etc/ppp/options
noauth
local
noipdefault
proxyarp
ms-dns 10.0.0.1
netmask 255.255.255.0
connect "sleep 2; echo -n CLIENTSERVER"
- Criar um arquivo para cada dispositivo rfcomm contendo IP local e o IP a ser atribuido para o dispositivo que se conectou:
- /etc/ppp/options.rfcommX
- Servidor - Exemplo tirado do script mostrado anteriormente:
#!/bin/sh
echo "Starting dund..."
sleep 2
dund --listen --channel 1 noauth
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j ACCEPT
- Cliente - Endereço Bluetooth da máquina servidora:
dund –-connect xx:xx:xx:xx:xx:xx --channel 1 --msdun
- Sockets
- Bibliotecas
#include < bluetooth/bluetooth.h >
#include < bluetooth/l2cap.h >
#include < bluetooth/rfcomm.h >
- Estruturas
#include < bluetooth/bluetooth.h >
#include < bluetooth/l2cap.h >
#include < bluetooth/rfcomm.h >
- Exemplos:
s_addr.l2_family = AF_BLUETOOTH;
s_addr.l2_psm = htobs(100);
baswap(&s_endereco.l2_bdaddr, addr);
s_ addr.rc_family = AF_BLUETOOTH;
bacpy(&s_ addr.rc_bdaddr, BDADDR_ANY);
s_ addr.rc_channel = 1;
str2ba(addr, &s_addr.rc_bdaddr);
- Criação do sockets
- RFCOMM:
int nsocket = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
- L2CAP:
int nsocket = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
- Bind:
bind(nsocket, (struct sockaddr *) &s_addr, sizeof(s_addr));
- Cliente
connect( nsocket,(struct sockaddr*)&s_endereco,sizeof(struct sockaddr) );
- Servidor
listen(nsocket, 10);
int news = accept (nsocket,(struct sockaddr *) &c_addr, &tam);