1. 程式人生 > >初識CoAP協議

初識CoAP協議

![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/thingsboard-coap/coap-banner.jpg) ## 前言 本文介紹什麼是CoAP,以及如何在物聯網裝置上使用它。CoAP是一種物聯網協議,具有一些專門為受約束的裝置而設計的有趣功能。還有其他一些可用於構建物聯網解決方案的IoT協議,例如MQTT等。 物聯網是最有趣和最有前途的技術趨勢之一。在這個生態系統中,物件,人員,裝置相互連線並交換資料。在此部落格中,我們從多個角度介紹了物聯網和開發物聯網專案,並涵蓋了與物聯網相關的多個方面。 ## 什麼是CoAP協議? 如前所述,CoAP是一種物聯網協議。CoAP意思為**Constrained Application Protocol**,在[RFC 7252](https://tools.ietf.org/html/rfc7252)中所定義。CoAP是一種低開銷的簡單協議,專門針對受限裝置(例如微控制器)和受限網路而設計。該協議用於M2M資料交換中,並且與HTTP非常相似,即使稍後我們將介紹重要的區別。 CoAP協議的主要特徵是: - 受限制的小型裝置的Web傳輸協議(類似於HTTP) - 非同步訊息交換 - 低開銷,非常易於解析 - URI和內容型別支援 - 代理和快取功能 您可能會注意到,CoAP某些功能也與HTTP非常相似,但是不能將CoAP視為壓縮版本的HTTP協議,因為CoAP是專門為IoT設計的,並且更詳細地針對M2M,因此針對這些要求必須有所優化。 從抽象協議層,CoAP可以表示為: ![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/thingsboard-coap/coap-stack.png) 正如你所看到的,CoAP協議有兩個不同的層:**訊息負載**和**請求/響應**。訊息層處理UDP和非同步訊息。請求/響應層基於請求/響應訊息來管理請求/響應互動。 CoAP支援四種不同的訊息型別: - 可確認的 Confirmable(**CON**) - 無法確認 Non-confirmable(**NON**) - 確認 Acknowledgment - 重置 Reset 在深入研究CoAP協議之前,以下必要的術語有助於我們更好的瞭解CoAP協議: - **節點**(Endpoint):參與CoAP協議的實體。通常,將端點標識為主機 - **發件人**(Sender):傳送訊息的實體 - **收件人**(Recipient):接受訊息的實體 - **客戶端**(Client):傳送請求的實體和接受訊息的實體 - **伺服器**(Server):接收來自客戶端的請求並向客戶端傳送迴響應的實體 ## CoAP訊息模型 這是CoAP的最低層。該層處理端點之間的UDP交換訊息。每個CoAP訊息都有一個唯一的ID。這對於檢測訊息重複很有用。CoAP訊息由以下部分構建: - 二進位制標誌頭 - 可選項 - 載荷訊息 稍後,我們將更詳細地描述訊息格式。 如前所述,CoAP協議使用兩種訊息: - 確認訊息 - 不可確認的訊息 可確認訊息是可靠訊息。在兩個端點之間交換訊息時,這些訊息可能是可靠的。在CoAP中,使用確認訊息(CON)獲得可靠的訊息。使用這種訊息,客戶端可以確保訊息將到達伺服器。反覆傳送確認訊息,直到另一方傳送確認訊息(ACK)。ACK訊息包含與確認訊息(CON)相同的ID。 下圖顯示了訊息交換過程: ![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/thingsboard-coap/coap-messages-ack.png) 如果伺服器在管理傳入請求時遇到問題,則可以傳送回Rest訊息(RST)而不是Acknowledge訊息(ACK): ![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/thingsboard-coap/coap-messages-rst.png) 另一個訊息類別是“不可確認(NON)”訊息。這些是不需要伺服器確認的訊息。它們是不可靠的訊息,或者換句話說,這些訊息不包含必須傳遞給伺服器的關鍵資訊。包含從感測器讀取的值的訊息屬於此類別。 即使這些訊息不可靠,它們也具有唯一的ID。 ![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/thingsboard-coap/coap-messages-non.png) ## CoAP請求/響應模型 CoAP請求/響應是CoAP抽象層中的第二層。使用“確認”(CON)或“非確認”(NON)訊息傳送請求。根據伺服器是否可以立即響應客戶端請求或答案(如果不可用),有幾種方案。 如果伺服器可以立即響應客戶端請求,則如果使用確認訊息(CON)承載了請求,則伺服器將包含響應或錯誤程式碼的確認訊息傳送回客戶端: ![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/thingsboard-coap/request-ack-con.png) 如您在CoAP訊息中所注意到的,有一個令牌。令牌不同於訊息ID,它用於匹配請求和響應。 如果伺服器無法立即響應來自客戶端的請求,則它將傳送帶有空響應的確認訊息。一旦響應可用,伺服器就會向客戶端傳送一條新的Confirmable訊息,其中包含響應。此時,客戶端傳送回確認訊息: ![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/thingsboard-coap/request-ack-con-async.png) 如果來自客戶端的請求是使用不可確認訊息承載的,則伺服器將使用不可確認訊息進行應答。 ## CoAP訊息格式 本段涵蓋了CoAP訊息格式。到目前為止,我們已經討論了客戶端和伺服器之間交換的各種訊息。現在是時候分析訊息格式了。受限的應用程式協議是受限環境中的關鍵,因此,它使用緊湊的訊息。為了避免分段,訊息佔用UDP資料報的資料部分。一條訊息由幾個部分組成: ![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/thingsboard-coap/coap-message-format.png) **Version**(VER)(2 bits): CoAP版本號 **Type**(2 bits) ​ 這描述了請求和響應著兩種訊息型別上下文的資料包訊息型別。 - 請求 - 0 : 可確認: 該訊息需要相應的確認訊息。 - 1 : 不可確認:此訊息不需要確認訊息。 - 響應 - 2 : 確認: 此訊息是確認可確認訊息的響應。 - 3 : 重置: 此訊息表明它已收到訊息,但無法處理。 **Token Length**(4 bits): 指示可變長度令牌欄位的長度,其長度可以為0-8位元組。 **Request/Response**(8 bits): CoAP請求/響應程式碼 **Message ID**(16 bits): 用於檢測訊息重複並將“確認/重置”型別的訊息與“確認” /“不可確認”型別的訊息進行匹配。:響應訊息將具有與請求相同的訊息ID。 ## CoAP安全方面 處理物聯網協議時的一個重要方面是安全性方面。如前所述,CoAP使用UDP傳輸資訊。CoAP依靠UDP安全性方面來保護資訊。由於HTTP使用基於TCP的TLS,因此CoAP使用基於*UDP的資料報TLS。*DTLS支援RSA,AES等。無論如何,我們應該考慮在某些受限裝置中可能無法使用某些DTLS密碼套件。重要的是要注意,某些密碼套件引入了一些複雜性,並且受約束的裝置可能沒有足夠的資源來管理它。 ![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/thingsboard-coap/secured-coap.png) 分割線君 ------

**:maple_leaf:高質量的 IOT 技術教程,程式碼主要源於國外開源物聯網平臺[ThingsBoard](https://thingsboard.io/)和對阿里雲物聯網平臺的感悟** 備註: :unlock: :表示**公開瀏覽**; :closed_lock_with_key: :表示**需要加入作者知識星球才可瀏覽**;

## ![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/thingsboard-mqtt-part2/thingsboard_logo_blue.png?imageMogr2/thumbnail/!10p) 原始碼解析系列 ### a.『 準備篇 』 - :unlock: [《物聯網時代-Thingsboard原始碼分析-除錯環境除錯》](https://blog.mushuwei.cn/2018/07/21/%E7%89%A9%E8%81%94%E7%BD%91%E6%97%B6%E4%BB%A3-Thingsboard%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-%E8%B0%83%E8%AF%95%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/)
- :unlock: [《物聯網時代-Thingsboard原始碼分析-專案結構說明》](https://blog.mushuwei.cn/2018/07/24/%E7%89%A9%E8%81%94%E7%BD%91%E6%97%B6%E4%BB%A3-ThingsBoard%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E8%AF%B4%E6%98%8E/)
### b.『裝置連線協議篇 』 - **MQTT** ![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/IOT%20Technical%20Guide/MQTT.png) 協議 : [MQTT](http://mqtt.org/) 技術框架 : [Netty](https://netty.io/) - :unlock: [《MQTT入門篇》](https://blog.mushuwei.cn/2020/02/05/mqtt入門篇/)
- :unlock: [《物聯網時代-ThingsBoard原始碼分析-MQTT裝置連線協議-上》](https://blog.mushuwei.cn/2020/01/24/物聯網時代-ThingsBoard原始碼分析-MQTT裝置連線協議-上/)
- :closed_lock_with_key: [《物聯網時代-ThingsBoard原始碼分析-MQTT裝置連線協議-下》](https://blog.mushuwei.cn/2020/04/23/物聯網時代-ThingsBoard原始碼分析-MQTT裝置連線協議-下/)
- **CoAP**![](https://james-1258744956.cos.ap-shanghai.myqcloud.com/IOT%20Technical%20Guide/coap.png) 協議 : [CoAP](https://coap.technology/) 框架: [Californium(cf)](https://www.eclipse.org/californium/) - :unlock: [《初識CoAP協議》](https://blog.mushuwei.cn/2020/04/30/%E5%88%9D%E8%AF%86CoAP%E5%8D%8F%E8%AE%AE/)
- :unlock: [《抓住CoAP協議的'心'》](https://blog.mushuwei.cn/2020/05/07/%E6%8A%93%E4%BD%8FCoAP%E5%8D%8F%E8%AE%AE%E7%9A%84-%E5%BF%83/)
## IoT線上資源推薦 - 關於物聯網框架、開源庫、作業系統和平臺的資源 https://phodal.github.io/awesome-iot/ - 一個很棒的物聯網專案和資源的列表 https://github.com/HQarroum/awesome-iot/ ## 號外 致力於打造專業的物聯網技術圈,幫助朋友和同學在物聯網的風口上早日起飛