Manual

do

Maker

.

com

Transformando seu Raspberry Pi 3 em um Beacon

Transformando seu Raspberry Pi 3 em um Beacon

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.

Update do sistema

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

Configurar a interface wlan0 por linha de comando no Linux

O processo é bastante simples e vou descrevê-lo como receita de bolo:

  • Torne-se root temporariamente com o comando 'sudo su'.
  • Edite o arquivo /etc/network/interfaces com seu editor preferido. Eu utilizo o 'vi', nem vou entrar em detalhes, mas você pode usar o 'pico', 'nano' ou 'mcedit'.
  • Comente as linhas relacionadas à interface wlan.
  • Adicione o seguinte conteúdo:
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
    wpa-ssid "suaRedeWiFi"
    wpa-psk "suaSenhaSecreta"

  • Reinicie o serviço de rede e o daemon pelo systemctl:
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:

  • Edite o arquivo /etc/wpa_supplicant/wpa_supplicant.conf
  • Adicione o seguinte conteúdo:
update_config=1 network={ ssid=”SeuSSID” scan_ssid=1 priority=15 psk=”senhaSecreta” key_mgmt=WPA-PSK id_str=”rpi”}
  • Agora edite o arquivo interfaces e invés da configuração descrita para DHCP, escreva esta configuração que segue:
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
  • Se preferir, invés de especificar o DNS no arquivo interfaces, aponte-o em /etc/resolv.conf:
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.

Configurar o Bluetooth LE no Raspberry Pi

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:

pi-bluetooth.webp

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

Iniciar anúncio do Beacon

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.

Comando para inicializar um beacon

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.

1E e 02

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.

01 - Identificador do tipo AD: Flag

Esse campo identifica o tipo de estrutura AD. O valor 01 indica que é Flag.

1A - Os valores da flag anteriormente citada

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

1A - Número de bytes da segunda estrutura

Se refere ao número de bytes que segue na segunda estrutura AD.

FF - Dados especificos do fabricante

Dados relacionados à manufatura do produto.

4C 00 - Identificador da Apple

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.

02 15 - Primeiro e segundo byte de  anúncio de um beacon

Auto-explicativo.

E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 - UUID

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).

uuidgen_shell-300x109.webp

00 00 e 00 00 - Major e Minor

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.

C4 00 - RSSI ou TX Power

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).

Parar o anúncio

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).

Configurar no aplicativo

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!

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.