› PaPeRo i 情報 › WebSocketの切断手順について
-
投稿者投稿
-
2017年9月13日 6:06 PM #1478まつやま参加者
いつもお世話になっております。
WebSocket通信アドオンと制御用Pythonライブラリを使わせていただいているのですが、RaspberryPi上のPythonスクリプトを終了して再度起動すると、WebSocket接続時に「Connection Refused」といったエラーが出ることがあります。
とくに、PaPeRo iが喋っている最中にスクリプトを終了すると、エラーが出がちです。おそらく、終了時に正しい切断の手順を踏んでいないためと思いますが、何か推奨される手順などありますでしょうか?
少しスクリプトに手を加え、終了時に
papero.papero_cleanup()
sleep(10)
papero = None
という処理を加えたところ、エラーの頻度はだいぶ減りましたが、たまに再接続ができないことがあります。もし何か情報等ございましたら、ご教示のほどよろしくお願いいたします。
02017年9月13日 8:30 PM #1479いつもお世話になっております。
私の場合、Windows上のPythonスクリプトのデバッグのための
WebSocket再接続は日常的に行っているのですが、接続失敗は
経験がありません。(手作業なのでタイミングが違うだけかも
しれませんが)また、アドオンシナリオ側は、常に新しい接続があったら
そちらに制御を切り替えるという思想で、正しく
終了することは一切期待していない作りですので、
スクリプト側の切断手順で解決出来る問題では無いと思われます。申し訳ありません、頂いた情報から考えると簡単には解決
できそうな気がしないのですが、アプリ側で一度接続した
WebSocketは保持するような再起動にするのは難しいでしょうか?もし難しい場合、
(1)RaspberryPiでの接続失敗時のtcpdumpなどのパケットログ
(2)現象が再現する単純化したPythonスクリプトの作成
(3)Windowsで再現するかどうかの調査
など、ご協力をお願い出来ませんでしょうか?大変申し訳ありませんが、よろしくお願いいたします。
02017年9月14日 12:16 AM #1480まつやま参加者takahashi様
さっそくお返事ありがとうございます。
WebSocket接続に失敗するときは、PaPeRo i本体も調子が悪いようで、しばらく放っておくとPaPeRo iのロボットサービス(?)が再起動します。(首が上下に動いて定位置に戻り、起動音が鳴ります)
そうすると、再びWebSocket接続もできるようになります。デバッグ用の情報につきましては、環境を作ってご提供できればと思いますが、とりいそぎ、接続失敗時のPythonのコンソール出力を以下に添付いたします。
Error in connect_paperoi():<class ‘ConnectionRefusedError’>[Errno 111] Connection refused(111, ‘Connection refused’)Traceback (most recent call last):
File “/home/pi/ancloud/r9paperoi.py”, line 33, in connect_paperoi
papero = pypapero.Papero(r9glob.simulator_id, r9glob.robot_name, r9glob.ws_server_addr)
File “/home/pi/ancloud/pypapero.py”, line 198, in __init__
self.ws.connect()
File “/usr/local/lib/python3.4/dist-packages/ws4py/client/__init__.py”, line 215, in connect
self.sock.connect(self.bind_addr)
ConnectionRefusedError: [Errno 111] Connection refused
(「r9paperoi.py」「connect_paperoi」はこちらで自作したものです。)このとき、PaPeRo i本体側でnetstat -anしてみると、ポート8088でLISTENしているソケットが無くなっているようでした。
エラー時刻周辺の/var/log/robotlog/messagesは以下の通りです。
Sep 14 00:05:30 aterm user.notice robot: speech.cpp[1050]startSpeech:[IN ]
Sep 14 00:05:30 aterm user.notice robot: speech.cpp[1257]startSpeech:[OUT] 0
Sep 14 00:05:35 aterm user.err robot: sce_websocket.cpp[702]scenarioSendCommandEx:[ERR] Fail To Send Command Message
Sep 14 00:05:35 aterm user.err kernel: [ 1952.116686] i2c-mcp2221 3-1.2.1:1.2: mcp2221(ll): wait interrupted
Sep 14 00:05:35 aterm user.err kernel: [ 1952.123031] i2c-mcp2221 3-1.2.1:1.2: mcp2221(ll): wait interrupted
Sep 13 15:05:35 aterm user.err kernel: [ 1952.129464] i2c-mcp2221 3-1.2.1:1.2: mcp2221(ll): wait interrupted
Sep 14 00:05:35 aterm user.err kernel: [ 1952.135830] i2c-mcp2221 3-1.2.1:1.2: mcp2221 wait_event_interruptible ERROR
Sep 14 00:10:01 aterm user.notice root: systemmanager not exist
Sep 14 00:10:01 aterm user.err root: systemmanager not exist
Sep 14 00:10:04 aterm user.notice root: S98-sound-ctrl stop
Sep 14 00:10:04 aterm user.notice root: firmware_reset現象の再現方法としては、たとえばsend_start_speech()で発話している最中に、PythonスクリプトをCtrl+Cで強制的に止めると、だいたい再現します(RaspberryPi上で実行しているとき)。
とはいえ、開発時にちょっと困ることがあるくらいで、リリース版ではスクリプトをCtrl+Cで止めるといったこともありませんので、急ぎ解決しなければならない問題でもございません。
お手すきのときにでも、ちらっとご確認いただけますと幸いです。
よろしくお願いいたします。02017年9月14日 9:55 AM #1481詳細な情報ありがとうございます。
なるほどsys_mgrが異常終了して接続出来なくなるということでしたか。
ご存知のことと思いますが、アドオンシナリオはdllでsys_mgrから
ロードされて実行されるので、sys_mgrプロセスが異常終了すれば
接続出来なくなるのは道理です。sys_mgrが死んでしまう現象は弊社でも経験があります。
アドオンシナリオが悪い可能性は当然あるのですが、ご呈示頂いた、
カーネルの出すi2c-mcp2221のエラー(USBがらみ?)と関連があるようで、
またsys_mgrをgdbから動作させても異常終了をとらえられず、
coreを吐かせることも出来ていないという状況です。
継続して調査は進めて参りますので、ご迷惑をお掛けして
大変申し訳ありませんが、よろしくお願いいたします。02017年9月19日 11:48 PM #1489まつやま参加者こんにちは。
続報…というほどではないですが、WebSocketの切断が確実に完了するように、というおまじないとして
pypapero.pyの108行目
papero.ws.close()
の下に
time.sleep(3)
を入れてみたところ、今のところ調子よく切断→再接続できるようになっております。RaspberryPi側から切断のリクエストを出したあと、PaPeRo i側から切断の返事を受け取るようになったため?かどうか分かりませんが、とりあえずご報告でした。
02017年10月31日 11:22 AM #1603本件は比較的単純なアドオンシナリオのバグでした。
修正版を公開しましたので更新をお願いします。
長らくご不便をお掛けし、大変申し訳ありませんでした。02017年11月14日 6:18 PM #1669まつやま参加者ご対応、誠にありがとうございました。
最新版のアドオンシナリオ(v0.0.4)と、最新のpypapero.py(Ver.1.01)を試しておりますが、問題無く稼働しております。
また何かありましたら、よろしくお願いいたします。
0 -
投稿者投稿
- このトピックに返信するにはログインが必要です。