COAP協議簡介
Coap(Constrained Application Protocol)是一種在物聯網世界的類web協議,它的詳細規范定義在 RFC 7252。COAP名字翻譯來就是“受限應用協議”,顧名思義,使用在資源受限的物聯網設備上。物聯網設備的ram,rom都通常非常小,運行TCP和HTTP是不可以接受的。
COAP協議特點
1 COAP協議網絡傳輸層由TCP改為UDP。

2 它基於REST,server的資源地址和互聯網一樣也有類似url的格式,客戶端同樣有POST,GET,PUT,DELETE方法來訪問server,對HTTP做了簡化。
3 COAP是二進制格式的,HTTP是文本格式的,COAP比HTTP更加緊湊。
4 輕量化,COAP最小長度僅僅4B,一個HTTP的頭都幾十個B了。
5 支持可靠傳輸,數據重傳,塊傳輸。 確保數據可靠到達。
6 支持IP多播, 即可以同時向多個設備發送請求。
7 非長連接通信,適用於低功耗物聯網場景。
COAP協議消息類型
COAP協議有4種消息類型
CON—— 需要被確認的請求,如果CON請求被發送,那么對方必須做出響應。這有點像TCP,對方必須給確認收到消息,用以可靠消息傳輸。

可靠消息傳輸
NON—— 不需要被確認的請求,如果NON請求被發送,那么對方不必做出回應。這適用於消息會重復頻繁的發送,丟包不影響正常操作。這個和UDP很像。用以不可靠消息傳輸。

不可靠消息傳輸
ACK —— 應答消息,對應的是CON消息的應答。
RST —— 復位消息,可靠傳輸時候接收的消息不認識或錯誤時,不能回ACK消息,必須回RST消息。
COAP消息格式

coap消息格式
消息頭(HEAD)
第一行是消息頭,必須有,固定4個byte。
Ver : 2bit, 版本信息,當前是必須寫0x01。
T: 2bit, 消息類型,包括 CON, NON. ACK, RST這4種。
TKL: 4bit,token長度, 當前支持0~8B長度,其他長度保留將來擴展用。
Code:8bit,分成前3bit(0~7)和后5bit(0~31),前3bit代表類型。 0代表空消息或者請求碼, 2開頭代表響應碼,取值如下:
1 0.00 Indicates an Empty message
2 0.01-0.31 Indicates a request.
3 1.00-1.31 Reserved
4 2.00-5.31 Indicates a response.
5 6.00-7.31 Reserved
Message ID:16bit, 代表消息MID,每個消息都有一個ID ,重發的消息MID不變
token(可選)用於將響應與請求匹配。 token值為0到8字節的序列。 ( 每條消息必須帶有一個標記, 即使它的長度為零)。 每個請求都帶有一個客戶端生成的token, 服務器在任何結果響應中都必須對其進行回應。token類似消息ID,用以標記消息的唯一性。token還是消息安全性的一個設置,使用全8字節的隨機數,使偽造的報文無法獲得驗證通過。option(可選,0個或者多個)
請求消息 與回應消息都可以0~多個options。 主要用於描述請求或者響應對應的各個屬性,類似參數或者特征描述,比如是否用到代理服務器,目的主機的端口等。
payload(可選)
實際攜帶數據內容, 若有, 前面加payload標識符“0xFF”,如果沒有payload標識符,那么就代表這是一個0長度的payload。如果存在payload標識符但其后跟隨的是0長度的payload,那么必須當作消息格式錯誤處理。
COAP的請求碼(requests)和響應碼(responses)
【0.01】GET方法——用於獲得某資源
【0.02】POST方法——用於創建某資源
【0.03】PUT方法——用於更新某資源
【0.04】DELETE方法——用於刪除某資源
CoAP的URL
coap的url和HTTP的有很相似的地方,開頭是“coap”對應“http”或者“coaps”對應“https”。
HTTP的默認端口是tcp 80,coap的默認端口是udp 5683(coaps是5684)。
URL里面的“/”“&”“.”
下面三個URL的地址是一樣的。訪問example.com這個域名,端口是udp 5683,訪問的資源地址是~sensors/temp.xml。
coap://example.com:5683/~sensors/temp.xml
coap://EXAMPLE.com/%7Esensors/temp.xml
coap://EXAMPLE.com:/%7esensors/temp.xml
COAP的安全性
COAP的安全性是用DTLS加密實現的。DTLS的實現需要的資源和帶寬較多,如果是資源非常少的終端和極有限的帶寬下可能會跑不起來。DTLS僅僅在單播情況下適用。
