ラズパイでWebSocket通信【Raspberry Pi/Python/JavaScript】



Raspberry Pi (以下、ラズパイ)をWebSocketサーバーにして同じローカルネットワーク内にいるMacBookから通信を試してみた。
WebSocketの理解を深めることが目的なので、前半ではHTMLとJavaScrpitを使ってとにかく簡単に通信を実装する。後半ではPythonでWebSocketクライアントを作り通信の仕組みに足をふみ込んでいく。





WebSocketサーバーのインストール


ラズパイに websocket-server をインストールする。
$ sudo pip install websocket-server



WebSocketサーバーからメッセージを受け取る


websocket-sever.py というファイル名で簡単なWebSocketサーバーを作ってみる。



hostにはラズパイのIPアドレスを設定する。
IPアドレスを調べるには、$ ifconfig を実行して wlan0inet に書かれているアドレスが自身のアドレスとなる。

$ python websocket-sever.py で実行すればサーバーが起動される。





HTMLでWebSocketクライアント作成


次にMac上で簡単なWebSocketクライアントを作って先ほどのラズパイのサーバーへ接続する。



これを websocket-client.html などとして適当な場所へ保存、Safariで実行してみよう。
Hello world! This is Raspberry Pi!
ラズパイで設定したメッセージがブラウザに表示されればWebSocketの通信成功だ。




WebSocketサーバーへメッセージを送る


今度はクライアントからサーバーへメッセージを送れるようにしていく。

まずはサーバーの websocket-sever.py を少し改造する。



クライアント側の websocket-client.html もメッセージを送信できるように少し改造した。



これで無事メッセージが送れた。


Raspberry Pi Zero W - ヘッダー ハンダ付け済み - ラズベリー・パイ ゼロ W ワイヤレス

Amazon




PythonでWebSocketクライアントを作る


ここまでやってみてWebSocketの通信は思いのほか簡単だった。しかし簡単すぎてこれではWebSocketの内部の理解がまったく深まらない。
そこでWebSocketクライアントのJavaScriptをやめて、pythonの scoket を使って通信をおこなっていく。

以下のようにHTTPリクエストを使ってWebSocketのハンドシェイクをする形になっている。
GET / HTTP/1.1
Host: 192.168.100.136
Connection: Upgrade
Sec-WebSocket-Key: vTu2gqiamRGo9gXd9dKbXg==
Sec-WebSocket-Version: 13
Upgrade: websocket


ここで Sec-WebSocket-Key というのは16byteのランダムな値をbased64でエンコードしたものである。サーバーとクライアントとのハンドシェイクの受信を立証するために必要なものだ。

リクエストをサーバーへ投げると以下のようにレスポンスが返ってくる。
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: Od7wpaRgvxXMSnWrv2qkQqREX7I=



このハンドシェイク後にいよいよWebSocketへ切り替わる仕組みとなっている。
WebSocketのデータフレームは次のようになっている。

RFC6455より
このデータフレームを1から作り上げていくのはシンドイので、こちらのソースを参考させてもらった。

実際にラズパイのWebSocketサーバーとの通信をPythonで書いたプログラムがこちら。

クライアントからサーバーへメッセージを送信するためのデーターフレーム以外はHTTPリクエストと同じなので理解しやすいと思う。

詳解 確率ロボティクス Pythonによる基礎アルゴリズムの実装

Sebastian Thrunらの名著『確率ロボティクス』の翻訳者であり、同分野の第一人者でもある、上田隆一氏が書き下ろす至極の入門書!理論→実装という一貫した流れで、丁寧に解説。まさにバイブル!

KindleAmazon




参考サイト


RFC6455 - The WebSocket Protocol
RFC6455 - The WebSocket Protocol (日本語訳)
WebSocketクライアント - Qiita
pythonでWebSocketサーバーを作ってみる - クイックノート
PythonでWebSocketのお勉強 | MUDAなことをしよう。




あなたにおすすめ