当前位置: 首页 > news >正文

通讯协议介绍CoAP 协议解析

目录

1 通讯协议

2 TCP/IP 网络模型

2.1 TCP协议

2.1.1 TCP 连接过程

2.1.2 TCP 断开连接

2.1.3 TCP协议特点

2.2 UDP协议

2.2.1 UDP 协议特点

3 应用层协议简介

3.1 HTTP 协议

3.2 CoAP 协议

3.3 MQTT 协议

4 CoAP 协议详解

4.1 REST 风格

4.2 CoAP 首部分析

4.3 CoAP 媒体类型

4.4 CoAP 重传机制

4.5 CoAP 报文解析


1 通讯协议

通讯协议又称通讯规程,是通信双方对数据传送控制的一种约定,双方必须共同准守。约定的内容包括:数据格式、同步方式、传送速度、传送速度、传送步骤、检纠错方式、控制字符定义等。双方实体需要准守通信协议中既定的规则,才能将有意义的信息传递给对方。

市面上有很多物联网应用层协议,COAP、HTTP、MQTT 是最常见的三种。HTTP 和 MQTT 均使用 TCP 作为传输层协议,而 COAP 则是基于 UDP 传输协议。同时,传输层的 UDP 和 TCP 协议又都是依赖网络层的 IP 技术。

2 TCP/IP 网络模型

TCP/IP 是互联网相关的各类协议族的总称,比如 TCP、UDP、IP、FTP、HTTP、SMTP 等都属于 TCP/IP 族内的协议。

TCP/IP 模型是互联网的基础,它是一系列网络协议的总称。这些协议可以划分为四层,分别为链路层、网络层、传输层和应用层。

链路层:负责封装和解封装 IP 报文,发送和接收 ARP 和 RARP 报文等。

网络层:负责路由以及把分组报文发送给目标网络或主机。

传输层:负责对报文进行分组和重组,并以 TCP 或 UDP 协议格式封装报文。

应用层:负责向用户提供应用程序,比如 HTTP、COAP、Telnet、MQTT、DNS 等。

在网络体系结构中,网络通讯的建立必须是在通讯双方在对等层进行,不能交错。在整个数据传输过程中,数据在发送端时经过各层都要附加上相应层的协议头和协议尾(仅数据链路层需要封装协议尾)部分,也就是要对数据进行协议封装,以标识对应层所用的通讯协议。

2.1 TCP协议

当一台计算机想要与另一台计算机通讯时,两台计算机之间的通行需要畅通且可靠,这样才能保证正确收发数据。例如,当你想查看网页或查看电子邮件时,希望完整且按顺序查看网页,而不丢失任何内容。当你下载文件时,希望获得的是完整的文件,而不仅仅是文件的一部分,于是就用到了 TCP 。

TCP(Transmission Control Protocol,传输控制协议),是是一种面向连接的、可靠的、基于字节流得到传输层通信协议,由 IETF 的 RFC 793 定义。TCP 是面向连接的、可靠的流协议,流是指不间断的数据结构,你可以把它想象成排水管中的水流。

2.1.1 TCP 连接过程

如下图所示,可以看到建立一个 TCP 连接的过程(三次握手的过程):

第一次握手:客户端发送 SYN(SEQ=x)报文给服务器,进入 SYN_SEND 状态

第二次握手:服务端接收到 SYN 报文,回应一个 SYN(SEQ=y)+ ACK(ACK=x+1)报文,并进入 SYN_RECV 状态。

第三次握手:客户端收到服务端的 SYN 报文,回应一个 ACK(ACK=y+1)报文,进入连接(Established)状态。

为了防止出现失效的连接请求报文被服务端接收的情况,从而产生错误,这个就是为什么 TCP 建立连接需要三次握手,而不是两次的原因。

通过 wireshark 抓包工具我们也能复现这个过程:

2.1.2 TCP 断开连接

建立一个连接需要三次握手,而终止一个连接需要进经过四次握手,这是由于 TCP 的半关闭造成的,具体过程如下图所示:

第一次握手:某个应用进程首先调用 close,称该端执行 “主动关闭(active close)”,该端的 TCP 于是发送一个 FIN 字节,表示数据发送完毕。

第二次握手:接收到这个 FIN 的队端执行 “被动关闭(passive close)”,这个 FIN 由 TCP 确认。

注意:FIN 的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN 的接收意味着接收端应用进程在相应连接上再无额外数据可接收。

第三次握手:一段时间后,接收到这个文件结束符的应用进程将调用 close 关闭它的套接字。这导致它的 TCP 也发送一个 FIN。

第四次握手:接收这个最终 FIN 的原发送端 TCP(即执行主动关闭的那一端)确认这个 FIN。

既然每个方向都需要一个 FIN 和一个 ACK,因此通常需要4个分节。

如下,通过 wireshark 抓包工具我们也能复现断开连接的过程:

2.1.3 TCP协议特点

面向连接

面向连接,是指发送数据之前必须在两端建立连接。建立连接的方法是 ”三次握手“,这样能建立可靠的连接。

仅支持单传播

每条 TCP 传输连接只能有两个端点,只能进行点对点的数据传输,不支持多端和广播传输方式。

面向字节流

TCP 不像 UDP 那样一个个报文独立的传输,而是在不保留报文边界的情况下已字节流方式进行传输。

可靠传输

对于可靠传输,判断丢包、误码靠的是 TCP 的段编号以及确认号。

提供拥塞控制

当网络出现拥塞的时候,TCP 能够减小向网络注入数据的速率和数量,缓解拥塞。

TCP 提供全双工通信

TCP 允许通信双方的应用程序在任何时候都能发送数据,因为 TCP 连接的两端都没有缓存,用来临时存放存放双向通信的数据。当然,TCP可以立即发送一个数据段,也可以缓存一段时间以便一次发送更多的数据段。

TCP 协议报文格式:

源端口号(2字节):源设备上发送数据包进程的16位端口号。

目标端口号(2字节):目标设备上接收进程的16位端口号。

序号(4字节):由滑动窗口确认系统使用,作为数据分包的第一个字节的序号。在 SYN 位置为1的情况下,它表示初始序号。

确认号(4字节):如果 ACK 位置为1,该字段有效并包含设备用于对接收到的数据包进行确认的序号。

数据偏移(4位):表示数据包的开始位置与 TCP 首部的开始处偏移多少个 32位(4字节)的偏移量。该字段的值乘以4才得到字节形式表示的偏移量、

控制位(6位):用于相关控制信息。这些控制信息包括 URG 紧急位、ACK 确认位、PUSH 推送位、RST 复位位、SYN 同步位和 FIN 结束位。

窗口(2字节):用于流控制,表示该数据包的发送者在一定时间内能从其他设备接收的字节数。

校验和(2字节):用于检测错误的 16 位校验和。

紧急指针(2字节):如果 URG 位置为1,该字段包含紧急数据后面的 “正常” 数据的第一字节的序列号。

2.2 UDP协议

UDP(User Datagram Protocol,用户数据报协议),在网络中它与 TCP 协议一样用于处理数据包,是一种无连接的协议。在 OSI 模型中,在第四层传输层,处于 IP 协议的上一层。UDP 有不提供数据包分组、组装和不能对数据包进行排序的特点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

2.2.1 UDP 协议特点

面向无连接

首先 UDP 是不需要和 TCP 一样在发送数据前进行三次握手建立连接的,想发数据就可以开始发送了,并且也只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作。

具体来说就是:

在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加一个 UDP 头,标识下是 UDP 协议,然后就传递给网络层了。

在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头后就传递给应用层,不会进行任何拼接操作。

有单播,多播和广播的功能

UDP 不只支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播、多播、广播的功能。

UDP 是面向报文的

发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。因此应用程序必须选择合适大小的报文。

不可靠性

首先不可靠性体现在无连接上,通信都不需要建立连接,想发送就发送,这样的情况肯定不可靠。并且收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据了。

再者网络环境时好时坏,但是 UDP 因为没有拥塞控制,一直会以恒定的速度发送数据。即使网络条件不好,也不会对发送速率进行调整,这样实现的弊端就是在网络条件不好的情况下可能会导致丢包,但是优点也很明显,在某些实时性要求高的场景(比如电话会议、直播等)就需要使用 UDP 而不是 TCP。

头部开销小,传输数据报文时是很高效的

UDP 头部包含了以下几个数据:

两个十六位的端口号,分别为源端口(可选字段)和目标端口。

整个数据报文的长度。

整个数据报文的校验和(IPv4 可选字段),该字段用于发现头部信息和数据中的错误。

因此 UDP 的头部开销小,只有八字节,相比 TCP 的至少二十字节要少的多,在传输数据报文时是很高效的。

3 应用层协议简介

3.1 HTTP 协议

HTTP 协议,即超文本传输协议(Hypertext Transfer Protocol),是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档得到数据传送协议。

目前 HTTP 协议作为 WEB 的标准协议已被广泛使用,它在一些物联网场景中同样可以使用,例如手机、PC等终端设备。但是作为适应浏览器场景的 HTTP 协议,并不适用于物联网的其他设备。

适用范围:开放物联网中的资源,实现服务被其他应用所调用。

优势:

简单的工作模式,请求 / 响应。

完整的方法定义。

合理的状态码设计。

友好的媒体类型支持,如文本、图片、视频等。

缺点:

单向传输,可以通过客户端轮询实现类似推送效果或者HTTP2.0

安全性不高,HTTP是明文协议,可以使用 HTTPS 传输。

HTTP 是文本协议,冗长的协议头部,对于运算、存储、带宽资源受限的设备来说开销大。

3.2 CoAP 协议

CoAP(Constrained Application Protocol)即受限的应用协议。CoAP 是为了让低功耗受限设备可以接入互联网,由 IETF 组织制定的,它借鉴了 HTTP 大量成功经验,同样使用请求 / 响应工作模式。

使用范围:适用于互联网环境下一对一 M2M 通讯。

优势:

采用和 HTTP 相似语义的请求和响应码,使用二进制报文,报文大小较小。

传输层基于 UDP 协议,比 TCP 数据包小,并不需要建立连接带来握手的开销。

资源发送支持,通过观察者模式实现类似发布 / 订阅效果。

缺点:

基于 UDP 的不可靠传输,但通过四种报文类型的组合及重传机制提高了传输的可靠性。

基于 UDP 的无连接传输,不利于不同网络间消息的回传。

3.3 MQTT 协议

MQTT(Message Queuing Telemetry Transport)即消息队列遥测传输。

MQTT 协议最初是在 1999 年由 IBM 公司开发的,用于将石油管道上的传感器与卫星相连接。2014 年正式成为 OASIS 开放标准。

MQTT 使用类似 MQ 常用的发布 / 订阅模式,起到应用程序解耦、异步消息、削峰填谷的作用。很多 MQ 中间件也支持 MQTT 协议,比如 ActiveMQ、RabbitMQ、Kafka 等。

适用范围:在低带宽、不可靠的网络下提供基于云平台的远程设备的数据传输和监控。

优势:

使用发布 / 订阅模式,提供一对多的消息发布,使消息发送者和接受者在时间和时空上解耦。

二进制协议,网络传输开销非常小(固定头部是2字节)。

灵活的 Topic 订阅、QoS 等特性。

缺点:

集中化部署,服务端压力大,需要考虑流程控制及高可用。

对于请求 / 响应模式的支持需要在应用层根据消息 ID 做发布主题和订阅主题之间的关联。

4 CoAP 协议详解

4.1 REST 风格

REST(具象状态传输)是 Roy Thomas Fielding 博士于2000年在他的博士论文 “Architectural Styles and the Design of Network-based SoftwareArchitectures” 中提出来的一种 Web 软件架构风格。目前在三种主流的 Web 服务实现方案中,REST 模式与复杂的 SOAP 和 XML-RPC 相比更加简洁,越来越多的 Web服务 开始采用 REST 风格设计和实现。REST 是设计风格而不是标准,REST 通常基于使用 HTTP、URI、XML、JSON 和HTML 这些现有的协议和标准来实现。

REST 风格具有以下特点:

资源一般由 URI 来指定。

无状态通信。

对资源的操作包括获取、创建、修改和删除等,这些操作对应 HTTP 的 GET、POST、PUT 和 DELETE 方法。

资源的表现形式可以是 XML、JSON 或 HTML 格式文件。

CoAP 基于 REST 架构风格,基于简洁、清晰,且易于实现的特点。CoAP 和 HTTP 一样,使用请求 / 响应工作模式:客户端发送 CoAP请求,服务器一旦侦听到请求便会根据其包含的 URI 对资源进行定位,并按请求方法决定如何操作该资源:读取(GET)、创建(POST)、修改(PUT)或者删除(DELETE)。服务器处理完请求之后,将返回客户端一个 CoAP响应,其中包含响应码,也有可能有响应内容。

虽然 CoAP 和 HTTP 多有相似,但其较 HTTP 简单的多。CoAP 建立在 UDP 栈上,这是与 HTTP 相比最主要的区别,它可以更快更好的进行资源优化。CoAP 可以使用与 10kb RAM 系统上,占用内存较少,同时,CoAP 能够发现网络中的节点,这对于低功耗无线传感器网络的自治金额自我修复设计非常有用。

4.2 CoAP 首部分析

CoAP 是一个完整的二进制应用层协议,和 TCP/IP 协议族中的其他协议一样,CoAP协议带有报文头,负载(Payload)和报文头之间使用单字节分隔符 0xFF 隔离。报文头里的版本编号 Ver、报文类型 T、标签长度指示 TKL、准则 Code、报文序号 MessageID 为必填内容。

CoAP 协议报文结构如下:

【 Ver 】版本编号,占2位,取固定值 0b01(0b开头表示后面的数据为二进制数);

【 T 】报文类型,占2位,CoAP 协议定义了4种不同形式的报文:CON、NON、ACK、RST :

【 TKL 】标签长度指示,占4位,用于指示 Token 区域的具体长度。当 CoAP 报文包含 Token 时,TKL 取值 0b0001(1个字节长度)、0b0010(2个字节长度)、0b0100(4个字节长度),当 CoAP 报文省略 Token 时,TKL 取值 0b0000。

【 Code 】准则,占8位(一个字节)。Code 的值分为高三位 Class 部分和低五位 Detail 部分,采用 c.dd 的形式描述:c 和 dd 均采用十进制,c 的取值范围是 031。Code 在请求和响应中的具体表现显示有所不同:当 c=0 时,表示 CoAP 请求,否则表示 CoAP 响应。Code=0.00 表示空报文,是一种特殊形式的 CoAP 响应,Code 值与表达含义如下:

【 Message ID 】报文序号,占2个字节,并采用大端格式描述,用于客户端和服务器建立请求和响应报文之间的一一对应关系,即起报文确认作用。一组对应的 CoAP 请求和 CoAP 响应使用相同的 Message ID,在同一次会话中 ID 保持不变,此次会话结束后该 ID 将会被回收利用。Message ID 可以弥补 UDP 传输方式带来的不可靠性。

【 Token 】标签,长度由 TKL 定义,可以是1字节、2字节或4字节。通常用于应用确认。

【 Options 】选项,CoAP 请求或响应中可携带一组或多组 Options,功能类似于 HTTP 中的通信首部字段、请求首部字段、响应首部字段和实体首部字段。Options 是 CoAP 核心协议中较为复杂的部分,但 Option 也给 CoAP 的应用带来了诸多灵活性。CoAP 选项包括 Uri-Host、Uri-Port、Uri-Path、Uri-Query、Content-Format、Accept、Etag、If-Match和If-None-Match 等部分。

Option Delta 占4位,转换为10进制数值范围在0~12之间 。

如果 Option Delta == 13,那么 Option Delta (extended) 部分为 1 字节,Option Delta = 13 + Option Delta(extended)

如果 Option Delta == 14,那么 Option Delta (extended) 部分为 2 字节,Option Delta = 14 + 255 + Option Delta(extended)

Option Delta == 15 无效

Option Length 占4位, 转换为10进制数值范围在0~12之间 。

如果 Option Length == 13,那么 Option Length (extended) 部分为 1 字节,Option Length = 13 + Option Length(extended)

如果 Option Length == 14,那么 Option Length (extended) 部分为 2 字节,Option Length = 14 + 255 + Option Length(extended)

Option Delta == 15 无效

Option Value 由 Option Length 的值决定 Option Value 的长度。

Option Delta 对应值的含义如下:

3 Uri-Host:CoAP 主机名称,例如 iot.eclipse.org

7  Uri-Port:CoAP 端口号,默认为5683

11 Uri-Path:资源路由或路径,例如 \temperature。资源路径采用 UTF8 字符串形式,不计 \ 的长度。

15 Uri-Query:访问资源参数,例如 ?value1=1&value2=2,参数与参数之间使用 “&” 分隔,Uri-Query 和 Uri-Path之间采用“?”分隔。

在这些option中,Content-Format 和 Accept 用于表示CoAP负载的媒体格式。

12 Content-Format:指定 CoAP 复杂媒体类型,媒体类型采用整数描述,例如 application/json 对应整数50,application/octet-stream 对应整数40。

17 Accept:指定 CoAP 响应复杂中的媒体类型,媒体类型的定义和 Content-Format 相同。

【 0xFF 】分隔符,占1个字节,用于区分 CoAP 首部和具体负载。

【 Payload 】负载,正在有用的被交互的数据。CoAP 负载可能包含不同的媒体类型:二进制、文本、XML、JSON、CBOR 等,但并不支持 HTML 类型的负载。

4.3 CoAP 媒体类型

CoAP 负载支持多种媒体类型,并采用编号的方式对其进行定义。编号一般为2字节的无符号整数。

文本类型(text/plain)、二进制类型(application/octet-stream)、JSON类型(application/json)是在物联网中应用最广泛的三种媒体类型,application/link-format 则是专属于 CoAP 的媒体类型,一般在 CoAP 资源发现中使用。

(一)文本类型

CoAP 中默认的媒体类型为文本类型,若负载为文本类型,那么 CoAP 请求和响应都不需要指定 Content-Format。虽然文本类型使用方便,但需要提前对负载结果的每个部分按顺序进行定义。

如传感器的数据:21.3,62,2022-01-01 17:31:10,传输双方需要事先约定第一个值表示 ”温度“,第二个值表示 ”湿度“,第三个值表示 ”时间“,数据才能被正确解析。

(二)二进制类型

TLV 形式的二进制负载也经常出现在某些物联网应用中出现。TLV 是 Tag,Length 和 Value 的缩写,一个基本的数据元就包含上面三个域。Tag 是该数据元的唯一标识,Length 是 Value 域的长度,Value 就是数据本身。Type 和 Length 的长度固定,一般为 2 或 4 个字节,Value 的长度由 Length 指定,如字符串 9F0607A0000000031010,其中 9F06 是 Tag,07 是长度,A0000000031010 就是数据本身。

(三)JSON类型

JSON(JavaScript Object Notation,JS对象表示法)是一种轻量级的数据交换格式,易于使用者阅读和编写,也易于机器解析和生成。JSON 分为 JSON对象和 JSON 数组两种构造结构:

JSON 对象

JSON 对象是一个无序的键值对集合,以 { 开始并以 } 结束,每个键后面跟一个分号 :,每组键值对之间使用逗号 , 分隔。

JSON 数组

JSON 数组是值有有序集合,以 [ 开始并以 ] 结束,值之间使用逗号 , 分隔。

4.4 CoAP 重传机制

由于 CoAP 采用 UDP 作为其传输层协议,故在网络数据传输过程中,无论是请求还是响应,均存在丢包的风险。为此,CoAP 设计了双层结构 -- 消息层和请求/响应层,消息层处理端点之间的数据交换,并为各报文类型提供重传机制,来弥补传输过程中的不可靠性。

前面提到过,CoAP 定义了四种不同类型的报文:CON、NON、ACK、RST。CON 报文需要被接受者确认,即每一个 CON 报文都对应一个准确热 ACK 报文或 RST 报文,如果在规定的时间内客户端未接受到 ACK 报文或 RST 报文,那么客户端将启动 “重传机制”,如:

在某个时刻,CoAP 客户端发起 CON 类型的 GET 请求,试图从服务端获得温度传感器数据 temperature。如请求没有准确到达 CoAP 服务器(称作 “CoAP 请求丢失”),或服务器虽收到请求并返回响应,但响应未正确到达客户端(称作 “CoAP 响应丢失”),超过一定时间后,客户端就会将前一次 CoAP 请求判定为失败,并再次发送同样的 GET 请求,两次请求的首部和负载完全相同。

CoAP 报文重传机制受制于 ACK_TIMEOUT、ACK_RAMDOM_FACTOR、MAX_RETRANSMIT 三个参数。ACK_TIMEOUT 是响应等待超时时间,典型值为 2s,ACK_RAMDOM_FACTOR 是一个不小于1的随机系数,典型值取1.5,MAX_RETRANSMIT 表示最大重传次数,典型值为4:

对于一个 CON 报文而言,初始超时时间是 ACK_TIMEOUT 到 ACK_RAMDOM_FACTOR * MAX_RETRANSMIT 之间的随机数。重传计数器从0开始计数,一旦在初始超时时间内客户端未收到服务器回传的 ACK 报文或 RST 报文,那么 CON 报文将会被重新发送,重传计数器自动增加至1,并且下一次重传超时间自动递增为上一次超时时间的两倍。

假设响应等待超时时间 ACK_TIMEOUT 取2s,随机系数 ACK_RAMDOM_FACTOR 取1.5,最大重传次数 MAX_RETRANSMIT 为4,则初始超时时间是2~3s之间的随机数(本例中我们取2.5s)。最极端的情况下,CoAP 客户端会发送一次正常的 CON 报文,并在重传4次后停止对该报文的传输。

在该过程中,相邻 CON 报文的时间间隔分别为 2.5s、2 * 2.5s、4 * 2.5s、8 * 2.5s,总计时间即最大传输时间 MAX_TRANSMIT_SPAN = 2.5 * (1 + 2 + 8) = 37.5s。

最后一次 CON 报文的重传并不意味整个传输过程已经结束,CoAP 客户端还要等待最后一次超时时间:16 * 2.5s,然后将停止本条报文的传输。从 CoAP 客户端发送第一次 CON 报文到最后停止传输,总共消耗的时间称为最大等待时间 MAX_TRANSMIT_WAIT = 2.5 *(1+2+4+8+16)= 77.5s。

4.5 CoAP 报文解析

以 电信 OC 平台上设备登录报文为例:

4402AD3D3DAD0700B272641128396C776D326D3D312E300D0565703D38363131303730353937333934353903623D55066C743D333030FF3C2F3E3B72743D226F6D612E6C776D326D222C3C2F312F303E2C3C2F322F303E2C3C2F332F303E2C3C2F342F303E2C3C2F352F303E2C3C2F362F303E2C3C2F372F303E2C3C2F31392F303E2C3C2F31392F313E

上述报文为十六进制数据,根据 [CoAP 首部分析](### CoAP 首部分析) 可以将报文分成7个部分:

① 44 1字节,转换为二进制可得 0b01000100,对应Ver、T、TKL 的值为:

② 02 1字节,Code 准则,转换为二进制可得 0b00000010,对应 Code 值为:

③ AD3D 2字节,Message ID 报文序号,对应的值为:

④ 3DAD0700 4字节,表示Token值, TLK 可知此报文 Token 长度为4字节,故此处截取4字节长度 Token 值。

⑤ B272641128396C776D326D3D312E300D0565703D38363131303730353937333934353903623D55066C743D333030 Options选项,

由 Option Delta 和 Option Length 占一个字节,故取 B2 先进行解析,转换为二进制数为 0b10110010,Option Delta 和 Option Length 解析为:

Option Value 取2个字节长度为:7264,转ASSIC为 rd,此 Option 表示为 uri-path=/rd。

继续往下,截取 11,转换为二进制数为 0b00010001,Option Delta 和 Option Length 解析为 1、1,累加上第一个偏移量为 11 + 1 = 12,对应的 Option 选项名称为 Content-Format ,Option Value 长度为1,故值截取为 28,转换为十进制数为 40 ,对应 CoAP 媒体类型为 application/link-format。

截取 39,转为为二进制数为 0b00111001,Option Delta 和 Option Length 解析为 3、9,累加前面的偏移量为 12 + 3 = 15,对应的 Option 选项名称为 Uri-Query,Option Value 长度为9,故值截取为 6C776D326D3D312E30,进行 ASCII 转换可以得到值为 lwm2m=1.0

截取 0D,转为二进制数为 0b00001101,Option Delta 和 Option Length 解析为 0、13,由于 Option Length 为 13,故下面还含有 Option Delta(extended) 和 Option Length(extended),截取 05 可得二进制数 0b00000101,Option Delta(extended) 和 Option Length(extended) 解析为 0、5,故 Option Length 值为 13 + 5 = 18,即 Option Value 的长度为18,截取 65703D383631313037303539373339343539,可得值为 ep=861107059739459

截取 03,转为二进制数得 0b00000011,Option Delta 和 Option Length 解析为 0、3,累加前面的偏移量为 15 + 0 = 15,对应的 Option 选项名称为 Uri-Query,Option Value 长度为3,故值截取为 623D55,进行 ASCII 转换可以得到值为 b=U

截取 06,转为二进制数得 0b00000110,Option Delta 和 Option Length 解析为 0、6,累加前面的偏移量为 15 + 0 = 15,对应的 Option 选项名称为 Uri-Query,Option Value 长度为6,故值截取为 6C743D333030,进行 ASCII 转换可以得到值为 lt=300

Uri-Query 参数与参数之间使用 & 符号隔开,故此参数完整形式为 lwm2m=1.0&ep=861107059739459&b=U<=300。

⑥ FF 1个字节,分隔符,用于区分 CoAP 首部 与 负载数据。

⑦ 3C2F3E3B72743D226F6D612E6C776D326D222C3C2F312F303E2C3C2F322F303E2C3C2F332F303E2C3C2F342F303E2C3C2F352F303E2C3C2F362F303E2C3C2F372F303E2C3C2F31392F303E2C3C2F31392F313E Payload 负载数据,ASSIC 转换后得 </>;rt="oma.lwm2m",</1/0>,</2/0>,</3/0>,</4/0>,</5/0>,</6/0>,</7/0>,</19/0>,</19/1> ,与 OC 平台文档 要求一致。

相关文章:

通讯协议介绍CoAP 协议解析

目录 1 通讯协议 2 TCP/IP 网络模型 2.1 TCP协议 2.1.1 TCP 连接过程 2.1.2 TCP 断开连接 2.1.3 TCP协议特点 2.2 UDP协议 2.2.1 UDP 协议特点 3 应用层协议简介 3.1 HTTP 协议 3.2 CoAP 协议 3.3 MQTT 协议 4 CoAP 协议详解 4.1 REST 风格 4.2 CoAP 首部分析 4…...

React 开发一个移动端项目(2)

配置基础路由 目标&#xff1a;配置登录页面的路由并显示在页面中 步骤&#xff1a; 安装路由&#xff1a; yarn add react-router-dom5.3.0 5 和 6 两个版本对组件类型的兼容性和函数组件支持有所改变&#xff0c;在这里使用的是 5。 和路由的类型声明文件 yarn add types…...

51单片机 点阵矩阵 坤坤代码

真正的黑子 #include <REGX52.H>void Delay(unsigned int xms); void _74HC595_WriteByte(unsigned char byte); void LED(unsigned char Y,DATA); void LED_Init();sbit RCKP3^5; //RCLK sbit SCKP3^6; //SRCL sbit SERP3^4; //SER //坤坤矩阵 unsigned char code D…...

Android13-图片视频选择器

在compileSDK 33 时&#xff0c;谷歌在安卓新增了 图片选择器 功能&#xff0c;支持单选、多选、选图片、视频等操作&#xff0c;并且不需要额外获取照片/音频权限。 具体实现如下&#xff1a; 1&#xff1a;请求 Log.d(TAG, "Build.VERSION.SDK_INT" Build.VERS…...

【问题处理】GIT合并解决冲突后,导致其他人代码遗失的排查

GIT合并解决冲突后&#xff0c;导致其他人代码遗失的排查 项目场景问题描述分析与处理&#xff1a;1. 警告分析2. 文件分析3. 问题关键4. 验证 解决策略总结 &#x1f4d5;作者简介&#xff1a;战斧&#xff0c;从事金融IT行业&#xff0c;有着多年一线开发、架构经验&#xff…...

H264视频压缩格式

H264简介 H.264从1999年开始&#xff0c;到2003年形成草案&#xff0c;最后在2007年定稿有待核实。在ITU的标准里称为H.264, 在MPEG的标准里是MPEG-4的一个组成部分-MPEG-4 Part 10&#xff0c;又叫Advanced Video Codec&#xff0c;因此常常称为MPEG-4AVC或直接叫AVC。 压缩算…...

动态的中秋爱心演示送女友用python生成爱心软件文末附c++语言写法

用python生成爱心软件 用python生成动态爱心软件 目录 用python生成爱心软件 完整代码 代码解释 逐句解释 效果展示&#xff1a; 如何打包 c写法 完整代码 import turtledef draw_heart():love turtle.Turtle()love.getscreen().bgcolor("black")love.…...

macOS - 使用VLC

文章目录 关于 VLC安装查看帮助流媒体 MRL 语法:URL 语法:主程序 (core)音频视频截图:窗口属性: 子画面屏幕显示&#xff08;OSD&#xff09;:字幕:覆盖:轨道设置:播放控制:默认设备:高级: 输入播放列表性能选项: 热键跳跃大小: 关于 VLC VLC media player VLC 是一款自由、开…...

java微服务项目整合skywalking链路追踪框架

skywalking官网网址&#xff1a;Apache SkyWalking 目录 1、安装skywalking 2、微服务接入skywalking 3、skywalking数据持久化 1、安装skywalking 下载skywalking&#xff0c;本篇文章使用的skywalking版本是8.5.0 Index of /dist/skywalkinghttps://archive.apache.org/…...

pandas 笔记: interpolate

一个用于填充 NaN 值的工具 1 基本用法 DataFrame.interpolate(methodlinear, *, axis0, limitNone, inplaceFalse, limit_directionNone, limit_areaNone, downcast_NoDefault.no_default, **kwargs) 2 主要参数 method 多种插值技术 linear: 默认值&#xff0c;使用线性插…...

应用程序接口(API)安全的入门指南

本文简单回顾了 API 的发展历史&#xff0c;其基本概念、功能、相关协议、以及使用场景&#xff0c;重点讨论了与之相关的不同安全要素、威胁、认证方法、以及十二项优秀实践。 根据有记录的历史&#xff0c;随着 Salesforce 的销售自动化解决方案的推出&#xff0c;首个 Web…...

JavaWeb概念视频笔记

学习地址&#xff1a;102.尚硅谷_Tomcat-Tomcat服务器和Servlet版本的对应关系_哔哩哔哩_bilibili 目录 1.JavaWeb的概念 2.Web资源的分类 3.常用的Web服务器 4.Tomcat服务器和Servlet版本的对应关系 5.Tomcat的使用 a.安装 b.目录介绍 c.如何启动 Tomcat 服务器 另一…...

网络请求【小程序】

一、get 二、post 1.获取相应数据 Page({/*** 页面的初始数据*/data: { inptValue:, isArr:[]},/*** 生命周期函数--监听页面加载*/onLoad(options) {},onSubmit(){// console.log(this.data.inptValue)//2.后台请求数据wx.request({url: https://tea.qingnian8.com/demoArt/…...

python 调用adb shell

目录 python调用 bat&#xff0c;启动新窗口&#xff0c;但是不能自动在进入shell 后执行提前设置的操作。 python启动cmd新窗口&#xff0c;但是不能自动在进入shell 后执行提前设置的操作。 python调用 bat&#xff0c;启动新窗口&#xff0c;但是不能自动在进入shell 后执…...

vue3 使用 vite 构建的项目打包后无法访问

解决办法&#xff1a; 1、安装 vitejs/plugin-legacy -D npm i vitejs/plugin-legacy -D2、vite.config.js 添加配置 import legacy from vitejs/plugin-legacy; export default defineConfig({plugins: [legacy({targets: [defaults, not IE 11]}),vue(),],base:./, // http…...

C语言指针详解(4)———找工作必看指针笔试题汇总

指针对于编程工作的重要性 C语言指针在找工作中具有重要性。以下是几个原因&#xff1a; 1.高效的内存管理&#xff1a;C语言指针可以帮助程序员高效地管理内存&#xff0c;包括动态内存分配和释放&#xff0c;以及数据的访问和操作。这对于开发性能优化的应用程序非常重要&am…...

03MyBatis-Plus中的常用注解

常用注解 TableName MyBatis-Plus根据BaseMapper中指定的泛型(实体类型名)确定数据库中操作的表,如果根据实体类型名找不到数据库中对应的表则会报表不存在异常 //向表中插入一条数据 Test public void testInsert(){User user new User(null, "张三", 23, "…...

Android 修复在 Settings 首页,按键盘方向键逐个单选

Android 修复在 Settings 首页&#xff0c;按键盘方向键逐个单选 问题现象问题分析解决办法 问题现象 在 Settings 主界面&#xff0c;按键盘方向键上下会直接整个选中&#xff0c;无法单条选中变色&#xff0c;而在二级页面中按方向键上下是正常的。 没有遥控器可以通过 adb…...

SpringMvc第六战-【SpringMvcJSON返回异常处理机制】

前言&#xff1a; 小编讲述了&#xff1a;JSR303的概念&#xff0c;应用场景和在具体实例的使用&#xff1b;和拦截器的应用 今天小编来讲述的为cJSON返回&异常处理机制&#xff0c;json返回就不用多说&#xff0c;毕竟大部分数据都是通过Json来传递数据的&#xff0c;异…...

idea-Tabnine

教程地址 Code Faster with AI Code Completions | Tabnine...

联通面试题

一、GC 1.1、目标 GC的主要作用是自动识别和释放不再使用的对象&#xff0c;回收其所占用的内存&#xff0c;以防止内存泄漏和内存溢出的问题。 1.2、如何实现 1.2.1、标记阶段 GC从根对象&#xff08;如线程栈中的引用、静态变量等&#xff09;开始&#xff0c;通过可达性…...

[计组03]进程详解2

目录 应用程序 系统调用 驱动 软件 再看进程 进程管理 如何管理 ? 创建一个进程 注意 PCB 文件描述表 进程相关重点 为什么有进程调度 虚拟空间地址 这次我们从更加详细全面的角度看一下进程在计算机中体系中的展现 应用程序 应用程序 调动 系…...

使用redis+lua通过原子减解决超卖问题【示例】

系列文章目录 一、SpringBoot连接MySQL数据库实例【tk.mybatis连接mysql数据库】 二、SpringBoot连接Redis与Redisson【代码】 三、SpringBoot整合WebSocket【代码】 四、使用redislua通过原子减解决超卖问题【示例】 五、SpringBoot整合Elasticsearch【代码示例】 文章目录 系…...

WebFlux异常处理:onErrorReturn和onErrorResume

1 缘起 最近在学习WebFlux&#xff0c; 处理异常时遇到些问题&#xff0c;比如&#xff0c;Java直接抛出的异常无法直接被onErrorReturn和onErrorResume捕获&#xff0c; 但是&#xff0c;在map或者flatMap等方法之后的异常又可以直接被捕获&#xff0c; 于是&#xff0c;进行…...

《动手学深度学习 Pytorch版》 4.5 权重衰减

4.5.1 范数与权重衰减 整节理论&#xff0c;详见书本。 4.5.2 高维线性回归 %matplotlib inline import torch from torch import nn from d2l import torch as d2l# 生成一些数据&#xff0c;为了使过拟合效果更明显&#xff0c;将维数增加到 200 并使用一个只包含 20 个样…...

数据脱敏的风险量化评估介绍

1、背景介绍 当前社会信息化高速发展&#xff0c;网络信息共享加速互通&#xff0c;数据呈现出规模大、流传快、类型多以及价值密度低的特点。人们可以很容易地对各类数据实现采集、发布、存储与分析&#xff0c;然而一旦带有敏感信息的数据被攻击者获取将会造成个人隐私的严重…...

SpringCloudGateway网关实战(三)

SpringCloudGateway网关实战&#xff08;三&#xff09; 上一章节我们讲了gateway的内置过滤器Filter&#xff0c;本章节我们来讲讲全局过滤器。 自带全局过滤器 在实现自定义全局过滤器前&#xff0c; spring-cloud-starter-gateway依赖本身就自带一些全局过滤器&#xff0…...

08在MyBatis-Plus中配置多数据源

配置多数据源 模拟多库场景 适用于多种场景: 多库(操作的表分布在不同数据库当中),读写分离(有的数据库负责查询的功能,有的数据库负责增删该的功能),一主多从,混合模式等 第一步: 模拟多库,在mybatis_plus数据库中创建user表,在mybatis_plus_1数据库中创建product表 --创建…...

Centos8安装docker并配置Kali Linux图形化界面

鉴于目前网上没有完整的好用的docker安装kali桌面连接的教程&#xff0c;所以我想做一个。 准备工作 麻了&#xff0c;这服务器供应商提供的镜像是真的纯净&#xff0c;纯净到啥都没有。 问题一&#xff1a;Centos8源有问题 Error: Failed to download metadata for repo ap…...

游戏开发初等数学基础

凑数图() 立体图形面积体积 1. 立方体&#xff08;Cube&#xff09;: 表面积公式: 6 a 2 6a^2 6a2 &#xff08;其中 a a a 是边长&#xff09;。体积公式: a 3 a^3 a3 &#xff08;其中 a a a 是边长&#xff09;。 2. 球体&#xff08;Sphere&#xff09;: 表面积公…...

自己服务器建设网站/百度查询关键词排名工具

大家在利用镶嵌数据集管理影像的过程中&#xff0c;遭受过影像黑边的困扰吗&#xff1f;所谓的黑边就是在影像接边处有黑色的区域&#xff0c;严重影响视觉效果。 图 镶嵌数据集黑边示意 我们先来分析一下黑边产生原因&#xff1a;在使用镶嵌数据集管理影像数据的过程中&#…...

app服务器搭建教程/长春百度seo公司

上来就是正在安装&#xff0c;一点选择的机会都没有 解决方案&#xff1a; 点击更多系统和语言下载 自行选择下载的类型&#xff0c;这个有选择方案...

顺德网站建设基本流程/武汉网站开发公司

--> Servelet: 用于接收请求(客户端,浏览器),做出响应的,服务器端的,java类 --> ServletLogin -- Web项目服务器响应的Java实现 package com.dragon.java.servlet;import java.io.IOException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException…...

wordpress 网络验证/今天的新闻有哪些

读书-程序员的自我修养-链接、封装与库&#xff08;10&#xff1a; 第四章&#xff1a;静态链接&#xff08;3&#xff09;--C问题,ABI,静态库libc.a,printf .o,hello.c 整个编译链接过程&#xff09;1. C相关问题1.1 C的两个问题1.2 c 与 ABI1.2.1 ABI 定义1.2.2 ABI 和 API 的…...

网站dns解析失败/代推广app下载

文章目录 本课题的研究内容:探地雷达原理探地雷达图像预处理图像倾斜矫正均值法去背景原理与实现图像分割技术阈值分割技术的实现腐蚀与膨胀技术探地雷达杂波抑制研究与实现探地雷达合成孔径成像探地雷达目标识别总结本文为论文解读,为2008年发布的基于传统图像处理与识别论文…...

开发公司采购招聘/seo关键词分析

最近有个概念吵得很火&#xff0c;网络爬虫&#xff0c;但是基本都是用什么python或者JAVA写&#xff0c;貌似很少看到用c写的&#xff0c;我在网上找了一个&#xff0c;看到其实还是很简单的算法。 算法讲解&#xff1a;1.遍历资源网站 2.获取html信息 3.然后解析网址和图片…...