11.3. O rádio e a camada de enlace¶
As duas camadas inferiores da pilha BLE são quase inteiramente automáticas do ponto de vista do Python – o silício do rádio e as camadas sobre as quais o MicroPython é executado cuidam de tudo, desde escolher um canal até retransmitir um pacote perdido. Três das escolhas que elas fazem ainda transparecem na API voltada ao usuário: potência, alcance e throughput.
11.3.1. O rádio¶
O BLE usa a mesma banda Industrial-Científica-Médica (ISM) de 2,4 GHz que o Wi-Fi, os fornos de micro-ondas e a maioria das outras tecnologias sem fio de curto alcance. A banda é dividida em 40 canais de 2 MHz de largura.
Três dos 40 canais são reservados para anúncio – transmissões curtas que anunciam a presença de um dispositivo a quem estiver ouvindo. Eles são espaçados ao longo da banda para que um ouvinte possa varrer os três rapidamente e para que a interferência em qualquer um deles dificilmente tire o dispositivo do ar por completo.
Trinta e sete são canais de dados. Depois que dois dispositivos se conectam, eles trocam pacotes nesses canais, saltando entre eles em uma sequência pseudoaleatória que os dois lados acordam no momento da conexão. O salto de frequência adaptativo permite que qualquer um dos lados marque um canal como ruim (forte interferência de Wi-Fi, micro-ondas, rede BLE vizinha) para que a sequência o ignore.
Os 40 canais BLE na banda de 2,4 GHz. Três são para anúncio, o restante carrega tráfego em uma conexão aberta.¶
O rádio transmite pacotes breves – de no máximo alguns milissegundos de duração – e dorme entre eles. Esse sono é o que torna a tecnologia de baixa energia. Um peripheral BLE típico passa bem menos de um por cento do tempo realmente transmitindo; o resto é o rádio desligado entre eventos agendados.
11.3.2. A camada de enlace¶
A camada de enlace é a menor unidade do BLE que conversa com sua contraparte em outro dispositivo. Ela cuida de quatro tarefas.
Enquadramento de pacotes. Cada pacote carrega um cabeçalho curto (endereço de acesso ao canal, comprimento do pacote, bits de controle), um payload e um CRC. O receptor verifica o CRC e descarta qualquer coisa corrompida.
Endereçamento. Todo dispositivo BLE tem um endereço de dispositivo de 48 bits que o identifica no rádio. Alguns são públicos – um identificador de hardware que o fabricante atribuiu, rastreável para sempre. Alguns são aleatórios – gerados no dispositivo, rotacionados periodicamente e, opcionalmente, criptografados para que um bisbilhoteiro não consiga vincular duas transmissões ao mesmo hardware físico. Os endereços aparecem novamente em Anúncio e varredura.
Agendamento de conexão. Depois que dois dispositivos se conectam, a camada de enlace agenda eventos de rádio periódicos na sequência de saltos – separados por um intervalo de conexão fixo – e empacota em cada evento os dados que estiverem enfileirados na camada GATT acima. Ambos os lados voltam a dormir entre os eventos. O intervalo de conexão é um ajuste que a aplicação pode solicitar (veja Conexões).
Confiabilidade. Cada pacote em uma conexão é confirmado pelo outro lado. A camada de enlace retransmite qualquer coisa que não receba resposta, de modo que as camadas acima veem um fluxo de bytes ordenado e sem perdas. Ao contrário do UDP – envie um pacote e torça pelo melhor no lado das redes, o BLE não tem um modo não confiável separado no uso normal – cada pacote em uma conexão aberta é tentado novamente até chegar ou até que o enlace seja declarado perdido.
A camada de enlace também é onde a criptografia roda depois que um par de dispositivos acorda uma chave durante o emparelhamento (veja Pareamento e vinculação). Cada pacote em um enlace criptografado é descriptografado no receptor antes que as camadas acima sequer o vejam.
11.3.4. O que o Python vê de tudo isso¶
Quase nada. As APIs bluetooth e aioble não expõem canais, sequências de saltos, CRCs de pacote ou temporizadores de retransmissão; tudo isso é tratado dentro do port BLE e do rádio. As partes que de fato transparecem são aquelas que a negociação no momento da conexão expõe – intervalo de conexão, MTU, tipo de endereço.