RaspberryPiとMacでWebSocket通信(Python3)

前回はRaspberryPiとMacをLANケーブルで繋ぎSocket通信を行う方法を紹介しました。

RaspberryPiとMacでSocket通信(Python3)

xp-cloud.jp

今回はここ数年流行りのWebSocketを行う方法を紹介します。

RaspberryPiとMacをLANケーブルで繋ぐか、Wi-Fiで同じルーターに接続しておいてください。

RaspberryPiでサーバー側の実装

まずWebSocketを扱うライブラリをインストールします。
検索すると色々出てくるのですが、今回はWebsocketServerを使用します。

次のコマンドで最新のライブラリがインストールできます。

python3 -m pip install git+https://github.com/Pithikos/python-websocket-server

RaspberryPiの適当なディレクトに下記ファイルを作成します。
MyWebSocketServer.py

  1. #!/usr/bin/env python3
  2. from websocket_server import WebsocketServer
  3. import time
  4. def start():
  5. # クライアントが接続してきた時のイベント
  6. def new_client(client, server):
  7. print('New client {}:{} has joined.'.format(client['address'][0], client['address'][1]))
  8. time.sleep(2)
  9. # クライアントへメッセージ送信
  10. server.send_message(client, 'from server 1st message in new_client')
  11. time.sleep(2)
  12. # クライアントへメッセージ送信
  13. server.send_message(client, 'from server 2st message in new_client')
  14. # クライアントが切断した時のイベント
  15. def client_left(client, server):
  16. print('Client {}:{} has left.'.format(client['address'][0], client['address'][1]))
  17. # クライアントからのメッセージを受信した時のイベント
  18. def message_received(client, server, message):
  19. print(message)
  20. time.sleep(2)
  21. # クライアントへメッセージ送信
  22. server.send_message(client, 'from server 1st message in message_received')
  23. time.sleep(2)
  24. # クライアントへメッセージ送信
  25. server.send_message(client, 'from server 2st message in message_received')
  26. # 10005番ポートでサーバーを立ち上げる
  27. server = WebsocketServer(port=10005, host='0.0.0.0')
  28. # イベントで使うメソッドの設定
  29. server.set_fn_new_client(new_client)
  30. server.set_fn_client_left(client_left)
  31. server.set_fn_message_received(message_received)
  32. # 実行
  33. server.run_forever()
  34. if __name__ == "__main__":
  35. start()

Macでクライアント側の実装

Macの適当なディレクトに下記ファイルを作成します。
MyWebSocketClient.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <script src="http://code.jquery.com/jquery-latest.min.js"></script>
  5. <script>
  6. $(function(){
  7. // RaspberryPiへ10005番ポートで接続
  8. var ws = new WebSocket("ws://raspberrypi.local:10005/");
  9. // サーバーからのメッセージ受信時のイベント
  10. ws.onmessage = function(message){
  11. $('textarea').val($('textarea').val() + message.data + '\n')
  12. }
  13. setTimeout(function(){
  14. // サーバーへメッセージ送信
  15. ws.send('from html');
  16. }, 6000)
  17. })
  18. </script>
  19. </head>
  20. <body>
  21. <textarea style="width:400px;height:100px"></textarea>
  22. </body>
  23. </html>

サーバー側の実行

RaspberryPiでサーバー側を実行します。

sudo を付けないとMac側から接続できないので注意が必要です。

sudo python3 MyWebSocketServer.py

クライアント側の実行

Macでクライアント側を実行します。
といってもHTMLファイルをブラウザで開くだけです。

実際の動き

実際の動き

  1. HTMLをリロードした途端、RaspberryPi(サーバー)へ接続
  2. RaspberryPi(サーバー)からMac(クライアント)へメッセージを2回送信
  3. Mac(クライアント)からRaspberryPi(サーバー)へメッセージを送信
  4. RaspberryPi(サーバー)からMac(クライアント)へメッセージを2回送信

という流れが確認できます。

 

 

 

アプリケーション開発バナー

AWS相談会バナー