RaspberryPiとMacでSocket通信(Python3)

RaspberryPiとMacをLANケーブルで繋ぎ、双方向にSocketを使いデータ通信を行う方法をお伝えします。

Pythonだけで実装するのでMacでなく、WindowsLinuxでも大丈夫です。

LANケーブルは直接RaspberryPiとMacに繋いでも大丈夫ですが、
Wi-Fi等で同じルーターに繋いであるだけでも大丈夫です。

双方向にデータ通信できますが、処理の流れ上サーバー側はどちらかを決めなくてはいけません。

サーバー側とクライアント側は1:Nになるので、その辺りを踏まえて決めれば良いと思います。
今回はRaspberryPiをサーバーにしていきます。


処理イメージ
イメージ図

RaspberryPiでサーバー側の実装

RaspberryPiの適当なディレクトに下記ファイルを作成します。
MySocketServer.py
  1. #!/usr/bin/env python3
  2. import socket
  3. import time
  4. def start():
  5. with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as streamSocket:
  6. # 10000番ポートでサーバーを立ち上げる
  7. streamSocket.bind(('0.0.0.0', 10000))
  8. # 1クライアントだけ受け入れる
  9. streamSocket.listen(1)
  10. # クライアントからの接続待ち
  11. clientSocket, addr = streamSocket.accept()
  12. # クライアントへメッセージ送信
  13. clientSocket.sendall(b'from server 1st message')
  14. time.sleep(1)
  15. # クライアントへメッセージ送信
  16. clientSocket.sendall(b'from server 2st message')
  17. # クライアントからのメッセージ受信待ち
  18. byteData = clientSocket.recv(1024)
  19. print(byteData)
  20. # クライアントからのメッセージ受信待ち
  21. byteData = clientSocket.recv(1024)
  22. print(byteData)
  23. if __name__ == "__main__":
  24. start()

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

Macの適当なディレクトに下記ファイルを作成します。
MySocketClient.py
  1. #!/usr/bin/python3
  2. import socket
  3. import time
  4. def start():
  5. with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as streamSocket:
  6. # RaspberryPiへ10000番ポートで接続
  7. # ラズパイはデフォルトでraspberrypi.localというPC名が設定されています
  8. streamSocket.connect(('raspberrypi.local', 10000))
  9. # サーバーからのメッセージ受信待ち
  10. byteData = streamSocket.recv(1024)
  11. print(byteData)
  12. # サーバーからのメッセージ受信待ち
  13. byteData = streamSocket.recv(1024)
  14. print(byteData)
  15. time.sleep(1)
  16. # サーバーへメッセージ送信
  17. streamSocket.sendall(b'from client 1st message')
  18. time.sleep(1)
  19. # サーバーへメッセージ送信
  20. streamSocket.sendall(b'from client 2st message')
  21. if __name__ == "__main__":
  22. start()

サーバー側の実行

RaspberryPiでサーバー側を実行します
python3 MySocketServer.py

クライアント側の実行

Macでクライアント側を実行します
python3 MySocketClient.py

実際の動き

実際の動き Mac(クライアント)からRaspberryPi(サーバー)へメッセージを2回送信した後、
RaspberryPi(サーバー)からMac(クライアント)へメッセージを2回送信したのが確認できます。

今回はサーバー側からでもクライアント側からでも送信できることを確認するためにメッセージを2回づつ送受信しました。
実際に使用する時は受信側がWhile文でポーリングするのが一般的です。

 

 

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

AWS相談会バナー