私の目標は、Adafruit Feather (WiFi) を自分のコンピューターで実行されている Websocket サーバーに接続することです。
- サーバー: EventMachineシンプル サーバーの例
- クライアント: ArduinoHttpClient > SimpleWebsocketExample
私の問題は、Feather をリセットすると再接続できない場合があることです。再接続する前に、数分、さらに数回リセットする必要があります。サーバー コードのデバッグ フラグをオンにすると、次の 2 つのパターンが表示されます。
接続成功
[[:initialize]]
[[:receive_data, "GET /"]]
[[:receive_data, " HTTP/1.1"]]
[[:receive_data, "\r\n"]]
[[:receive_data, "Host: "]]
[[:receive_data, "XXX:XXX:XX:XX"]] # masked for security, but the IP of my server
[[:receive_data, "443\r\n"]]
[[:receive_data, "User-Agent"]]
[[:receive_data, ": "]]
[[:receive_data, "Arduino/2.2.0"]]
[[:receive_data, "\r\n"]]
[[:receive_data, "Upgrade"]]
[[:receive_data, ": "]]
[[:receive_data, "websocket"]]
[[:receive_data, "\r\n"]]
[[:receive_data, "Connection"]]
[[:receive_data, ": "]]
[[:receive_data, "Upgrade"]]
[[:receive_data, "\r\n"]]
[[:receive_data, "Sec-WebSocket-Key"]]
[[:receive_data, ": "]]
[[:receive_data, "eGHyXdbEMgiCiR0cZEBRTQ=="]]
[[:receive_data, "\r\nSec-WebSocket-Version"]]
[[:receive_data, ": "]]
[[:receive_data, "13"]]
[[:receive_data, "\r\n\r\n"]]
[[:accepting_ws_version, 13]]
[[:upgrade_response,
"HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: rUUq6+3qildLwg2c5CpgHfxTO1I=\r\n\r\n"]]
[[:sending_frame,
:text,
"{\"sender\":\"socket-server\",\"event\":\"connection_opened\",\"data\":{\"sid\":3,\"ip\":\"129.XXX.XXX.30\"}}"]]
# DEVICE CONNECTION ESTABLISHED
# FIRST MESSAGE FROM FEATHER
[[:receive_data, "\x81"]]
[[:receive_data, "\xB6"]]
[[:buffer_incomplete, "\x81\xB6"]]
[[:receive_data,
"\xFC\xDE\xEB\xF1\x87\xFC\x85\x90\x91\xBB\xC9\xCB\xDE\xB0\x8E\x9E\x8C\xB7\x93\x94\x90\xFC\xC7\xD3\x8A\xBB\x99\x82\x95\xB1\x85\xD3\xC6\xFC\xDA\xDF\xCC\xFC\xC7\xD3\x99\xA8\x8E\x9F\x88\xFC\xD1\xD3\x9B\xAC\x8E\x94\x88\xB7\x85\x96\xDE\xA3"]]
[[:message_received,
:text,
"{\"name\":\"neopixel\",\"version\":\"1.0\",\"event\":\"greeting\"}"]]
# Works great, no issues unless it gets disconnected...
再接続に失敗しました
# HIT RESET BUTTON HERE
[[:sending_frame,
:text,
"{\"sender\":\"socket-server\",\"event\":\"connection_closed\",\"data\":{\"sid\":10,\"ip\":\"129.107.106.30\"}}"]]
# ATTEMPTING TO REOPEN
[[:initialize]]
[[:receive_data, "GET"]]
[[:receive_data, " "]]
[[:receive_data, "/"]]
[[:receive_data, " HTTP/1.1"]]
[[:receive_data, "\r\n"]]
[[:receive_data, "Host: "]]
[[:receive_data, "XXX.XX.XX.XX"]]
[[:receive_data, ":"]]
[[:receive_data, "443"]]
[[:receive_data, "\r\n"]]
[[:receive_data, "User-Agent"]]
[[:receive_data, ": "]]
[[:receive_data, "Arduino/2.2.0"]]
[[:receive_data, "\r\n"]]
[[:receive_data, "Upgrade"]]
[[:receive_data, ": websocket"]]
[[:receive_data, "\r\n"]]
[[:receive_data, "Connection"]]
[[:receive_data, ": "]]
[[:receive_data, "Upgrade"]]
[[:receive_data, "\r\n"]]
[[:receive_data, "Sec-WebSocket-Key"]]
[[:receive_data, ": "]]
[[:receive_data, "0rubjGOZYAJM0YZ/cSboWw=="]]
[[:receive_data, "\r\n"]]
[[:receive_data, "Sec-WebSocket-Version"]]
[[:receive_data, ": "]]
[[:receive_data, "13"]]
[[:receive_data, "\r\n"]]
[[:receive_data, "\r\n"]]
[[:accepting_ws_version, 13]]
[[:upgrade_response,
"HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: QP0lJhfU9wlSy4ZFesYTIVyj/ww=\r\n\r\n"]]
[[:sending_frame,
:text,
"{\"sender\":\"socket-server\",\"event\":\"connection_opened\",\"data\":{\"sid\":12,\"ip\":\"129.XXX.XXX.30\"}}"]]
[[:receive_data, "{"]]
[[:receive_data, "\"n"]]
[[:buffer_incomplete, "{\"n"]]
[[:receive_data, "a"]]
[[:buffer_incomplete, "{\"na"]]
[[:receive_data, "m"]]
[[:buffer_incomplete, "{\"nam"]]
[[:receive_data, "e"]]
[[:buffer_incomplete, "{\"name"]]
[[:receive_data, "\""]]
[[:buffer_incomplete, "{\"name\""]]
[[:receive_data, ":"]]
[[:buffer_incomplete, "{\"name\":"]]
[[:receive_data, "\""]]
[[:buffer_incomplete, "{\"name\":\""]]
[[:receive_data, "n"]]
[[:buffer_incomplete, "{\"name\":\"n"]]
[[:receive_data, "e"]]
[[:buffer_incomplete, "{\"name\":\"ne"]]
[[:receive_data, "o"]]
[[:buffer_incomplete, "{\"name\":\"neo"]]
[[:receive_data, "p"]]
[[:buffer_incomplete, "{\"name\":\"neop"]]
[[:receive_data, "i"]]
[[:buffer_incomplete, "{\"name\":\"neopi"]]
[[:receive_data, "x"]]
[[:buffer_incomplete, "{\"name\":\"neopix"]]
[[:receive_data, "e"]]
[[:buffer_incomplete, "{\"name\":\"neopixe"]]
[[:receive_data, "l\""]]
[[:buffer_incomplete, "{\"name\":\"neopixel\""]]
[[:receive_data, ","]]
[[:buffer_incomplete, "{\"name\":\"neopixel\","]]
[[:receive_data, "\""]]
[[:buffer_incomplete, "{\"name\":\"neopixel\",\""]]
[[:receive_data, "v"]]
[[:buffer_incomplete, "{\"name\":\"neopixel\",\"v"]]
[[:receive_data, "e"]]
[[:buffer_incomplete, "{\"name\":\"neopixel\",\"ve"]]
[[:receive_data, "r"]]
[[:buffer_incomplete, "{\"name\":\"neopixel\",\"ver"]]
[[:receive_data, "s"]]
[[:buffer_incomplete, "{\"name\":\"neopixel\",\"vers"]]
[[:receive_data, "i"]]
[[:buffer_incomplete, "{\"name\":\"neopixel\",\"versi"]]
[[:receive_data, "o"]]
[[:buffer_incomplete, "{\"name\":\"neopixel\",\"versio"]]
[[:receive_data, "n"]]
[[:buffer_incomplete, "{\"name\":\"neopixel\",\"version"]]
[[:receive_data, "\""]]
[[:buffer_incomplete, "{\"name\":\"neopixel\",\"version\""]]
[[:receive_data, ":"]]
[[:buffer_incomplete, "{\"name\":\"neopixel\",\"version\":"]]
[[:receive_data, "\""]]
[[:buffer_incomplete, "{\"name\":\"neopixel\",\"version\":\""]]
[[:receive_data, "1"]]
[[:buffer_incomplete, "{\"name\":\"neopixel\",\"version\":\"1"]]
[[:receive_data, "."]]
[[:buffer_incomplete, "{\"name\":\"neopixel\",\"version\":\"1."]]
[[:receive_data, "0"]]
[[:buffer_incomplete, "{\"name\":\"neopixel\",\"version\":\"1.0"]]
[[:receive_data, "\""]]
[[:buffer_incomplete, "{\"name\":\"neopixel\",\"version\":\"1.0\""]]
[[:receive_data, ","]]
[[:buffer_incomplete, "{\"name\":\"neopixel\",\"version\":\"1.0\","]]
[[:receive_data, "\""]]
[[:error, #<EventMachine::WebSocket::WSProtocolError: Unknown opcode 11>]]
[[:sending_frame, :close, "\x03\xEAUnknown opcode 11"]]
[[:receive_data, "e"]]
[[:unbind, :connection]]
# :(
while ループで Feather の再接続を試みます。私の問題は、非常に迅速な再接続試行からのデータのタイムアウト/スロットリングに関連するものかもしれないと思っていましたが、残念ながらそうではないようです。
問題を診断する方法についての考えは? 私はそのオペコードを潜在的な原因として注目していますが、サーバー側でそれを抑制しようとするか、クライアント側に配置されている理由を理解するかは不明です。