#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*/
转载于:https://my.oschina.net/u/2367008/blog/414595