使用WireShake抓取CoAP协议数据包

1.说明

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

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


本文关于以下几个部分:

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



2.前言

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

使用WireShake抓取CoAP协议数据包_第1张图片
我们把数据打印到串口助手上,这里使用02X表示转换成两位16进制。

在这里插入图片描述
调用串口助手,我们可以观察到确实打印出来了16进制,但是我们并不知道该16进制表示什么意思,我们第一时间会想到将16进制转换成字符看看。
使用WireShake抓取CoAP协议数据包_第2张图片
这里打印出来的16进制其实是属于CoAP类型的数据包,如果我们对CoAP协议不理解,那么我们很难上手,如果可以有类似的协议分析工具帮我们分析该数据包,那么问题就会变得很好解决。这里我们使用wireshake抓取数据包。




3.CoAP协议

使用WireShake抓取CoAP协议数据包_第3张图片
Code是资源请求的操作,比如Get,Post,Del,Put4种常见的操作。
MessageID是16位的报文编号,用于重复消息检测,匹配消息类型等。每个CoAP报文都会有一个ID,在一次会话结束之后会被回收利用。
比如南向设备发送数据,那么平台就会对该数据包进行ACK响应,此时MessageID是一致的。当然南向设备对平台的数据包响应也是一样的。




4.使用wireshake抓取数据包

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

使用WireShake抓取CoAP协议数据包_第4张图片
我们可以看到,抓取了很多的CoAP协议包,我们对第一个数据包进行分析。




5.对CoAP进行分析

CoAP分析一(连接请求)

使用WireShake抓取CoAP协议数据包_第5张图片
首先是CoAP的头部信息,版本号01,报文类型CON,Token的长度4字节,表现形式为POST请求,报文编号0,Token为00000600


使用WireShake抓取CoAP协议数据包_第6张图片
option为报文选项,通过报文选项可设定CoAP主机,CoAP URI,CoAP请求参数和负载媒体类型等。

使用WireShake抓取CoAP协议数据包_第7张图片
使用WireShake抓取CoAP协议数据包_第8张图片
使用WireShake抓取CoAP协议数据包_第9张图片


CoAP分析二(接收响应包)

使用WireShake抓取CoAP协议数据包_第10张图片
为服务器的响应字段
使用WireShake抓取CoAP协议数据包_第11张图片


CoAP分析三(上传数据包)

使用WireShake抓取CoAP协议数据包_第12张图片
该CoAP数据包是属于数据上报的数据包,其中Data为数据负载部分,也就是我们要发送的光照值,02属于固定的标识,这在代码里写好(至于为什么还得研究一下),后面根据两个字节是数据部分,这里是0035,十六进制,然后后面全0猜测是补全256的长度。
我们如果用串口打印,那么是下面这个样子
使用WireShake抓取CoAP协议数据包_第13张图片

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

使用WireShake抓取CoAP协议数据包_第14张图片
数据负载部分是03 00 04 4F4E,4F4E是ON。

在看一下OFF的数据包.
使用WireShake抓取CoAP协议数据包_第15张图片
数据负载部分是03 00 07 4F4646,也就是OFF。




6.串口模拟

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

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

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

4402000000000300B272641128396C776D326D3D312E300D0165703D773838383838383838383804623D5551056C743D3230FF3C2F3E3B72743D226F6D612E6C776D326D222C3C2F312F303E2C3C2F323E2C3C2F332F303E2C3C2F342F303E2C3C2F352F303E2C3C2F362F303E2C3C2F31392F303E2C3C2F31392F313E

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

使用WireShake抓取CoAP协议数据包_第16张图片


发送数据

当我们发送请求连接包的时候,我们必须对服务器发送的数据包进行ACK响应,否则认为连接失效,会进入RST重置状态。
使用WireShake抓取CoAP协议数据包_第17张图片
使用WireShake抓取CoAP协议数据包_第18张图片
使用WireShake抓取CoAP协议数据包_第19张图片
使用WireShake抓取CoAP协议数据包_第20张图片
可见生成的Token是随机的。

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




7.构建CoAP数据包

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

使用WireShake抓取CoAP协议数据包_第21张图片

符号 取值
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

使用WireShake抓取CoAP协议数据包_第22张图片

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长度)

使用WireShake抓取CoAP协议数据包_第23张图片
设置token

使用WireShake抓取CoAP协议数据包_第24张图片
序列化我们的option字段。
使用WireShake抓取CoAP协议数据包_第25张图片
分隔符。




最后

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




参考

CoAP技术原理

你可能感兴趣的:(小熊派,对接华为OC平台)