【硬核干货】NBIOT COAP与LWM2M协议详细解析
1. CoAP协议
CoAP协议是IETF提出的一种面向网络的协议,采用了与HTTP类似的特征,核心内容为资源抽象、REST式交互以及可扩展的头选项等。CoAP协议基于REST构架,REST是指表述性状态转换架构,是互联网资源访问协议的一般性设计风格。为了克服HTTP对于受限环境的劣势,CoAP既考虑到数据报长度的最优化,又考虑到提供可靠通信。一方面,CoAP提供URI,REST式的方法如GET、POST、PUT和DELETE,以及可以独立定义的头选项提供的可扩展性。另一方面,CoAP基于轻量级的UDP协议,并且允许IP多播。为了弥补UDP传输的不可靠性,CoAP定义了带有重传机制的事务处理机制。并且提供资源发现机制,并带有资源描述。
传输层为CoAP协议报文格式,CoAP由UDP作为承载,遵循UDP基本的协议报文格式,UDP数据内容部分按照CoAP协议报文格式进行写入传输。
CoAP协议格式说明如下:
【Ver】版本编号,指示CoAP协议的版本号。类似于HTTP 1.0 HTTP 1.1。版本编号占2位,取值为01B。
【T】报文类型,CoAP协议定义了4种不同形式的报文:CON报文,NON报文,ACK报文和RST报文。
【TKL】CoAP标识符长度。CoAP协议中具有两种功能相似的标识符,一种为Message ID(报文编号),一种为Token(标识符)。其中每个报文均包含消息编号,但是标识符对于报文来说是非必须的。
【Code】功能码/响应码。Code在CoAP请求报文和响应报文中具有不同的表现形式,Code占一个字节,它被分成了两部分,前3位一部分,后5位一部分,为了方便描述它被写成了c.dd结构。其中0.XX表示CoAP请求的某种方法,而2.XX、4.XX或5.XX则表示CoAP响应的某种具体表现。
【Message ID】报文编号。
【Token】标识符具体内容,通过TKL指定Token长度。
【Option】报文选项,通过报文选项可设定CoAP主机、CoAP URI、CoAP请求参数和负载媒体类型等等。
【1111 1111B】CoAP报文和具体负载之间的分隔符。
CoAP支持多个Option,CoAP的Option的表示方法比较特殊,采用增量的方式描述。一般情况下Option部分包含Option Delta、Option Length和Option Val三部分:
【Option Delta】表示Option的增量,当前的Option的具体编号等于之前所有Option Delta的总和。
【Option Length】表示Option Val终端设备的具体长度。
【Option Val终端设备】表示Option具体内容。
CoAP协议报文中具体数值的意义参考CoAP协议:IETF RFC7252。
1.1. COAP协议的特点:
1.CoAP协议网络传输层当前主要支持UDP。
2.CoAP是二进制的,HTTP是文本格式的,CoAP比HTTP更加紧凑。
3.轻量化,CoAP协议最小长度仅4个字节,一个HTTP的头部达几十个字节。
4.支持可靠传输、数据重传、块传输。确保数据可靠到达。
5.支持IP多播,即可以同时向多个设备发送请求。
6.非长连接通信,适用于低速率、低功耗物联网场景。
7.CoAP基于REST,服务器的资源地址和互联网一样也有类似URI的格式,客户端同样有POST、GET、PUT、DELETE方法来访问服务端,但是相对HTTP简化实现降低复杂度(代码更小,封包更小)
1.2. CoAP协议有4种消息类型:
CON—— 需要被确认的请求,如果CON请求被发送,那么对方必须做出响应。这有点像TCP,对方收到消息必须给确认,用以可靠消息传输。
NON—— 不需要被确认的请求,如果NON请求被发送,那么对方不必做出回应。这适用于消息重复频繁的发送情况,丢包不影响正常操作。这个和UDP很像,用以不可靠消息传输。
ACK —— 应答消息,对应的是CON消息的应答。
RST —— 复位消息,可靠传输时候接收的消息不认识或错误时,不能回ACK消息,必须回RST消息。
1.3. 一张表搞懂COAP协议:
1.4. COAP协议抓包验证图:
2. Lwm2m协议
LwM2M是OMA组织制定的轻量化的M2M协议。LwM2M定义了三个逻辑实体:
●LwM2M Server 服务器;
●LwM2M Client 客户端,负责执行服务器的命令和上报执行结果;
●LwM2M 引导服务器 Bootstrap Server,负责配置LwM2M客户端。
在这三个逻辑实体之间有4个逻辑接口:
●Device Discovery and Registration:设备发现和注册;
●Bootstrap:Bootstrap Server配置Client;
●Device Management and Service Enablement:设备管理和服务支持
●Information Reporting:信息报告服务。
LwM2M Objects:每个对象对应客户端的某个特定功能实体。LwM2M 规范定义了以下标准Objects,
Security Object
1\. Server Object
2\. Access Control Object
3\. Device Object
4\. Connectivity Monitoring Object
5\. Firmware Update Object
6\. Location Object
Connectivity Statistics Object
比如urn:oma:lwm2m:oma:2; (LwM2M Server Object);urn:oma:lwm2m:oma:3; (LwM2M Access Control Object);每个object下可以有很多resource,比如Firmware object可以有Firmware版本号,size等resource;Vendor可以自己定义object。
一张图表明三者的关系:
LwM2M Protocol:定义了一些逻辑操作,比如Read, Write, Execute, Create or Delete。
CoAP:是IETF定义的Constrained Application Protocol,用来做LwM2M的传输层,下层是UDP。CoAP有自己的消息头,重传机制等。
DTLS 是指 Datagram Transport Level Security,即数据报安全传输协议,其提供了UDP 传输场景下的安全解决方案,能防止消息被窃听、篡改、身份冒充等问题。 LwM2M协议具体参见OMA Lightweight M2M v1.0。
操作与接口之间的关系如下表所示。
关闭自动订阅,则设备注册成功后会收到云平台下发的Discover 请求,此时需要终端回复指定 object 的所有 resource。
开启自动订阅,平台会下发observe进行资源订阅,客户端进行订阅确认。
2.1. 用于传输资源信息的数据格式
LwM2M Enabler定义了四种数据格式:纯文本、不透明文本、TLV和JSON。LwM2M服务器必须支持所有数据格式。LwM2M客户端必须支持TLV数据格式。此外,LwM2M客户端还可以选择支持下表中的其他数据格式,即JSON、纯文本和不透明格式。包含数据的消息必须通过使用受支持的数据格式之一来指定有效负载编码。LwM2M服务器数据请求可能包含一个选项,指定服务器希望接收的数据格式;如果LwM2M客户端不接受此数据格式,则拒绝该请求;如果LwM2M客户端不支持该选项,或者LwM2M服务器没有表示数据格式首选项,则LwM2M客户端将使用自己的首选数据格式。
重点解释一下TLV格式:
对于“读”和“写”操作,二进制TLV(类型-长度-值)格式使用紧凑的二进制表示来表示值数组或奇异值,这很容易在简单的嵌入式设备上处理。该格式的每个值的最小开销仅为2字节,最大开销为5字节,这取决于标识符的类型和值的长度。在这种格式下的对象实例或资源的最大大小为16.7 MB。
2.2. Bootstrap
引导接口用于向LwM2M客户端提供基本信息,以使LwM2M客户端能够对一个或多个LwM2M服务器执行“注册”操作。在引导阶段,客户端可能忽略请求并刷新所有与引导序列无关的待起响应。有四个引导模式支持的LwM2M启用器:
1.工厂引导
2.引导从智能卡
3.客户端启动引导
4.服务器启动引导
最后两个引导模式需要LwM2M引导服务器实现最终目标连接LwM2M客户端的LwM2M服务器(s)。LwM2M客户端必须支持在引导接口中至少指定的一种引导模式。LwM2M引导-服务器必须支持在引导接口中指定的客户端启动引导模式和服务器启动引导模式。
举例说明客户端引导模式:
官方文档对于bootstrap的步骤说明
2.3. client Register
LwM2M服务器必须支持此接口中的所有操作,而LwM2M客户端必须支持“注册”和“更新”,并应该支持“去注册”操作。客户端注册接口1由LwM2M客户端用来向一个或多个LwM2M服务器注册,维护每个注册并从LwM2M服务器取消注册。注册是基于标识符和资源中定义的资源模型和标识符。注册时,LwM2M客户端执行“注册”操作,并提供LwM2M服务器需要与LwM2M客户端联系的属性(例如,端点名称);维护LwM2M客户端和LwM2M服务器之间的注册和会话(例如,生命周期、队列模式),以及LwM2M客户端支持的对象和LwM2M客户端中现有对象实例的知识。注册为软状态,其生命周期由该LwM2M服务器对象实例的生命周期资源指示。LwM2M客户端通过执行“更新”操作,定期更新其注册信息到已注册的LwM2M服务器——可能没有任何参数
LwM2M服务器必须支持表7中列出的所有参数,LwM2M客户端必须支持端点客户端名称、LwM2M版本、生命周期和对象实例,并且可能支持绑定模式和SMS号码。
Endpoint Client Name:端点客户端名称
Binding Mode :指示LwM2M客户端的当前绑定模式和队列模式。此值必须与服务器对象(ID #1)对应实例的名为“绑定”的资源中保存的值相同。默认使用 b=U 除此之外还有其他模式:
2.4. client Update
LwM2M客户端定期或基于LwM2M客户端内或由LwM2M服务器发起的某些事件,通过向LwM2M服务器发送“更新”操作,使用LwM2M服务器更新其注册信息。“更新”操作可以由LwM2M服务器通过对LwM2M服务器对象的“注册更新触发器”资源的“执行”操作来启动。LwM2M客户端可以执行“更新”操作,以刷新其向LwM2M服务器的注册生命周期。
2.5. Discover
“发现”操作用于发现附加到对象、对象实例和资源上的LwM2M属性。此操作可用于发现在给定的对象实例中实例化了哪些资源。返回的有效负载是每个目标对象、对象实例或资源的应用程序/链接格式核心链接\[RFC6690]列表,以及附加的属性,包括需要时的对象版本属性
注:
自动发现资源:开启后每次上线后自动发现资源列表,方便查看最新资源列表和数据;若关闭,则需要在查看具体设备资源时手动更新,但可以节省流量降低功耗
2.6. Observe
LwM2M服务器对一个对象实例中的特定资源、资源或LwM2M客户端中的一个对象的所有对象实例发起观察请求。
在LwM2M客户端发送一个新的注册之前,LwM2M服务器希望LwM2M客户端记住观察请求。如果一个LwM2M客户端忘记了观察请求(例如,设备出厂重置),它必须执行一个新的“注册”操作。每当LwM2M客户端注册时,LwM2M服务器就必须重新启动观察请求。为了避免网络流量的增加,LwM2M客户端应在重启、电源循环时,保持之前的观察状态。必须注意的是,仅包含对象ID的“观察”操作将生成所有对象实例信息的报告。注意:当LwM2M客户端注销时,LwM2M服务器应该假定过去的状态被无效,包括以前的观察。
同时该功能体现在Tuya NB模组上就是:仅在上电注册后进行observe、睡眠唤醒后不需要observe。
2.7. Notify
在对对象实例或资源进行有效观察期间,“通知”操作从LwM2M客户端发送到LwM2M服务器。此操作包括对象实例或资源的新值。当“写属性”操作满足“观察”操作配置的所有条件(即最小周期、最大周期、大于、小于、步骤)时,应发送“通知”操作
3. ONENET LWM2M 数据抓包详细解析:
3.1. Onenet 官方文档LWM2M设备开发说明:
3.2. Onenet bootstrap 报文逐字节解析:
Code: Select all
Onenet bootstrap COAP报文逐字节解析:
源文:4402A75959A7F6A1B262734D1565703D3836363234323035303837303039373B343630303439383933303038393533
-------------------------------------------------------------------------------------
44 01000100 Ver:1 message_type: CON token_len:4
02 POST
A759 msgid: 42841
59A7F6A1 token
B262734D1565703D3836363234323035303837303039373B343630303439383933303038393533
options
--------------------------------------------------------------
B2: 1011 0010
11 option-length:2
uri-path
6273: bs
----------------------------------------------------------------
4D: 0100 1101
4 13
11+4 = 15 D+15 = 34
uri-query
65703D3836363234323035303837303039373B343630303439383933303038393533 ;ep=866242050870097;460049893008953
-------------------------------------------------------------------------------------
应答 源文:6444A75959A7F6A1
-------------------------------------------------------------------------------------
64 01100100 ver:1 message_type: ACK token_len:4
44 response类型 2.04 changed
A759 msgid: 42841
59A7F6A1 token
-------------------------------------------------------------------------------------
server 返回bootstrap结果:
源文:4803BA9045E0E6B18E5C1C68B1300130122D16FFC80018636F61703A2F2F3231382E3230312E34352E333A35363833C10100C10203
-------------------------------------------------------------------------------------
48 01001000 ver:1 message_type: CON token_len:8
03 PUT
BA90 msgid: 47760
45E0E6B18E5C1C68 token
B1300130122D16
options
--------------------------------------------------------------
B1: 1011 0001
11 option-length:1
uri-path
30:0
----------------------------------------------------------------
01: 0000 0001
11+0=11 option-length:1
uri-path
30:0
-----------------------------------------------------------
12: 0001 0010
11+1=12 option-length:2
Content-Format
2D16: 11542 Content type 11542 TLV格式 application/vnd.oma.lwm2m+tlv
----------------------------------------------------------
FF 分隔符
C80018 636F61703A2F2F3231382E3230312E34352E333A35363833C10100C10203
包含了bootstrap结果:coap://218.201.45.3:5683
-------------------------------------------------------------------------------------
server下发 bootstrap结束
源文:4802BA918408788635B3398AB26273
-------------------------------------------------------------------------------------
48 01001000 ver:1 message_type: CON token_len:8
02 POST
BA91 msgid: 47761
8408788635B3398A token
B26273
options:
-----------------------------------------
B2: 1011 0010
11 option-length:2
uri-path
6273: bs
-----------------------------------------
-------------------------------------------------------------------------------------
client ACK
源文:6844BA918408788635B3398A
-------------------------------------------------------------------------------------
68 01101000 ver:1 message_type: ACK token_len:8
44 Changed
BA91 msgid: 47761
8408788635B3398A token
-------------------------------------------------------------------------------------
3.3. Onenet注册报文逐字节解析
Code: Select all
Onenet注册 COAP报文逐字节解析:
源文:4402A75A5AA706A2B2726411283D1565703D3836363234323035303837303039373B34363030343938393330303839353303623D55096C743D313732383030FF3C2F3E3B72743D226F6D612E6C776D326D222C3C2F302F303E2C3C2F302F313E2C3C2F333230302F303E2C3C2F333230302F313E
-------------------------------------------------------------------------------------
44 0100 0100 Ver:1 message_type: CON token_len:4
02 POST
A75A msgid: 42842
5AA706A2 token
B2726411283D1565703D3836363234323035303837303039373B34363030343938393330303839353303623D55096C743D313732383030
options:
-----------------------------------------
B2: 1011 0010
11 option-length:2
uri-path
7264: rd
-----------------------------------------
11: 0001 0001
11+1: 12 option-length:1
content-format
28: 40 application/link-format
-----------------------------------------
3D: 0011 1101
12+3: 15 option-length:13
uri-query
D+15 = 34
65703D3836363234323035303837303039373B343630303439383933303038393533: ep=866242050870097;460049893008953
------------------------------------------
03: 0000 0011
15+0: 15 3
uri-query
3623D5: b=U
-------------------------------------------
09: 0000 1001
15+0: 15 9
uri-query
6C743D313732383030: lt=172800
-------------------------------------------
FF 分割符 payload
3C2F3E3B72743D22 </>;rt="oma.lwm2m",</0/0>,</0/1>,</3200/0>,</3200/1>
6F6D612E6C776D32
6D222C3C2F302F30
3E2C3C2F302F313E
2C3C2F333230302F
303E2C3C2F333230
302F313E
-------------------------------------------------------------------------------------
3.4. Onenet Observe报文解析
Code: Select all
server 下发的Observe报文:
源文:480178A72DD9565ADEF247C16054333230300130622D16
---------------------------------------------------------------
48 0100 0100 Ver:1 message_type: CON token_len:8
01 get
78A7 msgid: 30887
2DD9565ADEF247C1 token
6054333230300130622D16
options:
-----------------------------------------
60: 0110 0000
6 option-length:0
observe
-----------------------------------------
54: 0101 0100
6+5=11 option-length:4
uri-path
33323030 : 3200
-----------------------------------------
01: 0000 0001
11+0=11 option-length:1
uri-path
30: 0
-----------------------------------------
62: 0110 0010
11+6=17
accept
2D16: 11542 Content type 11542 TLV格式
--------------------------------------------------------------
client 应答 observe 完成
源文:684578A72DD9565ADEF247C16100
---------------------------------------------------------------
68 0110 1000 Ver:1 message_type: ACK token_len:8
45 content
78A7 msgid: 30887
2DD9565ADEF247C1 token
6100
options:
-----------------------------------------
61: 0110 0001
8 option-length:1
observe
0: observe
-----------------------------------------
--------------------------------------------------------------
server下发
源文:480178A89A71255D4E73883B6054333230300131622D16
---------------------------------------------------------------
48 0100 0100 Ver:1 message_type: CON token_len:8
01 get
78A8 msgid: 30888
9A71255D4E73883B token
6054333230300130622D16
options:
-----------------------------------------
60: 0110 0000
6 option-length:0
observe
-----------------------------------------
54: 0101 0100
6+5=11 option-length:4
uri-path
33323030 : 3200
-----------------------------------------
01: 0000 0001
11+0=11 option-length:1
uri-path
31: 1
-----------------------------------------
62: 0110 0010
11+6=17
accept
2D16: 11542 Content type 11542 TLV格式
--------------------------------------------------------------
//Observe 应答:content
源文:684578A89A71255D4E73883B6100
---------------------------------------------------------------
68 0110 1000 Ver:1 message_type: ACK token_len:8
45 content
78A8 msgid: 30888
9A71255D4E73883B token
6100
options:
-----------------------------------------
61: 0110 0001
6 option-length:1
observe
0: observe
-----------------------------------------
--------------------------------------------------------------
根据理论来进行实操UDP上线onenet
4. 参考资料
LWM2M 协议文档:LWM2M
OMA 官网:https://www.omaspecworks.org/
LWM2M定义的Object和Resourc
Onenet官方文档:LWM2M 设备接入
B站相关理论介绍视频:LWM2M