首页 > 解决方案 > Websockets and Adafruit Feather OpCode 11

问题描述

My goal is to connect an Adafruit Feather (WiFi) to a Websocket Server running on my computer.

My issues is that when I reset my Feather, I sometimes cannot reconnect. I have to wait a couple of minutes, a couple of extra resets, before I can reconnect. Turning on the debug flag on the server code, I see two patterns:

Successful connect


[[: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... 

FAILED RECONNECTION

# 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]]

# :(

I have the Feather attempt reconnection in a while loop. I thought my issue might be something associated with timeout/throttling the data from very quick reconnection attempts, but alas it looks like this is not the case.

Thoughts on how to diagnose the issue? I'm eyeing that opcode as the potential culprit, but unsure as to whether to try and suppress it in the server side or figure out why its being placed there on the client side.

标签: rubywebsocketarduinoopcodeem-websocket

解决方案


推荐阅读