CoAP(Constrained Application Protocol) 協(xié)議是 IETF 提出的一種面向網(wǎng)絡(luò)的協(xié)議,采用了與 HTTP 類似的特征,核心內(nèi)容為資源抽象、REST 式交互以及可擴(kuò)展的頭選項(xiàng)等。為了克服 HTTP 對(duì)于受限環(huán)境的劣勢(shì),CoAP 既考慮到數(shù)據(jù)報(bào)長(zhǎng)度的最優(yōu)化,又考慮到提供可靠通信。 CoAP協(xié)議具有以下特點(diǎn): (1)消息模型,以消息為數(shù)據(jù)通信載體,通過(guò)交換網(wǎng)絡(luò)消息來(lái)實(shí)現(xiàn)設(shè)備間數(shù)據(jù)通信; (2)對(duì)云端設(shè)備資源操作都是通過(guò)請(qǐng)求與響應(yīng)機(jī)制來(lái)完成,類似 HTTP,設(shè)備端可通過(guò)4個(gè)請(qǐng)求方法(GET, PUT, POST, DELETE)對(duì)服務(wù)器端資源進(jìn)行操作; (3)協(xié)議包輕量級(jí),最小長(zhǎng)度僅為 4B; (4)支持可靠傳輸,通過(guò)確認(rèn)和數(shù)據(jù)重傳確保數(shù)據(jù)可靠到達(dá); (5)支持IP多播, 即可以同時(shí)向多個(gè)設(shè)備發(fā)送請(qǐng)求; (6)非長(zhǎng)連接通信,適用于低功耗物聯(lián)網(wǎng)場(chǎng)景。 1、CoAp 協(xié)議棧CoAP 協(xié)議棧如圖下圖所示,CoAP 由 UDP 作為承載,遵循 UDP 基本的協(xié)議報(bào)文格式,UDP 數(shù)據(jù)內(nèi)容部分按照 CoAP 協(xié)議報(bào)文格式進(jìn)行寫入傳輸。 1.1、 CoAP 資源請(qǐng)求/響應(yīng)模型 Requests:請(qǐng)求方法與 HTTP 協(xié)議類似,分別為: GET, PUT, POST和 DELETE。 Responses:響應(yīng)內(nèi)容也與HTTP協(xié)議類似,主要有以下3類: (1)Success 2.xx 代表客戶端請(qǐng)求被成功接收并被成功處理; (2)Client Error 4.xx 代表客戶端請(qǐng)求有錯(cuò)誤,比如參數(shù)錯(cuò)誤等; (3)Server Error 5.xx 代表服務(wù)器在執(zhí)行客戶端請(qǐng)求時(shí)出錯(cuò)。 1.2、 CoAP 消息報(bào)文定義 如下圖所示為 CoAP 消息報(bào)文示意圖,CoAP 消息報(bào)文是通過(guò)在 UDP 上傳輸消息完成,各部分說(shuō)明如下: - CoAP消息報(bào)文頭部(Header)
頭部固定為4個(gè)Bytes,包含版本號(hào)(Ver)、報(bào)文類型(T)、CoAP標(biāo)識(shí)符長(zhǎng)度(TKL)、功能碼/響應(yīng)碼(Code)以及報(bào)文編號(hào)(Message ID)。各部分說(shuō)明如下: Ver:版本號(hào)占2位,取值為01B,用于指示CoAP協(xié)議的版本號(hào)。 T:CoAP協(xié)議定了4種不同形式的報(bào)文,CON報(bào)文,NON報(bào)文,ACK報(bào)文和RST報(bào)文。 TKL:CoAP協(xié)議中具有兩種功能相似的標(biāo)識(shí)符,一種為Message ID(消息編號(hào)),一種為Token(標(biāo)識(shí)符)。其中每個(gè)報(bào)文均包含消息編號(hào),但是標(biāo)識(shí)符對(duì)于報(bào)文來(lái)說(shuō)是非必須的。 Code:Code在CoAP請(qǐng)求報(bào)文和響應(yīng)報(bào)文中具有不同的表現(xiàn)形式,Code占一個(gè)字節(jié),它被分成了兩部分,前3位一部分,后5位一部分,為了方便描述它被寫成了c.dd結(jié)構(gòu)。其中0.XX表示CoAP請(qǐng)求的某種方法,而2.XX、4.XX或5.XX則表示CoAP響應(yīng)的某種具體表現(xiàn)。 Message ID:消息編號(hào)。 - Token(可選)
標(biāo)識(shí)符具體內(nèi)容,通過(guò)TKL指定Token長(zhǎng)度。通過(guò)token,客戶端收到響應(yīng)后,取出Token,就可以知道該響應(yīng)是針對(duì)之前哪個(gè)請(qǐng)求回復(fù)的。 (3)Option(可選,0個(gè)或者多個(gè)) 請(qǐng)求消息 與回應(yīng)消息都可以0~多個(gè)options。 主要用于描述請(qǐng)求或者響應(yīng)對(duì)應(yīng)的各個(gè)屬性,類似參數(shù)或者特征描述。 (4)1111 1111 CoAP報(bào)文和具體負(fù)載之間的分隔符。 - Payload
實(shí)際攜帶數(shù)據(jù)內(nèi)容, 若有攜帶數(shù)據(jù), 前面加payload 標(biāo)志 OxFF。 2、塊傳輸CoAP 協(xié)議的特點(diǎn)是傳輸?shù)膬?nèi)容小巧精簡(jiǎn),但是在某些情況下不得不傳輸較大的數(shù)據(jù)。在這種情況下可以使用 CoAP 協(xié)議中的選項(xiàng)設(shè)定分塊傳輸?shù)拇笮。?wù)器和客戶端即可完成分片和組裝。擴(kuò)展的塊傳輸協(xié)議在 COAP 基礎(chǔ)協(xié)議上增加了 3 個(gè) options, 2 個(gè) response codes 用于塊傳輸大小協(xié)商及控制。當(dāng)請(qǐng)求消息或者響應(yīng)消息里面有出息 block1/block2 option時(shí),代表這是塊傳輸通信。需要根據(jù) option block 里面M標(biāo)識(shí),決定是否繼續(xù)進(jìn)行塊傳輸。 2.1、新增option說(shuō)明 新增加的 3 個(gè) options 如表7-2所示: Number | Name | Reference | 23 | Block2 | RFC 7959 | 27 | Block1 | RFC 7959 | 28 | Size2 | RFC 7959 |
Option Block2:主要用于服務(wù)器端響應(yīng)時(shí),分塊傳輸, 比如設(shè)備端發(fā)起資源發(fā)現(xiàn)時(shí),由于服務(wù)器上資源較多,就要啟動(dòng)分塊傳輸。 Option Block1:主要用于客戶端發(fā)出請(qǐng)求時(shí),分塊傳輸,比如需要上傳一個(gè)大的數(shù)據(jù)包到服務(wù)器上。 Option Size2: 代表服務(wù)器端響應(yīng)資源總的大小。 Option Block 由三部分組成: (1)NUM:占用0~3Byte,代表當(dāng)前塊編號(hào),以0開(kāi)始, 如我們要傳10個(gè)數(shù)據(jù)塊,則數(shù)據(jù)塊的編號(hào)為0~9。 (2)M:占用1bit, 如果設(shè)置為1代表還有剩下數(shù)據(jù)塊未傳輸。如果設(shè)置為0,代表數(shù)據(jù)塊都已傳輸出去。 (3)SZX:占用2bit,取值范圍0~6,對(duì)應(yīng)每個(gè)block 大小為2(SZX+4),即范圍為(16 ~ 1024)Bytes。 7.2.2.2 新增response code說(shuō)明 新增加的2個(gè)response codes如表7-3所示: Code | Description | Reference | 2.31 | Continue | RFC 7959 | 4.08 | Request Entity Incomplete | RFC 7959 |
3、安全傳輸COAP 使用 DTLS 來(lái)做安全傳輸層,該層運(yùn)行于 UDP 之上,如下圖所示: 當(dāng)前考慮使用 DTLS 時(shí),需要考慮設(shè)備終端資源受限情況,有些資源有限設(shè)備無(wú)法運(yùn)行 DTLS 安全加密算法。做安全加密,需要根據(jù)應(yīng)用場(chǎng)景需要,對(duì)應(yīng)只上報(bào)數(shù)據(jù),且數(shù)據(jù)敏感度不高場(chǎng)景,可以不考慮加入安全層。
|