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.

Uma pilha vertical de cinco caixas rotuladas. De baixo para cima: Físico (rádio), Camada de Enlace, GAP, GATT, Aplicação. Uma seta à direita aponta para cima na pilha, rotulada "o que construímos". Uma seta à esquerda aponta para baixo na pilha, rotulada "o que é fornecido".

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