樂鑫科技官網無線wifi模組ble藍牙soc常見的本地數據通信協議,介紹完如何在局域網內發現設備后,本節將介紹如何控制設備。以智能燈為例,簡單的控制就是開關智能燈,對于軟件層而言,就是 GPIO 引腳電平被拉高或拉低。通過其他設備來控制智能燈的開關,無非就是提供命令來進行 GPIO 的操作。那么這種命令是怎么通過智能手機發送到智能燈的呢?這種命令到底是什么格式? 采用什么協議呢? 本節將會一一解開疑惑,本節主要介紹通過樂鑫科技官網無線wifi模組ble藍牙socWi-Fi 無線傳輸媒介來傳輸符合 TCP/IP 協議的數據,以及通過藍牙無線傳輸媒介來傳輸符合藍牙數據通信協議的數據。
1、TCP協議:
TCP/IP模型
應用層
傳輸層
網絡層
數據鏈路層
物理層
傳輸控制協議(TCP,Transmission Control Protocol) 是Internet 協議族的主要協議之一。在 TCP/IP 模型中,TCP作為傳輸層協議,為應用層協議提供了可靠的數據傳輸,常用的應用層協議有 HTTP、MQTT、FTP 等。
TCP 協議介紹
樂鑫科技官網無線wifi模組ble藍牙socTCP 是一種面向連接的、可靠的、基于字節流的傳輸層通信協議,由IETF的RFC 793 定義。
(1)面向連接。采用 TCP 協議發送數據前需要在發送方和接收方之間建立連接,也就是常說的三次握手。
(2)可靠的。采用 TCP 協議發送數據,可以保證接收方的接收,如果丟失了數據,則會重傳丟失的數據。TCP 協議還可保證接收方按順序接收數據。
(3)字節流。在采用TCP 協議發送數據時,首先將應用層數據寫入 TCP 緩沖區中,然后由TCP協議來控制發送數據,是按字節流的方式發送數據的,和應用層寫下來的報文長度沒有任何關系,所以說是字節流。
TCP協議將上層應用數據發給接收方的流程如下:
(1)上層應用程序將應用數據寫入 TCP 緩沖區。
(2)TCP緩沖區將數據打包成TCP 報文發往網絡層。
(3)接收方接收到 TCP 報文,將其放入TCP 緩沖區。
(4)當收到一定數量的數據后,對數據進行排序與重組后告知給應用層。
使用 Socket 創建 TCP 服務器端
函數 esp_create_tcp_server()可創建一個TCP 服務器端,樂鑫科技官網無線wifi模組ble藍牙soc包括TCP 套接字的創建、端口配置綁定、監聽、接收數據和發送數據。相較于 TCP 客戶端、UDP 服務器端和客戶端,TCP服務器端的代碼流程都要復雜一些,會涉及 listen 和 accept 兩個套接字函數的使用,這是TCP服務器端特有的操作。
2、HTTP 協議
HTTP (HyperText Transfer Protocol,超文本傳輸協議)是基于傳輸層之上的應用協議。HTTP協議是萬維網 (World Wide Web,www或 Web) 的數據通信基礎,它規定了客戶端與服器端之間數據傳輸的格式與方式。樂鑫科技官網無線wifi模組ble藍牙soc客戶端使用 HTTP 協議可以通過 HTTP 請求方式來獲取智能燈的開關狀態(GET)或者操作智能燈的亮滅 (POST),并且每個操作都會有對端的響應回復。因此,HTTP 協議在應用上比單純的 TCP 協議更加完善與合理。
HTTP協議介紹
HTTP 協議是一個客戶端(用戶) 和服務器端(網站)之間請求和應答的標準??蛻舳送ㄟ^網頁瀏覽器、網絡爬蟲或者其他的工具與服務器端建立 TCP 連接,然后發送請求讀取服務器端數據、上傳數據或者表單到服務器端,并讀取服務器端的響應狀態,如“HTTP/1.1 200 0K”以及返回的內容(如請求的文件、錯誤消息或者其他信息)。樂鑫科技官網無線wifi模組ble藍牙soc通過 HTTP 協議請求的資源由統一資源標識符(Uniform Resource Identifiers,URI)來標識。
在 0.9 和 1.0 版本的 HTTP 協議中,TCP 連接在每一次請求和回應之后關閉。在 1.1 版本的HTTP 協議中,引入了保持連接的機制,一個連接可以重復多個請求和回應,這樣可以在每次數據請求前減少 TCP 握手時間和網絡開銷
常見的 HTTP 請求方法有:
(1)GET。請求指定的 URI資源。
(2)POST。向指定 URI 資源提交數據,請求服務器端進行處理(如提交表單或者上傳文件)
(3)DELETE。請求服務器端刪除 URI所標識的資源。
在智能燈的本地控制中,可以使用 GET 方法來獲取智能燈的狀態,使用 POST 方法來操作智能燈的行為。
3、UDP協議
之前分別介紹了TCP 協議和 HTTP 協議,這兩個協議的主要特點就是傳輸可靠。本節接下案介紹傳輸層的另一種協議,即 UDP 協議。與 TCP 協議相反,UDP 協議是一種可靠的傳輸協議。常見的基于 UDP 協議的應用協議有 DNS、TFTP、SNMP等。
UDP 協議介紹
用戶數據報協議(UDP,User Datagram Protocol) 是一個簡單的面向數據報的通信協議,TCP協議一樣位于傳輸層。UDP 協議由 David P. Reed 在 1980 年設計且在 RFC 768 中被定義(摘錄自維基百科)。UDP 是不可靠的傳輸協議,數據通過 UDP 協議發送出去后,底層不會負責保留數據來防止數據在傳輸過程中的丟失。UDP 協議本身不支持差錯校正、隊列管理和擁塞控制,但支持校驗和。
樂鑫科技官網無線wifi模組ble藍牙socUDP 是一種無連接的協議,在發送數據前無須像 TCP 協議那樣建立連接,可直接將數據發送到對端。由于在傳輸數據時不需建立連接,因此也就不需要維護連接狀態,包括收發狀態等UDP 協議本身只負責傳輸,因此使用該協議的應用程序要做更多關于數據如何發送和處理的控制,例如,如何使對端的應用程序正確且有序地接收數據。
與TCP 協議相比,UDP 協議不能保證數據安全可靠地傳輸,您可能會有疑問,那為什么還要使用UDP 協議呢?UDP 協議的無連接特性,相比于 TCP 協議的網絡和時間開銷更少:UDP協議的不可靠傳輸(主要是 UDP 協議在包丟棄后無法保證重傳的特性)更適合流媒體、實時多人游戲和 IP 語音之類的應用,丟失幾個包不會影響應用:反而如果使用 TCP 協議重傳,則會大大增加網絡的延時。
使用 Socket 創建UDP 服務器端
使用 Socket 創建 UDP 服務器端和 8.2.2 節介紹的創建組播組接收方類似,都是先創建 UDP套接字,樂鑫科技官網無線wifi模組ble藍牙soc再配置綁定的端口、接收和發送數據。函數 esp_create udp server()設置SO_ REUSEADDR 選項,允許服務器端綁定當前已建立連接的地址。
4、CoAP協議
隨著物聯網技術的飛速發展,誕生了一系列滿足物聯網設備的協議。物聯網設備大都是資源限的,如 RAM、Flash、CPU、網絡帶寬等資源。對于物聯網設備而言,如果要借助 TCP協議和HTTP 協議進行數據傳輸,往往需要更多的內存與網絡帶寬。如果能使用UDP協議進行數據傳輸,那么有沒有一個類似 HTTP 的應用協議呢? 答案是有的,樂鑫科技官網無線wifi模組ble藍牙socCoAP 協議就是按照HTTP 協議的 REST 架構設計的。
CoAP 協議介紹
受限制的應用協議 (Constrained Application Protocol,CoAP) 是一種在物聯網設備中類似于Web 應用的協議,在 RFC 7252 中被規范定義,可用于資源受限的物聯網設備,使那些被稱為節點的資源受限設備能夠使用類似的協議與更廣泛的互聯網進行通信。CoAP 協議被設計用于同一受限網絡(如低功耗、有損網絡) 上的設備之間、設備和互聯網上的一般節點之間,以及由互聯網連接的不同受限網絡上的設備之間。
CoAP 協議是基于請求與響應模型的,類似于 HTTP 協議,這樣可以彌補UDP 協議不可靠傳輸的缺陷,保證數據不丟失亂序。服務器端的資源用 URL(如 coap://[IP]/id/light_status)來標識訪問某個智能燈的狀態)。樂鑫科技官網無線wifi模組ble藍牙soc客戶端通過某個資源的 URL 來訪問服務器端資源,通過4個請求方法 (GET、PUT、POST 和DELETE) 完成對服務器端資源的操作。
CoAP 協議還具有以下特點:
客戶端和服務器端都可以獨立地向對方發送請求。
支持可靠的數據傳輸。
支持多播與廣播,可以實現一對多的數據傳輸。
支持低功耗、非長連接的通信。
相比于 HTTP協議,其包頭更輕量。
使用ESP-IDF 組件創建 COAP 服務器端
下面的代碼展示了如何使用 ESP-IDF 組件創建 COAP 服務器端,該服務器端提供了 GET 和PUT 操作,用于 CoAP 協議的資源獲取與修改。CoAP 協議的操作一般都是固定的,我們只需要關心自己的資源 URI路徑以及所需要提供的操作。通過函數 coap_resource_init()可以設置資源訪問的 URI,通過函數 coap_register_handler()可以注冊資源URI對應的GET和PUT 方法回調函數。
5、藍牙通信協議
藍牙通信協議介紹
之前文章介紹了藍牙的協議與架構,藍牙協議定義了完成特定功能的消息格式和過程,如鏈路控制、安全服務、服務信息交換和數據傳輸。本節只介紹藍牙協議規范的 ATT屬性協議。藍牙的數據是以屬性 (Attribute) 方式存在的,每條屬性由4個元素組成。
(1)屬性句柄(Attribute Handle)。正如使用內存地址查找內存中的內容一樣,屬性句也以協助找到相應的屬性。例如,首一個屬性句柄是 0x0001,第二個屬性句柄是 0x0002,以類推,大為 OxFFFF。
(2)屬性類型 (Attribute UUID)。每個數據有自己需要代表的意思,如智能燈可以有兩個基本的屬性,一個是設置智能燈開關的屬性,另一個是讀取智能燈開關狀態的屬性。
(3)屬性值 (Atribute Value)。屬性值是每個屬性真正要承載的信息,其他3 個元素都是為了讓對方能夠更好地獲取屬性值。例如,對于智能燈而言,可以設置智能燈開關的屬性值為1代表開燈,設置屬性值為0代表關燈;讀取智能燈開關狀態的屬性值,1 代表打開狀態,0代表關閉狀態。
(4)屬性權限(Attribute Permissions)。每個屬性對各自的屬性值都有相應的訪問限制,如有些屬性是可讀的、有些是可寫的、有些是可讀可寫的。擁有數據的一方可以通過屬性權限控制本地數據的屬性權限。例如,對于智能燈而言,可以將智能燈的開關屬性權限設置為可寫不可讀,將讀取智能燈開關狀態的屬性權限設置為只讀不可寫。
通常將保存數據(即屬性的設備稱為服務器端(Server),將獲取其他設備數據的設備稱為客戶端(Client)。對于智能燈和智能手機而言,智能燈相當于服務器端,智能手機相當于客戶端。下面是服務器端和客戶端間的常用操作:
(1)客戶端向服務器端發送數據。通過對服務器端的數據進行寫操作 (Write),可完成數的發送。寫操作分兩種:一種是寫入請求 (Write Request): 另一種是寫入命令 (Write Command)。兩者的主要區別是前者需要對方回復響應 (Write Response),后者不需要對方復響應。對于樂鑫科技官網無線wifi模組ble藍牙soc智能燈而言,智能手機發送開燈、關燈的命令就相當于寫操作,而且這是一種寫入請求,需要智能燈對寫操作進行響應。這個響應不是簡單的 ACK 響應,需要將開燈和關燈這個動作執行的結果返回給智能手機,告知智能手機此時的智能燈狀態。
(2)服務器端向客戶端發送數據。主要通過服務器端指示(Indication)或者通知(Notification)的形式,實現將服務器端的更新數據發給客戶端。與寫操作類似,指示和通知的主要區別是前者需要對方設備在收到數據指示后,進行回復 (Confirmation)。對于樂鑫科技官網無線wifi模組ble藍牙soc智能燈而言,如果用戶通過硬件開關按鈕進行開燈和關燈后,需要主動將智能燈狀態告知智能手機,此時就可以使用該模式。智能燈可以通過指示或者通知的形式告訴智能手機,智能手機顯示智能燈的狀態。
(3)客戶端也可以主動通過讀操作來讀取服務器端的數據。主要是客戶端通過讀操作來獲取服務器端相應屬性的值。對于智能燈而言,類似于上述通過硬件操作改變智能燈的狀態,智能手機如果想要獲取正確的狀態,則可以借助智能燈發送指示或者通知來告知智能手機,智能手機也可以通過讀操作來獲取智能燈的實時狀態。
可以思考一下,樂鑫科技官網無線wifi模組ble藍牙soc智能燈以通知的方式將其狀態告知智能手機和智能手機主動去讀智能燈的狀態,這兩種方法哪種更好呢?使用后一種方法時,智能手機每次讀取智能燈都是需要傳輸時間的,而前一種方法可能在智能手機刷新智能燈狀態時就已經完成了,可以省去傳輸時間。盡管前一種方法的速度更快,但仍建議使用后一種方法,這是因為如果智能燈在發送通知的時候,如果智能手機沒有連接智能燈,則智能燈就無法將其狀態更新到智能手機。除非在智能手機連接到智能燈的時候,智能燈就把其當前狀態告知智能手機了。