ruby - Websockets and Adafruit Feather OpCode 11
问题描述
My goal is to connect an Adafruit Feather (WiFi) to a Websocket Server running on my computer.
- Server: EventMachine Simple Server Example
- Clients: ArduinoHttpClient > SimpleWebsocketExample
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.
解决方案
推荐阅读
- java - 使用数组反转移动坐标
- typescript - 使用 Google Cloud Task 客户端部署 Firebase 函数时收到区域错误
- chromecast - Chromecast 接收器当前帧
- java - 使用 for 循环显示数组
- javascript - 将递增/递减箭头添加到输入类型 = 时间
- firebase-authentication - 从 Firebase 中的 SafetyNet 注销应用程序检查中的应用程序
- plugins - 谁声明更新 kuzzle V1 到 kuzzle V2 的插件
- node.js - 我应该如何使用 puppeteer (node.js) 为 google 进行 OAuth 自动化测试
- sql - 空值结束日期:db2-sql
- c# - 有没有办法将实体框架中的 where 子句设置为参数?