11.3. Das Funkmodul und die Link-Schicht¶
Die untersten beiden Schichten des BLE-Stacks sind aus Sicht von Python nahezu vollständig automatisch – das Funk-Silizium und die Schichten, die MicroPython darüber betreibt, kümmern sich um alles, von der Wahl eines Kanals bis zum erneuten Senden eines verlorenen Pakets. Drei der Entscheidungen, die sie treffen, schimmern dennoch in die benutzerseitige API durch: Leistung, Reichweite und Durchsatz.
11.3.1. Das Funkmodul¶
BLE nutzt dasselbe 2,4-GHz-ISM-Band (Industrial-Scientific-Medical) wie Wi-Fi, Mikrowellenöfen und die meisten anderen Kurzstrecken-Funktechniken. Das Band ist in 40 Kanäle von je 2 MHz Breite aufgeteilt.
Drei der 40 Kanäle sind für Werbung reserviert – kurze Aussendungen, die die Anwesenheit eines Geräts an jeden Zuhörer ankündigen. Sie sind über das Band verteilt, sodass ein Zuhörer alle drei schnell durchsuchen kann und sodass eine Störung auf einem einzelnen Kanal das Gerät wahrscheinlich nicht völlig vom Netz nimmt.
Siebenunddreißig sind Daten-Kanäle. Sobald zwei Geräte verbunden sind, tauschen sie Pakete über diese aus und springen dabei zwischen ihnen nach einer pseudozufälligen Sequenz, die beide Seiten zum Verbindungszeitpunkt vereinbaren. Adaptive Frequenzsprung erlaubt jeder Seite, einen Kanal als schlecht zu markieren (starke Wi-Fi-Störung, Mikrowelle, benachbartes BLE-Netzwerk), sodass die Sequenz ihn überspringt.
Die 40 BLE-Kanäle im 2,4-GHz-Band. Drei sind für Werbung, der Rest trägt den Verkehr über eine offene Verbindung.¶
Das Funkmodul sendet kurze Pakete – höchstens ein paar Millisekunden lang – und schläft dazwischen. Dieser Schlaf ist es, der die Technologie energiesparend macht. Ein typisches BLE-Peripheral verbringt deutlich unter einem Prozent seiner Zeit mit tatsächlichem Senden; der Rest ist das Funkmodul, das zwischen geplanten Ereignissen abgeschaltet ist.
11.3.2. Die Link-Schicht¶
Die Link-Schicht ist die kleinste Einheit von BLE, die mit ihrem Gegenstück auf einem anderen Gerät kommuniziert. Sie erledigt vier Aufgaben.
Paketrahmung. Jedes Paket trägt einen kurzen Header (Channel Access Address, Paketlänge, Steuerbits), eine Nutzlast und eine CRC. Der Empfänger prüft die CRC und verwirft alles Beschädigte.
Adressierung. Jedes BLE-Gerät hat eine 48-Bit-Geräteadresse, die es im Funk identifiziert. Einige sind öffentlich – eine Hardware-Kennung, die der Hersteller zugewiesen hat, für immer nachverfolgbar. Einige sind zufällig – auf dem Gerät erzeugt, regelmäßig rotiert und optional verschlüsselt, sodass ein Lauscher zwei Übertragungen nicht derselben physischen Hardware zuordnen kann. Adressen kommen erneut in Advertising und Scanning vor.
Verbindungsplanung. Sobald zwei Geräte verbunden sind, plant die Link-Schicht periodische Funkereignisse auf der Sprungsequenz – ein festes Connection Interval auseinander – und packt alle aus der darüber liegenden GATT-Schicht in der Warteschlange befindlichen Daten in jedes Ereignis. Beide Seiten gehen zwischen den Ereignissen wieder schlafen. Das Connection Interval ist ein Regler, den die Anwendung anfordern kann (siehe Verbindungen).
Zuverlässigkeit. Jedes Paket auf einer Verbindung wird von der anderen Seite quittiert. Die Link-Schicht sendet alles erneut, was keine Antwort erhalten hat, sodass die darüber liegenden Schichten einen geordneten, verlustfreien Bytestrom sehen. Anders als UDP – sende ein Paket, hoffe auf das Beste auf der Networking-Seite hat BLE im Normalbetrieb keinen separaten unzuverlässigen Modus – jedes Paket auf einer offenen Verbindung wird wiederholt, bis es ankommt oder die Verbindung als verloren erklärt wird.
Die Link-Schicht ist auch dort, wo Verschlüsselung läuft, sobald sich ein Gerätepaar während des Pairings auf einen Schlüssel geeinigt hat (siehe Pairing und Bonding). Jedes Paket auf einer verschlüsselten Verbindung wird beim Empfänger entschlüsselt, bevor die darüber liegenden Schichten es überhaupt sehen.
11.3.4. Was Python von all dem sieht¶
Fast nichts. Die APIs bluetooth und aioble stellen weder Kanäle noch Sprungsequenzen, Paket-CRCs oder Retransmissions-Timer bereit; all das wird innerhalb des BLE-Ports und des Funkmoduls behandelt. Die Teile, die durchscheinen, sind diejenigen, die die Aushandlung zum Verbindungszeitpunkt freilegt – Connection Interval, MTU, Adresstyp.