一个用来学习CoAP协议的小例子

article/2025/8/19 11:08:54

1 CoAP简介

CoAP 是受限制应用协议的简称,是物联网应用层协议之一。物联网应用层协议主要还有HTTP和MQTT,这三种协议有各自不同的应用场景。其中HTTP和MQTT使用TCP作为传输层协议,而CoAP使用UDP作为传输层协议,如下图:
物联网协议
虽然CoAP没有使用TCP作为传输层协议,但它也是TCP/IP协议族的一部分。CoAP借鉴了大量HTTP的经验,比如CoAP也使用请求/响应工作模式(客户端发送CoAP请求,服务器侦听到该请求后根据请求内容返回响应码和相应内容)。不过与HTTP不一样的是,CoAP专门为低功耗受限制设备设计,它比HTTP简单很多。

2 CoAP快速入门

2.1 框架

通过一个简单 例子 来进行CoAP的学习,平台结构如下
在这里插入图片描述
安装有libcoap的Linux主机作为CoAP客户端,而 WeMos D1 作为CoAP服务器。CoAP服务器提供数量有限的几种服务,在 RESTful 风格下,这些服务被称为资源,由WeMos D1组成的CoAP服务器具有一个hello资源,通过GET方法可获得hello资源,其包含一个固定字符串内容“Hello CoAP!”,此外还提供一个light资源,该资源支持GET方法和PUT方法访问,通过GET方法可获得该资源内容,通过PUT方法可以修改该资源的内容,结合GET和PUT方法,可以把虚拟资源的操作直接映射到真实资源中【此例中light资源对应于一个真实的LED灯,其与WeMos D1的引脚2相连】。

2.2 CoAP服务器实现

从代码仓库的first_demo/microcoap目录中获取实例代码,其中

  • microcoap.ino为Arduino IDE的工程文件。
  • coap.c和coap.h为CoAP的实现代码,该部分代码实现了CoAP首部解析和填充、选项解析和填充、负载分离和填充等功能。虽然 coap.c 和 coap.h 仅实现了CoAP的一部分基础功能,但对于本例子,这两个文件并不需要修改。

2.2.1 初始化

Arduino IDE的工程文件中,总有setup()和loop()函数,这点不知道的小伙伴可以学习下Arduino IDE编程,本例中setup()用于实现LED初始化,串口初始化,网络设备初始化等,部分代码如下所示:

//宏定义WeMos D1要连接的WiFi信息
#define AP_SSID "LaoLin"
#define AP_PSW "66684403"//定义UDP变量及包缓存区域
EthernetUDP udp;
uint8_t packetbuf[256];//传感器引脚以及对应变量
static int led = 2;
static char light = '0';void setup()
{int i;pinMode(led, OUTPUT);Serial.begin(9600);Serial.println("Program is beginning");//连接WiFiWiFi.begin(AP_SSID, AP_PSW);Serial.print(String("Connecting to ")+AP_SSID);while (WiFi.status() != WL_CONNECTED){delay(500);//Serial.print(".");}Serial.print("\nConnected, IP address: ");//输出当前IP地址Serial.println(WiFi.localIP());//侦听5683端口的UDP输入数据udp.begin(5683);build_rsp();
}

2.2.2 CoAP数据处理

CoAP数据处理位于loop()函数内,处理流程如图所示:
在这里插入图片描述
具体代码如下所示:

void udp_send(const uint8_t *buf, int buflen)
{udp.beginPacket(udp.remoteIP(), udp.remotePort());while(buflen--)udp.write(*buf++);udp.endPacket();
}
void loop()
{int sz;int rc;coap_packet_t pkt;int i;if ((sz = udp.parsePacket()) > 0){//读取UDP请求内容udp.read(packetbuf, sizeof(packetbuf));for (i = 0; i < sz; i++){Serial.print(packetbuf[i], HEX);Serial.print(" ");}Serial.println("");//验证解析CoAP请求if (0 != (rc = coap_parse(&pkt, packetbuf, sz))){//CoAP数据包有问题Serial.print("Bad packet rc=");Serial.println(rc, DEC);}else{size_t rsplen = sizeof(packetbuf);coap_packet_t rsppkt;//处理CoAP请求coap_handle_req(&scratch_buf, &pkt, &rsppkt, endpoints);memset(packetbuf, 0, UDP_TX_PACKET_MAX_SIZE);//构造CoAP响应if (0 != (rc = coap_build(packetbuf, &rsplen, &rsppkt))){//CoAP响应构造失败Serial.print("coap_build failed rc=");Serial.println(rc, DEC);}else{//返回UDP数据包udp_send(packetbuf, rsplen);}}}
}

2.2.3 资源列表

endpoints列表是一组资源集合,当WeMos D1服务器收到CoAP请求时将遍历此资源集合,其中每个资源都由请求方法,请求处理函数,请求URI和媒体类型组成,具体代码如下:

coap_endpoint_t endpoints[] =
{{COAP_METHOD_GET, handle_get_well_known_core, &path_well_known_core, "ct=40"},{COAP_METHOD_GET, handle_get_hello, &path_hello, "ct=0"},{COAP_METHOD_GET, handle_get_light, &path_light, "ct=0"},{COAP_METHOD_PUT, handle_put_light, &path_light, NULL},{(coap_method_t)0, NULL, NULL, NULL}
};
2.2.3.1 hello 资源

资源定义需要两部分组成,分别是URI和请求处理函数,其代码如下:

//URI,可通过coap://IP/hello对该资源进行访问
static const coap_endpoint_path_t path_hello = {1, {"hello"}};
//请求处理函数
static int handle_get_hello(coap_rw_buffer_t *scratch, const coap_packet_t *inpkt, coap_packet_t *outpkt, uint8_t id_hi, uint8_t id_lo)
{char hello[32] = "Hello CoAP!";return coap_make_response(scratch, outpkt, (const uint8_t *)&hello, strlen(hello), id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CONTENT, COAP_CONTENTTYPE_TEXT_PLAIN);
}
2.2.3.2 light 资源

light资源与hello资源类似,其PUT方法的处理函数代码如下:

static int handle_put_light(coap_rw_buffer_t *scratch, const coap_packet_t *inpkt, coap_packet_t *outpkt, uint8_t id_hi, uint8_t id_lo)
{if (inpkt->payload.p[0] == '1'){//CoAP请求的payload字段为1,则点亮LED灯light = '1';digitalWrite(led, HIGH);Serial.println("ON");}else{//CoAP请求的payload字段为0,则熄灭LED灯light = '0';digitalWrite(led, LOW);Serial.println("OFF");}return coap_make_response(scratch, outpkt, (const uint8_t *)&light, 1, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CHANGED, COAP_CONTENTTYPE_TEXT_PLAIN);
}

2.3 测试

使用已安装有libcoap的Linux主机对WeMos D1服务器发起访问,使用以下命令分别对资源进行访问:

./coap-client -m get coap://[ip]/hello
./coap-client -m get coap://[ip]/light
./coap-client -m put -e "1" coap://[ip]/light

3 CoAP核心

CoAP协议的核心部分内容包括如下内容:

  • CoAP首部分析:版本编号、报文类型、标签长度指示、准则、报文序号、标签、选项、分隔符和负载。
  • CoAP工作模式说明:CON、NON、ACK和RST。
  • CoAP重传机制分析:CoAP请求丢失处理、CoAP响应丢失处理、最大重传次数、最大传输耗时、最大等待时间。
  • CoAP方法说明:GET方法、POST方法、PUT方法和DELETE方法。
  • CoAP响应码说明:正确响应、客户端错误、服务器错误。
  • CoAP选项详细分析:选项格式、URI选项、Content-Format选项、Accept选项、Etag选项、If-Match选项、If-None-Match选项。
  • CoAP媒体类型说明:link-format类型、文本类型、二进制类型、JSON类型。

由于网上本部分资料比较多,博主就不再重复,如有需要了解,找不到好的资料的,也可以下载博客最后面分享的书籍资料进行学习。

4 遇到的问题

  • 刚开始学习CoAP,上网找到的资料基本上说的都是概念性的东西,项目类博客也说的云里雾里,不知道怎么动手操作一个实质性的项目,后来找到了这本书《IoT开发实战:CoAP卷》,PDF的下载链接放在超链接中,有需要的朋友可以自行下载,若是链接失效,可以留言提醒。不得不说要系统性的学习一门知识,还是书籍更好点。
  • 各位看官有问题请留言。

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

相关文章

CoAP学习笔记(1)CoAP报文结构

CoAP报文结构 CoAP基于UDP的应用层协议&#xff0c;报文结构如下 Ver 版本号占2bit&#xff0c;固定为01T 报文类型&#xff0c;占2bit&#xff0c;CoAP中有4种报文类型&#xff0c;如下 类型描述T值CON报文Confirmable&#xff0c;需要被确认的报文T00NON报文Non-Confirma…

coap协议学习之搭建coap测试环境

本篇目标&#xff1a;简单初步认识coap&#xff0c;以及怎么去测试自己搭建的coap协议应用。 材料准备&#xff1a; 谷歌浏览器/火狐浏览器&#xff08;55.0&#xff09;与 copper插件linux系统&#xff08;搭建在虚拟机下的 Ubantu&#xff09;与 libcoap开源程序 COAP插件的…

【协议】MQTT、CoAP、HTTP比较,MQTT协议优缺点

目录 MQTT、CoAP、HTTP区别 1. 协议栈&#xff1a; 2. 请求方式 3. 通讯消息格式&#xff1a; 4. 使用特点与使用场景 5.客户端平台差异 6.防火墙容错 MQTT、CoAP、HTTP介绍 CoAP协议 简介 CoAP与MQTT的区别&#xff1a; HTTP协议 简介 HTTP与CoAP的区别 MQTT协…

libcoap 接口分析与 CoAP 协议开发

libcoap 作为一个重要的 CoAP 开源实现&#xff0c;完整实现了 RFC 7252。很多优秀的 IoT 产品都用到了 libcoap&#xff0c;libcoap 为资源受限的设备&#xff08;例如计算能力&#xff0c;射频范围&#xff0c;内存&#xff0c;带宽或网络数据包大小&#xff09;实施轻量级应…

CoAP协议接入

CoAP协议规范 本小节介绍物联网平台支持的CoAP协议规范。 协议版本 支持RFC 7252 Constrained Application Protocol协议&#xff0c;更多信息&#xff0c;请参见RFC 7252。 通道安全 使用DTLS v1.2保证通道安全&#xff0c;更多信息&#xff0c;请参见DTLS v1.2。 开源客…

干货 | CoAP协议例析

点击上方“中兴开发者社区”&#xff0c;关注我们 每天读一篇一线开发者原创好文 在物联网领域中&#xff0c;MQTT和CoAP是最主要的两个应用协议。MQTT&#xff08;Message Queuing Telemetry Transport/消息队列遥测传输&#xff09;是基于TCP的发布/订阅方式的应用协议&#…

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) 监测数据的指标,例如风力和温…