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进行构建,或者直接从下方下载。

git clone https://github.com/sanshengshui/coap-shell

cd coap-shell

mvn clean install

然后在该target文件夹中运行可执行jar包。

快速开始

启动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:>

连接到CoAP服务器(例如coap://californium.eclipse.org/或coap://coap.me)

server-unknown:>connect coap://coap.me

available

coap://coap.me:>ping

available

coap://coap.me:>

发现可用的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:>

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: 消息负载数据

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:>

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:>

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。

参考资料

coap 返回版本信息_CoAP协议详解相关推荐

  1. coap 返回版本信息_CoAP协议学习笔记

    CoAP是一种应用层协议,运行于UDP协议之上,非常小巧,最小的数据包仅4字节. CoAP协议定义 CoAP协议的交互模型与HTTP的客户端/服务端模型类似.然而,在M2M的交互场景中,CoAP的目标 ...

  2. coap 返回版本信息_CoAP 协议解析说明(转)

    CoAP 协议全面分析 HTTP与COAP 请求与响应示例 HTTP请求(文本格式) POST https://getman.cn/echo HTTP/1.1 User-Agent: Fiddler ...

  3. coap 返回版本信息_coap组包格式的简单解析

    最近的一个项目中用到了coap,为了防止时间过长导致遗忘,将具体的关键知识写在这里,同时也为后来人减少一些坑. Coap coap是一种符合REST规范(主要是幂等性)的,适用于物联网通讯的数据协议. ...

  4. IoT:MQTT协议详解

    IoT -- (七)MQTT协议详解 转自:https://blog.csdn.net/anxianfeng55555/article/details/80908795 MQTT是什么? MQTT(M ...

  5. HTTP协议详解(真的很经典)

    转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的 ...

  6. Http 协议详解笔记

    HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第 ...

  7. Http协议 详解(转载)

    http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx 引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分 ...

  8. HTTP协议详解 转自小坦克

    HTTP协议详解 转自小坦克 -- 有些文章是引用别人的,为了方便我以后或不再备注;引用目的是因为直接网摘里面的地址经常被重置,找不到原来的文章 当今web程序的开发技术真是百家争鸣,ASP.NET, ...

  9. 【HTTP协议】超详细的HTTP协议详解

    基本介绍 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/ ...

最新文章

  1. 怎么配置mysql的ip_设置MYSQL允许用IP访问
  2. hdu4400 BFS+STL
  3. python的pip文件目录_python基础—pip指定安装目录
  4. 服务器linux centos 7.4 搭建ftp服务器
  5. 去除Android开发文档中的URL,加速你的Android开发文档
  6. netty系列之:基于流的数据传输
  7. as3.0 mysql_RedhatAS3.0上安装Apache2+PHP5+MySQL+Resin+SSL+GD+weba_PHP教程
  8. 第一:Python发送邮件时定义文本乱码
  9. JavaScript中的对象学习笔记(属性操作)
  10. 三维旋转矩阵_旋转之一 - 复数与2D旋转
  11. CoreAnimation-CABasicAnimation
  12. (03)两个模型的交集、并集、差集
  13. nyoj107hdu A Famous ICPC Team
  14. vue3-proxy
  15. 三分钟带你快速了解网站开发的整个流程
  16. wechat小程序布局flex
  17. UUI Make StartUp Disk
  18. Mqtt ----心跳机制 长链接 ping
  19. 大连医科大学中山学院模拟医院信息系统实验室建设完成
  20. 朴素贝叶斯分类器NBC

热门文章

  1. 17所大学!考研计算机/软件专业课变化的大学名单!【20考研】
  2. html语音合成text2audio讯飞,python讯飞语音合成
  3. 打造数智制造“新引擎”,用友U9 cloud助百得胜加速崛起
  4. oracle集群crs,oracle rac集群 crs常用命令(转)
  5. 你连问问题都不会?怎么学编程!!!
  6. 适合零基础编程学员学习的网站,APP
  7. android自动夜间模式吗,Android夜间模式的实现方案
  8. 盒子模型(Box Model)
  9. 商丘学院计算机基础,商丘学院
  10. [USACO09DEC]视频游戏的麻烦Video Game Troubles(DP)