學習目的及目標
· 掌握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/