9.1. なぜネットワークが必要か

ハードウェア制御は、特定の別のワイヤ上にある特定の別のデバイスと通信する手段をカメラに与えてくれました。カメラと 1 台の付随ボードとの間の UART。カメラと、同じ短いバスにぶら下がるセンサーとの間の I2C。1 本の堅牢なバスを共有する少数のモジュール間の CAN。いずれの場合も同じ形を取ります。2 者(または既知の小さなグループ)、1 つの共有媒体、そしてその媒体上のバイトが何を意味するかについての両者間の合意です。

9.1.1. その形はスケールしなくなる

ポイントツーポイントのパターンは、両端が近くにあり、両端が事前に分かっており、スクリプトがどのワイヤで通信するかを選べる限りは機能します。これらの制約のいずれかが崩れた途端、配線だけでは不十分になります。

  • 多数の相手。 1 台のサーバーに報告する 50 台のカメラのネットワークを 1 対 1 で配線することはできません。サーバーには十分な数の UART がなく、ケーブルの取り回しも不可能でしょう。

  • 同じワイヤ上にない相手。 工場にあるカメラと、町の向こうのオフィスにあるダッシュボードは、シリアルケーブルを共有できません。2 つの建物の間にすでに走っている何らかのインフラを通じて、両者の間に何らかの経路が存在しなければなりません。

  • 事前に分からない相手。 結果をクラウドに公開するカメラは、配線図の中でどのサーバーと通信するかを選ぶわけではありません。クラウドのアドレスは、スクリプトが実行時に調べてデータをルーティングする対象です。

  • 1 本のケーブル上の多数のプログラム。 今日のラップトップは、ブラウザ、チャットアプリ、ビデオ通話、バックアップを同時に実行しており、すべてが同じネットワークインターフェイスを通じて同時に通信しています。ワイヤは、UART のように 1 つの会話によって「占有」されることはありません。

これらの失敗のそれぞれが、異なる 種類 のアドレス指定問題です。それらすべてをまとめて解決するには、ワイヤとボーレート以上のものが必要です。

9.1.2. ネットワークとは何か

ネットワーク とは、各ペアが専用のリンクを必要とすることなく、多数のコンピュータのいずれもが他のいずれともメッセージを交換できるようにするインフラのことです。ネットワークを大きなシリアルケーブル以上のものにする 3 つの性質があります。

  • 共有媒体。 多数のデバイスが同じケーブル、スイッチ、または無線チャネルに接続します。複数の会話が同じ物理リンクに収まるよう、それらは順番を取るか多重化を行います。

  • 論理アドレス。 各デバイスは、どのケーブルに接続されているかとは無関係にそれを識別する番号を持ちます。メッセージを送るとは、特定のワイヤを接続することではなく、その番号をメッセージに書き込むことを意味します。

  • ルーティング。 送信側と受信側が同じローカルセグメント上にない場合、両者の にあるインフラがメッセージをホップごとに運びます。エンドポイントは経路を知りません。互いのアドレスを知っているだけです。

遠隔地のデータセンターにあるサーバーに到達するオフィスの Wi-Fi 上のラップトップは、この 3 つすべてを使っています。Wi-Fi リンクは共有された無線媒体であり、ラップトップとサーバーはそれぞれ自身の論理アドレスを持ち、メッセージは両者の間にあるインフラを縫って、1 ホップずつ転送されます。ユーザーがリンクをクリックすると、ラップトップがパケットを送り、残りはネットワークが処理します。

9.1.3. では、カメラはどうか?

カメラは、ラップトップとまったく同じ役割をネットワーク上で果たします。ネットワークに参加するときに論理アドレスを取得し、送出するメッセージを他のデバイスの論理アドレス宛てに指定し、インフラにそれらをルーティングさせます。

ハードウェア制御の各章から変わるのは インターフェイス です。UART インスタンスを開いてそこにバイトを書き込む代わりに、スクリプトは ソケット を開いてそこにバイトを書き込みます。ソケットはネットワークへのエンドポイントであり、UART インスタンスがワイヤへのエンドポイントであるのと同じです。ソケットとワイヤの間にある要素(フレーム、パケット、ルーティングテーブル、スイッチ、無線)はすべてその下層に位置し、Python コードからはほとんど見えません。

この先のページでは、それらの要素をレイヤごとに詳しく説明し、「ソケットを開いてバイトを送る」という抽象化が魔法ではなく必然に感じられるようにします。