嵌入式WebSocket的实现

系统硬件采用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的实现

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值