Manual
do
Maker
.
com
No post anterior discorri a respeito de beacons (sugiro a leitura nesse link, caso não tenha entendimento a respeito ainda), agora escrevo esse tutorial para configurar o Raspberry Pi 3 como um Beacon. Alguns passos adotados são padrão e provavelmente você já está acostumado. No caso do BLE (Bluetooth Low Energy, nativo do Raspberry 3), tive um trabalho extra, mas com o sistema básico instalado tive que adotar procedimentos para configurar inclusive a WiFi. Pra começar, coloquei dissipadores no Raspberry; não que ele esquente muito, mas tem lá sua importância. Após, instalei a versão mínima do Raspbian (Jessie), habilitei o ssh (comando 'sudo raspi-config' e 'Advanced Options'). Localmente ainda, configurei a interface wlan0 pela linha de comando. Ressalto que inicialmente a interface WiFi não apareceu no sistema, somente após o upgrade. Para deixar completinho, vou descrever o processo, apesar de você encontrar referências que escrevi em outros artigos, inclusive para o Sistemas Embarcados.
O primeiro passo pra mim foi fazer a atualização do sistema após a instalação. Tenha em mente que a instalação mínima não contempla interface gráfica. De qualquer modo, sempre faço tudo por linha de comando em Linux por ser mais prático. Se estiver utilizando um WM, abra um terminal e:
sudo su
apt-get update && apt-get dist-upgrade
O processo é bastante simples e vou descrevê-lo como receita de bolo:
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid "suaRedeWiFi"
wpa-psk "suaSenhaSecreta"
service networking restart
systemctl daemon-reload
Agora seu Raspberry já deverá estar conectado à sua rede WiFi. Feito isso e com o serviço ssh habilitado, dirija-se a um computador. Se preferir fazer tudo no Raspberry mesmo, ignore a parte do ssh.
A conexão de rede será necessária principalmente pela necessidade de instalação de pacotes, porém por alguma razão sombria, é possível que você esteja optando por não distribuir IP por DHCP. Nesse caso o trabalho é maior e mais chato:
update_config=1 network={ ssid=”SeuSSID” scan_ssid=1 priority=15 psk=”senhaSecreta” key_mgmt=WPA-PSK id_str=”rpi”}
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface rpi inet static address 192.168.1.2
gateway 192.168.1.1
netmask 255.255.255.0
dns-nameservers 8.8.8.8
echo "nameserver 8.8.8.8" >/etc/resolv.conf
Quando a interface é configurada por DHCP, o reteador informa o gateway, máscara e DNS, mas quando configurado manualmente, você deverá saber todos esses parâmetros. Seguindo.
Como fui por osmose, esqueci de testar se nessa nova versão do sistema operacional (Jessie) é necessário esse procedimento, mas de qualquer modo, servirá para versões anteriores do RPi.
Instale as dependências iniciais:
apt-get install libdbus-1-dev libdbus-glib-1-dev libglib2.0-dev libical-dev libreadline-dev libudev-dev libusb-dev make
Com isso, 14MB se foram. Agora vamos à compilação do Bluez:
sudo su
mkdir temp && cd temp
wget -c https://www.kernel.org/pub/linux/bluetooth/bluez-5.39.tar.xz
tar xvJf bluez-5.39.tar.xz && cd bluez-5.39
./configure --disable-systemd && make && make install
O processo é um bocado lento, mas "acaba no fim". Quando acabar, não estará funcionando se for o Raspberry Pi 3. Estranho esse tutorial que vos escrevo, hum? Mas vamos lá.
apt-get install pi-bluetooth
Feita a instalação, você certamente encontrará a interface:
Automaticamente a interface foi levantada (UP RUNNING), mas se porventura sua interface aparecer como DOWN, basta levantá-la:
hciconfig hci0 up
Para anúncio, outro comando deve ser utilizado:
hciconfig hci0 leadv 3
E então desabilitar o scan para evitar problemas enquanto anunciando:
hciconfig hci0 noscan
Infelizmente existe uma complexidade notável aqui, mas vou ser superficial na explicação porque ainda não absorvi todos os conceitos necessários para te explicar com segurança essa parte. Primeiro, se desejar criar uma URL Eddystone, você pode optar por uma calculadora online. Mas essa pode não ser a melhor opção, porque a maioria dos aplicativos dá suporte aos dispositivos que se identificam como iBeacon. Por exemplo, você pode usar o Estimote para identificar outros beacons que não iBeacon, bastando para isso identificar-se como um dispositivo da Apple. Para tal, discorro a respeito do hci.
Estive por longos dias me debatendo para configurar o modo URL utilizando o formato de mensagem de resposta - por esse erro, não cheguei tão perto do resultado esperado. Com algumas dicas do Leonardo Lontra, consegui enfim interpretar as partes que me faltavam entender. Vejamos:
/usr/bin/hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 00 00 00 00 CA 00
0x08 0x0008 - OGF e OCF
OGF significa Operation Group Field e OCF significa Operation Command Field. Saber disso não ajuda em nada aqui, mas são dois campos fundamentais e para BLE, sempre será esse valor.
Esse é o primeiro valor significativo da string, que informa o comprimento da mensagem. No caso, vai até o campo 30. É importante frizar que a mensagem normalmente envia 31 octetos, e a mensagem é dividida em parte significativa e parte não-significativa. A parte não significativa é preenchida por zeros e a parte significativa é o último valor válido - no caso da string acima, 'CA', que casa exatamente com 1E - em decimal, 30. O segundo octeto aponta o número de octetos dentro da primeira estrutura.
Esse campo identifica o tipo de estrutura AD. O valor 01 indica que é Flag.
Sério, no momento em que estou escrevendo essa linha, conto já como quarto dia trabalhando na identificação dos valores que compõe a string. Você pode usar calculadoras online, fazer Ctrl+C e Ctrl+V por aí, mas eu não ficaria feliz em fazer desse modo, por isso desprendi até a última gota de sangue pra entender a porca, gigantesca e velha especificação do bluetooth. Não que falte informação lá, mas é como escrever uma carta com sopa de letrinhas e então misturar com bastante água e tempero.
Como na AD anterior foi dito que seriam passados flags, esse A1 passa os valores. As flags são 0 ou 1 e a conversão de 1A para binário equivale a 11010. Para quem não sabe, os bits são lidos da direita para a esquerda; 0 é OFF e 1 é ON. Os valores posicionais representam os seguintes campos:
bit 0 - Modo de descoberta limitada
bit 1 - Modo de descoberta geral
bit 2 - BR/EDR Não suportado (recursos prévios ao LE)
bit 3 - LE e BR/EDR simultaneamente na controladora
bit 4 - LE e BR/EDR No mesmo dispositivo host
Resultado da seleção: 11010
Se refere ao número de bytes que segue na segunda estrutura AD.
Dados relacionados à manufatura do produto.
Esse valor é o UUID de 16 bits registrado pela Apple. Estranhamente, ele não aparece xxxxx, talvez por estar desatualizado. O caso é que quando escolher um fornecedor, você deve ver o código (que se apresenta nesse link no formato 0x004C por exemplo) e então dividí-lo em 2 pares, para seguir o padrão.
Auto-explicativo.
Esse valor é utilizado para identificar o beacon. Para gerá-lo é muito fácil, basta ter instalado o programa uuidgen:
uuidgen |tr -d "-"|sed -re 's/(.{2})/\1 /g'
Pegue o valor e adicione-o na referida posição (logo após os octetos de anúncio).
Aqui pode sim variar. No caso, aí estão os campos de 'area ID' e 'unit ID'. São especificados como "major" e "minor". Major é para identificar o grupo do Beacon e o Minor é a identificação do Beacon.
Essa é a grande sacada. Esse é o valor do sinal TX, utilizado para fazer a calibragem, conforme veremos mais adiante.
hcitool -i hci0refere-se à interface e cmdao comando. Os dois primeiros valores são chamados de OGF e OCF. Esses dois valores serão adotados como padrão sempre que for configurar um BLE (Bluetooth Low Energy).
Para parar de anunciar, utiliza-se o comando
hcitool -i hci0 cmd 0x08 0x000a 00
O registrado 0x0008 vira 0x000a e o restante é limpo (00).
Tem montes de aplicativos, eu vou fazer um video mostrando que fantástico e preciso o beacon é, você consegue ter precisão de 2 centimetros. Basicamente, no aplicativo você escolhe um nome para identificar o dispositivo em um campo, em outro campo você coloca o UUID no formato original, Major e Minor. Vou mostrar também no video como calibrar cada beacon (pretendo colocar mais de um, inclusive já estou iniciando um post para configurar beacon no Arduino) e mostrar alguns apps, mas se quiser já ir experimentando, baixe o Estimote para Android (acho que tem pra iOS também). Por isso, mais uma vez recomendo:
Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.
Próximo post a caminho!
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.