9.3. ケーブルとフレーム¶
スタックの最下位の2つの層は、カメラ上では当たり前のものとして見過ごしてしまいがちです。なぜなら、これらが行うすべての処理はチップ内部で完結し、Pythonコードを一切介さずにカメラが扱ってくれるからです。それでも、これらは「ローカルネットワーク」が何を意味するのか、そしてそれ以外のインフラとの境界がどこから始まるのかを説明してくれるため、簡単に見ておく価値があります。
9.3.1. 物理層¶
最下層は実際の信号伝送そのもの、つまり2つのデバイス間でビットを運ぶ配線、光ファイバー、または電波です。ツイストペアケーブル上のEthernetは、各ビットを一定のレートで電圧の遷移として符号化します。Wi-Fiは同じビットを2.4 GHzまたは5 GHz帯の無線搬送波に変調します。どちらも2つのハードウェア間に2進数のストリームを生成し、どちらもカメラのシリコンがソフトウェアに意識させることなく処理してくれる類の詳細です。
Pythonスクリプトの視点から見れば、物理層は「リンクがアップしている」か「リンクがダウンしている」かのいずれかです。network モジュールは、その状態をWi-Fiインターフェースの isconnected() メソッドを通じて、また有線Ethernetインターフェースではリンクステータスを通じて報告します。それ以外に、この層が行うことはすべて隠蔽されています。
9.3.2. リンク層¶
1つ上には リンク層 があります。これは、同じ物理セグメントを共有する2つのデバイス間でバイトのかたまり(フレーム)を送るためのルールです。リンク層は生の信号伝送の上に2つのものを追加します。
ハードウェアアドレス。 すべてのネットワークインターフェースには、MACアドレス(Media Access Control)と呼ばれる一意の48ビット識別子が付いています。Ethernetではチップに焼き込まれており、Wi-Fiでは無線モジュールに焼き込まれた同じ種類の識別子です。MACアドレスは、スイッチ(近くのデバイスが接続する複数のEthernetポートを備えた装置)が、あるフレームをどのポートから送出すべきかを判断するために使うものです。Wi-Fiアクセスポイントは、自身のチャンネル上の無線デバイスに対して同じ役割を果たします。
フレーミング。 上位層から渡されたバイトは、小さなヘッダ、ペイロード、そして末尾のチェックサムを持つフレームにパッケージ化されます。ヘッダには送信元と宛先のMACアドレスが含まれ、チェックサムによって受信側は転送中にバイトが破損したフレームを検出できます。チェックに失敗したフレームは黙って破棄されます。信頼性を気にする者は、それを上位層で取り戻さなければなりません。
ローカルセグメント とは、互いのフレームを直接見ることができるデバイスのグループのことです。1台のスイッチの有線ポート、1つのWi-Fiアクセスポイントに関連付けられたすべてのデバイス、または相互接続された小規模なスイッチのメッシュなどがこれにあたります。リンク層はそのセグメントを越えて到達することはできません。宛先が別のセグメント上にある場合、メッセージは直ちに上位層へ引き渡されなければなりません。
9.3.3. カメラが公開するもの¶
カメラは、持っているネットワークインターフェースごとにMACアドレスを持ちます。カメラに無線サポートがあればWi-Fi用のもの、ボードに対応するポートがあればEthernet用のものです。network モジュールは、アドレスを読み取る必要がある場合に、アプリケーションが使用しているインターフェースオブジェクト上で network_interface.config("mac") を通じてアクセスできるようにします。たとえばフリート管理システムにデバイスを登録するために、これを必要とするアプリケーションもあります。それ以外では、これがリンク層がPythonに委ねる唯一のつまみです。
それ以外のすべて、つまりフレーミング、配線上や空中での実際のMACトラフィック、どのチャンネルとレートを使うかについてのカメラとアクセスポイント間のネゴシエーションは、すべて無線またはEthernetハードウェアの内部で行われます。次のページ では、Pythonスクリプトがリンク層に関与できる唯一の場所、すなわちどのネットワークに参加するかをカメラに伝えることについて説明します。