学习目的及目标
· 掌握Websocket原理和工作过程
· 掌握乐鑫ESP32的WebSocket的程序设计
WebSocket原理
WebSocket 是一种网络通信协议,是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
为什么需要 WebSocket ?
了解计算机网络协议的人,应该都知道:HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。
这种通信模型有一个弊端:HTTP 协议无法实现服务器主动向客户端发起消息。
这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。大多数 Web 应用程序将通过频繁的异步JavaScript和XML(AJAX)请求实现长轮询。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。
因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。WebSocket 连接允许客户端和服务器之间进行全双工通信,以便任一方都可以通过建立的连接将数据推送到另一端。WebSocket 只需要建立一次连接,就可以一直保持连接状态。这相比于轮询方式的不停建立连接显然效率要大大提高。
Websocket特点
· 建立在 TCP 协议之上,服务器端的实现比较容易。
· 与 HTTP 协议有着良好的兼容性。默认端口也是 80 和 443 ,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
· 数据格式比较轻量,性能开销小,通信高效。
· 可以发送文本,也可以发送二进制数据。
· 没有同源限制,客户端可以与任意服务器通信。
· 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL,如下图。
请求握手包
接收请求包
注:WebSocket握手详解
Websocket和HTTP连接过程
Websocket工作过程
软件设计
ESP32的Websocket详细过程
ESP32的Websocket接口介绍
· 连接函数:netconn_new();
· 绑定函数:netconn_bind();
· 监听函数:netconn_listen();
· 获取连接函数:netconn_accept();
· 接收数据函数:netconn_recv();
· 发送数据函数:netconn_write();
· 关闭连接函数:netconn_close();
· 删除连接函数:netconn_delete();
更多更详细接口请参考官方指南。
Websocket新建任务编写
Websocket连接过程代码
Websocket发送代码
代码有全部中文注释
测试流程和效果展示
测试流程
· 修改STA的账号密码
· 使用电脑助手工具进行WebSocket测试
效果展示
· 连接
· 发送
· 控灯
· 断开连接
WebSocket总结
· 此源码主要是学习WebSocket整个流程,实际中还有很多可以完善的地方,了解WebSocket后,就自己飞向天空吧。
· 源码地址:https://github.com/xiaolongba/wireless-tech
开源地址:https://github.com/HX-IoT/