本文将使用CoAP协议来对接华为OC平台,使用的通信模组是ESP8266,如果使用NB-IOT来对接华为OC平台简单很多,因为NB-IOT的设备标识符在平台绑定,那么使用几个AT指令即可完成华为OC平台的对接和发送数据。
小熊派的官方教程有很多关于对接华为OC平台的例子,只需要移植和调用一个函数即可,这里我主要想探讨使用串口来对接华为OC平台(找事做),主要是对CoAP有更好的理解。
本文关于以下几个部分:
为了更好的了解CoAP协议,这里我们使用ESP8266,那么就需要向华为OC平台发送设备的标识符,也就是会调用ESP8266的发送函数,我们可以把该数据打印出来看看。
我们把数据打印到串口助手上,这里使用02X表示转换成两位16进制。
调用串口助手,我们可以观察到确实打印出来了16进制,但是我们并不知道该16进制表示什么意思,我们第一时间会想到将16进制转换成字符看看。
这里打印出来的16进制其实是属于CoAP类型的数据包,如果我们对CoAP协议不理解,那么我们很难上手,如果可以有类似的协议分析工具帮我们分析该数据包,那么问题就会变得很好解决。这里我们使用wireshake抓取数据包。
Code是资源请求的操作,比如Get,Post,Del,Put4种常见的操作。
MessageID是16位的报文编号,用于重复消息检测,匹配消息类型等。每个CoAP报文都会有一个ID,在一次会话结束之后会被回收利用。
比如南向设备发送数据,那么平台就会对该数据包进行ACK响应,此时MessageID是一致的。当然南向设备对平台的数据包响应也是一样的。
我们使用wireshake抓取WIFI模块跟云平台通信的数据包,这里我把电脑开个热点给WIFI通信模组连接。
我们可以看到,抓取了很多的CoAP协议包,我们对第一个数据包进行分析。
首先是CoAP的头部信息,版本号01,报文类型CON,Token的长度4字节,表现形式为POST请求,报文编号0,Token为00000600
option为报文选项,通过报文选项可设定CoAP主机,CoAP URI,CoAP请求参数和负载媒体类型等。
该CoAP数据包是属于数据上报的数据包,其中Data为数据负载部分,也就是我们要发送的光照值,02属于固定的标识,这在代码里写好(至于为什么还得研究一下),后面根据两个字节是数据部分,这里是0035,十六进制,然后后面全0猜测是补全256的长度。
我们如果用串口打印,那么是下面这个样子
在看一下OFF的数据包.
数据负载部分是03 00 07 4F4646,也就是OFF。
由于我们发送的数据是16进制的,所以在发送数据的时候请把串口改成16进制发送
AT+CIPSEND=1,125,"49.4.85.232",5683
4402000000000300B272641128396C776D326D3D312E300D0165703D773838383838383838383804623D5551056C743D3230FF3C2F3E3B72743D226F6D612E6C776D326D222C3C2F312F303E2C3C2F323E2C3C2F332F303E2C3C2F342F303E2C3C2F352F303E2C3C2F362F303E2C3C2F31392F303E2C3C2F31392F313E
标红的部分是我的设备标识符,也就是上面所讲的CoAP分析一。
此时云平台可以向南向设备发送数据,也就说设备可以接收北向应用的信息。
当我们发送请求连接包的时候,我们必须对服务器发送的数据包进行ACK响应,否则认为连接失效,会进入RST重置状态。
可见生成的Token是随机的。
本来想自己写一个串口助手,自动解析下发的数据并回复服务器发过来的ACK数据包,奈何技术有限,这里就不模拟了。
我们可以看一下单片机如何构建一个Coap格式的报文。
符号 | 取值 |
---|---|
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 |
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长度)
通过抓包分析,我们可以更加的理解CoAP协议,比如Code字段和MessageID字段。如果时间充足,那么也会更新一些关于Liteos及对接华为OC的一个博客。以上是我的一些见解,肯定有一些不对的地方,可以在评论下留言一起讨论。
CoAP技术原理