11.3. 無線とリンク層¶
BLE スタックの下位 2 層は、Python から見るとほぼ完全に自動です -- 無線シリコンと、MicroPython がその上で動作するレイヤが、チャネルの選択から失われたパケットの再送まですべてを処理します。それらが行う選択のうち 3 つは、それでもユーザー向け API に現れます: 電力、到達範囲、そしてスループットです。
11.3.1. 無線¶
BLE は、Wi-Fi、電子レンジ、その他ほとんどの短距離無線と同じ 2.4 GHz の Industrial-Scientific-Medical(ISM)帯を使用します。この帯域は幅 2 MHz の 40 チャネルに分割されています。
40 チャネルのうち 3 つ は アドバタイジング 用に予約されています -- デバイスの存在を、聞いている誰にでも知らせる短いブロードキャストです。これらは帯域全体に分散して配置されているため、リスナーは 3 つすべてを素早くスイープでき、また、どれか 1 つに干渉があってもデバイスが完全に通信不能になる可能性は低くなります。
37 個 は データ チャネルです。2 つのデバイスが接続すると、これらの上でパケットを交換し、接続時に両側で合意した疑似ランダム列に従ってチャネル間をホッピングします。適応周波数ホッピング により、どちらの側もチャネルを不良(Wi-Fi の強い干渉、電子レンジ、近隣の BLE ネットワーク)としてマークでき、その列はそれをスキップします。
2.4 GHz 帯上の 40 個の BLE チャネル。3 つはアドバタイジング用で、残りは開いた接続上のトラフィックを運びます。¶
無線は短いパケット -- 最大でも数ミリ秒の長さ -- を送信し、その間はスリープします。そのスリープこそが、この技術を 低エネルギー たらしめているものです。一般的な BLE peripheral が実際に送信に費やす時間は 1 パーセントを十分に下回り、残りはスケジュールされたイベントの合間に無線の電源を切っている状態です。
11.3.2. リンク層¶
リンク層は、別のデバイス上の相手と通信する BLE の最小単位です。4 つの仕事を担います。
パケットフレーミング。 各パケットは、短いヘッダ(チャネルアクセスアドレス、パケット長、制御ビット)、ペイロード、そして CRC を運びます。受信側は CRC をチェックし、破損したものはすべて破棄します。
アドレッシング。 すべての BLE デバイスは、無線上でそれを識別する 48 ビットの デバイスアドレス を持ちます。一部は public -- メーカーが割り当てたハードウェア識別子で、永久に追跡可能です。一部は random -- デバイス上で生成され、定期的にローテーションされ、オプションで暗号化されるため、盗聴者は 2 つの送信を同じ物理ハードウェアに結びつけることができません。アドレスは アドバタイジングとスキャン で再び登場します。
接続スケジューリング。 2 つのデバイスが接続すると、リンク層はホッピング列上で定期的な無線イベントを -- 一定の 接続インターバル 間隔で -- スケジュールし、上位の GATT 層からキューに入れられたデータを各イベントに詰め込みます。両側はイベント間で再びスリープします。接続インターバルは、アプリケーションが要求できるつまみです(接続 を参照)。
信頼性。 接続上の各パケットは、相手側によって確認応答されます。リンク層は応答を得られなかったものをすべて再送するため、上位レイヤには順序の保たれた損失のないバイトストリームが見えます。ネットワーキング側の UDP -- パケットを送って最善を祈る とは異なり、BLE は通常の使用において別個の非信頼モードを持ちません -- 開いた接続上のすべてのパケットは、到着するか、リンクが失われたと宣言されるまで再試行されます。
リンク層はまた、ペアリング中にデバイスのペアが鍵に合意した後に 暗号化 が実行される場所でもあります(ペアリングとボンディング を参照)。暗号化されたリンク上のすべてのパケットは、上位レイヤが見る前に受信側で復号されます。
11.3.4. Python にはこのすべてのうち何が見えるか¶
ほとんど何も見えません。bluetooth および aioble API は、チャネル、ホッピング列、パケット CRC、再送タイマーを公開しません。それらはすべて BLE ポートと無線の内部で処理されます。実際に 現れる 部分は、接続時のネゴシエーションが公開するもの -- 接続インターバル、MTU、アドレスタイプ -- です。