系统硬件采用STM32+DM9000AEP,具体实现步骤如下,
第一步建立TCP监听端口可以随意,等待浏览器发出http请求。
Chrome浏览器发出的请求
第二步建立握手
服务端需要解析最少4个头字段,并且提取Sec-WebSocket-Key,具体实现如下:
2.1定义字符串常量:
2.2截取Upgrade和Connection的头字段字符串值进行不分大小写比较,并记录比较结果。
Connection的头字段字符值不同浏览器有所不同,ChromeIE浏览器的值为“upgrade”,
火狐浏览器的值为“keep-alive, Upgrade”。
2.3截取Sec-WebSocket-Key和Sec-WebSocket-Version的头字段字符串值并保存。
2.4将截取WebSocket-Key加上258EAFA5-E914-47DA-95CA-C5AB0DC85B11进行SHA1加密,再进行Base64编码,这个值用于回复。
2.5回复浏览器握手请求,如果上叙4个比较失败,则不允许连接。
2.6正确的回复如下:其中Sec-WebSocket-Accept的值由2.4步得来,如果不同意连接需要回复“HTTP/1.1404 NotFound”或其他,
成功握手,将会触发浏览器onopen
事件。
到此为止可以通信了。
第三步数据通信
3.1此阶段可以使用TCP进行通信了,每个包都有一个包头,如:
82、8A、
2C、AB、B0、F2为包头,之后为数据需要解码。
浏览器发给服务端的数据包
数据格式:
例如图3.1第一个字节和第二个字节82、8A,表示单个二进制包数据长度10个字节,有4个MASK-KEY码分别为:2C、AB
、B0、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个字节,也有可能是其他数字,可以从包总长度减其他计算得来。
3.2通信仲裁
3.3回复数据:
为了减少计算量回复数据没有进行MASK-KEY编码,直接使用明码通信。82、4B为包头,之后为二进制数据共75个字节。
3.4停止通信:
浏览器关闭时多数没有发送关闭帧,而是采用TCP来关闭,除IE浏览器主动发送pong帧保持心跳,其他浏览器采用TCP保持心跳。
效果图: