primeiros passos com Bluetooth Low Energy (BLE) e Perfil de Atributo Genérico (GATT) Especificação de IoT
de Acordo com a Wikipédia, o Bluetooth é uma tecnologia sem fio padrão usado para a troca de dados entre fixos e móveis, dispositivos em distâncias curtas. Bluetooth Low Energy (Bluetooth LE ou BLE) é uma tecnologia de rede de área pessoal sem fio (WPAN) projetada e comercializada pelo Grupo de Interesse Especial Bluetooth (Bluetooth SIG). De acordo com o Bluetooth SIG, BLE é projetado para operação de energia muito baixa. BLE suporta taxas de dados de 125 Kb / s a 2 Mb / s, com múltiplos níveis de potência de 1 miliwatt (mW) a 100 mW. Vários fatores-chave influenciam o alcance efetivo de uma conexão Bluetooth confiável, que pode variar de um quilômetro para menos de um metro. A nova geração Bluetooth 5 fornece uma melhoria teórica de alcance 4x sobre Bluetooth 4.2, de aproximadamente 200 pés (60 metros) a 800 pés (240 metros).
a Wikipédia lista atualmente 36 definições de perfis Bluetooth definidos e adotados pelo Bluetooth SIG, incluindo a especificação Generic Attribute Profile (GATT). De acordo com o Bluetooth SIG, o GATT é construído em cima do Attribute Protocol (ATT) e estabelece operações comuns e um quadro para os dados transportados e armazenados pelo ATT. O GATT fornece serviços de descoberta e descrição de perfis para o protocolo BLE. Ele define como os atributos ATT são agrupados em conjuntos para formar serviços.
devido ao seu baixo consumo de energia e perfis bem desenvolvidos, como o GATT, BLE é um protocolo sem fio ideal para internet de Coisas (IoT) dispositivos, quando comparado com protocolos concorrentes, como ZigBee, Bluetooth classic, e Wi-Fi. Neste post, vamos explorar a utilização do BLE e da especificação do GATT para transmitir dados de sensores ambientais de um Sensor IoT para um Gateway IoT.
Sensor IoT
neste post, usaremos um microcontrolador de Arduino para servir como um sensor IoT, na verdade um conjunto de sensores. O 3.3 V AI-habilitado Arduino Nano 33 BLE Sense board, lançado em agosto de 2019, vem com o poderoso processador nRF52840 da Nordic Semiconductors, uma CPU Cortex-M4 de 32 bits ARM rodando a 64 MHz, 1MB de memória Flash CPU, 256KB de SRAM, e um módulo Bluetooth 5 de baixa energia NINA-B306 stand-alone.
O Sentido também contém uma impressionante variedade de sensores incorporados:
- 9-eixo de Sensor Inercial (LSM9DS1): 3D digital linear sensor de aceleração, 3D digital
sensor de velocidade angular, e uma digital 3D sensor magnético - Temperatura e Umidade Sensor (HTS221): Capacitivo sensor digital de temperatura e umidade relativa
- Sensor Barométrico (LPS22HB): MEMS nano sensor de pressão: 260-1260 hectopascal (hPa) barómetro de saída digital absoluto
- microfone (MP34DT05): sensor de áudio MEMS microfone omnidireccional digital
- gesto, proximidade, cor da luz e Sensor de intensidade da luz (APDS9960): detecção avançada de gestos, detecção de proximidade, sentido de Luz Ambiente Digital (ALS) e sentido de cor (RGBC).
the Sense is an excellent, low-cost single-board microcontroller for learning about collecting and transmitting IoT sensor data.
IoT Gateway
Um IoT Gateway, de acordo com TechTarget, é um dispositivo físico ou programa de software que serve como ponto de ligação entre a Nuvem e controladores, sensores e dispositivos inteligentes. Todos os dados que se movem para a nuvem, ou vice-versa passa pelo gateway, que pode ser um aparelho de hardware dedicado ou programa de software.
neste post, vamos usar um recente geração Raspberry Pi 3 Modelo B+ computador de placa única (SBC), para servir como um mecanismo de impressão de Gateway. Este modelo Raspberry Pi apresenta um Cortex-A53 (ARMv8) 64-bit quad-core processor System em um Chip (SoC), 1GB LPDDR2 SDRAM, dual-band wireless LAN, Bluetooth 4.2 BLE, E Gigabit Ethernet.
para seguir junto com o post, você poderia substituir o Raspberry Pi por qualquer máquina baseada em Linux para executar a amostra de script Python incluído.
O Arduino irá transmitir IoT sensor de telemetria, mais IRRESISTÍVEL, para o Raspberry Pi. O Raspberry Pi, usando Wi-Fi ou Ethernet, é então capaz de transmitir de forma segura os dados de telemetria do sensor para a nuvem. Na terminologia Bluetooth, o dispositivo periférico Bluetooth (também conhecido como servidor GATT), que é o Arduino, irá transmitir dados para o dispositivo Central Bluetooth (também conhecido como cliente GATT), que é o Raspberry Pi.
Arduino Esboço
Para aqueles não familiarizados com o Arduino, um esboço é o nome que o Arduino usa para um programa. É a unidade de código que é carregado em memória flash não-volátil e funciona em uma placa Arduino. A linguagem Arduino é um conjunto de funções C/C++. Todas as construções padrão de C e c++ suportadas pelo compilador avr-g++ devem funcionar em Arduino.
para este post, o sketch, combo_sensor_ble.ino, contém todo o código necessário para coletar telemetria de sensores ambientais, incluindo temperatura, umidade relativa, pressão barométrica, e luz ambiente e cor RGB. Todos os códigos para este post, incluindo o sketch, podem ser encontrados no GitHub.
a telemetria dos sensores será publicitada pelo sentido, sobre BLE, como um serviço de detecção ambiental do GATT (número atribuído ao GATT 0x181A) com múltiplas características do GATT. Cada característica representa uma leitura do sensor e contém o(S) Valor (s) do sensor mais atual, por exemplo, temperatura (0x2A6E) ou umidade (0x2A6F).Cada característica do GATT define a forma como os dados devem ser representados. Para representar os dados com precisão, as leituras do sensor precisam ser modificadas. Por exemplo, usando a Biblioteca ArduinoHTS221, a temperatura é capturada com dois pontos decimais de precisão (por exemplo, 22.21 °c). No entanto, a característica temperatura do GATT (0x2A6E) requer um valor de 16 bits assinado (- 32.768-32.767). Para manter a precisão, o valor capturado (por exemplo, 22.21 °C) é multiplicado por 100 para convertê-lo em um inteiro (por exemplo, 2221). O Raspberry Pi irá então lidar com a conversão do valor de volta para o valor original com a precisão correta.
a especificação do GATT não tem uma característica pré-definida actual que represente a luz ambiente e a cor RGB. Portanto, criei uma característica personalizada para os valores de cor e atribuí-lhe um identificador universalmente único (UUID).
de acordo com a documentação, a luz ambiente e a cor RGB são capturadas como valores de 16 bits (um intervalo de 0-65,535). No entanto, usando a Biblioteca ArduinoAPDS9960, descobri que a escala das leituras está dentro de um intervalo de 0-4097. Sem mergulhar nas ervas daninhas, o valor máximo de contagem (ou saturação) é variável. Ele pode ser calculado com base no tempo de integração e no tamanho do registro de contagem (por exemplo, 16-bits). O tempo de integração ADC parece ser definido para 10 ms no arquivo da biblioteca, Arduino_APDS9960.cpp.Valores RGB são tipicamente representados como cor de 8 bits. Poderíamos converter os valores para 8 bits antes de enviar ou lidar com isso mais tarde no Gateway Raspberry Pi IoT. Para fins de demonstração versus eficiência de transferência de dados, o esboço concatenata os valores de 12 bits juntos como uma cadeia (por exemplo, 4097,2811,1500,4097
). A corda será convertida de 12-bit para 8-bit no Raspberry Pi (por exemplo, 255,175,93,255
).
antevisão e depuração de Serviços de dispositivos BLE
Antes de olhar para o código em execução no Raspberry Pi, podemos usar qualquer número de aplicações móveis para visualizar e depurar o serviço de detecção ambiental em execução no Arduino e ser anunciado sobre BLE. Um aplicativo comumente recomendado é o NRF Connect da Nordic Semiconductor para celular, disponível no Google Play. Descobri que a versão Android funciona melhor na interpretação correta e exibindo valores característicos do GATT do que a versão iOS do aplicativo.
abaixo, vemos uma varredura da minha vizinhança local para dispositivos BLE sendo anunciado, usando a versão Android da aplicação móvel nRF Connect. Note o dispositivo BLE, ArduinoNano33BLESense (indicado em vermelho). Além disso, note o endereço de controle de acesso de mídia (endereço MAC) desse dispositivo BLE, no meu caso, d1:aa:89:0c:ee:82
. O endereço MAC será exigido mais tarde no Gateway IoT.
Ligar o dispositivo, vemos três Serviços. O serviço de detecção ambiental (indicado em vermelho) contém as leituras do sensor.
Perfuração para baixo, para o Ambiente de Detecção de Serviço (0x181A), vemos que os quatro esperado Características: Temperatura (0x2A6E), Umidade (0x2A6F), Pressão (0x2A6D) e Desconhecido (Característica 936b6a25-e503–4f7c-9349-bcc76c22b8c3). Uma vez que nRF Connect não pode reconhecer a leitura do sensor de cores como uma característica registrada do GATT (sem número atribuído ao GATT), ela é exibida como uma característica desconhecida. Enquanto os valores de temperatura, umidade e pressão (indicados em vermelho) são interpretados e exibidos corretamente, a leitura do sensor de cores é deixada como texto hexadecimal bruto (por exemplo, 30-2c-30-2c-30-2c-30-00
ou 0,0,0,0
).
Estes resultados indicam que tudo está funcionando como esperado.
BLE Client Python Code
To act as the BLE Client( aka central device), the Raspberry Pi runs a Python script. O script, rappi_ble_ receiver.py, usa o módulo Python bluepy para interagir com dispositivos BLE através de Bluez, no Linux.
para executar o script Python, execute o seguinte comando, substituindo o argumento de endereço MAC para o seu próprio endereço MAC anunciado do dispositivo BLE.
python3 ./rasppi_ble_receiver.py d1:aa:89:0c:ee:82
ao contrário do aplicativo NRF Connect, o módulo Python bluepy não é capaz de interpretar e exibir corretamente os valores característicos do GATT. Por isso, o script pega o texto hexadecimal bruto e entra do Arduino e coage-o aos valores corretos. Por exemplo, uma leitura de temperatura deve ser transformada de bytes, b'\xb8\x08\x00\x00'
, para uma matriz de bytes, bytearray(b'\xb8\x08\x00\x00')
, então para um inteiro, 2232
, então para uma casa decimal, 22.32
, e finalmente para a escala Fahrenheit, 72.18°F
.
as leituras dos sensores são recuperadas do dispositivo BLE a cada dois segundos. Além de exibir as leituras dos sensores numéricos, O script Python também exibe um swatch de cor da cor RGB de 8 bits, bem como um swatch de tons de cinza representando a intensidade de luz usando o módulo Python colr.
A seguinte gravação de tela mostra um paralelo vista do Arduino Serial Monitor e o Raspberry Pi do terminal de saída. O Raspberry Pi (dispositivo central) conecta-se ao Arduino (dispositivo periférico) quando o script Python é iniciado. O Raspberry Pi lê e interpreta com sucesso os dados de telemetria do serviço de detecção ambiental.
Conclusion
In this post, we explored the use of BLE and the GATT specification to transmit environmental sensor data from a peripheral device to a central device. Devido ao seu baixo consumo de energia e perfis bem desenvolvidos, como o GATT, Bluetooth Low Energy (BLE) é um protocolo de curto alcance ideal para dispositivos IoT.