干货 | CoAP协议例析

article/2025/8/19 11:04:03

点击上方“中兴开发者社区”,关注我们

   每天读一篇一线开发者原创好文

在物联网领域中,MQTT和CoAP是最主要的两个应用协议。MQTT(Message Queuing Telemetry Transport/消息队列遥测传输)是基于TCP的发布/订阅方式的应用协议,没错,你可以将它类比Redis的Pub/Sub机制。CoAP(Constrained Application Protocol,资源受限应用协议)是基于UDP的请求/响应方式的应用协议,是的,你可以类比HTTP,CoAP设计的方方面面的确参考了HTTP,所以你可以把CoAP认为是“物联网的HTTP”。我之前已在《MQTT协议例析》一文中介绍了MQTT,这里在本文中我将简要介绍CoAP协议的典型功能及流程,并基于开源软件libcoap(coap-server)搭建CoAP服务器环境,采用FireFox扩展“Copper (Cu)”作为CoAP客户端产生真实消息,同时使用Wireshark对真实消息进行抓包以及进行码流分析。


首先,使用Copper (Cu)连接coap-server。CoAP默认端口为5683,在Copper (Cu)中输入“coap://<IP地址>:5683/”,并执行Discover(探索),即可发起对CoAP默认资源配置的查询,从而获得该CoAP服务器所提供的所有资源的路径。下图左侧红框内为CoAP NON GET /.well-known/core 请求消息的CoAP协议解码,下图右侧蓝框内为CoAP NON 2.05 Content link-format响应消息的CoAP协议解码,响应消息的内容即下部绿框中的文本信息就是该CoAP服务器所支持的所有资源路径。

CoAP支持四种方法GET/POST/PUT/DELETE,CoAP GET请求与HTTP GET类似,CoAP 2.05 Content响应与HTTP 200 OK类似。为什么这里CoAP请求和响应中都加上了一个“NON”来描述呢?这是因为CoAP基于UDP,UDP是不可靠连接可能丢包,所以CoAP自己实现了连接可靠性。可靠的CoAP消息为CON类型,CON类型的消息必须有响应,如果超时收不到响应就要重发。有可靠就会有不可靠,不可靠的CoAP消息为NON类型,NON类型就是指即使这条消息丢了,也不需要重发。本例的请求和响应都是NON类型的,都是无关紧要的消息。

物联网终端设备通常无法人为操作,终端需要能够自动获取服务器的资源信息,查询“/.well-known/core”就是CoAP协议规定好的用于自动查询服务器所有资源路径的方式。终端发起GET /.well-known/core用于获取该URI所代表的资源。在CoAP中URI需要以Option的形式编码,“/.well-known/core”被编码为上图左侧红框请求消息的Opt#1: Uri-Path: .well-known和Opt#2: Uri-Path: core两部分。服务器收到后会按#1、#2的顺序将其复原为正确的URI“/.well-known/core”。对于上图右侧蓝框的响应消息,服务器将回复link-format格式的文本数据,与HTTP Content-Type类似,在CoAP中通过Content-Format选项(即,上图右侧蓝框Opt #1)来指示所携带数据的类型为application/link-format格式。然后,通过分隔符255(End of options marker)分割Option与载荷部分。载荷中的内容为上图下部绿色文本形式,该文本的格式即为link-format,用于描述CoAP服务器有哪些资源以及资源路径和各种具体属性信息。


我们再来详细看看“/.well-known/core”返回的link-format数据的具体内容,如下图所示,link-format数据使用逗号分割,本例中被2个逗号分割成3个被尖括号所括的资源路径,分别是“/”、“/time”、“/async”,这三个资源有各自的属性,在link-format格式中属性用分号分割。这里提醒一下,CoAP的link-format格式中逗号、分号的用法,与我们在C/C++或者JSON中的常见用法正好相反,请一定注意。如下图所示,资源“/”的属性有title和ct,title即标题即该资源含义或内容的简要描述;ct即Content-Type,在link-format格式中0表示text/plain即纯文本格式。资源“/time”的属性有if、rt、title、ct、obs,其中obs即Observable即可观察的,其值为true,表示该资源支持观察者模式,下文将给出观察者模式的举例和解释。

下面给出CoAP观察者模式的举例,我在下面这个例子中会介绍CoAP协议的Token、分离模式、CON消息、ACK消息、RST消息、Max-Age有效期等知识。如下图所示,本例分为五个步骤,首先是CoAP客户端对 /time 资源发起申请观察请求,然后是CoAP服务器在 /time 资源内容发生变化时主动向客户端投递 /time 的最新内容,连续投递三次后,客户端通过RST消息通知服务器停止观察。为什么CoAP协议支持观察者模式呢?这是因为物联网终端设备通常需要从服务器获取最新的数据信息,如果由客户端发起周期性轮询,则可能出现两种问题:一是服务器资源长期不变,则客户端发起的多次查询请求都是无效的,浪费运算及网络资源;二是如果轮询周期设置过长,则服务器的资源在前次轮询刚过时发生了变化,则会造成客户端无法及时获悉最新的资源信息。因此,CoAP引入了观察者模式,由客户端申请观察,然后主动权就交给服务器,只有资源变化时服务器才将资源信息按需投递给客户端,从而解决上述两个问题。本例的 /time 资源用于提供服务器时间的,在coap-server的 /time 每2秒钟变化一次,因此在观察者模式中服务器会每隔2秒钟发送一次当前的时间信息给客户端。

第1步,客户端发起NON GET /time请求,在请求中携带Observe选项,选项值为0,表示客户端在服务器上注册以申请对 /time 进入观察者模式。服务器收到该请求后,将根据Token值记录该客户端的会话信息,如果 /time 有变化,则会将 /time 的最新内容投递给客户端。我们把一个客户端所注册的一次观察者过程看做一次会话,则Token就是该会话的标识ID,客户端和服务器都会根据Token来区分和识别不同消息是否属于同一个观察者会话。本步骤中服务器回复了该请求,其实对于NON类型的GET请求来说,服务器是可以不必回复的,不过回复了也没有关系。

第2步,两秒钟后,服务器的 /time 资源发生了变化,服务器主动向客户端发起CON 2.05 Content消息,携带当前最新的时间信息给客户端。因为是CON消息,所有客户端收到后必须回复一个ACK消息,如果客户端不回复ACK消息或者ACK消息在网络传输中丢失,则服务器将超时重发该CON消息。在这个服务器主动下发的CON消息中,Observe选项的值为2882,在这里Observe选项值的含义表示计数器,下一次为2883、再下一次为2884、2885、2886等。计数器有助于客户端了解观察者会话中资源的变化次数,以及辅助判断重发情况的资源数据是否为最新。在这个CON 2.05 Content消息中,时间信息的有效期 Max-age 选项值为1,该选项含义为数据的有效期,单位是秒。也就是说,1秒钟后该资源就失效了。

第3步,与第2步类似,又过了两秒钟,服务器的 /time 资源又发生了变化,服务器再次主动向客户端发起CON 2.05 Content消息,携带当前最新的时间信息给客户端,客户端回复ACK以确认。

第4步,与第3步类似,又过了两秒钟,服务器的 /time 资源又发生了变化,服务器再次主动向客户端发起CON 2.05 Content消息,携带当前最新的时间信息给客户端,客户端回复ACK以确认。

第5步,与第4步类似,又过了两秒钟,服务器的 /time 资源又发生了变化,服务器再次主动向客户端发起CON 2.05 Content消息,携带当前最新的时间信息给客户端。这次客户端希望退出观察者模式,向服务器发送RST消息,以退出该Token所标识的观察者会话。需要注意的是,退出观察者会话也可以通过GET消息的Observe选项指示退出,客户端发起的GET消息其Observe选项值为1,即表示退出观察者会话。

如上观察者模式举例中,同一个会话以相同的Token来标识,在同一个会话中有多对消息,每对消息以相同的MessageID来标识,这种同一个Token会话有多对MessageID消息的流程,称为CoAP的分离模式。观察者模式就是一种典型的分离模式。


CoAP协议是IETF制定的标准物联网应用协议,在万物互联时代尤为重要,本文结合消息码流实例抛砖引玉,介绍了CoAP协议的典型功能和流程,希望能够帮助读者了解CoAP协议之概貌,以进一步学习CoAP,了解IoT,了解万物互联。


参考资料:

1. rfc7252 The Constrained Application Protocol (CoAP)
2. rfc7959 Block-Wise Transfers in the Constrained Application Protocol (CoAP)
3. rfc8075 Guidelines for Mapping Implementations HTTP to the Constrained Application Protocol (CoAP)
4. http://coap.technology/
5. http://coap.technology/spec.html
6. https://en.wikipedia.org/wiki/Constrained_Application_Protocol
7. https://en.wikipedia.org/wiki/MQTT
8. https://libcoap.net/


拓展阅读

干货 | MQTT协议例析


http://chatgpt.dhexx.cn/article/K9HXFoEI.shtml

相关文章

CoAP协议简介

学习CoAP最简单的方法便是阅读协议文档。该协议文档并不是那么复杂。当然如果有一个CoAP的简单介绍那就再好不过了。 什么是CoAP CoAP是受限制的应用协议(Constrained Application Protocol)的代名词。在最近几年的时间中&#xff0c;专家们预测会有更多的设备相互连接&#xf…

CoAP 协议学习

CoAP 协议学习 2014年左右智能家居异常火热&#xff0c;由于高效的端到端订阅推送特性&#xff0c;使得MQTT成为了智能家居的首选协议。因此目前各大云平台中&#xff0c;MQTT基本成了标配。 物联网另一个应用协议 CoAP 协议则相对低调&#xff0c;不过由于 NB-IoT 的推出&am…

CoAP协议学习笔记——CoAP格式详解

CoAP是受限制的应用协议(Constrained Application Protocol)的代名词。在当前由PC机组成的世界&#xff0c;信息交换是通过TCP和应用层协议HTTP实现的。但是对于小型设备而言&#xff0c;实现TCP和HTTP协议显然是一个过分的要求。为了让小设备可以接入互联网&#xff0c;CoAP协…

COAP学习笔记

文章目录 一、UDP协议简介二、COAP协议2.1 COAP简介2.2 CoAP消息报文结构i CoAP消息结构 - 消息类型 详解ii CoAP消息结构 - Requset/Response Code 详解iii CoAP消息结构 - Option 详解 2.3 CoAP观察模式2.4 COAP的安全性 三、根据阿里云COAP规范,分析并构建十六进制的报文3.1…

CoAP

CoAP是受限的应用协议(Contrained Application Protocol)的代名词. CoAP是一种应用层协议, 它运行于UDP协议之上. 参考: https://blog.csdn.net/xukai871105/article/details/45167069 CoAP协议综述 和其他TCP IP协议簇中的协议一样, CoAP协议总是以"头"的形式出现…

COAP详解

COAP协议学习 1分析工具 网络包分析利器&#xff1a;wiresharkCOAP协议客户端、服务端&#xff1a;wakaama 源码地址辅助编译工具cmake3&#xff1a;由于wakaama对cmake有版本要求 源码地址 ** 文章后附上wakaama、cmake3编译、使用方法及安装步骤等 2COAP协议介绍 Coap&am…

CoAP协议及开源实现

1. CoAP协议的简单介绍 CoAP是一种面向网络的协议&#xff0c;采用了与HTTP类似的特征&#xff0c;核心内容为资源抽象、REST式交互以及可扩展的头选项等。这些关键特征使得因特网由简单的文档检索机制(World Wide Web)演进成为现在繁荣的应用平台(Web 2.0)。HTTP作为IETF 成功…

CoAP学习笔记——CoAP格式详解

0 前言 CoAP是受限制的应用协议(Constrained Application Protocol)的代名词。在当前由PC机组成的世界&#xff0c;信息交换是通过TCP和应用层协议HTTP实现的。但是对于小型设备而言&#xff0c;实现TCP和HTTP协议显然是一个过分的要求。为了让小设备可以接入互联网&#xff0c…

CoAP协议学习——CoAP基础

【 原连接地址】 更多CoAP文章请参考博文索引——【 物联网学习笔记——索引博文】 推广 《IoT开发实战:CoAP卷》已经由机械工业出版社出版&#xff0c;如果想学习CoAP的更多内容请于淘宝、天猫或京东平台搜索"CoAP"。 什么是CoAP CoAP是受限制的应用协议(Constraine…

COAP介绍

什么是COAP CoAP是受限制的应用协议(Constrained Application Protocol)的代名词。在最近几年的时间中&#xff0c;专家们预测会有更多的设备相互连接&#xff0c;而这些设备的数量将远超人类的数量。在这种大背景下&#xff0c;物联网和M2M技术应运而生。虽然对人而言&#xf…

时序数据库InfluxDB和关系型数据库MySQL的区别及适用场景

数据库主要分为关系型数据库和非关系型数据库&#xff0c;大家所熟悉的数据库中&#xff0c;属Oracle、MySQL和Microsoft SQL Server最出名&#xff0c;使用人数最多&#xff0c;这三种都属于关系型数据库&#xff0c;之所以使用人数这么多&#xff0c;是因为关系型数据库符合大…

vm时序数据库-导入数据

时间序列数据可以通过任何支持的摄取协议导入&#xff1a; Prometheus remote_write API. See these docs for details.DataDog submit metrics API. See these docs for details.InfluxDB line protocol. See these docs for details.Graphite plaintext protocol. See these …

三种常用时序数据库对比调研-InfluxDB、Prometheus、IotDB

1、引言 时序数据治理是数据治理领域核心、打通IT与OT域数据链路&#xff0c;是工业物联网基石、大数据价值创造的关键、企业管理提升的发动机、是数字化转型的重要支撑。 工业企业在生产经营过程中&#xff0c;会运用物联网技术&#xff0c;采集大量的数据并进行实时处理&am…

时序数据 mysql存储_【时序数据库】时序数据库介绍

1.基本概念 时序数据库(Time Series Database)是用于存储和管理时间序列数据的专业化数据库。时序数据库特别适用于物联网设备监控和互联网业务监控场景。 下面介绍下时序数据库的一些基本概念(不同的时序数据库称呼略有不同)。 1.1 度量(metric) 监测数据的指标,例如风力和温…

mysql 时序数据库_时序数据库介绍和使用(转)

1.基础 1.1 时序数据的定义 什么是时间序列数据(Time Series Data,TSD,以下简称时序)从定义上来说,就是一串按时间维度索引的数据。用描述性的语言来解释什么是时序数据,简单的说,就是这类数据描述了某个被测量的主体在一个时间范围内的每个时间点上的测量值。它普遍存在于…

关于时序数据库

https://blog.csdn.net/ransom0512/article/details/78114167 看了一些时序数据库&#xff0c;没有太深入&#xff0c;有一些大概认识&#xff0c;记录下来。 1. 核心 数据存储分为行存储或者列存储&#xff0c;由于列存储的高压缩比&#xff0c;现在使用列存储的比较多一…

时序数据库Machbase

Background 最近偶然接触到Machbase&#xff0c;发现相关信息很少&#xff0c;于是自己做了一些简单的了解&#xff0c;这里记录下&#xff0c;方便有兴趣的童靴参考哈。 1、官方介绍 Machbase是韩国的一家公司开发的一款类似InfluxDB、DolphinDB、TDengine等时序数据库产品&am…

用友:时序数据库要更懂业务场景

本文来自IT168 作者卢敏 时序数据库是针对时间戳或时间序列数据优化的数据库。比如工业企业为了管好工业设备&#xff0c;需要用传感器收集一些带有时间标签的数据&#xff0c;这些数据既要求“超大规模数据瞬时写入”&#xff0c;又要求实现乱序管理。 用友网络助理总裁何冠…

InfluxDB时序数据库

InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成&#xff0c;着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据&#xff0c;IoT行业的实时数据等场景。 InfluxDB有三大特性&#xff1a; Time Series &#xff08;时间序列&#xff…

【技术选型】时序数据库选型

文章目录 1、前言2、概述2.1 时序数据库的定义2.2 时序数据库的概念2.3 时序数据库的趋势 3、时序数据库对比3.1 influxdb3.2 Prometheus3.3 TDengine3.4 DolphinDB 4、选型结论 1、前言 时序数据治理是数据治理领域核心、打通IT与OT域数据链路&#xff0c;是工业物联网基石、…