Índice:
2025 Autor: John Day | [email protected]. Última modificação: 2025-01-13 06:58
Bluetooth Low Energy (BLE) é uma forma de comunicação Bluetooth de baixa potência. Dispositivos vestíveis, como as roupas inteligentes que ajudo a projetar na Predictive Wear, devem limitar o consumo de energia sempre que possível para estender a vida útil da bateria e frequentemente utilizar BLE. O Bluetooth Special Interest Group (SIG) define várias especificações que um dispositivo deve implementar para interagir com um dispositivo Bluetooth, que eles chamam de "perfis". A maioria dos perfis de aplicativo utiliza o Perfil de Atributo Geral (GATT) para enviar dados por um link BLE. Existem três conceitos fundamentais em BLE: perfis, serviços e atributos.
O Bluetooth SIG padronizou muitos perfis, serviços e atributos comuns. No entanto, ao criar hardware personalizado, geralmente é necessário criar serviços e atributos personalizados e não há muitos tutoriais disponíveis. Para tornar as coisas mais difíceis, a Adafruit não fornece nenhuma orientação sobre o projeto de aplicativos móveis para emparelhar com seus módulos BLE e o código-fonte de seus aplicativos é difícil de fazer engenharia reversa.
Este tutorial tem como objetivo explicar:
- Como projetar serviços e características personalizados do GATT
- Como programar o Adafruit Bluefruit LE SPI Friend para atuar como um servidor GATT para esses serviços e características personalizados
- Como programar um dispositivo Android para atuar como cliente GATT para ler os dados do servidor GATT
Este tutorial não se destina a ser traduzido em um aplicativo pronto para produção - esta é simplesmente uma introdução ao BLE.
Leitura de fundo:
- Documentação do Adafruit Bluefruit LE SPI Friend
- Se você não está familiarizado com GATT ou BLE
Suprimentos
- 1x - Um dispositivo Arduino (estou usando o UNO para este tutorial)
- 1x - Amigo Adafruit Bluefruit LE SPI
- 8x - fios de jumper macho para macho
- Equipamento de solda básico (para soldar os pinos do cabeçote no SPI Friend)
- Um computador (para programar o dispositivo Arduino e o dispositivo Android)
Etapa 1: projetar serviços e características personalizadas
INTRODUÇÃO
Este artigo explica como criar serviços e características personalizados. Eu recomendo fortemente a leitura deste artigo. Eu forneço uma visão geral muito simples abaixo que negligencia as sutilezas em favor da simplicidade.
Os serviços GATT são um conjunto de características.
As características GATT contêm uma propriedade, um valor e zero ou mais descritores.
- Propriedade: como os dados devem ser tratados pelo cliente (aplicativo Android), por exemplo ler, escrever, escrever sem resposta, notificar e indicar.
- Valor: o valor real da característica, por exemplo 1089
- Descritores: são informações sobre o valor, por exemplo a unidade, milissegundos
PROJETO
Ok, agora que você sabe o que são serviços e características, precisamos descobrir como projetar alguns serviços e características para obter nossos dados personalizados e enviá-los de nosso servidor GATT (Arduino) para o cliente (aplicativo Android). Vamos considerar um dispositivo Arduino que está coletando dados de um módulo acelerômetro-giroscópio (AGM). Queremos coletar medições de giroscópio e aceleração de três eixos espaciais e o tempo em que essas medições foram feitas e transmitir esses dados para nosso aplicativo móvel. Também queremos saber quando precisamos carregar o dispositivo, então queremos ler o nível da bateria e transmitir isso para nosso aplicativo móvel.
1. Podemos usar qualquer um dos serviços e características padrão?
O Bluetooth SIG padronizou muitos serviços e características comuns. Primeiro, verifique-os para ver se você pode cooptar qualquer um dos serviços e características padronizados. Os serviços e características padrão podem utilizar pacotes de dados muito menores, já que o identificador exclusivo universal (UUID) tem 16 bits, enquanto os serviços e características personalizados devem utilizar 128 bits para seus UUIDs. Mais sobre UUIDs mais tarde. Em nossa pesquisa, encontramos um "serviço de bateria" padronizado que contém uma característica "nível de bateria".
2. Separe todos os valores de dados que deseja enviar via BLE em características e serviços
Podemos dividir nossos pontos de dados personalizados em sete características personalizadas dentro de um serviço personalizado. Chamaremos este serviço de "serviço AGM". Ele conterá 7 características: aceleração x, aceleração y, aceleração z, giroscópio x, giroscópio y, giroscópio z e uma referência de tempo.
3. Determine as propriedades necessárias para cada característica
Existem várias propriedades que uma característica pode ter.
- Ler: o cliente (aplicativo Android) pode ler um valor do servidor GATT (Arduino)
- Escrita: o cliente pode alterar um valor do servidor GATT
- Indique: o cliente será notificado se um valor mudar do servidor GATT e espera-se que o cliente envie uma confirmação para o servidor GATT
- Notificar: o cliente será notificado se um valor mudar do servidor GATT e não se espera que o cliente envie uma confirmação para o servidor GATT
Para este tutorial, definiremos todas as nossas características para leitura, com exceção do nível da bateria, que terá propriedades de notificação e leitura.
4. Gere UUIDs para serviços e características personalizados e encontre UUIDs padrão
Como mencionei brevemente antes, os serviços e características padronizados do Bluetooth SIG utilizam um UUID de 16 bits, enquanto os serviços e características personalizados utilizam UUIDs de 128 bits. Por exemplo, consulte o número atribuído ao serviço de bateria no Bluetooth SIG. O número atribuído 0x180F representa o UUID de 128 bits "0000180F-0000-1000-8000-00805F9B34FB". Os quatro dígitos (16 bits) em negrito são exclusivos para o serviço padronizado particular ou característica, enquanto os outros caracteres são conservados entre todos os serviços padronizados e características. Como o cliente e o servidor GATT sabem que os serviços e características padronizados variam apenas nos dígitos em negrito, os tamanhos dos pacotes de dados podem ser substancialmente reduzidos. No entanto, os serviços e características personalizados não podem operar sob esta mesma suposição.
Em vez disso, os serviços e características personalizados devem utilizar UUIDs de 128 bits não abreviados. Aqui está um gerador de UUID online. Qualquer UUID diferente do UUID padronizado é aceitável para um UUID personalizado. No entanto, uma convenção de nomenclatura típica é denotar um serviço personalizado 00000001- … e as características desse serviço personalizado 00000002- …
Aqui está uma planilha de resumo dos serviços e características que implementaremos junto com seus UUIDs
Etapa 2: Código Arduino
ATUALIZAR O AMIGO BLUEFRUIT LE SPI
Primeiro, conecte o Adafruit Bluefruit LE SPI Friend conforme especificado em seu guia de conexão e ligue o dispositivo Arduino. Certifique-se de encontrar o Adafruit Bluefruit LE SPI Friend em seu dispositivo Android ao fazer a varredura para dispositivos Bluetooth. Baixe o aplicativo Bluefruit Connect, conecte-se ao Adafruit Bluefruit LE SPI Friend e permita que ele atualize o firmware no dispositivo. Esta etapa é importante. Se você não atualizar o firmware, os comandos que você emite para o dispositivo via Arduino provavelmente falharão e não haverá um erro óbvio para você descobrir qual é o problema.
Aqui está meu repo para este projeto. Você pode ver o código completo do Arduino aqui.
VISÃO GLOBAL
Algumas coisas importantes a serem observadas:
- No método setup (), todos os UUIDs personalizados devem conter "-" entre cada dois caracteres. Por exemplo, "AT + GATTADDCHAR = UUID128 = 00 thirty-05-62-7E-47-E5-A3-FC-DD-AB-D9-7A-A9-66" funcionará. "AT + GATTADDCHAR = UUID128 = 00000005-627E-47E5-A3fCDDABD97AA966" não funcionará.
- Observe que no método setup (), "battery.begin (true);" chama "ble.reset ();" automaticamente. Se você não usa o serviço de bateria como eu, você precisa reiniciar o módulo ble (use "ble.reset ();") onde tenho o comando "battery.begin (true);".
- No método setup (), altere "if (! Ble.begin (false))" para "if (! Ble.begin (true))" se quiser depurar.
Este código é bastante autoexplicativo. Incluí descrições de cada método personalizado. O método de configuração deixa o módulo BLE pronto para atuar como o servidor GATT. O método de loop passa por uma varredura falsa do módulo giroscópio do acelerômetro (AGM) e gera um número aleatório de 1 a 100 para esses valores. A bateria está descarregada em 1% para simular o uso da bateria. Você pode substituir este código pelos valores reais do sensor facilmente. Este código assume que você transmitirá uma matriz de dados AGM, 6 medições de comprimento, em vez de uma única medição, pois analisar uma janela de dados AGM é provavelmente mais útil do que um único ponto de dados. Se você alterar o tamanho da matriz, observe que haverá alterações necessárias no código do Android Studio. Para capturar uma matriz de dados, você deve passar um contador junto com os dados que pretende enviar. Este contador permite que você encontre onde você está na janela do aplicativo Android Studio para que você possa esperar para ouvir os pontos de dados ausentes na janela. Sem o contador ou com uma matriz de tamanho diferente, o projeto do Android Studio perderá pontos de dados ou ficará preso em um loop esperando pelos pontos de dados restantes que espera.
Etapa 3: código do Android Studio
Aqui está meu repo para este projeto. Você pode ver o código completo do Android Studio aqui.
VISÃO GLOBAL
Vou continuar atualizando isso com uma visão geral mais completa de como o código do arduino e do Android funcionam em detalhes … O aplicativo é totalmente funcional, então fique à vontade para olhar o código por conta própria enquanto isso.
Etapa 4: Inscrição final
Parabéns! Seu aplicativo é baixado para o seu telefone e seu dispositivo vestível é carregado e transmitindo dados.
INICIE O APLICATIVO
Para começar, clique no ícone do iniciador do aplicativo.
CONCEDER PERMISSÕES
Você precisará aprovar o uso de algumas permissões para que o aplicativo funcione corretamente.
VERIFICAR DISPOSITIVOS
Em seguida, clique no botão "Scan" no canto superior esquerdo do aplicativo.
SELECIONE SEU DISPOSITIVO USÁVEL
Em seguida, selecione seu dispositivo vestível na lista de dispositivos BLE disponíveis. Seu nome é "BLE Arduino Hardware". GET DATAWait enquanto o aplicativo obtém os dados AGM e determina onde o usuário está parado ou em movimento. VEJA SEUS RESULTADOS Verifique os resultados na tela! Clique no botão sincronizar para obter outra leitura de dados.