机智云通信协议笔记1---结构体定义

#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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值