哪有什麼天生如此,只是咱們每天堅持。 -Zhiyuangit
續上篇文章《物聯網協議之CoAP協議開發學習筆記》 沒看過的同窗能夠出門左轉。https://segmentfault.com/a/11...
在進入正題以前強烈建議先看一下關於CoAP協議的一些術語,我已經爲你們準備好了github
這篇文章咱們進入正題詳解一下CoAP協議:json
CoAP協議的交互模型與HTTP的客戶端/服務端模型相似。
然而,在M2M的交互場景中,一個使用CoAP協議的設備一般既是客戶端又是服務端。
CoAP中的請求與HTTP協議中的請求相同,是由客戶端發起的,請求一個位於服務端的資源(用URI標識),執行一個動做(用Method Code標識)。而後服務端發回一個響應,帶有一個響應代碼(Response Code),這個響應中有可能也包含一個資源的表現(附帶響應格式)。segmentfault
與HTTP協議不一樣的是,CoAP的交互是異步的,構建於面向數據報的傳輸協議,如UDP。
交互是經過一個消息層來實現的,消息層提供了可選的可靠性支持(採用指數回退)。
CoAP協議中定義了四種類型的消息: CON, NON, ACK和RST。(下文有介紹)這四種類型的消息中包含有請求和響應標識碼,標識着這些消息是請求仍是響應。請求能夠包含在CON和NON兩種類型中,而響應則除了能夠包含在CON和NON之中,還能夠包含在附帶響應的ACK中。安全
從邏輯上,能夠把CoAP協議劃分爲兩層:服務器
固然,CoAP是一個協議,消息和請求/響應僅僅是其頭部特性。網絡
CoAP的消息格式是很緊湊的,默認運行在UDP上(每一個CoAP消息都是UDP數據包中的數據部分)。
CoAP也能夠運行在DTLS協議上(見9.1節)和其它傳輸協議上,例如SMS,TCP或SCTP,這些不屬於本文檔的範疇(CoAP不支持UDP-lite[RFC3828]和UDP zero checksum[RFC6936])。app
CoAP消息用二進制格式進行編碼。 這個消息格式以一個固定4個字節的頭部開始。
此後是一個長度在0到8字節之間的Token。Token值以後是0個或多個Type-Length-Value(TLV)格式的選項(Option)。以後到整個數據報的結尾都是payload部分,payload能夠爲空。eclipse
頭部字段定義以下:異步
實現注意:0xFF這個值有可能出如今一個選項的長度或選項的值中,因此簡單的掃描0xFF來尋找payload標識符是不可行的。做爲payload標識符的0xFF只可能出如今一個選項結束以後下一個選項有可能開始的地方。
在HTTP的世界中,RESTFul協議因爲其簡單性和適用性,在WEB應用中愈來愈受歡迎,這樣的道理一樣適用於CoAP。
一個CoAP資源能夠被一個URI所描述,例如一個設備能夠測量溫度,那麼這個溫度傳感器的URI被描述爲:CoAP://machine.address:5683/sensors/temperature。請注意,CoAP的默認UDP端口號爲5683。
當你須要去監控某個傳感器例如溫度或溼度等。在這種狀況下,CoAP客戶端並不須要不停的查詢CoAP服務器端的數據變化狀況。
CoAP客戶端能夠發送一個觀察請求到服務器端。從該時間點開始計算,服務器便會記住客戶端的鏈接信息,一旦溫度發生變化,服務器將會把新結果發送給客戶端。
若是客戶端不在但願得到溫度檢測結果,那麼客戶端將會發送一個RST復位請求,此時服務器便會清除與客戶端的鏈接信息。
CoAP協議的特色是傳輸的內容小巧精簡,可是在某些狀況下不得不傳輸較大的數據。在這種狀況下可使用CoAP協議中的某個選項設定分塊傳輸的大小,那麼不管是服務器或客戶端可完成分片和組裝這兩個動做。
CoAP定義了許多option。
通常狀況下Option部分包含Option Delta、Option Length和Option Value三部分。
消息中的每一個option都有一個option編號,option值長度,和option值。
消息中的option號(TLV格式中的T)並非直接指定option編號的。
全部的option必須按實際option編號的遞增排列,某一個option和上一個option之間的option編號差值爲delta;
每個TLV格式的option號都是delta值(數據包中第一個option的delta即它的option編號)。
同一個編號的option再次出現時,delta的值爲0。
option編號由「CoAP option編號」表維護(見12.2節)。5.4講述了本文檔中定義的option的語義。()
一個option之中的各個字段的含義以下:
Option Delta:
表示Option的增量,當前的Option的具體編號。
4-bit無符號整型。值0-12表明option delta。其它3個值做爲特殊狀況保留:
Option Length:
表示Option Value的具體長度。
4-bit無符號整數。值0-12表明這個option值的長度,單位是字節。其它3個值是特殊保留的:
CoAP中全部的Option都採用編號的方式,這些Option及編號的定義以下圖所示。
在這些option中,Uri-Host、Uri-Port、Uri-Path和Uri-Query等和資源「位置」和參數有關。
【3】Uri-Host:CoAP主機名稱,例如iot.eclipse.org
【7】Uri-Port:CoAP端口號,默認爲5683
【11】Uri-Path:資源路由或路徑,例如temperature。資源路徑採用UTF8字符串形式,長度不計第一個""。
【15】Uri-Query:訪問資源參數,例如?value1=1&value2=2,參數與參數之間使用「&」分隔,Uri-Query和Uri-Path之間採用「?」分隔。
在這些option中,Content-Format和Accept用於表示CoAP負載的媒體格式
【12】Content-Format:指定CoAP複雜媒體類型,媒體類型採用整數描述,例如application/json對應整數50,application/octet-stream對應整數40。
【17】Accept: 指定CoAP響應複雜中的媒體類型,媒體類型的定義和Content-Format相同。
CoAP協議中支持多個Option,例如
第一個Option Delta=11,表示該Option表示Uri-Path(11)
第二個Option Delta=1,表示該Option=1+11,表示Content-Format(12)
第三個Option Delta=3,表示該Option=3+1+11,表示Uri-Query(15)
CoAP採用這樣的方式表示多個Option,而每種Option均可以在HTTP協議中找到對應項。
這篇文檔定義了兩個sub-registries,給CoAP頭部代碼字段的值包含「Constrained RESTful Environments (CoRE) Parameters」註冊表。未來參考「CoRE參數」註冊表。
這兩個sub-registries都是8位值,能夠用三個十進制的符號表示爲「c.dd」,用一個句號將第一位和第二位數字分離開;第一位數字c爲07,表示代碼種類;第二個和第三個數字dd爲0031的十進制數,表示細節。
全部的代碼值都按照sub-registries,按照以下範圍安排:
+------+--------+-----------+ | Code | Name | Reference | +------+--------+-----------+ | 0.01 | GET | [RFC7252] | | 0.02 | POST | [RFC7252] | | 0.03 | PUT | [RFC7252] | | 0.04 | DELETE | [RFC7252] | +------+--------+-----------+ 表 5: CoAP Method Codes
其餘Method Codes沒有安排。
互聯網號碼分配政策在將來爲這個sub-registry額外定義描述在「IETF Review or IESG Approval」 [RFC5226].
方法代碼的文檔須要指定這個請求的語義,包含以下屬性:
1.這個方法的響應碼成功返回。 2.這個方法是否冪等,安全或二者都知足。
響應碼 這個sub-registry的名字是「CoAP Response Codes」
每一個sub-registry必須包含在2.00-5.31範圍內的響應碼,響應碼的描述,響應碼的文檔參考。
初始化進入這個sub-registry以下:
+------+------------------------------+-----------+ | Code | Description | Reference | +------+------------------------------+-----------+ | 2.01 | Created | [RFC7252] | | 2.02 | Deleted | [RFC7252] | | 2.03 | Valid | [RFC7252] | | 2.04 | Changed | [RFC7252] | | 2.05 | Content | [RFC7252] | | 4.00 | Bad Request | [RFC7252] | | 4.01 | Unauthorized | [RFC7252] | | 4.02 | Bad Option | [RFC7252] | | 4.03 | Forbidden | [RFC7252] | | 4.04 | Not Found | [RFC7252] | | 4.05 | Method Not Allowed | [RFC7252] | | 4.06 | Not Acceptable | [RFC7252] | | 4.12 | Precondition Failed | [RFC7252] | | 4.13 | Request Entity Too Large | [RFC7252] | | 4.15 | Unsupported Content-Format | [RFC7252] | | 5.00 | Internal Server Error | [RFC7252] | | 5.01 | Not Implemented | [RFC7252] | | 5.02 | Bad Gateway | [RFC7252] | | 5.03 | Service Unavailable | [RFC7252] | | 5.04 | Gateway Timeout | [RFC7252] | | 5.05 | Proxying Not Supported | [RFC7252] | +------+------------------------------+-----------+ 表 6: CoAP Response Codes
響應碼3.00-3.31是預留給未來使用。全部其餘響應碼都沒有被安排。
互聯網號碼分配政策爲這個sub-registry之後額外的定義描述在「IETF Review or IESG Approval」[RFC5226].
響應碼的文檔須要指定這個響應的語義,包含以下屬性:
CoAP支持多種媒體類型,具體可參考RFC7252 #12.3。從下圖的信息能夠發現,CoAP協議中關於媒體類型的定義比較簡單,將來應該會根據實際狀況擴展。
圖5.1 Content-Format編號內容
【text/plain】 編號爲0,表示負載爲字符串形式,默認爲UTF8編碼。
【application/link-format】編號爲40,CoAP資源發現協議中追加定義,該媒體類型爲CoAP協議特有。
【application/xml】編號爲41,表示負載類型爲XML格式。
【application/octet-stream】編號爲42,表示負載類型爲二進制格式。
【application/exi】編號爲47,表示負載類型爲「精簡XML」格式。(翻譯不必定準確)
另外,還有一種格式也北IANA認定,也會在CoAP協議中普遍使用那即是CBOR格式,該格式可理解爲二進制JSON格式。
【applicaiton/cbor】編號爲60。
該示例來自於RFC7252。
【流程描述】
CoAP客戶端經過GET方法從Server端得到溫度傳感器數據,CoAP URI以下
coap://www.server.com/temperautre
CoAP請求採用CON報文,Server接收到CON報文必須返回一個ACK報文。
CoAP請求採用0.01 GET方法,若操做成功CoAP Server返回2.05 Content,至關於HTTP 200 OK。請求和響應的MID必須徹底相同,此處爲0x7d34。請求響應中的Token域爲空。CoAP請求中包含Option,該Option的類型爲Uri-Path,那麼Option Delta的值爲0+11=11,Option Value的值爲字符串形式的「temperature」。
CoAP返回中包含溫度數據,使用字符串形式描述,具體值爲"22.3"。
圖6.1 CoAP 請求響應流程
【格式描述】
圖6.2 CoAP請求響應具體格式
參考文獻:
1.譯文:https://github.com/WildDogTea...
2.http://blog.csdn.net/xukai871...