1.说明

本文将使用CoAP协议来对接华为OC平台,使用的通信模组是ESP8266,如果使用NB-IOT来对接华为OC平台简单很多,因为NB-IOT的设备标识符在平台绑定,那么使用几个AT指令即可完成华为OC平台的对接和发送数据。

小熊派的官方教程有很多关于对接华为OC平台的例子,只需要移植和调用一个函数即可,这里我主要想探讨使用串口来对接华为OC平台(找事做),主要是对CoAP有更好的理解。



本文关于以下几个部分:

  • 为什么要抓取CoAP数据包
  • 使用wireshake抓取数据包
  • 对数据包进行分析




2.前言

为了更好的了解CoAP协议,这里我们使用ESP8266,那么就需要向华为OC平台发送设备的标识符,也就是会调用ESP8266的发送函数,我们可以把该数据打印出来看看。

wireshark 抓取内网微信_wireshark 抓取内网微信


我们把数据打印到串口助手上,这里使用02X表示转换成两位16进制。

wireshark 抓取内网微信_串口_02


调用串口助手,我们可以观察到确实打印出来了16进制,但是我们并不知道该16进制表示什么意思,我们第一时间会想到将16进制转换成字符看看。

wireshark 抓取内网微信_wireshark 抓取内网微信_03


这里打印出来的16进制其实是属于CoAP类型的数据包,如果我们对CoAP协议不理解,那么我们很难上手,如果可以有类似的协议分析工具帮我们分析该数据包,那么问题就会变得很好解决。这里我们使用wireshake抓取数据包。




3.CoAP协议

wireshark 抓取内网微信_16进制_04


Code是资源请求的操作,比如Get,Post,Del,Put4种常见的操作。

MessageID是16位的报文编号,用于重复消息检测,匹配消息类型等。每个CoAP报文都会有一个ID,在一次会话结束之后会被回收利用。

比如南向设备发送数据,那么平台就会对该数据包进行ACK响应,此时MessageID是一致的。当然南向设备对平台的数据包响应也是一样的。




4.使用wireshake抓取数据包

我们使用wireshake抓取WIFI模块跟云平台通信的数据包,这里我把电脑开个热点给WIFI通信模组连接。

wireshark 抓取内网微信_wireshark 抓取内网微信_05


我们可以看到,抓取了很多的CoAP协议包,我们对第一个数据包进行分析。




5.对CoAP进行分析

CoAP分析一(连接请求)

wireshark 抓取内网微信_16进制_06


首先是CoAP的头部信息,版本号01,报文类型CON,Token的长度4字节,表现形式为POST请求,报文编号0,Token为00000600


wireshark 抓取内网微信_串口_07


option为报文选项,通过报文选项可设定CoAP主机,CoAP URI,CoAP请求参数和负载媒体类型等。


wireshark 抓取内网微信_数据_08


wireshark 抓取内网微信_wireshark 抓取内网微信_09


wireshark 抓取内网微信_wireshark 抓取内网微信_10


CoAP分析二(接收响应包)

wireshark 抓取内网微信_16进制_11


为服务器的响应字段

wireshark 抓取内网微信_wireshark 抓取内网微信_12


CoAP分析三(上传数据包)

wireshark 抓取内网微信_串口_13


该CoAP数据包是属于数据上报的数据包,其中Data为数据负载部分,也就是我们要发送的光照值,02属于固定的标识,这在代码里写好(至于为什么还得研究一下),后面根据两个字节是数据部分,这里是0035,十六进制,然后后面全0猜测是补全256的长度。

我们如果用串口打印,那么是下面这个样子

wireshark 抓取内网微信_串口_14


CoAP分析四(接收下发指令)

wireshark 抓取内网微信_串口_15


数据负载部分是03 00 04 4F4E,4F4E是ON。在看一下OFF的数据包.

wireshark 抓取内网微信_串口_16


数据负载部分是03 00 07 4F4646,也就是OFF。




6.串口模拟

由于我们发送的数据是16进制的,所以在发送数据的时候请把串口改成16进制发送

发送包含设备标识符的数据

AT+CIPSEND=1,125,"49.4.85.232",5683
4402000000000300B272641128396C776D326D3D312E300D0165703D773838383838383838383804623D5551056C743D3230FF3C2F3E3B72743D226F6D612E6C776D326D222C3C2F312F303E2C3C2F323E2C3C2F332F303E2C3C2F342F303E2C3C2F352F303E2C3C2F362F303E2C3C2F31392F303E2C3C2F31392F313E

标红的部分是我的设备标识符,也就是上面所讲的CoAP分析一。
此时云平台可以向南向设备发送数据,也就说设备可以接收北向应用的信息。

wireshark 抓取内网微信_数据_17



发送数据

当我们发送请求连接包的时候,我们必须对服务器发送的数据包进行ACK响应,否则认为连接失效,会进入RST重置状态。

wireshark 抓取内网微信_wireshark 抓取内网微信_18


wireshark 抓取内网微信_16进制_19


wireshark 抓取内网微信_数据_20


wireshark 抓取内网微信_数据_21


可见生成的Token是随机的。

本来想自己写一个串口助手,自动解析下发的数据并回复服务器发过来的ACK数据包,奈何技术有限,这里就不模拟了。





7.构建CoAP数据包

我们可以看一下单片机如何构建一个Coap格式的报文。

wireshark 抓取内网微信_数据_22

符号

取值

COAP_HEADER_VERSION_MASK

0xC0

COAP_HEADER_VERSION_POSITION

6

COAP_HEADER_TYPE_MASK

0x30

COAP_HEADER_TYPE_POSITION

4

COAP_HEADER_TOKEN_LEN_MASK

0x0F

COAP_HEADER_TOKEN_LEN_POSITION

0

wireshark 抓取内网微信_串口_23

buffer[0] = (0xc0)&1<<6 = (1100 0000)&(0100 0000) = 0100 0000 = 0x40;(version 1)
buffer[0] = (0x30)&0<<4 = (0011 0000)&(0000 0000) = 0000 0000 = 0x00;(CON包)
buffer[0] = (0x0F)&8<<0 = (0000 1111)&(0000 1000) = 0000 1000 = 0x80;(Token长度)

wireshark 抓取内网微信_串口_24


设置token

wireshark 抓取内网微信_wireshark 抓取内网微信_25


序列化我们的option字段。

wireshark 抓取内网微信_数据_26


分隔符。




最后

通过抓包分析,我们可以更加的理解CoAP协议,比如Code字段和MessageID字段。如果时间充足,那么也会更新一些关于Liteos及对接华为OC的一个博客。以上是我的一些见解,肯定有一些不对的地方,可以在评论下留言一起讨论。