#ifndef _PROTOCOL_H #define _PROTOCOL_H #include <stdio.h> #include <stm32f10x.h> #define PRO_VER "00000004" #define P0_VER "00000004" #define HARD_VER "00000002" #define SOFT_VER "00000002" #define PRODUCT_KEY "95d561aa43d54a369fa529640e34b2d0" //测试设备 __packed typedef struct { uint8_t KEY1; uint8_t KEY2; uint8_t KEY3; }KEY_StatusTypeDef; #define Max_UartBuf 256 /** ****************************************************************************** *header(2B)=0xFFFF, len(2B), cmd(1B), sn(1B), flags(2B), payload(xB), checksum(1B) ****************************************************************************** * */ //设备串口通信 __packed typedef struct { uint8_t Package_Flag; //判断是否接收到一个完整的串口数据包 uint8_t UART_Flag1; uint8_t UART_Flag2; uint16_t UART_Count; //串口缓冲区计算数据长度 uint8_t UART_Cmd_len; //指令长度 uint8_t UART_Buf[Max_UartBuf]; //串口缓冲区 uint8_t Message_Buf[Max_UartBuf]; //处理接收到指令的Buf uint8_t Message_Len; //处理信息长度 }UART_HandleTypeDef; //所有协议指令集合 typedef enum { Pro_W2D_GetDeviceInfo_Cmd = 0x01, Pro_D2W__GetDeviceInfo_Ack_Cmd = 0x02, Pro_W2D_P0_Cmd = 0x03, Pro_D2W_P0_Ack_Cmd = 0x04, Pro_D2W_P0_Cmd = 0x05, Pro_W2D_P0_Ack_Cmd = 0x06, Pro_W2D_Heartbeat_Cmd = 0x07, Pro_D2W_heartbeatAck_Cmd = 0x08, Pro_D2W_ControlWifi_Config_Cmd = 0x09, Pro_W2D_ControlWifi_Config_Ack_Cmd = 0x0A, Pro_D2W_ResetWifi_Cmd = 0x0B, Pro_W2D_ResetWifi_Ack_Cmd = 0x0C, Pro_W2D_ReportWifiStatus_Cmd = 0x0D, Pro_D2W_ReportWifiStatus_Ack_Cmd = 0x0E, Pro_D2W_ReportWifiReset_Cmd = 0x0F, Pro_W2D_ReportWifiReset_Ack_Cmd = 0x10, Pro_W2D_ErrorPackage_Cmd = 0x11, Pro_D2W_ErrorPackage_Ack_Cmd = 0x12, }Pro_CmdTypeDef; typedef enum { SetLED_OnOff = 0x01, SetLED_Color = 0x02, SetLED_R = 0x04, SetLED_G = 0x08, SetLED_B = 0x10, SetMotor = 0x20, }Attr_FlagsTypeDef; typedef enum { LED_OnOff = 0x00, LED_OnOn = 0x01, LED_Costom = 0x00, LED_Yellow = 0x02, LED_Purple = 0x04, LED_Pink = 0x06, }LED_ColorTypeDef; /****************************************************** * 只读设备列表,以后要添加只读设备都添加到这里 ********************************************************/ __packed typedef struct { bool Infrared; uint8_t Temperature; uint8_t Humidity; }Device_ReadTypeDef; /****************************************************** *可写设备列表,以后要添加可写设备都添加到这里 ********************************************************/ __packed typedef struct { uint8_t LED_Cmd; uint8_t LED_R; uint8_t LED_G; uint8_t LED_B; uint16_t Motor; }Device_WirteTypeDef; /****************************************************** *设备报警,故障等信息 *******************************************************/ __packed typedef struct { uint8_t Alert; uint8_t Fault; }Device_RestsTypeDef; /****************************************************** *包含所有设备的结构体 ********************************************************/ __packed typedef struct { Device_WirteTypeDef Device_Wirte;//写 Device_ReadTypeDef Device_Read;//读 Device_RestsTypeDef Device_Rests;//故障 }Device_AllTypeDef; #define Send_MaxTime 200 #define Send_MaxNum 3 /****************************************************** * ACK 回复参数 * SendTime ********************************************************/ __packed typedef struct { uint8_t SendTime; uint8_t SendNum; }Pro_Wait_AckTypeDef; /** ****************************************************************************** *命令格式 * 1 2 3 4 * header(2B)=0xFFFF, len(2B), cmd(1B), sn(1B), flags(2B) * header(2B)=0xFFFF, len(2B), cmd(1B), sn(1B), flags(2B), ****************************************************************************** * * 1 包头(header)固定为0xFFFF * 2 长度(len)是指从cmd开始到整个数据包结束所占用的字节数 * 3 多于一个字节的整型数字以大端字节序编码 * 4 消息序号(sn)由发送方给出,接收方响应命令时需把消息序号返回给发送方 */ /****************************************************** * 协议的公用部分 ********************************************************/ __packed typedef struct { uint8_t Head[2]; uint16_t Len; uint8_t Cmd; uint8_t SN; uint8_t Flags[2]; }Pro_HeadPartTypeDef; /****************************************************** * 4.1 WiFi模组请求设备信息 * Pro_M2W_ReturnInfoTypeDef * MCU to WIFI reback ********************************************************/ /*********************************************************************************************************** * 设备MCU回复: * header(2B) len(2B) cmd(1B) sn(1B) flags(2B) protocol_ver(8B) * 0xFFFF 0x0047 0x02 0x## 0x0000 0x3030303030303034 ************************************************************************************************************ * p0_ver(8B) hard_ver(8B) soft_ver(8B) product_key(32B) bindable_timeout(2B) checksum(1B) * 0x3030303030303032 硬件版本号 软件版本号 产品标识码 绑定超时(秒) 0x## ************************************************************************************************************/ __packed typedef struct { Pro_HeadPartTypeDef Pro_HeadPart;//header(2B) len(2B) cmd(1B) sn(1B) flags(2B) // 0xFFFF 0x0047 0x02 0x## 0x0000 uint8_t Pro_ver[8]; // uint8_t P0_ver[8]; uint8_t Hard_ver[8]; uint8_t Soft_ver[8]; uint8_t Product_Key[32];//产品标识码 uint16_t Binable_Time;//绑定超时(bindable_timeout)的值为0时,表示设备随时可在局域网被绑定;当值大于零时,表示当按下绑定按钮后,用户必须在该时间范围内完成绑定操作。 uint8_t Sum; }Pro_M2W_ReturnInfoTypeDef; /***************************************************** * 通用命令,心跳、ack等可以复用此帧 * ****************************************************** * 4.2 WiFi模组与设备MCU的心跳 当设备MCU在180秒内没有收到WiFi模组的心跳请求,则通过硬件引脚重启WiFi模组。 * 4.4 设备MCU重置WiFi模组 * 4.6 WiFi模组请求重启MCU * 4.9 Wifi模组回复 * 4.10 设备MCU回复 ******************************************************/ /** ****************************************************************************** *命令格式 * 1 2 3 4 5 * header(2B)=0xFFFF, len(2B), cmd(1B), sn(1B), flags(2B), checksum(1B) ****************************************************************************** * * 1 包头(header)固定为0xFFFF * 2 长度(len)是指从cmd开始到整个数据包结束所占用的字节数 * 3 多于一个字节的整型数字以大端字节序编码 * 4 消息序号(sn)由发送方给出,接收方响应命令时需把消息序号返回给发送方 * 5 检验和(checksum)的计算方式为把数据包按字节求和得出的结果对256求余 * 6 除“非法消息通知”外的命令都带有确认,如在200毫秒内没有收到接收方的响应,发送方应重发,最多重发3次。 */ __packed typedef struct { Pro_HeadPartTypeDef Pro_HeadPart; uint8_t Sum; }Pro_CommonCmdTypeDef; /****************************************************** * 4.3 设备MCU通过WiFi模组进入配置模式 Pro_D2W_ConfigWifiTypeDef ********************************************************/ /****************************************************** ****************************************************************************** *命令格式 * header(2B) len(2B) cmd(1B) sn(1B) flags(2B) config_method(1B) checksum(1B) * 0xFFFF 0x0006 0x09 0x## 0x0000 配置方式 0x## ****************************************************************************** * 配置方式(config_method)是指使用何种方法配置WiFi模组加入网络,可以选择以下的值: * 1: SoftAp * 2: Air Link * WiFi状态(wifi_status)用两个字节描述, 从右向左依次是bit0, bit1, ...bit15; * bit0: 是否开启SoftAP模式, 0: 关闭, 1: 开启; * bit1: 是否开启Station模式, 0: 关闭, 1: 开启; * bit2: 是否开启配置模式, 0: 关闭, 1: 开启; * bit3: 是否开启绑定模式, 0: 关闭, 1: 开启; * bit4: WiFi模组是否成功连接路由器, 0: 未连接, 1: 连接; * bit5: WiFi模组是否成功连接云端, 0: 未连接, 1: 连接; * bit6 - bit7:预留; ********************************************************/ __packed typedef struct { Pro_HeadPartTypeDef Pro_HeadPart; uint8_t Config_Method; uint8_t Sum; }Pro_D2W_ConfigWifiTypeDef; /***************************************************** *WiFi工作模式宏定义 ******************************************************/ #define Wifi_SoftAPMode (uint8_t)(1<<0) //是否开启SoftAP 模式,0:关闭,1:开启 #define Wifi_StationMode (uint8_t)(1<<1) //是否开启Station模式,0:关闭,1:开启 #define Wifi_ConfigMode (uint8_t)(1<<2) //是否开启配置模式,0:关闭,1:开启 #define Wifi_BindingMode (uint8_t)(1<<3) //是否开启绑定模式,0:关闭,1:开启 #define Wifi_ConnRouter (uint8_t)(1<<4) //WiFi模组是否成功连接到路由器,0:关闭,1:开启 #define Wifi_ConnClouds (uint8_t)(1<<5) //WiFi模组是否成功连接到云端,0:关闭,1:开启 /***************************************************** * 4.5 WiFi模组向设备MCU通知WiFi模组工作状态的变化 Pro_W2D_WifiStatusTypeDef ******************************************************/ /****************************************************** ****************************************************************************** *命令格式 * header(2B) len(2B) cmd(1B) sn(1B) flags(2B) wifi_status(2B) checksum(1B) * 0xFFFF 0x0006 0x09 0x## 0x0000 WiFi状态 0x## ****************************************************************************** *WiFi状态(wifi_status)用两个字节描述, 从右向左依次是bit0, bit1, ...bit15; * bit0: 是否开启SoftAP模式, 0: 关闭, 1: 开启; * bit1: 是否开启Station模式, 0: 关闭, 1: 开启; * bit2: 是否开启配置模式, 0: 关闭, 1: 开启; * bit3: 是否开启绑定模式, 0: 关闭, 1: 开启; * bit4: WiFi模组是否成功连接路由器, 0: 未连接, 1: 连接; * bit5: WiFi模组是否成功连接云端, 0: 未连接, 1: 连接; * bit6 - bit7:预留; * bit8 - bit10:仅当WiFi模组已成功连接路由器(请看上第4位)时值才有效,三个位合起来表示一个整型值,值范围为0~7,表示WiFi模组当前连接AP的信号强度(RSSI Received Signal Strength Indicator)是接收信号的强度指示,0为最低,7为最高; * bit11:是否有已绑定的手机上线,0:没有,1:有; * bit12:是否处于产测模式中,0:否,1:是; * bit13 - bit15:预留。 *WiFi模组在当状态发生了变化后立刻通知设备MCU,同时每隔10分钟也会定期向设备MCU发送状态。 ********************************************************/ __packed typedef struct { Pro_HeadPartTypeDef Pro_HeadPart; uint16_t Wifi_Status; uint8_t Sum; }Pro_W2D_WifiStatusTypeDef; /***************************************************** * 非法信息通知枚举列表 ******************************************************/ typedef enum { Error_AckSum = 0x01, //校验和错误 Error_Cmd = 0x02, //命令不可识别 Error_Other = 0x03, //其他错误 }Error_PacketsTypeDef; /***************************************************** * 4.7 非法消息通知 Pro_ErrorCmdTypeDef ******************************************************/ /****************************************************** ****************************************************************************** *命令格式 * header(2B) len(2B) cmd(1B) sn(1B) flags(2B) error_code(1B) checksum(1B) * 0xFFFF 0x0006 0x11 0x## 0x0000 错误码 0x## ****************************************************************************** *错误码(error_code)可为以下的值: * 1:校验和错误 * 2:命令不可识别 * 3:其它错误 * 0和4~255保留 ********************************************************/ __packed typedef struct { Pro_HeadPartTypeDef Pro_HeadPart; Error_PacketsTypeDef Error_Packets; uint8_t Sum; }Pro_ErrorCmdTypeDef; /***************************************************** * P0 command 列表 ******************************************************/ typedef enum { P0_W2D_Control_Devce_Action = 0x01, //4.10 WiFi模组控制设备 P0_W2D_ReadDevStatus_Action = 0x02, //4.8 WiFi模组读取设备的当前状态 P0_D2W_ReadDevStatus_Action_ACK = 0x03, //4.8 MCU设备的回复WIFI当前状态 P0_D2W_ReportDevStatus_Action = 0X04, //4.9 设备MCU向WiFi模组主动上报当前状态 }P0_ActionTypeDef; /****************************************************** * 带P0指令的公共部分 ********************************************************/ /****************************************************** ****************************************************************************** *命令格式 * header(2B) len(2B) cmd(1B) sn(1B) flags(2B) action(1B) checksum(1B) * 0xFFFF 0x0006 0x11 0x## 0x0000 P0 0x## ****************************************************************************** * P0 可为以下的值: * P0_W2D_Control_Devce_Action = 0x01, //4.10 WiFi模组控制设备 * P0_W2D_ReadDevStatus_Action = 0x02, //4.8 WiFi模组读取设备的当前状态 * P0_D2W_ReadDevStatus_Action_ACK = 0x03, //4.8 MCU设备的回复WIFI当前状态 * P0_D2W_ReportDevStatus_Action = 0X04, //4.9 设备MCU向WiFi模组主动上报当前状态 ********************************************************/ __packed typedef struct { Pro_HeadPartTypeDef Pro_HeadPart; P0_ActionTypeDef Action; }Pro_HeadPartP0CmdTypeDef; /***************************************************** * 4.8 WiFi模组读取设备的当前状态Pro_W2D_ReadDevStatusTypeDef ****************************************************** *Wifi 模组发送 ******************************************************/ /****************************************************************************** *命令格式 * header(2B) len(2B) cmd(1B) sn(1B) flags(2B) action(1B) checksum(1B) * 0xFFFF 0x0006 0x03 0x## 0x0000 0x02 0x## ******************************************************************************/ __packed typedef struct { Pro_HeadPartP0CmdTypeDef Pro_HeadPartP0Cmd; uint8_t Sum; }Pro_W2D_ReadDevStatusTypeDef; /****************************************************** *设备MCU 回复 *设备MCU上报当前的状态 ******************************************************* *4.9 设备MCU向WiFi模组主动上报当前状态 Pro_D2W_ReportDevStatusTypeDef ******************************************************/ /****************************************************************************** *命令格式 * header(2B) len(2B) cmd(1B) sn(1B) flags(2B) action(1B) dev_status(11B) checksum(1B) * 0xFFFF 0x0011 0x05 0x## 0x0000 0x04 设备状态0x## ******************************************************************************/ __packed typedef struct { Pro_HeadPartP0CmdTypeDef Pro_HeadPartP0Cmd; Device_AllTypeDef Device_All; uint8_t Sum; }Pro_D2W_ReportDevStatusTypeDef; /***************************************************** * 4. 10 WiFi模组控制设备Pro_P0_ControlTypeDef ****************************************************** * WiFi模组发送 ******************************************************/ /****************************************************************************** *命令格式 * header(2B) len(2B) cmd(1B) sn(1B) flags(2B) action(1B) attr_flags(1B) attr_vals(6B) checksum(1B) * 0xFFFF 0x000D 0x03 0x## 0x0000 0x01 是否设置标志位 设置数据值 0x## ****************************************************************************** * 1. 是否设置标志位(attr_flags)表示相关的数据值是否为有效值,相关的标志位为1表示值有效,为0表示值无效, * 从右到左的标志位依次为: * bit0: 设置LED_OnOff * bit1: 设置LED_Color * bit2: 设置LED_R * bit3: 设置LED_G * bit4: 设置LED_B * bit5: 设置Motor_Speed * 2. 设置数据值(attr_vals)存放数据值, 只有相关的设置标志位为1时,数据值才有效。例如数据包为 * 0x07 FE FE FE 00 0A 时,其格式为: ******************************************************************************/ __packed typedef struct { Pro_HeadPartP0CmdTypeDef Pro_HeadPartP0Cmd; Attr_FlagsTypeDef Attr_Flags; Device_WirteTypeDef Device_Wirte; uint8_t Sum; }Pro_P0_ControlTypeDef; void MessageHandle(void); void Pro_W2D_GetMcuInfo(void); void Pro_W2D_CommonCmdHandle(void); void Pro_W2D_WifiStatusHandle(void); void Pr0_W2D_RequestResetDeviceHandle(void); void Pro_W2D_ErrorCmdHandle(void); void Pro_W2D_P0CmdHandle(void); void Pro_W2D_Control_DevceHandle(void); void Pro_W2D_ReadDevStatusHandle(void); void Pro_D2W_ReportDevStatusHandle(void); void Pro_UART_SendBuf(uint8_t *Buf, uint16_t PackLen, uint8_t Tag); void Log_UART_SendBuf(uint8_t *Buf, uint16_t PackLen); short exchangeBytes(short value); uint8_t CheckSum( uint8_t *buf, int packLen ); #endif /*_PROTOCOL_H*/