11.2. A pilha BLE¶
Assim como em redes, o Bluetooth Low Energy é construído como uma pilha de camadas, cada uma resolvendo um único problema e expondo uma abstração limpa para a camada acima. Os nomes a seguir vêm diretamente da especificação Bluetooth Core e aparecem nas APIs aioble e bluetooth.
A pilha Bluetooth Low Energy. Cada camada entrega uma abstração mais limpa à seguinte, o mesmo padrão que a pilha de redes usa.¶
Camada física. Move bits entre dois dispositivos pelo rádio de 2,4 GHz. Seleção de canal, modulação, potência de transmissão. O trabalho da câmera é estar ligada; o silício faz o resto.
Camada de enlace. Move pacotes entre dois dispositivos que concordam em conversar entre si. Adiciona endereços de dispositivo para que cada pacote possa ser direcionado a um vizinho, agenda os eventos de rádio periódicos que compõem uma conexão e lida com a retransmissão de qualquer pacote que o receptor não tenha confirmado.
Generic Access Profile (GAP). A camada de descoberta e conexão. Define quatro papéis – broadcaster, observer, peripheral, central – e o protocolo de anúncio / varredura que permite que dois dispositivos se encontrem em primeiro lugar, além do procedimento para abrir e fechar uma conexão entre eles. É aqui que residem os endereços, as cargas úteis de anúncio, os parâmetros de conexão e o pareamento.
Generic Attribute Profile (GATT). A camada de dados. Fica no topo de uma conexão GAP aberta e expõe um pequeno banco de dados chave/valor: um lado hospeda uma árvore de valores nomeados chamados características, o outro lado os lê, escreve ou se inscreve neles. É aqui que fluem os bytes reais da aplicação.
Aplicação. Tudo o que a câmera e o par concordarem que os bytes significam. O Bluetooth SIG publica perfis padrão – frequência cardíaca, nível de bateria, sensoriamento ambiental – que definem características comumente usadas para que dispositivos não relacionados possam interoperar, mas qualquer aplicação é livre para definir as suas próprias.
11.2.1. Como as camadas se empilham em tempo de execução¶
O padrão corresponde ao da pilha de redes:
Os bytes da aplicação vão para um valor de característica.
O GATT os envolve com um cabeçalho identificando a qual característica os bytes pertencem.
O GAP mantém uma conexão aberta em execução para que o GATT tenha para onde enviar.
A camada de enlace envolve tudo em um pacote, endereçado ao endereço de dispositivo do par, e agenda um evento de rádio para transmiti-lo.
A camada física transforma o pacote em uma breve rajada de rádio de 2,4 GHz.
A camada física e a camada de enlace são quase invisíveis a partir do Python – o silício e o firmware do rádio cuidam delas. Do GAP para cima, o código Python da câmera tem mais voz.
11.2.2. Duas camadas que a API voltada ao usuário discretamente pula¶
A especificação Bluetooth nomeia mais duas camadas que ficam entre a camada de enlace e o GAP/GATT: o Host Controller Interface (HCI) – o protocolo que a CPU do host usa para controlar um chip de rádio separado – e o L2CAP – o multiplexador que divide uma conexão de camada de enlace em vários canais lógicos.
Nenhuma delas é visível na API aioble, mas nenhuma desaparece. O HCI fica dentro do port BLE e é invisível, a menos que esteja em jogo uma compilação personalizada do MicroPython, e o L2CAP é o portador sobre o qual o GATT é executado. Uma aplicação que deseja fluxos de bytes brutos pode reivindicar seu próprio canal L2CAP (Canais L2CAP).