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 vertical stack of five labelled boxes. From bottom to top: Physical (radio), Link Layer, GAP, GATT, Application. An arrow on the right points up the stack labelled "what we build". An arrow on the left points down the stack labelled "what is provided".

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