WebSocket 是瀏覽器與伺服器交換資料眾多方式之一,與 HTTP 最大的區別為 WebSocket 屬於全雙工通訊模式、無須重新連線和重新傳送檔頭等多餘網路通訊連線負荷且反應更即時。WebSocket 傳輸協定已經在 2012 年成為 IETF 的正式標準:RFC 6455,從各方面來說,也已經是一個成熟的技術了。目前大多數瀏覽器都支援此協定,如 Microsoft Edge、Internet Explorer、Safari、GoogleChrome、Firefox、Opera。
HTTP與WebSocket架構示意圖如下:
WebSocket協定規範將ws(WebSocket)和wss(WebSocket Secure)定義為兩個新的統一資源識別碼(URI)方案,分別對應明文和加密連接。
二. WebSocket協議通訊流程簡介
WebSocket是一個基於TCP的傳輸協議,通過 HTTP/1.1 協定的101狀態碼進行交握,主要都應用在瀏覽器與伺服器間雙向溝通,具有靈活及高效能。首次建立連結是透過 HTTP GET發出請求並與伺服器取得溝通後,接續使用WebSocket協議來進行溝通。相較於 polling 與 long-polling,WebSocket可以在更短的時間傳送更多資料。客戶端格式如下:
在HTTP中,Upgrade: WebSocket 表示要升級到 WebSocket協議。通過 WebSocket協定,發往伺服器的升級請求包含一個唯一的金鑰,伺服器會將其破壞並返回,作為接受升級請求的證據。表示伺服器理解WebSocket協定的實際證明。Sec-WebSocket-Version表示支援的WebSocket版本,RFC6455要求使用的版本是13
伺服器端確認後回應如下:
成功的狀態碼始終是 101,而任何其他狀態碼將解釋為拒絕升級到WebSocket協定。伺服器將收到的金鑰與固定的 GUID 字串連接,並計算生成的字串的雜湊值。然後將雜湊值編碼為Base64並通過 Sec-WebSocket-Accept標頭將其返回給用戶端。此流程可以避免一般HTTP請求被誤認為WebSocket協定。
三. Novatek NT9832x建置WebSocket Server
- 下載libwebsockets函示庫,Novatek NT9832x平台建置WebSocket伺服器會使用。可到官網(https://github.com/warmcat/libwebsockets/releases)查看所需版本。本文使用v4.2.1
- 設置NT9832x 交叉編譯環境(可參考Novatek SDK文件,內有詳細步驟)。
- 交叉編譯libwebsockets-4.2.1.tar.gz。
4. 撰寫WebSocket Server並將置於NT9832x EVB內執行。
四.使用WebSocket協定在NT9832x EVB硬體平台傳送H264/HEVC原始數據至客戶端(以H264為例)
1. WebSocket伺服器端發送H264原始數據
2. WebSocket客戶端程序向Novatek NT9832x伺服器端發送請求
3. WebSocket客戶端接收影像原始數據
4. Novatek NT9832x與客戶端完整溝通流程
五. 總結
WebSocket提供客戶端和伺服器端低延遲連線通訊協定技術且與現今主流瀏覽器接支援此技術。本文實作Novatek NT9832x EVB平台使用WebSocket技術傳送影像編碼資料透過網路傳送到客戶端。
參考資料
1. https://zh.wikipedia.org/wiki/WebSocket
2. https://iter01.com/420761.html
3. https://github.com/warmcat/libwebsockets
評論