WebSocketの切断手順について

PaPeRo i 情報 WebSocketの切断手順について

7件の投稿を表示中 - 1 - 7件目 (全7件中)
  • 投稿者
    投稿
  • #1478
    まつやま
    参加者

    いつもお世話になっております。

    WebSocket通信アドオンと制御用Pythonライブラリを使わせていただいているのですが、RaspberryPi上のPythonスクリプトを終了して再度起動すると、WebSocket接続時に「Connection Refused」といったエラーが出ることがあります。
    とくに、PaPeRo iが喋っている最中にスクリプトを終了すると、エラーが出がちです。

    おそらく、終了時に正しい切断の手順を踏んでいないためと思いますが、何か推奨される手順などありますでしょうか?

    少しスクリプトに手を加え、終了時に
    papero.papero_cleanup()
    sleep(10)
    papero = None
    という処理を加えたところ、エラーの頻度はだいぶ減りましたが、たまに再接続ができないことがあります。

    もし何か情報等ございましたら、ご教示のほどよろしくお願いいたします。

    0
    #1479
    takahashi@spi
    参加者

    いつもお世話になっております。

    私の場合、Windows上のPythonスクリプトのデバッグのための
    WebSocket再接続は日常的に行っているのですが、接続失敗は
    経験がありません。(手作業なのでタイミングが違うだけかも
    しれませんが)

    また、アドオンシナリオ側は、常に新しい接続があったら
    そちらに制御を切り替えるという思想で、正しく
    終了することは一切期待していない作りですので、
    スクリプト側の切断手順で解決出来る問題では無いと思われます。

    申し訳ありません、頂いた情報から考えると簡単には解決
    できそうな気がしないのですが、アプリ側で一度接続した
    WebSocketは保持するような再起動にするのは難しいでしょうか?

    もし難しい場合、
    (1)RaspberryPiでの接続失敗時のtcpdumpなどのパケットログ
    (2)現象が再現する単純化したPythonスクリプトの作成
    (3)Windowsで再現するかどうかの調査
    など、ご協力をお願い出来ませんでしょうか?

    大変申し訳ありませんが、よろしくお願いいたします。

    0
    #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で止めるといったこともありませんので、急ぎ解決しなければならない問題でもございません。

    お手すきのときにでも、ちらっとご確認いただけますと幸いです。
    よろしくお願いいたします。

    0
    #1481
    takahashi@spi
    参加者

    詳細な情報ありがとうございます。

    なるほどsys_mgrが異常終了して接続出来なくなるということでしたか。
    ご存知のことと思いますが、アドオンシナリオはdllでsys_mgrから
    ロードされて実行されるので、sys_mgrプロセスが異常終了すれば
    接続出来なくなるのは道理です。

    sys_mgrが死んでしまう現象は弊社でも経験があります。
    アドオンシナリオが悪い可能性は当然あるのですが、ご呈示頂いた、
    カーネルの出すi2c-mcp2221のエラー(USBがらみ?)と関連があるようで、
    またsys_mgrをgdbから動作させても異常終了をとらえられず、
    coreを吐かせることも出来ていないという状況です。
    継続して調査は進めて参りますので、ご迷惑をお掛けして
    大変申し訳ありませんが、よろしくお願いいたします。

    0
    #1489
    まつやま
    参加者

    こんにちは。

    続報…というほどではないですが、WebSocketの切断が確実に完了するように、というおまじないとして
    pypapero.pyの108行目
    papero.ws.close()
    の下に
    time.sleep(3)
    を入れてみたところ、今のところ調子よく切断→再接続できるようになっております。

    RaspberryPi側から切断のリクエストを出したあと、PaPeRo i側から切断の返事を受け取るようになったため?かどうか分かりませんが、とりあえずご報告でした。

    0
    #1603
    takahashi@spi
    参加者

    本件は比較的単純なアドオンシナリオのバグでした。
    修正版を公開しましたので更新をお願いします。
    長らくご不便をお掛けし、大変申し訳ありませんでした。

    0
    #1669
    まつやま
    参加者

    ご対応、誠にありがとうございました。

    最新版のアドオンシナリオ(v0.0.4)と、最新のpypapero.py(Ver.1.01)を試しておりますが、問題無く稼働しております。

    また何かありましたら、よろしくお願いいたします。

    0
7件の投稿を表示中 - 1 - 7件目 (全7件中)
  • このトピックに返信するにはログインが必要です。