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是可選的。