一、通信协议详解
1、协议命令格式:
header + len + cmd + sn + payload + checksum
固定包头+包长度+命令+包序号+数据区约定+校验和
2、P0数据区约定解析《XX-机智云接入串口通讯协议文档》
【1】WiFi模组请求设备信息;
【2】WiFi模组与设备MCU的心跳;
【3】设备MCU通知WiFi模组进入配置模式;
【4】设备MCU重置WiFi模组;
【5】WiFi模组向设备MCU通知WiFi模组工作状态的变化;
【6】WiFi模组请求重启MCU;
【7】非法消息通知;
【8】WiFi模组读取设备的当前状态;
【9】设备MCU向WiFi模组主动上报当前状态;
【10】WiFi模组控制设备;
注意:查看《XX-机智云接入串口通讯协议文档》
有效数据的上传(协议4.8、4.9),上传协议的组成形式为:action(1B) + dev_status(11B) ;
有效数据的上传(协议4.10),下达协议的组成形式为:action(1B) + attr_flags(1B) + attr_vals(6B) ;
二、程序详解
1、代码目录介绍
【1】一级目录说明
Gizwits:协议相关目录
Hal:外设驱动库
Lib:STM32驱动库
Project:工程管理文件
User:代码入口文件目录
Utils:工具函数目录
README.txt:GoKit3(V)文档
【2】代码文件说明(gizwits_product.c/h,gizwits_protocol.c/h)
【3】协议API介绍
2、程序实现原理
【1】协议实现机制:协议解析后,将P0数据区的有效数据点生成对应的数据点事件,再按事件处理数据点。
【2】数据点转换事件的说明:根据协议P0数据区的attr_flags位判断出有效数据点,并将其转化成对应的数据点事件,然后在事件处理函数中(gizwitsEventProcess)完成事件的处理。
3、程序初始化说明
【1】数据协议结构体的定义
设备MCU向WIFi模组上报当前状态:payload(数据区约定) == flag(标识)+action(动作)+dev_status(设备状态)
WIFi模组下发指令控制设备MCU:payload(数据区约定) == flag(标识)+action(动作)+attr_flags(标志位)+attr_vals(数据值)
【2】程序主函数
SystemInit()、userInit()、gizwitsInit()、userHandle()、gizwitsHandle()
【3】用户程序初始化
【4】定时器使用
【5】串口的使用
4、配置模式说明
设备需要进入配置模式才能进行联网,并与云端进行通信,在本示例工程中是通过按键触发进入相应的配置模式。
5、协议处理函数的实现
【1】首先是一些局部变量的初始化,比较重要的是:“protocolHead_t *recvHead = NULL;”它的作用是保存解析出来的协议包头。
【2】然后是协议的重发机制,它的作用是对发送后的协议数据进行超时判断,超时200ms进行重发,重发上限为三次。
【3】接下来程序会从环形缓冲区中抓取一包的数据。
【4】当我们获得到一整包的数据,就会进入下面的if判断逻辑,进行协议的解析。
【5】然后是各协议命令的处理流程
【6】协议判断完成后是一个状态机的判断,用来完成对应协议命令的处理。
【7】之后是一个数据上报判断机制,主要执行了gizCheckReport函数。
【8】最后一段代码是一个数据定时上报机制。
6、控制型协议的实现
【1】流程:gitProtocalIssuedProcess —> ACTION_CONTROL_DEVICE —> gizDataPoint2Event —> gizwitsEventProcess
【2】控制型事件处理
【3】可写型数据类型转换
【4】可写型数据类型转换
7、上报型协议的实现
【1】流程:userHandle —> gizCheckReport —> gizDataPoint2ReportData —> gizReportData
【2】只读型数据的获取
【3】上报转态判断
【4】只读型数据类型转换
8、机智云协议数据处理
【1】数据点类型转换
【2】数据解压与压缩处理
作者:桥边风满袖
链接:https://www.jianshu.com/p/5ead62952749
共同学习,写下你的评论
评论加载中...
作者其他优质文章