CoAP協(xié)議學(xué)習(xí)筆記——CoAP格式詳解
CoAP是受限制的應(yīng)用協(xié)議(Constrained Application Protocol)的代名詞。在當(dāng)前由PC機(jī)組成的世界,信息交換是通過(guò)TCP和應(yīng)用層協(xié)議HTTP實(shí)現(xiàn)的。但是對(duì)于小型設(shè)備而言,實(shí)現(xiàn)TCP和HTTP協(xié)議顯然是一個(gè)過(guò)分的要求。為了讓小設(shè)備可以接入互聯(lián)網(wǎng),CoAP協(xié)議被設(shè)計(jì)出來(lái)。CoAP是一種應(yīng)用層協(xié)議,它運(yùn)行于UDP協(xié)議之上而不是像HTTP那樣運(yùn)行于TCP之上。CoAP協(xié)議非常小巧,最小的數(shù)據(jù)包僅為4字節(jié)。
1 CoAP協(xié)議綜述
和其他TCP IP協(xié)議簇中的協(xié)議一樣,CoAP協(xié)議總是以“頭”的形式出現(xiàn)在負(fù)載之前,而負(fù)載和CoAP頭之間使用單字節(jié)0xFF分離。學(xué)習(xí)CoAP協(xié)議***的方法便是結(jié)合RFC文檔,詳細(xì)分析CoAP協(xié)議報(bào)文格式的每一部分,便是CoAP協(xié)議報(bào)文結(jié)構(gòu)示意圖。
圖1.1 CoAP協(xié)議報(bào)文結(jié)構(gòu)示意圖
2 CoAP協(xié)議報(bào)文各部分
【Ver】 版本編號(hào),指示CoAP協(xié)議的版本號(hào)。類(lèi)似于HTTP 1.0 HTTP 1.1。版本編號(hào)占2位,取值為01B。
【T】報(bào)文類(lèi)型,CoAP協(xié)議定了4種不同形式的報(bào)文,CON報(bào)文,NON報(bào)文,ACK報(bào)文和RST報(bào)文。
【TKL】CoAP標(biāo)識(shí)符長(zhǎng)度。CoAP協(xié)議中具有兩種功能相似的標(biāo)識(shí)符,一種為Message ID(報(bào)文編號(hào)),一種為T(mén)oken(標(biāo)識(shí)符)。其中每個(gè)報(bào)文均包含消息編號(hào),但是標(biāo)識(shí)符對(duì)于報(bào)文來(lái)說(shuō)是非必須的。
【Code】功能碼/響應(yīng)碼。Code在CoAP請(qǐng)求報(bào)文和響應(yīng)報(bào)文中具有不同的表現(xiàn)形式,Code占一個(gè)字節(jié),它被分成了兩部分,前3位一部分,后5位一部分,為了方便描述它被寫(xiě)成了c.dd結(jié)構(gòu)。其中0.XX表示CoAP請(qǐng)求的某種方法,而2.XX、4.XX或5.XX則表示CoAP響應(yīng)的某種具體表現(xiàn)。
【Message ID】報(bào)文編號(hào)
【Token】標(biāo)識(shí)符具體內(nèi)容,通過(guò)TKL指定Token長(zhǎng)度。
【Option】報(bào)文選項(xiàng),通過(guò)報(bào)文選項(xiàng)可設(shè)定CoAP主機(jī),CoAP URI,CoAP請(qǐng)求參數(shù)和負(fù)載媒體類(lèi)型等等。
【1111 1111B】CoAP報(bào)文和具體負(fù)載之間的分隔符。#p#
3 Code部分詳解
Code部分被分成了兩部分,為了便于閱讀,Code被描述為c.dd形式。具體內(nèi)容可參考RFC7252 #12.1.1 Method Codes
3.1 請(qǐng)求
在CoAP請(qǐng)求中,Code被定義為CoAP請(qǐng)求方法,這些方法有GET、POST、PUT和DELETE,這些方法和HTTP協(xié)議非常相似。
【0.01】GET方法——用于獲得某資源
【0.02】POST方法——用于創(chuàng)建某資源
【0.03】PUT方法——用于更新某資源
【0.04】DELETE方法——用于刪除某資源
3.2 響應(yīng)
在CoAP響應(yīng)中,Code被定義為CoAP響應(yīng)碼,類(lèi)似于HTTP 200 OK等等。
【2.01】Created
【2.02】Deleted
【2.03】Valid
【2.04】Changed
【2.05】Content。類(lèi)似于HTTP 200 OK
【4.00】Bad Request 請(qǐng)求錯(cuò)誤,服務(wù)器無(wú)法處理。類(lèi)似于HTTP 400。
【4.01】Unauthorized 沒(méi)有范圍權(quán)限。類(lèi)似于HTTP 401。
【4.02】Bad Option 請(qǐng)求中包含錯(cuò)誤選項(xiàng)。
【4.03】Forbidden 服務(wù)器拒絕請(qǐng)求。類(lèi)似于HTTP 403。
【4.04】Not Found 服務(wù)器找不到資源。類(lèi)似于HTTP 404。
【4.05】Method Not Allowed 非法請(qǐng)求方法。類(lèi)似于HTTP 405。
【4.06】Not Acceptable 請(qǐng)求選項(xiàng)和服務(wù)器生成內(nèi)容選項(xiàng)不一致。類(lèi)似于HTTP 406。
【4.12】Precondition Failed 請(qǐng)求參數(shù)不足。類(lèi)似于HTTP 412。
【4.15】Unsuppor Conten-Type 請(qǐng)求中的媒體類(lèi)型不被支持。類(lèi)似于HTTP 415。
【5.00】Internal Server Error 服務(wù)器內(nèi)部錯(cuò)誤。類(lèi)似于HTTP 500。
【5.01】Not Implemented 服務(wù)器無(wú)法支持請(qǐng)求內(nèi)容。類(lèi)似于HTTP 501。
【5.02】Bad Gateway 服務(wù)器作為網(wǎng)關(guān)時(shí),收到了一個(gè)錯(cuò)誤的響應(yīng)。類(lèi)似于HTTP 502。
【5.03】Service Unavailable 服務(wù)器過(guò)載或者維護(hù)停機(jī)。類(lèi)似于HTTP 503。
【5.04】Gateway Timeout 服務(wù)器作為網(wǎng)關(guān)時(shí),執(zhí)行請(qǐng)求時(shí)發(fā)生超時(shí)錯(cuò)誤。類(lèi)似于HTTP 504。
【5.05】Proxying Not Supported 服務(wù)器不支持代理功能。#p#
4 Option部分詳解
CoAP支持多個(gè)Option,CoAP的Option的表示方法比較特殊,采用增量的方式描述,細(xì)節(jié)可參考RFC7252 #3.1
圖4.1 CoAP部分Option定義
一般情況下Option部分包含Option Delta、Option Length和Option Value三部分。
【Option Delta】表示Option的增量,當(dāng)前的Option的具體編號(hào)等于之前所有Option Delta的總和。
【Option Length】表示Option Value的具體長(zhǎng)度。
【Option Value】表示Option具體內(nèi)容
CoAP中所有的Option都采用編號(hào)的方式,這些Option及編號(hào)的定義如下圖所示。
圖4.2 Option編號(hào)內(nèi)容
在這些option中,Uri-Host、Uri-Port、Uri-Path和Uri-Query等和資源“位置”和參數(shù)有關(guān)。
【3】Uri-Host:CoAP主機(jī)名稱(chēng),例如iot.eclipse.org
【7】Uri-Port:CoAP端口號(hào),默認(rèn)為5683
【11】Uri-Path:資源路由或路徑,例如\temperature。資源路徑采用UTF8字符串形式,長(zhǎng)度不計(jì)***個(gè)"\"。
【15】Uri-Query:訪問(wèn)資源參數(shù),例如?value1=1&value2=2,參數(shù)與參數(shù)之間使用“&”分隔,Uri-Query和Uri-Path之間采用“?”分隔。
在這些option中,Content-Format和Accept用于表示CoAP負(fù)載的媒體格式
【12】Content-Format:指定CoAP復(fù)雜媒體類(lèi)型,媒體類(lèi)型采用整數(shù)描述,例如application/json對(duì)應(yīng)整數(shù)50,application/octet-stream對(duì)應(yīng)整數(shù)40。
【17】Accept: 指定CoAP響應(yīng)復(fù)雜中的媒體類(lèi)型,媒體類(lèi)型的定義和Content-Format相同。
CoAP協(xié)議中支持多個(gè)Option,例如
***個(gè)Option Delta=11,表示該Option表示Uri-Path(11)
第二個(gè)Option Delta=1,表示該Option=1+11,表示Content-Format(12)
第三個(gè)Option Delta=3,表示該Option=3+1+11,表示Uri-Query(15)
CoAP采用這樣的方式表示多個(gè)Option,而每種Option都可以在HTTP協(xié)議中找到對(duì)應(yīng)項(xiàng)。#p#
5 Content-Format描述
CoAP支持多種媒體類(lèi)型,具體可參考RFC7252 #12.3。從下圖的信息可以發(fā)現(xiàn),CoAP協(xié)議中關(guān)于媒體類(lèi)型的定義比較簡(jiǎn)單,未來(lái)應(yīng)該會(huì)根據(jù)實(shí)際情況擴(kuò)展。
圖5.1 Content-Format編號(hào)內(nèi)容
【text/plain】 編號(hào)為0,表示負(fù)載為字符串形式,默認(rèn)為UTF8編碼。
【application/link-format】編號(hào)為40,CoAP資源發(fā)現(xiàn)協(xié)議中追加定義,該媒體類(lèi)型為CoAP協(xié)議特有。
【application/xml】編號(hào)為41,表示負(fù)載類(lèi)型為XML格式。
【application/octet-stream】編號(hào)為42,表示負(fù)載類(lèi)型為二進(jìn)制格式。
【application/exi】編號(hào)為47,表示負(fù)載類(lèi)型為“精簡(jiǎn)XML”格式。(翻譯不一定準(zhǔn)確)
另外,還有一種格式也北IANA認(rèn)定,也會(huì)在CoAP協(xié)議中廣泛使用那便是CBOR格式,該格式可理解為二進(jìn)制JSON格式。
【applicaiton/cbor】編號(hào)為60。
6 示例
該示例來(lái)自于RFC7252。
【流程描述】
CoAP客戶端通過(guò)GET方法從Server端獲得溫度傳感器數(shù)據(jù),CoAP URI如下
coap://www.server.com/temperautre
CoAP請(qǐng)求采用CON報(bào)文,Server接收到CON報(bào)文必須返回一個(gè)ACK報(bào)文。CoAP請(qǐng)求采用0.01 GET方法,若操作成功CoAP Server返回2.05 Content,相當(dāng)于HTTP 200 OK。請(qǐng)求和響應(yīng)的MID必須完全相同,此處為0x7d34。請(qǐng)求響應(yīng)中的Token域?yàn)榭?。CoAP請(qǐng)求中包含Option,該Option的類(lèi)型為Uri-Path,那么Option Delta的值為0+11=11,Option Value的值為字符串形式的“temperature”。CoAP返回中包含溫度數(shù)據(jù),使用字符串形式描述,具體值為"22.3"。
圖6.1 CoAP 請(qǐng)求響應(yīng)流程
【格式描述】
圖6.2 CoAP請(qǐng)求響應(yīng)具體格式
7 總結(jié)
一旦熟悉了CoAP協(xié)議的格式,那么再學(xué)習(xí)CoAP協(xié)議的應(yīng)用就輕松多了。