- Terminologias relacionadas a BLE (Bluetooth Low Energy)
- Preparando o hardware
- Programação de ESP32 para indicação de nível de bateria usando o serviço GATT
- Testando seu serviço GATT em ESP32 BLE
Fones de ouvido sem fio, bandas de ginástica, alto-falantes Bluetooth, fones de ouvido intra-auriculares, telefones celulares, laptops… existem tantos dispositivos Bluetooth ao nosso redor e a maioria desses dispositivos funciona com bateria. Você já se perguntou quando você conecta um dispositivo Bluetooth ao seu celular como ele automaticamente entende que o dispositivo conectado é um computador ou dispositivo de áudio ou um telefone celular? Para alguns dispositivos, nosso telefone pode até mostrar automaticamente a porcentagem da bateria do dispositivo conectado na barra de notificação. Como tudo isso acontece por conta própria? Deve haver algum protocolo comum compartilhado entre o telefone e o dispositivo Bluetooth, certo!
Fique curioso, você obterá respostas para essas perguntas à medida que tentarmos entender o Bluetooth Low Energy (BLE para abreviar), com o popular módulo ESP32. Ao contrário do Bluetooth clássico no ESP32, o BLE opera apenas quando uma comunicação é ativada e permanece no modo de suspensão, caso contrário, isso o torna a escolha certa para aplicativos alimentados por bateria. BLE também pode formar redes mesh e atuar como Beacons. Normalmente um módulo BLE funciona como servidor ou como cliente, aqui usaremos ESP32 BLE como servidor.
Aqui, dividimos o ESP32 Bluetooth completo em três segmentos para facilitar o entendimento.
1. Bluetooth serial no LED de alternância ESP32 do telefone móvel
2 . Servidor BLE para enviar dados de nível de bateria para celular usando o serviço GATT
3. Cliente BLE para procurar dispositivos BLE e atuar como beacon.
Já cobrimos o primeiro artigo; neste artigo, aprenderemos como fazer o ESP32 BLE funcionar como um servidor e usar o serviço GATT para enviar informações sobre o nível da bateria. Para fins de teste, enviaremos valores codificados do ESP32 como porcentagem da bateria para o nosso telefone móvel através do serviço BLE GATT, desta forma, nosso celular assumirá que ESP32 é um dispositivo Bluetooth operado por bateria que está tentando enviar para sua porcentagem de bateria. Antes de entrar em detalhes, iremos compreender algumas terminologias relacionadas com Bluetooth Low Energy.
Terminologias relacionadas a BLE (Bluetooth Low Energy)
Servidor BLE: Como dito anteriormente, o BLE pode ser programado para funcionar como um servidor ou como um cliente. Ao trabalhar como um servidor, o BLE pode fornecer apenas dados, mas não pode iniciar uma conexão. O exemplo seria uma faixa de fitness. Um servidor pode enviar informações somente se o cliente solicitar.
Mais comumente, o BLE do ESP32 é usado como um servidor. Cada servidor terá um ou mais serviços dentro dele e, da mesma forma, cada serviço terá uma ou mais características associadas a ele. Uma característica pode ter zero, um ou mais de um descritor dentro dela. Cada serviço, característica ou descritor terá seu próprio ID exclusivo predefinido chamado UUID.
Cliente BLE: O cliente pode fazer a varredura, se conectar e ouvir outros dispositivos Bluetooth. Um exemplo seria seu telefone celular. Observe que a maioria dos dispositivos de hardware BLE pode funcionar como servidor e como cliente, é o software que decide a função do dispositivo.
Dispositivo Periférico / Dispositivo Central: Em uma rede BLE pode haver apenas um Dispositivo Central, mas pode ter quantos dispositivos Periféricos forem necessários. O Dispositivo Central pode se conectar a todos os dispositivos periféricos ao mesmo tempo, mas o dispositivo periférico pode se conectar apenas ao Dispositivo Central, desta forma dois dispositivos periféricos não podem compartilhar dados entre si. Um melhor exemplo para o dispositivo Central serão nossos telefones inteligentes e para o dispositivo periférico serão nosso fone de ouvido Bluetooth ou pulseiras de fitness.
Publicidade BLE: A publicidade BLE é o termo geeky para instruir o dispositivo Bluetooth a ser visível a todos para que possa emparelhar e estabelecer uma conexão. Pode ser considerada uma comunicação unilateral. Aqui, o servidor continua anunciando dados esperando que um servidor os receba. BLE Beacon é um tipo de BLE.
UUID (Identificador Único Universal): Cada dispositivo BLE Bluetooth recebe um Número Identificador Único Universal quando programado pelo programador. Você pode pensar neste identificador como uma sequência de números que representa a funcionalidade / função do dispositivo BLE. Novamente, existem dois tipos de UUID. Um é o UUID de serviço e o outro é o UUID característico.
Serviço GATT: GATT significa Generic Attribute Profile; isso define algumas maneiras padrão com as quais dois dispositivos BLE devem sempre se comunicar. Este protocolo de atributo (ATT) é pré-definido e é comum para todos os dispositivos BLE, dessa forma, quaisquer dois dispositivos BLE podem se identificar. Então o GATT foi a resposta à nossa pergunta anterior.
A técnica pela qual dois dispositivos BLE devem enviar dados para e para frente é definida pelo conceito denominado serviços e características.
Serviço BLE / característica BLE: O UUID de serviço nos diz que tipo de serviço o dispositivo BLE vai realizar e o UUID de característica diz quais são os parâmetros ou funções que serão executados por esse serviço. Portanto, cada serviço terá uma ou mais características sob eles. OK! De onde o programador obtém esse UUID? Todo UUID já está definido pelo GATT (Generic Attribute Profile), você pode visitar o site deles e selecionar o UUID conforme necessário para o projeto. Eu sei que saltou um pouco sobre nossa cabeça; vamos tentar entender com um exemplo.
Vamos supor o dispositivo BLE de um reprodutor de áudio. Inicialmente, quando você o emparelha com o telefone, o telefone o identifica como um dispositivo de áudio e também exibe o nível da bateria na barra de status. Então, para que isso aconteça, o reprodutor de áudio precisa de alguma forma informar ao telefone que ele está disposto a compartilhar o nível da bateria e a porcentagem de carga que contém. Isso é feito usando o UUID, há um UUID específico que informa que o dado BLE fornecerá detalhes sobre o nível de bateria. Este UUID que informa o tipo de serviço é chamado de UUID de serviço, novamente pode haver tantos parâmetros ser trocado por completar um serviço se o valor da bateria estiver em tal parâmetro, cada parâmetro terá seu próprio UUID e estes são chamados de UUID de Característica.A função comum realizada por uma característica é Ler, Gravar, Notificar e Indicar.
Descritor BLE: O Descritor é um atributo opcional que está presente dentro da Característica. Um Descritor normalmente especifica como acessar uma Característica.
BLE Beacon: Um Bluetooth Beacon é mais como um interruptor de proximidade que executa alguma ação predefinida quando o usuário entra em um alcance (proximidade). Ele anuncia sua identidade o tempo todo e, portanto, está sempre pronto para formar pares.
BLE2902: Ainda sou cético em relação a isso, mas você pode pensar nisso como um pedaço de software no lado do cliente que informa o servidor para ligar ou desligar a notificação, isso nos ajudará a economizar energia
Espero que você tenha uma ideia aproximada, o bom é que não precisamos saber muito, pois todo o trabalho manual já está feito para nós através das bibliotecas.
Preparando o hardware
O projeto não requer configuração de hardware, mas certifique-se de ter adicionado os detalhes da placa ESP32 em seu IDE Arduino e de ter tentado um programa de amostra mínima para verificar se tudo está funcionando conforme o esperado. Se você estiver cético sobre como fazer isso, siga o tutorial Getting started with ESP32 with Arduino para fazer o mesmo.
Também para testar os serviços BLE estaremos usando o aplicativo android nRF em nosso celular que pode ser baixado diretamente da PlayStore. Também está disponível na iTunes Store para usuários de Iphone. Se você está planejando trabalhar com BLE por um longo tempo, este aplicativo será realmente útil para fins de depuração.
Programação de ESP32 para indicação de nível de bateria usando o serviço GATT
A esta altura, suponho que você tenha uma boa ideia sobre o serviço do GATT e como ele é implementado usando o serviço e os modelos característicos. Agora, vamos mergulhar no programa para aprender como ele é implementado no ESP32 usando o IDE do Arduino. Antes de continuarmos, gostaria de usar este espaço para agradecer a Andreas Spiess por seu vídeo BLE, que deixou as coisas muito claras do meu lado.
Começamos o programa importando as bibliotecas necessárias para o nosso esboço. Há muitas coisas a serem configuradas para usar a funcionalidade BLE do ESP32, felizmente graças a Neil Kolban, que já fez o trabalho duro por nós e forneceu as bibliotecas. Se você quiser entender a funcionalidade das bibliotecas, pode consultar sua documentação na página do github.
#incluir
Em seguida, temos que definir a função de retorno de chamada do servidor para nosso dispositivo Bluetooth. Antes disso, vamos entender o que é a função de retorno de chamada no BLE.
O que é a função de retorno de chamada no BLE?
Quando BLE está operando como Servidor, é importante definir uma função de retorno de chamada do Servidor. Existem muitos tipos de retornos de chamada associados ao BLE, mas, para simplificar, você os considera como uma confirmação realizada para garantir que a ação foi concluída. Um retorno de chamada do servidor é usado para garantir que a conexão entre o cliente e o servidor seja estabelecida com êxito.
Usamos as seguintes linhas de código para realizar um retorno de chamada do servidor.
bool _BLEClientConnected = false; classe MyServerCallbacks : public BLEServerCallbacks { void onConnect (BLEServer * pServer) { _BLEClientConnected = true; }; void onDisconnect (BLEServer * pServer) { _BLEClientConnected = false; } };
Dentro da função de configuração vazia , iniciamos a comunicação serial em 115200 para depuração e, em seguida, inicializamos o dispositivo Bluetooth por meio da função InitBLE .
configuração vazia () { Serial.begin (115200); Serial.println ("Indicador de nível de bateria - BLE"); InitBLE (); }
O initBLE é o lugar onde toda a mágica acontece. Temos que criar um servidor Bluetooth e usar o serviço de nível de bateria aqui. Mas antes temos que definir o UUID para Serviço, Característica e Descritor para leitura do Nível da bateria. Todos os UUIDs podem ser obtidos no site de serviço Bluetooth GATT. Para nosso caso, estamos tentando usar o serviço de bateria e UUID para ele é definido como 0X180F conforme mostrado abaixo.
A seguir, precisamos saber a característica associada a este serviço. Para saber isso basta clicar em Battery Service e você será levado à página Service Characteristics, onde se menciona que Battery Level é o nome das características e leva no valor de 0 a 100. Observe também que podemos realizar apenas duas ações com essa característica, uma é Ler, que é obrigatória, e a outra, Notificar, que é opcional. Portanto, temos que enviar o valor da bateria para o cliente (telefone) que é obrigatório e se necessário podemos avisar o telefone sobre o que é opcional.
Mas espere, ainda não encontramos o valor UUID para o nível de bateria característico. Para fazer isso entre na página Battery Characteristic e procure pelo nome do Battery Level, você encontrará seu UUID como 0X2A19, o instantâneo do mesmo é mostrado abaixo.
Agora que temos todos os valores, vamos colocá-lo no programa conforme mostrado abaixo. O nome BatterySerivce , BatteryLevelCharacteristic e BatteryLevelDescriptor são variáveis definidas pelo usuário para se referir ao serviço, característico e Descriptor que estamos usando no programa. O valor para o descritor 0X2901 é usado quando o tamanho do valor é de 8 bits, mais informações podem ser encontradas na página Descrição do descritor.
#define BatteryService BLEUUID ((uint16_t) 0x180F)
BLECharacteristic BatteryLevelCharacteristic (BLEUUID ((uint16_t) 0x2A19), BLECharacteristic :: PROPERTY_READ - BLECharacteristic :: PROPERTY_NOTIFY); BLEDescriptor BatteryLevelDescriptor (BLEUUID ((uint16_t) 0x2901));
Voltando à função initBLE . Primeiro, temos que iniciar o servidor BLE e fazer com que ele anuncie com um nome. As linhas a seguir são usadas para iniciar o BLE como servidor. O nome que dei ao meu servidor BLe é “BLE Battery”, mas você pode escolher o seu.
BLEDevice:: init ("Bateria BLE"); // Cria o servidor BLE BLEServer * pServer = BLEDevice:: createServer (); pServer-> setCallbacks (new MyServerCallbacks ());
Em seguida, temos que iniciar o serviço GATT, pois já definimos o UUID, podemos simplesmente iniciar o serviço usando a linha abaixo.
// Cria o serviço BLE BLEService * pBattery = pServer-> createService (BatteryService);
Assim que o serviço for iniciado, podemos vincular o descritor às características e definir os valores. O serviço BLE2902 também é adicionado aqui, conforme mostrado abaixo.
pBattery-> addCharacteristic (& BatteryLevelCharacteristic); BatteryLevelDescriptor.setValue ("Porcentagem 0 - 100"); BatteryLevelCharacteristic.addDescriptor (& BatteryLevelDescriptor); BatteryLevelCharacteristic.addDescriptor (new BLE2902 ());
Finalmente tudo está definido, agora tudo o que resta é pedir ao ESP32 para anunciar para que outros dispositivos como o nosso telefone possam descobri-lo e se conectar a ele, e quando conectado a um cliente ele deve iniciar o serviço de bateria que pode ser feito através do seguintes linhas.
pServer-> getAdvertising () -> addServiceUUID (BatteryService); pBattery-> start (); // Comece a anunciar pServer-> getAdvertising () -> start ();
Até ai tudo bem, o último passo é informar ao descritor qual é o valor da bateria em porcentagem que deve ser enviada para o cliente (Telefone). Este valor pode ser de 0 a 100 como lemos antes, para manter as coisas simples, eu codifiquei o valor da bateria para 57 e, em seguida, incremento a cada 5 segundos e comece de 0 quando atingir 100. isso é mostrado abaixo. Observe que o valor que está sendo enviado está no formato unit8_t.
nível uint8_t = 57; void loop () { BatteryLevelCharacteristic.setValue (& level, 1); BatteryLevelCharacteristic.notify (); atraso (5000); nível ++; Serial.println (int (nível)); if (int (nível) == 100) nível = 0; }
Testando seu serviço GATT em ESP32 BLE
O código completo explicado acima é fornecido no final da página. Faça upload do código para sua placa ESP32. Uma vez carregado, seu telefone deve descobrir um dispositivo Bluetooth chamado “Bateria BLE”. Emparelhe com ele.
Em seguida, instale o aplicativo Android nRF e abra-o e conecte-se ao dispositivo BLE Bateria BLE. Expanda a seção Serviço de bateria e você deverá encontrar a tela a seguir.
Como você pode ver o Aplicativo identificou automaticamente que o BLE fornece Serviço de Bateria e possui as características de Nível de Bateria devido ao UUID que usamos no programa. Você também pode ver que o valor atual da bateria é de 67%, aguarde 5 segundos e você também pode notar que está aumentando.
O legal de usar o BLE é que agora qualquer aplicativo que funcione com o BLE pensará que seu ESP32 é um dispositivo BLE que avisa o nível da bateria. Para experimentar, usei um aplicativo chamado BatON e o aplicativo identificou o ESP32 como um dispositivo Bluetooth alimentado por bateria e deu a notificação de porcentagem no meu telefone assim
Legal!! Direito? Também mostrei o trabalho completo no vídeo abaixo. Agora que você aprendeu a usar os serviços da bateria BLE com ESP32, também pode experimentar outros serviços GATT, que são muito interessantes, como frequência de pulso, HID, frequência cardíaca etc.