抓住CoAP協議的“心”


摘要

The Constrained Application Protocol(CoAP)是一種專用的Web傳輸協議,用於受約束的節點和受約束的(例如,低功率,有損)網絡。

節點通常具有帶少量ROM和RAM的8位微控制器,而諸如低功耗無線個人局域網 (6LoWPAN)上的IPv6之類的受限網絡通常具有較高的分組錯誤率,典型吞吐量為10 kbps 。該協議旨在用於機器對機器(M2M)應用,例如智能能源和樓宇自動化。

CoAP提供了應用程序端點之間的請求/響應交互模型,支持服務的資源發現,並包括Web的關鍵概念,例如URI和Internet媒體類型。CoAP旨在輕松與HTTP交互以與Web集成,同時滿足諸如多播支持,非常低的開銷以及在受限環境中的簡單性等特殊要求。

介紹

互聯網上的Web服務(Web API)的使用在大多數應用程序中已經無處不在,並且依賴於Web 的Representational State Transfer(REST)體系結構。

Constrained RESTful Environments(CoRE)的工作旨在以最合適的形式實現REST體系結構,以適用於最受約束的節點(例如RAM和ROM受限的8位微控制器)和網絡(例如6LoWPAN)。諸如6LoWPAN之類的受約束的網絡支持將IPv6數據包分段成小的鏈路層幀。但是,這會大大減少數據包交付概率。CoAP的一個設計目標是保持消息開銷較小,從而限制了分段的需要。

CoAP的主要目標之一是針對這種受限環境的特殊要求設計通用的Web協議,尤其是考慮到能源,樓宇自動化以及其他機器對機器(M2M)應用程序。

CoAP的目標不是盲目地壓縮HTTP,而是實現與HTTP通用但針對M2M應用程序進行了優化的REST的子集。盡管CoAP可用於將簡單的HTTP接口重新生成更緊湊的協議,更重要的是,它還提供了M2M的功能,例如內置資源發現,多播支持和異步消息交換。

該協議可以輕松轉換為HTTP以與現有Web集成,同時滿足特殊要求,例如多播支持,非常低的開銷以及受約束環境和M2M應用程序的簡便性。

特性

CoAP具有以下主要功能:

  • 在受限條件下滿足M2M要求的Web協議
  • UDP [ RFC0768 ]綁定,具有可選的可靠性,支持單播和多播請求。
  • 異步消息交換。
  • 低的報頭開銷和解析復雜度。
  • 簡單的代理和緩存功能。
  • 無狀態HTTP映射,允許構建代理通過HTTP統一方式或HTTP訪問CoAP資源。
  • 綁定到數據報傳輸層安全性(DTLS)的安全性。
  • URI和內容類型支持。

消息格式

  0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Ver| T |  TKL  |      Code     |          Message ID           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   Token (if any, TKL bytes) ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   Options (if any) ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |1 1 1 1 1 1 1 1|    Payload (if any) ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

上圖的頭部字段定義如下:

Version(Ver): 2位無符號整數。CoAP版本號。本規范的實現必須將此字段設置為1(01二進制)。其他值保留用於將來的版本。

Type(T): 2位無符號整數。指示此消息的類型是否為Confirmable(0), Non-Confirmable, Acknowledgement(2)或者Reset(3)。

Token Length(TKL): 4位無符號整數。指示可變長度令牌字段的長度(0-8個字節)。長度9-15 保留,不得發送,並且必須作為消息格式錯誤進行處理。

Code: 8位無符號整數,響應碼。

Message ID: 網絡字節順序的16位無符號整數。用於檢測消息重復並將確認/重置類型的消息與可確認/不可確認類型的消息進行匹配。

CoAP初體驗

CoAP有兩款我覺得比較不錯的客戶端:

  • CoAP-CLI: CoAP-CLI是CoAP的命令行界面,基於node.js和node-coap所構建。

  • The CoAP Shell提供用於與CoAP協議交互的命令行界面。它支持coap:coaps模式(例如UDP和DTLS)。CoAP Shell建立在Spring Shell, Californium(Cf)Scandium(Sc)項目之上。它是一個SpringBoot應用程序,它內置於單個可自我執行的jar中,並且可以在任何Java8+環境中運行。

由於CoAP Shell能更好的體現和展示CoAP的功能、特性和消息格式,接下來我將通過CoAP Shell來講述CoAP協議相關知識點。

以下是CoAP Shell效果圖

如何構建

從GitHub克隆項目並使用Maven進行構建,或者直接從下方下載。

鏈接: https://pan.baidu.com/s/1soGdqIlOBQe968_wezxq7Q 密碼: rw6o

git clone https://github.com/sanshengshui/coap-shell
cd coap-shell
mvn clean install

然后在該target文件夾中運行可執行jar包。

快速開始

  1. 啟動Shell:
java -jar coap-shell-1.1.2-SNAPSHOT.jar
  _____     ___   ___     ______       ____
 / ___/__  / _ | / _ \   / __/ /  ___ / / /
/ /__/ _ \/ __ |/ ___/  _\ \/ _ \/ -_) / /
\___/\___/_/ |_/_/     /___/_//_/\__/_/_/
CoAP Shell (v1.1.2-SNAPSHOT)
For assistance hit TAB or type "help".

server-unknown:>
  1. 連接到CoAP服務器(例如coap://californium.eclipse.org/coap://coap.me)
server-unknown:>connect coap://coap.me
available
coap://coap.me:>ping
available
coap://coap.me:>
  1. 發現可用的CoAP資源
coap://coap.me:>discover
┌──────────────────────────────┬────────────────────────┬─────────────────────────┬───────────┬──────┬─────────────┐
│Path [href]                   │Resource Type [rt]      │Content Type [ct]        │Interface  │Size  │Observable   │
│                              │                        │                         │[if]       │[sz]  │[obs]        │
├──────────────────────────────┼────────────────────────┼─────────────────────────┼───────────┼──────┼─────────────┤
│/123412341234123412341234     │123412341234123412341234│text/plain (0)           │           │      │             │
│/3                            │3                       │application/json (50)    │           │      │             │
│/4                            │4                       │application/json (50)    │           │      │             │
│/5                            │5                       │application/json (50)    │           │      │             │
│/bl%C3%A5b%C3%A6rsyltet%C3%B8y│blåbærsyltetøy          │text/plain (0)           │           │      │             │
│/broken                       │Type2, Type1            │text/plain (0)           │If2, If1   │      │             │
│/create1                      │create1                 │text/plain (0)           │           │      │             │
│/hello                        │Type1                   │text/plain (0)           │If1        │      │             │
│/large                        │Type1, Type2            │text/plain (0)           │If2        │1700  │             │
│/large-create                 │large-create            │text/plain (0)           │           │      │             │
│/large-update                 │large-update            │text/plain (0)           │           │      │             │
│/location-query               │location-query          │text/plain (0)           │           │      │             │
│/location1                    │location1               │application/link-format  │           │      │             │
│                              │                        │(40)                     │           │      │             │
│/multi-format                 │multi-format            │text/plain (0)           │           │      │             │
│/path                         │path                    │application/link-format  │           │      │             │
│                              │                        │(40)                     │           │      │             │
│/query                        │query                   │text/plain (0)           │           │      │             │
│/secret                       │secret                  │text/plain (0)           │           │      │             │
│/seg1                         │seg1                    │application/link-format  │           │      │             │
│                              │                        │(40)                     │           │      │             │
│/separate                     │separate                │text/plain (0)           │           │      │             │
│/sink                         │sink                    │text/plain (0)           │           │      │             │
│/test                         │test                    │text/plain (0)           │           │      │             │
│/validate                     │validate                │text/plain (0)           │           │      │             │
│/weird33                      │weird33                 │text/plain (0)           │           │      │             │
│/weird333                     │weird333                │text/plain (0)           │           │      │             │
│/weird3333                    │weird3333               │text/plain (0)           │           │      │             │
│/weird33333                   │weird33333              │text/plain (0)           │           │      │             │
│/weird44                      │weird44                 │text/plain (0)           │           │      │             │
│/weird55                      │weird55                 │text/plain (0)           │           │      │             │
└──────────────────────────────┴────────────────────────┴─────────────────────────┴───────────┴──────┴─────────────┘

coap://coap.me:>
  1. GET獲取資源數據
coap://coap.me:>get /hello
----------------------------------- Response -----------------------------------
GET coap://coap.me/hello
MID: 64187, Type: ACK, Token: 50E8F0AC1BA8D277, RTT: 3368ms
Options: {"Content-Format":"text/plain"}
Status : 205-Reset Content, Payload: 5B
................................... Payload ....................................
world
--------------------------------------------------------------------------------

從以上列表能清晰的看出CoAP的消息格式和數據包。

  • coap://coap.me/hello : 是CoAP協議的uri

  • MID: 消息的ID,用於唯一區分消息。

  • Type: 消息類型,這里的消息類型為:Acknowledgement(確認)

  • Token: 消息會話

  • Options:{"Content-Format":"text/plain"}消息可選性,這里表示消息的數據類型為文本

  • Status: 狀態碼

  • Payload: 消息負載數據

  1. Delete資源數據

    coap://coap.me:>get /sink
    NULL response!
    coap://coap.me:>delete /sink
    ----------------------------------- Response -----------------------------------
    DELETE coap://coap.me/sink
    MID: 64264, Type: ACK, Token: 0C2338F7FB9447F7, RTT: 274ms
    Options: {"Content-Format":"text/plain"}
    Status : 202-Accepted, Payload: 9B
    ................................... Payload ....................................
    DELETE OK
    --------------------------------------------------------------------------------
    coap://coap.me:>get /sink
    ----------------------------------- Response -----------------------------------
    GET coap://coap.me/sink
    MID: 64265, Type: ACK, Token: 04A8DACB450186A7, RTT: 276ms
    Options: {"ETag":0xa6166ef62ce0b4bc, "Content-Format":"text/plain"}
    Status : 205-Reset Content, Payload: 38B
    ................................... Payload ....................................
    I was deleted, and you put here: hello
    --------------------------------------------------------------------------------
    coap://coap.me:>
    
  2. PUT資源數據

    coap://coap.me:>put /sink --payload 'Hi From IoT Technology' --format text/plain
    ----------------------------------- Response -----------------------------------
    PUT coap://coap.me/sink
    MID: 64266, Type: ACK, Token: FC2CE751AD5A232A, RTT: 368ms
    Options: {"Content-Format":"text/plain"}
    Status : 204-No Content, Payload: 6B
    ................................... Payload ....................................
    PUT OK
    --------------------------------------------------------------------------------
    coap://coap.me:>get /sink
    ----------------------------------- Response -----------------------------------
    GET coap://coap.me/sink
    MID: 64267, Type: ACK, Token: 3439364639206648, RTT: 13478ms
    Options: {"ETag":0x01fd3e1298b1fb7a, "Content-Format":"text/plain"}
    Status : 205-Reset Content, Payload: 36B
    ................................... Payload ....................................
    you put here: Hi From IoT Technology
    --------------------------------------------------------------------------------
    coap://coap.me:>
    
  3. POST資源數據

coap://coap.me:>delete /sink
----------------------------------- Response -----------------------------------
DELETE coap://coap.me/sink
MID: 64268, Type: ACK, Token: 0CCB572626A124A6, RTT: 391ms
Options: {"Content-Format":"text/plain"}
Status : 202-Accepted, Payload: 9B
................................... Payload ....................................
DELETE OK
--------------------------------------------------------------------------------
coap://coap.me:>post /sink --payload 'testing for post data' --format text/plain
----------------------------------- Response -----------------------------------
POST coap://coap.me/sink
MID: 64269, Type: ACK, Token: A441392CC855852D, RTT: 424ms
Options: {"Location-Path":["location1","location2","location3"], "Content-Format":"text/plain"}
Status : 201-Created, Payload: 7B
................................... Payload ....................................
POST OK
--------------------------------------------------------------------------------
coap://coap.me:>get /sink
----------------------------------- Response -----------------------------------
GET coap://coap.me/sink
MID: 64270, Type: ACK, Token: DC24713232F17DB7, RTT: 325ms
Options: {"ETag":0xf97973ea26db6781, "Content-Format":"text/plain"}
Status : 205-Reset Content, Payload: 54B
................................... Payload ....................................
I was deleted, and you put here: testing for post data
--------------------------------------------------------------------------------

到此為止,我相信大家對CoAP協議的消息格式應該有了一定的認知。更多信息和使用請瀏覽這個庫的README

下一篇,我將手把手帶大家用Eclipse Californium搭建CoAP Server服務。

參考資料

CoAP英文官方文檔: https://tools.ietf.org/html/rfc7252

CoAP Wiki百科: https://en.wikipedia.org/wiki/Constrained_Application_Protocol

CoAP-Shell客戶端: https://github.com/sanshengshui/coap-shell


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM