11.1. なぜBluetoothなのか¶
ネットワーク接続は、カメラをWi-FiまたはEthernetネットワークに接続し、そこから到達可能なあらゆるものと通信できるようにします。廊下の先にあるノートPC、別の大陸にあるサーバー、モバイル回線を移動中のスマートフォンなどです。しかし、その到達範囲には前提条件が伴います。ネットワークが存在しなければなりません。何らかのアクセスポイントが電波の届く範囲にあり、何らかの認証情報が利用可能で、何らかのルーターがカメラにアドレスを割り当てる用意がなければなりません。さらにカメラは、リンクを維持するために無線(またはEthernetポート)を十分に稼働させ続ける必要があります。
Bluetoothは、その逆のケース、つまり短距離、インフラ不要、低消費電力という状況に対応します。同じ部屋にあるカメラとスマートフォンは、両者の間に何も介さない直接の無線リンクでデータを交換します。アクセスポイントもルーターも不要で、どちらの側もいかなるネットワークにも接続している必要がまったくありません。無線は短時間の活動の合間はほとんどオフの状態を保つため、Wi-Fiではかろうじて1日もたないようなバッテリーでも数か月稼働できます。
11.1.1. Bluetoothが適したツールである場合¶
カメラにおける一般的なケースは次のとおりです。
スマートフォンやタブレットがカメラとペアリングする。 近くにいるユーザーがスマートフォンでアプリを開き、両方のデバイスを同じWi-Fiネットワークに接続することなく、カメラを設定したり、ステータスを読み取ったり、結果をダウンロードしたりします。ほとんどのスマートフォンはBluetooth Low Energyをネイティブにサポートしているため、ユーザー体験は「まずこのネットワークに参加する」ではなく「アプリを開いて接続を押す」になります。
ウェアラブルやセンサーがカメラに報告する。 心拍数ストラップ、体温計、ビーコン、接点スイッチなどは、いずれもBluetooth Low Energyを中心に設計されたバッテリー駆動デバイスです。カメラはクライアントとして接続し、それらの値を読み取り、そのデータを実行中の他の処理に取り込みます。
カメラが小さなステータスフィードを公開する。 バッテリー残量、最後に検出したオブジェクト、フレームレートなど、いくつかの数値を、近くで読み取りたいものに公開します。ペアリングは任意で、機密性のないデータであれば、カメラは接続なしでその値を直接アドバタイズできます。
2台のカメラ(またはカメラとマイクロコントローラー)がネットワークなしでデータを共有する。 両端は互いを認識しており、両端は同じ建物内にあります。部屋を横切るためだけにバイトをクラウドまで送って戻す理由はありません。
11.1.2. 代わりにネットワーク接続が適したツールである場合¶
Bluetoothのトレードオフは、いくつかの一般的なケースには不向きです。
範囲外の相手。 Bluetooth Low Energyは実際には数メートル、見通しのよい空間でもせいぜい数十メートルです。建物の向こう側、街の向こう側、あるいはインターネットの向こう側にあるものには、Wi-FiまたはEthernetが必要です。
高帯域幅のリンク。 Bluetooth Low Energyは実際には数十キロビットから数百キロビット毎秒を提供します。フレームのストリーミングや意味のある映像には、Wi-Fiが必要です。
共有インフラ上での多対多のグループ通信。 すべてが1台のサーバーと通信するデバイスでいっぱいの部屋や、結果を共有するカメラのメッシュ、そういったパターンこそIPネットワークが想定して作られているものです。
11.1.3. Low Energyであってクラシックではない¶
日常的な使い方での「Bluetooth」は、2つの異なる無線スタックを指します。クラシックBluetoothは、ワイヤレスヘッドセット、車載オーディオ、キーボードやマウスのリンクに使われているもので、音声・オーディオ品質の無線、比較的複雑なスタック、そして無視できない消費電力を伴います。Bluetooth Low Energy(BLE)は、ブランド名と2.4 GHz帯を共有するものの、それ以外はほとんど共通点のない、別の新しいプロトコルです。平均消費電力を極小に抑えるための短く低頻度の無線バースト、そしてオーディオのストリーミングではなくキー/値のデータモデルを中心に構築されています。
カメラ上のMicroPythonはBLEのみをサポートします。クラシックBluetoothはAPIにまったく含まれていません。以下で「Bluetooth」と言う場合はBLEを意味します。
11.1.4. ネットワークモデルから何が変わるか¶
BLEはネットワーク接続と同じ5層スタックを持ちますが、上位層の動作が異なります。
「ソケットを開いてバイトを送る」という抽象化は存在しません。BLEは、一方の側がホストし、他方の側が読み取り、書き込み、またはサブスクライブする小さなキー/値データベースを中心に構築されています。カメラは名前付きの値(バッテリー残量、温度、コマンドレジスタ)を公開し、ピアはそれらを読み取ったり監視したりします。
名前によるアドレッシングは存在しません。デバイスは、自分が何者であるかを記述した短いブロードキャストをアドバタイズすることで自己を識別します。ピアはそれらのブロードキャストをスキャンし、接続する相手を1つ選びます。
無線はほとんどアイドル状態です。両端は接続時に、どれくらいの頻度で起動して通信するかを取り決めます。その合間は、両者ともスリープ状態に戻ります。
これら3つの違いが、BLE APIの残りの部分をソケットモデルから遠ざける要因となっています。