11.3. O rádio e a camada de ligação¶
As duas camadas inferiores da pilha BLE são quase inteiramente automáticas do ponto de vista do Python — o silício de rádio e as camadas em que o MicroPython é executado tratam de tudo, desde a escolha de um canal até à retransmissão de um pacote perdido. Três das escolhas que fazem ainda transparecem para a API orientada ao utilizador: potência, alcance e débito.
11.3.1. O rádio¶
O BLE utiliza a mesma banda Industrial-Científica-Médica (ISM) de 2,4 GHz que o Wi-Fi, os fornos micro-ondas e a maioria dos outros dispositivos sem fios de curto alcance. A banda está dividida em 40 canais com 2 MHz de largura.
Três dos 40 canais estão reservados para publicidade — transmissões curtas que anunciam a presença de um dispositivo a quem estiver a ouvir. Estão espaçados pela banda para que um ouvinte possa percorrê-los os três rapidamente e para que a interferência em qualquer um deles tenha pouca probabilidade de retirar o dispositivo do ar completamente.
Trinta e sete são canais de dados. Assim que dois dispositivos se ligam, trocam pacotes nestes canais, saltando entre eles numa sequência pseudo-aleatória acordada pelas duas partes no momento da ligação. O adaptive frequency hopping permite que qualquer dos lados marque um canal como mau (forte interferência 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 destinam-se à publicidade, os restantes transportam tráfego numa ligação aberta.¶
O rádio transmite pacotes breves — no máximo alguns milissegundos — e fica em modo de suspensão no intervalo. Essa suspensão é o que torna a tecnologia de baixo consumo. Um periférico BLE típico passa bem menos de um por cento do seu tempo a transmitir efetivamente; o resto é o rádio desligado entre eventos agendados.
11.3.2. A camada de ligação¶
A camada de ligação é a menor unidade do BLE que comunica com a sua contraparte noutro dispositivo. Trata de quatro tarefas.
Enquadramento de pacotes. Cada pacote transporta um cabeçalho curto (endereço de acesso ao canal, comprimento do pacote, bits de controlo), um payload e um CRC. O recetor verifica o CRC e descarta tudo o que estiver corrompido.
Endereçamento. Cada 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 atribuído pelo fabricante, rastreável para sempre. Alguns são aleatórios — gerados no dispositivo, rotacionados periodicamente e opcionalmente encriptados para que um intruso não consiga ligar duas transmissões ao mesmo hardware físico. Os endereços voltam a aparecer em Publicidade e pesquisa.
Agendamento de ligações. Assim que dois dispositivos se ligam, a camada de ligação agenda eventos de rádio periódicos na sequência de salto — separados por um intervalo de ligação fixo — e compacta todos os dados enfileirados da camada GATT acima em cada um. Ambos os lados voltam ao modo de suspensão entre eventos. O intervalo de ligação é um parâmetro que a aplicação pode solicitar (ver Ligações).
Fiabilidade. Cada pacote numa ligação é confirmado pelo outro lado. A camada de ligação retransmite tudo o que não obteve resposta, de modo que as camadas acima vejam um fluxo de bytes ordenado e sem perdas. Ao contrário do UDP – envia um pacote e torce para o melhor no lado da rede, o BLE não tem um modo não fiável separado em utilização normal — cada pacote numa ligação aberta é reenviado até chegar ou até a ligação ser declarada perdida.
A camada de ligação é também onde a encriptação é executada assim que um par de dispositivos concordou com uma chave durante o emparelhamento (ver Emparelhamento e vinculação). Cada pacote numa ligação encriptada é desencriptado no recetor antes de as camadas acima o verem.
11.3.4. O que o Python vê de tudo isto¶
Quase nada. As APIs bluetooth e aioble não expõem canais, sequências de salto, CRCs de pacotes ou temporizadores de retransmissão; estes são todos tratados dentro do port BLE e do rádio. As partes que transparecem são as que a negociação no momento da ligação expõe — intervalo de ligação, MTU, tipo de endereço.