嵌入式WebSocket的实现

2019-07-12 22:50发布

系统硬件采用STM32+DM9000AEP,具体实现步骤如下,   第一步建立TCP监听端口可以随意,等待浏览器发出http请求。   嵌入式WebSocket的实现

Chrome浏览器发出的请求 第二步建立握手 服务端需要解析最少4个头字段,并且提取Sec-WebSocket-Key,具体实现如下:   2.1定义字符串常量: 嵌入式WebSocket的实现
2.2截取Upgrade和Connection的头字段字符串值进行不分大小写比较,并记录比较结果。 Connection的头字段字符值不同浏览器有所不同,ChromeIE浏览器的值为“upgrade”, 火狐浏览器的值为“keep-alive, Upgrade”。 嵌入式WebSocket的实现

2.3截取Sec-WebSocket-Key和Sec-WebSocket-Version的头字段字符串值并保存。 嵌入式WebSocket的实现


2.4将截取WebSocket-Key加上258EAFA5-E914-47DA-95CA-C5AB0DC85B11进行SHA1加密,再进行Base64编码,这个值用于回复。 嵌入式WebSocket的实现
2.5回复浏览器握手请求,如果上叙4个比较失败,则不允许连接。 嵌入式WebSocket的实现
2.6正确的回复如下:其中Sec-WebSocket-Accept的值由2.4步得来,如果不同意连接需要回复“HTTP/1.1404 NotFound”或其他,成功握手,将会触发浏览器onopen事件。 嵌入式WebSocket的实现
到此为止可以通信了。 第三步数据通信 3.1此阶段可以使用TCP进行通信了,每个包都有一个包头,如:   82、8A、2C、AB、B0、F2为包头,之后为数据需要解码。 嵌入式WebSocket的实现 浏览器发给服务端的数据包 数据格式: 嵌入式WebSocket的实现
例如图3.1第一个字节和第二个字节82、8A,表示单个二进制包数据长度10个字节,有4个MASK-KEY码分别为:2C、ABB0、F2。 数据为:     28、AF、B1、52、9C、AB、B0、F2、2C、AB。 解码后的数据:04、04、01、A0、B0、00、00、00、00、00。   解码函数如下,解码比较简单就是将MASK-KEY码逐一与数据进行异或运算。MASK-KEY通常为4个字节,也有可能是其他数字,可以从包总长度减其他计算得来。 嵌入式WebSocket的实现
3.2通信仲裁 嵌入式WebSocket的实现
3.3回复数据:           为了减少计算量回复数据没有进行MASK-KEY编码,直接使用明码通信。82、4B为包头,之后为二进制数据共75个字节。 嵌入式WebSocket的实现 3.4停止通信:         浏览器关闭时多数没有发送关闭帧,而是采用TCP来关闭,除IE浏览器主动发送pong帧保持心跳,其他浏览器采用TCP保持心跳。
  效果图:
嵌入式WebSocket的实现