質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1660閲覧

子プロセスで親プロセスと同様にwebsocketを利用する方法

dyrobin

総合スコア13

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/07/31 02:51

編集2021/07/31 10:54

①webブラウザに表示させたボタンをクリックすることでGPIOを入出力する(LEDを点灯消灯)
②GPIOの入力状態(スイッチでLEDを点灯消灯)をwebブラウザにリアルタイムに表示する

上記を実現するために、色々調べ、実験してきて、以下のコードにたどり着きました。

python

1testgpio.py 2#!/usr/bin/env python 3# coding:utf-8 4from websocket_server import WebsocketServer 5from time import sleep 6import RPi.GPIO as GPIO 7import time 8import subprocess 9 10cmd = [("/home/pi/dev/flask/websocket/testsub.py")] 11proc = subprocess.Popen(cmd) 12 13 14GPIO.setmode(GPIO.BCM) 15GPIO.setup(14, GPIO.OUT) 16GPIO.setup(27, GPIO.IN, GPIO.PUD_DOWN) 17 18def receivedMessage(client, server, message): 19 print(message) 20 21 if message == 'led_on': 22 GPIO.output(14, True) 23 server.send_message_to_all("Hello world! This is Raspberry Pi!") 24 25 elif message == 'led_off': 26 GPIO.output(14, False) 27 else: 28 print("Unknown Message: {}".format(message)) 29 30server = WebsocketServer(9001, host="192.168.43.57") 31server.set_fn_message_receiv 32

python

1testsub.py 2#!/usr/bin/env python 3# coding:utf-8 4from websocket_server import WebsocketServer 5from time import sleep 6import RPi.GPIO as GPIO 7import time 8 9GPIO.setmode(GPIO.BCM) 10GPIO.setup(14, GPIO.OUT) 11GPIO.setup(27, GPIO.IN, GPIO.PUD_DOWN) 12 13while True: 14 if GPIO.input(27) == 0: 15 16 print("LED消灯中") 17 time.sleep(1) 18 server = WebsocketServer(9001, host="192.168.43.57") 19 server.send_message_to_all("LED消灯中") 20 21 22 elif GPIO.input(27) == 1: 23 print("LED点灯中") 24 time.sleep(1) 25 server = WebsocketServer(9001, host="192.168.43.57") 26 server.send_message_to_all("LED消灯中") 27

html

1<html> 2<head> 3 <script src="http://code.jquery.com/jquery-latest.min.js"> 4 </script> 5 <script> 6 $(function(){ 7 var ws = new WebSocket("ws://192.168.43.57:9001/"); 8 $('#btn').on('click', function () { 9 if($('#btn').text() == "OFF") { 10 $('#btn').text("ON") 11 ws.send('led_on'); 12 } else { 13 $('#btn').text("OFF") 14 ws.send('led_off'); 15 } 16 }); 17 18 ws.onmessage = function (message) { 19 $('#test').append(message.data); 20 $('#test').css('background-color', 'red'); 21 }; 22 }) 23 </script> 24 <style> 25 #btn{ 26 width: 500px; 27 height: 200px; 28 font-size: 100px; 29 } 30 #test{ 31 display: inline-block; 32 height:40px; 33 width:1000px; 34 font-size: 40px; 35 margin-right: 500px; 36 margin-bottom: 100px; 37 margin-top: 10px; 38 } 39 #name{ 40 width: 500px; 41 height: 70px; 42 font-size: 60px; 43 margin-top: 50px; 44 } 45 </style> 46</head> 47<body> 48 <button id="btn">OFF</button> 49 <div id="name">メッセージ</div> 50 <div id="test"></div> 51 52</body> 53</html> 54

しかし、以下のエラーが出力されます。
Traceback (most recent call last):
File "/home/pi/dev/flask/websocket/testsub.py", line 19, in <module>
server = WebsocketServer(9001, host="192.168.43.57")
File "/usr/local/lib/python2.7/dist-packages/websocket_server/websocket_server.py", line 123, in init
TCPServer.init(self, (host, port), WebSocketHandler)
File "/usr/lib/python2.7/SocketServer.py", line 420, in init
self.server_bind()
File "/usr/lib/python2.7/SocketServer.py", line 434, in server_bind
self.socket.bind(self.server_address)
File "/usr/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 98] Address already in use

①は実現できておりますが、②がどうしても実行できません。
上記エラーの解決、もしくはそもそもの正しい実現方法などのご意見を頂けないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まずpythonサーバーのポートが被ってますので被らないように設定する必要があります。
あとはpythonサーバーを1つにまとめるかJSクライアントを2つにするかですかね。

JSクライアントを2つにする

<script> $(function(){ var ws1 = new WebSocket("ws://192.168.43.57:9001/"); var ws2 = new WebSocket("ws://192.168.43.57:9002/"); $('#btn').on('click', function () { if($('#btn').text() == "OFF") { $('#btn').text("ON") ws1.send('led_on'); } else { $('#btn').text("OFF") ws1.send('led_off'); } }); ws2.onmessage = function (message) { $('#test').append(message.data); $('#test').css('background-color', 'red'); }; }) </script>

testsub.pyの例

python

1 2#!/usr/bin/env python 3# coding:utf-8 4from websocket_server import WebsocketServer 5from time import sleep 6import RPi.GPIO as GPIO 7import time 8 9GPIO.setmode(GPIO.BCM) 10GPIO.setup(14, GPIO.OUT) 11GPIO.setup(27, GPIO.IN, GPIO.PUD_DOWN) 12 13 14def sendMessage(client, server): 15 while True: 16 if GPIO.input(27) == 0: 17 print("LED消灯中") 18 time.sleep(1) 19 20 elif GPIO.input(27) == 1: 21 print("LED点灯中") 22 time.sleep(1) 23 24server = WebsocketServer(9002, host="192.168.43.57") 25server.set_fn_new_client(sendMessage) 26server.run_forever()

投稿2021/07/31 05:31

編集2021/08/01 08:41
holy_

総合スコア364

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dyrobin

2021/07/31 10:53

ご回答ありがとうございます。 1つ目pyスクリプトと2つ目スクリプト、 ポート番号が9001になっているので、被らないようにということですね。 pythonサーバーを一つにする、もしくはjsを一つにする(html側?)とは、 どういうことでしょうか… 教えて頂けませんか。
holy_

2021/07/31 11:23

pythonサーバーを一つにするのはtestgpio.pyとtestsub.pyの処理をまとめて同じスクリプトに書くことで JSクライアントを2つにするのは例を提示しました。
dyrobin

2021/08/01 07:38

ご回答ありがとうございます。 とりあえずは、JSクライアントを2つにする方法で、下記スクリプに書き換えて実行しました。 testgpio.py !/usr/bin/env python # coding:utf-8 from websocket_server import WebsocketServer from time import sleep import RPi.GPIO as GPIO import time import subprocess cmd = [("/home/pi/dev/flask/websocket/testsub.py")] proc = subprocess.Popen(cmd) GPIO.setmode(GPIO.BCM) GPIO.setup(14, GPIO.OUT) GPIO.setup(27, GPIO.IN, GPIO.PUD_DOWN) def receivedMessage(client, server, message): print(message) if message == 'led_on': GPIO.output(14, True) server.send_message_to_all("Hello world! This is Raspberry Pi!") elif message == 'led_off': GPIO.output(14, False) else: print("Unknown Message: {}".format(message)) server = WebsocketServer(9001, host="192.168.43.57") server.set_fn_message_received(receivedMessage) server.run_forever() testsub.py #!/usr/bin/env python # coding:utf-8 from websocket_server import WebsocketServer from time import sleep import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(14, GPIO.OUT) GPIO.setup(27, GPIO.IN, GPIO.PUD_DOWN) while True: if GPIO.input(27) == 0: print("LED消灯中") time.sleep(1) server = WebsocketServer(9002, host="192.168.43.57") server.send_message_to_all("LED消灯中") elif GPIO.input(27) == 1: print("LED点灯中") time.sleep(1) server = WebsocketServer(9002, host="192.168.43.57") server.send_message_to_all("LED点灯中") server.run_forever() html <script> $(function(){ var ws1 = new WebSocket("ws://192.168.43.57:9001/"); var ws2 = new WebSocket("ws://192.168.43.57:9002/"); $('#btn').on('click', function () { if($('#btn').text() == "OFF") { $('#btn').text("ON") ws1.send('led_on'); } else { $('#btn').text("OFF") ws1.send('led_off'); } }); ws2.onmessage = function (message) { $('#test').append(message.data); $('#test').css('background-color', 'red'); }; }) </script> 上記のように、ご教示頂いた内容で書き換えましたが、やはり下記同様のエラーが出力されます。 Traceback (most recent call last): File "/home/pi/dev/flask/websocket/testsub.py", line 19, in <module> server = WebsocketServer(9002, host="192.168.43.57") File "/usr/local/lib/python2.7/dist-packages/websocket_server/websocket_server.py", line 123, in __init__ TCPServer.__init__(self, (host, port), WebSocketHandler) File "/usr/lib/python2.7/SocketServer.py", line 420, in __init__ self.server_bind() File "/usr/lib/python2.7/SocketServer.py", line 434, in server_bind self.socket.bind(self.server_address) File "/usr/lib/python2.7/socket.py", line 228, in meth return getattr(self._sock,name)(*args) socket.error: [Errno 98] Address already in use 申し訳ございませんが、エラーとなる原因など引き続きご意見頂けないでしょうか。
holy_

2021/08/01 08:43

エラーの原因は同じく同じポートでサーバを立てようとしているのでエラーが起きてます。 コードを追記いたしましたので参考にしてみてください
dyrobin

2021/08/01 09:31

無事、意図した動作ができました! ご回答ありがとうございました。 後学のために、よろしければ教えて頂きたいのですが、 最初はtestgpio.pyとtestsub.pyの処理をまとめて同じスクリプトに書く方法であれこれ考えていました。 しかし、前者のwhile Trueのループと後者のwhile Trueのループ、2つのループを同一スクリプトで同時実行できないのではないか?という結論に思い至り、サブプロセス(子プロセス)を使用してスクリプトを分けました。 2つのスクリプトをまとめて処理をするコードについて、考え方やコード例を教えて頂けないでしょうか。。。
dyrobin

2021/08/01 10:32

なるほど、asyncioで実現できるのですね。 挑戦してみます、回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問