NBIoT模组NB35-A开发(3)— 使用UDP模拟CoAP协议连接到EMQ
一、直接发送消息到EMQ
先发送一条消息到EMQ再说,关于EMQ的CoAP使用可以参考:https://blog.csdn.net/qq_38113006/article/details/105859481#t5
创建一个UDPsocket
AT+NSOCR=DGRAM,17,0
得到socket编号1
接下来使用这个socket发送到EMQ
AT+NSOST=1,39.96.35.207,5683,47,420369495562b46d71747406746f7069633149633d636c69656e743205753d746f6d08703d736563726574ff313234
然后可以看到,在EMQ平台订阅topic1
主题的websocket接收到了消息
可以看到,发送成功
二、发送数据解析
我们来看一下我们发送的这一串数据,将其分割开来:
42036949 5562 b46d71747406746f7069633149633d636c69656e743205753d746f6d08703d736563726574 ff 313234
1、第一段数据42036949
第一个字节数据42
,用二进制表示为01000010
- 最高两位为版本号,即
01
,表示CoAP版本为 V1版本 - 接下来两位为报文形式,即
00
,表示为CON报文,需要被确认的请求 - 然后剩下的四位为
Token
的长度,即Token的长度为2个字节
第二个字节数据03
,用二进制表示为00000011
- 这个字节是
Method Code
,即方法代码,前3位一部分,后5位一部分,为了方便描述它被写成了c.dd结构,这里即为0.03
,表示PUT
。其他的方法:GET ->0.01
,POST->0.02
,DELETE->0.04
第三和第四字节数据6949
,为Message ID(消息编号),每个CoAP消息都有一个ID,每条消息要唯一。
2、第二段数据5562
第二段数据为标记 Token,其长度由第一段数据的Token长度决定,通过token,客户端收到响应后,取出Token,就可以知道该响应是针对之前哪个请求回复的。Token是可选的。
3、第三段数据
b46d71747406746f7069633149633d636c69656e743205753d746f6d08703d736563726574
这一长串数据表示的是:/mqtt/topic1?c=client2&u=tom&p=secret
,其为选项 Options,可以看到,这里面可以有多个选项。
4、第四段数据ff
这是CoAP报文和具体负载之间的分隔符。
5、第五段数据
实际携带的数据内容,313234
从16进制转化为字符串即为124
数据解析参考自博客:CoAP协议学习笔记 1.2 一张表了解 CoAP 协议
和视频:【COAP】COAP协议详细讲解(二)服务器测试与抓包分析
三、收到的回复消息
发送数据后,我们可以看到NBIoT收到了6个字节的回复数据
我们将其读取出来
得到的数据为624469495562
同样的,将其分段解析:
62 44 6949 5562
第一段数据62
,用二进制表示为01100010
- 最高两位为版本号,即
01
,表示CoAP版本为 V1版本 - 接下来两位为报文形式,即
10
,表示为ACK报文,应答消息,接受到CON消息的响应。 - 然后剩下的四位为
Token
的长度,即Token的长度为2个字节
第二段数据44
,用二进制表示为01000100
-
这个字节是
Response codes
,即响应代码,前3位一部分,后5位一部分,为了方便描述它被写成了c.dd结构,这里即为2.04
,表示Changed
。其他的响应:+------------------+--------------------------------+---------------+ | Code | Description | | +------------------+--------------------------------+---------------+ | 2.01 (65, 0x41) | Created | Success | | 2.02 (66, 0x42) | Deleted | | | 2.03 (67, 0x43) | Valid | | | 2.04 (68, 0x44) | Changed | | | 2.05 (69, 0x45) | Content | | | 2.31 (95, 0x5F) | Continue | | +------------------+--------------------------------+---------------+ | 4.00 (128, 0x80) | Bad Request | Client Error | | 4.01 (129, 0x81) | Unauthorized | | | 4.02 (130, 0x82) | Bad Option | | | 4.03 (131, 0x83) | Forbidden | | | 4.04 (132, 0x84) | Not Found | | | 4.05 (133, 0x85) | Method Not Allowed | | | 4.06 (134, 0x86) | Not Acceptable | | | 4.08 (136, 0x88) | Request Entity Incomplete | | | 4.12 (140, 0x8C) | Precondition Failed | | | 4.13 (141, 0x8D) | Request Entity Too Large | | | 4.15 (143, 0x8F) | Unsupported Content-Format | | +------------------+--------------------------------+---------------+ | 5.00 (160, 0xA0) | Internal Server Error | Server Error | | 5.01 (161, 0xA1) | Not Implemented | | | 5.02 (162, 0xA2) | Bad Gateway | | | 5.03 (163, 0xA3) | Service Unavailable | | | 5.04 (164, 0xA4) | Gateway Timeout | | | 5.05 (165, 0xA5) | Proxying Not Supported | | +------------------+--------------------------------+---------------+
第三段数据6949
,为Message ID(消息编号)。
第四段数据5562
为标记 Token,其长度由第一段数据的Token长度决定,通过token,客户端收到响应后,取出Token,就可以知道该响应是针对之前哪个请求回复的。Token是可选的。