概述CoAP协议

news2024/11/19 0:31:09

目录

概述

1 认识CoAP协议

2 CoAP的消息

2.1 CoAP消息类型

2.2 可靠传输和不可靠传输 

2.2.1 可靠传输

2.2.2 不可靠消息

2.3 Request/Response Model

3 CoAP消息的格式

3.1 格式介绍

3.2 协议分析

4 CoAP URL

4.1  coap URI Scheme

4.2 coaps URI Scheme

5  CoAP-HTTP Proxying

5.1 GET

5.2 PUT

5.3 DELETE

5.4 POST

6 HTTP-CoAP Proxying

6.1 GET

6.2 HEAD

6.3 POST

6.4 PUT

6.5 DELETE

6.6 CONNECT

7 CoAP Code

7.1  Method Codes

7.2  Response Codes

8 参考资料:


概述

本文主要介绍CoAP的一些知识,CoAP协议是一个非常庞大的系统,不可能在一篇文章中面面俱到。笔者根据自己实际应用的需要,将一些可能使用的重要知识点罗列出来,便于工作和学习中查阅。

1 认识CoAP协议

CoAP(Constrained Application Protocol)是一种专为物联网设备设计的轻量级通信协议。它在UDP(User Datagram Protocol)上运行,具有低带宽和低能耗的特点,适用于资源受限的网络环境。

以下是CoAP协议的一些重要特性:

  1. 轻量级:COAP协议使用简单的二进制格式,占用较少的网络带宽和资源。它可以在嵌入式系统等资源受限的设备上运行。

  2. 简单性:COAP协议定义了一组简单的方法来进行通信,包括GET、POST、PUT和DELETE等。这使得开发者可以轻松地实现和使用COAP协议。

  3. 可靠性:COAP协议在传输层使用了可靠的确认和重传机制,以确保数据的可靠传输。它还支持重复消除,以避免重复请求。

  4. 低能耗:COAP协议的设计考虑了物联网设备的低能耗需求。它使用了一些技术来减少通信的能耗,如触发式通信和低功耗传输模式。

  5. 安全性:COAP协议支持基于DTLS(Datagram Transport Layer Security)的安全传输。它可以使用加密和身份验证来保护通信的安全性。

COAP协议主要用于物联网设备之间的通信,支持各种应用场景,如智能家居、工业自动化和智能城市等。它提供了一种简单、可靠和高效的通信方式,以满足物联网设备的通信需求。

2 CoAP的消息

2.1 CoAP消息类型

CoAP的消息类型总共有四种,其总结如下

消息类型说明
CON需要被确认的请求,如果CON请求被发送,那么对方必须做出响应。这有点像TCP,对方必须给确认收到消息,用以可靠消息传输。
NON不需要被确认的请求,如果NON请求被发送,那么对方不必做出回应。这适用于消息会重复频繁的发送,丢包不影响正常操作。这个和UDP很像。用以不可靠消息传输。
ACK应答消息,对应的是CON消息的应答。
RST复位消息,可靠传输时候接收的消息不认识或错误时,不能回ACK消息,必须回RST消息。

2.2 可靠传输和不可靠传输 

2.2.1 可靠传输

在CoAP协议框架下,CON类型的消息被称作为可靠传输,Client发送消息至Server。Server在接收到消息后,必须对其作出响应。

2.2.2 不可靠消息

 在CoAP协议框架下,NON类型的消息被称作为不可靠传输,Client发送消息至Server。Server在接收到消息后,不需要对其作出响应。

2.3 Request/Response Model

CoAP请求和响应语义在CoAP消息中携带,其中分别包括方法代码或响应代码。可选的(或默认的)请求和响应信息,例如URI和有效负载媒体类型作为CoAP选项携带。令牌是用于独立于底层匹配对请求的响应消息。(请注意,Token是一个单独的概念从消息ID。)

请求以可确认(CON)或非可确认(NON)方式传送。消息,如果立即可用,则返回对请求的响应
在可确认消息中携带的消息在结果中携带确认(ACK)消息。这被称为“piggy-backed”响应)没有必要像客户端那样,单独确认一个附带的响应如果确认消息携带不抱希望的回应是失败的。)两个基本GET请求的示例如图4所示,一个成功,一个导致4.04(未找到)响应。

如果服务器不能立即响应承载的请求在Confirmable消息中,它只是用一个Empty来响应确认消息,以便客户端可以停止重传请求。当响应准备好时,服务器将其发送到新的可确认消息(然后需要确认)由客户端决定。

如果请求以非确认消息的形式发送,则响应使用新的非确认消息发送,尽管服务器可以
而是发送一条confirable消息。 

3 CoAP消息的格式

3.1 格式介绍

CoAP消息的格式如下:

CoAP头部:包含了消息的版本、类型、代码、标识符和选项字段的信息。

CoAP头部信息说明
版本CoAP协议的版本号。
类型消息的类型,包括CON(可靠性传输)、NON(非可靠性传输)、ACK、RST等。
代码消息的操作码,表示请求类型(GET、POST、PUT、DELETE)或响应类型(成功、错误等)。
标识符用于区分不同CoAP消息的唯一标识符。
选项字段可选的参数,用于传输额外的信息。

CoAP选项:可选的参数,用于传输额外的信息。

CoAP选项说明
编号表示此选项的类型。
长度选项值的长度。
选项值具体的选项值。


CoAP负载:用于传输应用层数据。

3.2 协议分析

CoAP基于压缩消息的交换,默认情况下,通过UDP传输(即,每个CoAP消息占用数据一个UDP数据报的部分)。CoAP也可以在数据报上使用传输层安全性(DTLS)。也可能是在其他传输(如SMS、TCP或SCTP)上使用的其规格超出了本文档的范围

CoAP消息以简单的二进制格式编码。的消息Format以固定大小的4字节头开始。后面跟着a
variable-length令牌值,长度在0到8字节之间。以上翻译结果来自有道神经网络翻译(YNMT)· 通用场景。Token值之后是一个由0个或多个CoAP组成的序列TLV (Type-Length-Value)格式的选项,后面可选地跟一个占用数据报其余部分的有效负载。

消息头部分内容

Version (Ver): 

 2位无符号整数。CoAP版本号号码。此规范的实现必须设置此字段到1(01二进制)。其他值为以后的版本保留。版本号未知的消息必须被静默忽略。

Type (T): 

2位无符号整数。指示此消息是否为类型可确认(0)、不可确认(1)、确认(2)或Reset(3)

Token Length (TKL):    

4位无符号整数。的长度。可变长度Token字段(0-8字节)。长度9-15是保留,MUST不能发送,并且必须作为消息处理格式错误。

Code:     

数据类型:8位无符号整数。拆分为3位类(大多数)有效位)和5位细节(最低有效位),文档记录为"c.d ",其中"c"是0到7之间的数字3位子字段和“dd”是5位从00到31的两位数字子域。该类可以指示一个请求(0),一个成功响应(2)、客户端错误响应(4)或服务器错误response(5).(保留所有其他类的值。)作为一个特殊情况下,代码0.00表示空消息。如果…请求时,Code字段表示请求方法;如果…response,一个响应代码。

Message ID: 

数据类型:16位无符号整数网络字节顺序。用于检测消息重复并匹配类型的消息确认/重置为可确认/非确认类型的消息可证实的。

4 CoAP URL

CoAP使用“CoAP”和“coaps”URI模式来标识CoAP资源并提供定位资源的方法。资源是否按等级组织并由潜在的CoAP起源管理侦听CoAP请求(“CoAP”)或dtls安全CoAP的服务器在给定的UDP端口上请求(“coaps”)。CoAP服务器为通过泛型语法的权限组件标识,该组件包括一个主机组件和可选的UDP端口号。的URI的剩余部分被认为是标识一个资源可以通过CoAP协议定义的方法进行操作。因此,可以将“coap”和“coaps”URI模式与“http”和“coaps”URI模式进行比较"https" URI方案。

4.1  coap URI Scheme

coap-URI = "coap:" "//" host [ ":" port ] path-abempty [ "?" query ]

如果主机组件作为ip字面值或IPv4address提供,那么就可以通过该IP地址访问CoAP服务器。如果host是已注册的名称,则该名称被视为间接标识符端点可以使用名称解析服务(如DNS)来找到该主机的地址。主机不能为空;如果一个URI接收到的权限缺失或主机空,那么必须被认为无效。port子组件表示UDP端口CoAP服务器所在的位置。如果它是空的或者没有给出,然后假定缺省端口为5683

路径标识主机和端口范围内的资源。它由一系列用斜杠分隔的路径段组成字符(U+002F SOLIDUS "/")。该查询用于进一步参数化资源。它由由一个&字符 (U+0026 AMPERSAND "&")分隔的参数序列。常用的格式为:“key=value”

4.2 coaps URI Scheme

coaps-URI = "coaps:" "//" host [ ":" port ] path-abempty  [ "?" query ]

上述“覆盖”计划的所有要求也是除了一个默认的UDP端口如果端口子组件为空或,则假设[IANA_TBD_PORT],并且UDP数据报必须通过使用DTLS。

通过“coaps”方案提供的资源没有共享使用“coap”方案标识,即使它们的资源标识符也是如此
表示相同的授权机构(侦听相同UDP的相同主机)端口)。它们是不同的名称空间,并且被认为是
不同的原始服务器。

5  CoAP-HTTP Proxying

如果请求包含代理uri或代理方案选项'http'或'https' URI ,然后是接收CoAP端点(以后称为“代理”)被请求执行操作由请求方法指定的HTTP资源和将结果返回给客户端。此部分为任何CoAP请求指定CoAP响应代理应该返回到客户端。代理是如何满足请求是一个实现细节,尽管典型的预期案例是代理翻译和转发将请求发送到HTTP源服务器。由于HTTP和CoAP共享基本的请求方法集,在HTTP资源上执行CoAP请求并没有太大的不同在CoAP资源上执行它。的含义在HTTP资源上执行单个CoAP方法时在本节的子节中解释。如果代理不能或不愿意使用HTTP URI,则返回5.05(不支持代理)响应客户端。如果代理通过与第三方(如HTTP源服务器),无法获取在一个合理的时间框架内得到一个结果,一个5.04(网关超时)返回响应;如果一个结果可以得到,但没有得到理解后,返回5.02(坏网关)响应。

5.1 GET

方法请求代理返回控件的表示形式由请求URI标识的HTTP资源。如果成功,应该返回一个2.05 (Content)响应码。的响应的有效载荷必须是目标HTTP的表示形式资源,并相应地设置内容格式选项。响应必须指示一个Max-Age值,该值不能大于剩下的时间可以被认为是新鲜的。如果HTTP实体有一个实体标签,代理应该包含一个ETag响应中的选项和处理请求中的ETag选项下面描述。

客户端可以通过以下方式影响GET请求的处理:

接受:  请求可能包括一个接受选项,该选项标识首选的响应内容格式。

ETag:   请求可能包括一个或多个ETag选项,标识客户端存储的响应。这请求代理发送一个2.03(有效)响应时,它将发送一个2.05(内容)响应,在请求的集合中包含实体标记.否则。注意,CoAP etag总是强etagHTTP的感觉;CoAP没有HTTP弱etag的等价物,在交叉代理中没有很好的方法来利用这些。

5.2 PUT

PUT方法请求代理更新或创建HTTP由请求,是通过URI标识的资源来表示。

如果在请求URI处创建了新资源,则2.01(已创建)响应必须返回给客户端。如果现有资源是
修改后,必须返回2.04(已更改)响应来指示请求成功完成。

5.3 DELETE

DELETE方法请求代理删除HTTP资源由HTTP源服务器上的请求URI标识。

2.02(已删除)响应必须返回给客户端如果在请求时资源不存在。

5.4 POST

POST方法请求代理具有该表示请求中包含的内容将由HTTP源服务器处理。POST方法执行的实际功能由源服务器,并依赖于请求所标识的资源URI。

如果POST方法执行的操作没有导致可以通过URI标识的资源,即2.04(已更改)响应必须返回给客户端。如果资源已创建在对于源服务器,必须返回2.01(已创建)响应。

6 HTTP-CoAP Proxying

如果HTTP请求包含带有'coap'或'coaps'的请求uriURI,然后是接收HTTP端点(以后称为“代理”)被请求执行由请求方法指定的操作在指定的CoAP资源上执行,并将结果返回给客户端。此部分为任何HTTP请求指定HTTP响应代理应该返回到客户端。除非另有规定所做的所有陈述都是推荐行为;一些高度受约束的实现可能需要求助于捷径。如何代理实际满足请求是一个实现细节,虽然典型的情况预计是代理翻译和将请求转发到CoAP源服务器。的含义在CoAP资源上执行单个HTTP方法时在本节的子节中解释。如果代理不能或不愿意使用CoAP为请求提供服务URI,则将501(未实现)响应返回给客户端。如果代理通过与第三方交互来为请求提供服务(如CoAP源服务器),并且无法获得结果在合理的时间范围内,504(网关超时)响应是返回;如果可以得到一个结果,但不能理解,则502返回(坏网关)响应。

6.1 GET

GET方法: 请求代理返回控件的表示形式由请求uri标识的CoAP资源。成功后,返回一个200 (OK)响应。有效载荷响应必须是目标CoAP资源的表示形式,并且设置报头字段Content-Type和Content-Encoding相应的行动。响应必须指示一个最大年龄指令指定的值不大于系统的剩余时间代表可以被认为是新鲜的。如果CoAP响应具有选项时,代理应该被响应。

客户端可以通过以下方式影响GET请求的处理以下选项:

Accept: 

 HTTP Accept报头的首选媒体类型字段映射到CoAP Accept选项。HTTP接受不支持媒体类型范围、参数和扩展名CoAP接受选项。如果代理不能发送响应是可接受的,那么代理发送406(不可接受)响应。代理人可以然后用来自HTTP的其他媒体类型重试请求接受报头字段。

Conditional GETs:

Conditional HTTP GET 请求包含“If-”“Match”或“If-None-Match”请求头字段可以映射到相应的CoAP请求。“If- modified - since”和“If-。未修改-因为“请求头”字段不直接支持通过CoAP,但由缓存代理在本地实现。

6.2 HEAD

HEAD方法与GET方法相同,只是服务器必须不这样做在响应中返回消息体。尽管CoAP中没有直接对应HTTP的HEAD方法,HTTP-CoAP代理响应对CoAP资源的HEAD请求返回的HTTP报头没有消息体。

6.3 POST

POST方法请求代理具有该表示请求中包含的内容将由CoAP源服务器处理。POST方法执行的实际功能由源服务器,并依赖于请求所标识的资源URI。如果POST方法执行的操作没有导致资源,可以通过URI, 200 (OK)或204 (No内容响应必须返回给客户端。如果一个资源如果在源服务器上已创建,则必须是201(已创建)响应返回。

如果CoAP响应中存在任何Location-*选项,则由这些选项的值构造的位置报头字段为返回。

6.4 PUT

PUT方法请求代理更新或创建CoAP由Request-URI标识的资源表示。

如果在Request-URI处创建了新资源,则201 (created)将响应返回给客户端。如果现有资源是修改后,响应码为200 (OK)或204 (No Content)发送以指示请求成功完成。

6.5 DELETE

DELETE方法请求代理删除CoAP资源由CoAP源服务器上的请求uri标识。

如果响应包含实体,则成功响应为200 (OK)描述状态或204(无内容),如果操作已完成已制定,但响应不包括实体。

6.6 CONNECT

HTTP-CoAP代理目前无法满足此方法作为TLS到DTLS隧道的功能尚未指定。现在,一个501(未实现)错误返回给客户端。

7 CoAP Code

7.1  Method Codes

子注册表的名称是“CoAP Method Codes”。子注册表中的每个条目必须包含方法代码
范围0.01-0.31,方法的名称,以及对方法的文档。

此子注册表的初始条目如下:

7.2  Response Codes

子注册中心的名称是“CoAP Response Codes”。子注册中心中的每个条目必须包含响应代码
范围2.00-5.31。

此子注册表的初始条目如下:

8 参考资料:

  https://datatracker.ietf.org/doc/html/draft-ietf-core-coap-00   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1637059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytorch GPU版本安装

一、背景 记录一下安装Pytorch GPU版本过程。 由于手残,卸载了电脑上的显卡驱动,现在我连显卡类型是啥都不知道了。 总体思路:安装显卡驱动->安装cuda->安装pytorch库 二、安装显卡驱动 2.1 查看本地显卡型号 通过「DirectX 诊断工具…

基于模板的图像拼接02

基于模板的图像拼接_图像拼接算法模板匹配-CSDN博客 之前的代码在计算模板位置后,高度方向上的值调整时不对。 if height_dst matchRight_H: matchRight imageRight[max_loc[1] - left_height_begin: height_Right, max_loc[0]:width_Right] elif hei…

【全网首发】2024五一数学建模ABC题保奖思路(后续会更新)

一定要点击文末的卡片哦! 1)常见模型分类 机理分析类:来源于实际问题,需要了解一定的物理机理,转化为优化问题。 运筹优化类:旨在找到使某个目标函数取得最大或最小值的最优解,对于机理要求要求不高&…

QT之信号和槽

在刚刚了解Qt的时候,为了通过按钮显示 hello world 的时候曾说明过信号与槽,虽然没有细说,不过也算是接触过。 而本文就会细细说明什么是 Qt 的信号与槽。 概念初识 在 linux 学进程相关的内容的时候,曾了解过信号是操作系统控…

【分治算法】【Python实现】整数划分问题

文章目录 [toc]问题描述分治算法Python实现 个人主页:丷从心 系列专栏:分治算法 学习指南:Python学习指南 问题描述 将正整数 n n n表示成一系列正整数之和, n n 1 n 2 ⋯ n k ( n 1 ≥ n 2 ≥ ⋯ ≥ n k ≥ 1 , k ≥ 1 ) …

【蓄水池问题】太 nice 了!我中奖啦!

小伙伴们中过奖么? 是不是都是 中奖绝缘体 呢? 今天我们就来聊一聊关于中奖的 概率 问题~ 先思考两个问题 如果让你从规模为 N 的数据序列中,随机选取出 k 个不重复的数据,你会怎么做呢? 是不是很简单&#xff0c…

商务口才的谈话技巧(3篇)

商务口才的谈话技巧(3篇) 商务口才的谈话技巧(一) 在商务沟通中,有效的谈话技巧至关重要。首先,倾听是建立信任和理解的基础。真正聆听对方的观点和需求,不仅能让对方感受到尊重,还能…

C++协程库封装

操作系统&#xff1a;ubuntu20.04LTS 头文件&#xff1a;<ucontext.h> 什么是协程 协程可以看作轻量级线程&#xff0c;相比于线程&#xff0c;协程的调度完全由用户控制。可以理解为程序员可以暂停执行或恢复执行的函数。将每个线程看作是一个子程序&#xff0c;或者…

代码随想录算法训练营第59天|503.下一个更大元素II、42. 接雨水

503.下一个更大元素II 题目链接&#xff1a;下一个更大元素II 题目描述&#xff1a;给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数…

TDengine写入2000万数据查询体验

最近在寻找时序数据库&#xff0c;想应用在公司的项目上。 上一篇文章实验了InfluxDB:windows上使用influx2.7学习,还学习了flux语言&#xff0c;最后发现宽表查询比较困难&#xff0c;就放弃了&#xff0c;于是决定试试国产时序数据库TDengine 参考 官方文档&#xff1a;htt…

OpenSSH 漏洞补丁更新笔记

OpenSSH 漏洞补丁更新笔记 相关背景OpenSSH 8.8 以后版本弃用RSA 以及影响centos 更新openssh9.7p1通过rpm包进行安装 Ubuntu更新openssh-9.5p1前置条件下载的源码包导入服务器后操作 相关背景 客户通过第三方扫漏工具发现服务器centos8和Ubuntu22.04有OpenSSH 相关高危漏洞 扫…

Linux 第十八章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

【C#】基础知识

0.参考 C#语言入门详解 1.几种打印hello_world的方式 1.1 console控制台 新建一个console&#xff0c;直接打印&#xff1a; Console.WriteLine("Hello_world");启动一闪而过&#xff0c;在vs调试中选择开始执行不调试&#xff08;without debug&#xff09;。 …

el-tabs作为子组件使用页面空白

文章目录 前言一、问题展示二、源码分析三、解决方案 前言 如果el-tabs是子组件&#xff0c;父组件传值value / v-model为空字符&#xff0c;这个时候在watch中监听value / v-model就会发现监听的数据会被调用为‘0’。一定是作为子组件引用&#xff0c;且在watch进行监听&…

5.C++动态内存管理(超全)

目录 1 .C/C 内存分布 2. C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3. C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 3.3 operator new函数 3.4 定位new表达式(placement-new) &#xff08;了解&#xff09; 4. 常…

开发一个语音聊天社交app小程序H5需要多少钱?

社交&#xff0c;即时通讯APP系统。如何开发一个社交App||开发一个即时通信应用是一项复杂而充满挑战的任务&#xff0c;需要考虑多个技术、开发时间和功能方面的因素。以下是一个概要&#xff0c;描述了从技术、开发时间和功能角度如何开发这样的应用&#xff1a; 1. 技术要点…

Centos7.9系统MySQL5.7.32升级为5.7.44(生成环境操作)

1.背景 由于客户进行等保漏扫和渗透&#xff0c;生成环境mysql数据库被扫描出了 高危漏洞。 如图&#xff1a;部分漏洞 查看漏洞详细信息&#xff0c;建议升级到指定版本解决&#xff1a; 说明&#xff1a; 本文仅适合使用当前数据库为 RPM 安装方式 2.升级前准备 查看环…

STM32-HAL库12-STM32F407VGT6的PWM主从定时器,发送指定数量脉冲

STM32-HAL库12-STM32F407VGT6的PWM主从定时器&#xff0c;发送指定数量脉冲 一、所用材料 STM32F407VGT6自制双伺服电机控制板&#xff1b; 一川A1系列伺服电机驱动器&#xff08;电0.73KW电机&#xff09;&#xff1b; 二、所学内容 实现PWM发送指定个数脉冲&#xff0c;以…

Noisy:一款功能强大的DNS和HTTPS网络流量噪声生成工具

关于Noisy Noisy是一款功能强大的DNS和HTTP/S网络流量噪音生成工具&#xff0c;该工具基于Python开发&#xff0c;可以帮助广大研究人员在进行常规网络浏览时&#xff0c;在后台生成随机的HTTP/DNS网络流量噪声&#xff0c;并以此来提升网络通信数据的安全性和隐蔽性。 支持的…

Hikyuu-教程-如何利用 FINANCE 指标计算市盈率

本篇主要讲解如何利用 FINANCE 指标计算市盈率&#xff0c;其他市净率等指标可以参考此文实现。 获取历史财务字段信息 调用 sm.get_history_finance_all_fields() 方法获取历史财务信息对应字段的索引号和名称 In [2]: sm.get_history_finance_all_fields() Out[2]: [(0, 基…