Newer
Older
BIRMM-GT200N / AiderProtocol.h
#ifndef _AIDERPROTOCOL_H_
#define _AIDERPROTOCOL_H_

#include "API-Platform.h"
#include "stdio.h"
#define   MAX   10              //定义一帧数据最多包含的OID数量    
#define   MAX_SEND_DATA   152             //定义一次数据上报最多上报字节数

// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
#if defined ( __CC_ARM )

// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
#pragma push

// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
#pragma pack( 1 )

// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
#endif
//结构体声明
// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
union Hfloat
{
	uint8_t       Data_Hex[4];
	float    Data_Float;
};	                        //便于做数据格式转换
//结构体声明
// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
union HInt16
{
	uint8_t       Data_Hex[2];
	uint16_t      Data_Int16;
};
//结构体声明
// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
union HInt32
{
	uint8_t       Data_Hex[4];
	uint32_t      Data_Int32;
};	                        //便于做数据格式转换
//结构体声明
// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
struct DeviceStatus
{
	uint8_t  BatteryCapacity;             //电池容量检测,例如xx%,仅为百分号前面的部分。
	uint8_t  CorrRateSensorStatus;        //腐蚀速率传感器状态指示变量,0表示工作正常,1表示数据采集失败,2表示数据异常,3表示探头未启用
//	uint8_t  TemperatureSensorStatus;   //温度传感器状态指示变量,0表示工作正常,1表示数据采集失败,2表示数据异常,3表示探头未启用
//	uint8_t  AlarmFlag;              //用于指示当前液位是否超预警值,0表示报警,1表示未报警,2表示上位机查询数据

};
//结构体声明
// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
struct SenserData
{

	uint16_t    CollectTime;           //每组数据对应的采集时间,以每天零点为参考,单位分钟
//	float  ResistanceRatio;       //采集到的电阻比值(探针电阻比参考电阻)
//	float  ReferenceResistance;   //采集到的参考电阻阻值
//	float  CorrRateData;          //采集到的腐蚀速率数据
	float  ProbeLossData;         //采集到的探针损耗数据

//	uint8_t     DataCount;                  //采集到的数据总数,温度压力数据成对出现
};

//结构体声明
// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
struct BusinessData
{

	uint16_t    CollectTime[24];            //每组数据对应的采集时间,以每天零点为参考,单位分钟
	uint8_t     CollectData[24][4];         //采集到的数据
	uint8_t     StartTime[5];        		//采集第一组数据的时间日期
	uint8_t     DataCount;                  //采集到的数据总数
	uint8_t     SendCount;              	//未发送的次数
	uint8_t     ParameterReply; 			//参数配置回复	
	uint8_t     HistoryDateCount;           //未发送的历史数据总量
	float       Level_Float;
	union
	{
		uint8_t  Data_Hex[4];
		float    Data_Float;
	} Level_Date[24];
};

//结构体声明
// -----------------------------------------------------------------------------
// DESCRIPTION:便于Flash数据存储和交互
// -----------------------------------------------------------------------------
struct Config_RegPara
{
	uint8_t          CollectTime_Byte[2];      //数据采集时间,使用数组存储,以方便Flash读写
	uint8_t          CollectPeriod_Byte[2];    //数据采集间隔,使用数组存储,以方便Flash读写
	uint8_t          CollectNum_Byte[2];       //采集数量,使用数组存储,以方便Flash读写
	uint8_t          UploadCycle_Byte[2];      //数据上传周期,使用数组存储,以方便Flash读写
	uint8_t          RetryNumSet;              //数据重传次数
	union
	{
		uint8_t  Data_Hex[4];
		float    Data_Float;
	} MountHeight;                     //液位探头到井底的高度
	union
	{
		uint8_t  Data_Hex[4];
		float    Data_Float;
	} AlarmValue;                      //报警阈值
	char        CurrentPhoneNum[16];      //当前通信手机号码,字符串格式
	char        SMS_Set_ServerIP[16];     //短信配置服务器IP,字符串格式
	uint8_t        SMS_Set_ServerPort[2];    //短信配置服务器端口号,字符串格式
	uint8_t	      SignalIntensity;          //信号强度
};

//结构体声明
// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
struct DeviceSet       //待修改
{
	uint16_t CollectTime;              //数据采集时间,即设备开始采数的时间,单位分钟
	uint16_t CollectPeriod;            //数据采集间隔,即相邻两组数据采集的时间间隔,单位分钟
	uint16_t CollectNum;               //采集数量,即一次上传多少组数据
	uint16_t UploadCycle;              //数据上报周期,即设备的休眠周期,单位分钟
	uint8_t  RetryNum;                 //数据重传次数
	union
	{
		uint8_t  Data_Hex[4];
		float    Data_Float;
	} MountHeight;                     //液位探头到井底的高度
	union
	{
		uint8_t  Data_Hex[4];
		float    Data_Float;
	} AlarmValue;                      //报警阈值
	uint8_t  BatteryCapacity;          //电池容量检测,例如xx%,仅为百分号前面的部分。//虽然不是配置参数,但是为了数据组织方便,仍放在配置参数结构体中
	uint8_t  Time_Sec;                 //系统时间,秒
	uint8_t  Time_Min;                 //系统时间,分
	uint8_t  Time_Hour;                //系统时间,小时
	uint8_t  Time_Mday;                //系统日期,日
	uint8_t  Time_Mon;                 //系统日期,月
	uint8_t  Time_Year;                //系统日期,年
	uint8_t  NetId;                    //433模块网络ID,1-255
	uint8_t  PDUType;                  //PDUType,1-255
	uint8_t  RouteFlag;                //RouteFlag,1-255
	uint8_t  DeviceType;               //设备类型,1-255
	char    ServerIP[16];           //服务器IP
	uint16_t    ServerPort;          //服务器端口
};

typedef enum
{
	DEF_NR       = 0x1000000A,    //重传次数
	SYSTERM_DATA = 0x10000050,    //系统日期
	SYSTERM_TIME = 0x10000051,    //系统时间
	CLT1_STIME1  = 0x10000104,    //一时区采集时间
	CLT1_ITRL1   = 0x10000105,    //一时区采集间隔
	CLT1_CNT1    = 0x10000106,    //一时区采集次数
	UPLOAD_CYCLE = 0x10000062,    //数据上报周期
	MOUNT_HEIGHT = 0x10000060,    //液位探头到井底的高度
	ALARM_VALUE  = 0x10000901,    //报警阈值
	DEVICE_STATE = 0x60000100,    //设备状态指示(上电)
	SENSOR_STATE = 0x60000009,    //传感器状态指示(上电)
	DEVICE_QTY   = 0x60000020,    //电池电量
	DEVICE_WAKEUP= 0x60000200,    //设备状态指示(唤醒)
	FRAM_STATE   = 0x60000300,    //数据接收状态指示
	DATA_REQUEST = 0x20000001,    //服务器查询数据
	NET_ID       = 0x10001001,    //433模块网络ID
	CARRIER_CODE = 0x10000063,    //IMEI&ICCID
	NB_PCI       = 0x60000511,    //NB主小区物理小区PCI号
	NB_RSRP      = 0x60000513,    //NB主小区RSRP值
	NB_SNR       = 0x60000516,    //NB主小区lart SNR值
	BSS_IP       = 0x10000022,    //设备IP地址,主要用于3G版设备通过短信配置
	BSS_PORT     = 0x10000023     //设备端口号,主要用于3G版设备通过短信配置
} CommandType;                  //通信过程中使用到的OID集合(除了业务上报OID)

//结构体声明
// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
struct TagStruct                         //用于存储参数命令数据
{
	CommandType   OID_Command;            //命令OID编码
	uint16_t           Width;                  //Value域的长度
	uint8_t            Value[32];              //参数值,当Width为0时,Value域可以不存在,当前应用需求Value域最多占用32字节
};

//结构体声明
// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
struct SpecialTagStruct                  //用于存储业务上报数据
{
	uint32_t           OID_Command;               //数据OID编码
	uint16_t            Width;                  //Value域的长度
	uint8_t            Value[40];
	union                                 //声明共用体,便于后续对特定字节操作
	{
		uint8_t         Value[4];               //ieee754格式表示的业务数据
		float      		Data_F;                 //浮点数格式表示的业务数据
	} LevelData;
};

//结构体声明
// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
struct CommandFrame                      //查询命令数据帧格式
{
	uint8_t           Preamble;                 //帧前导码
	uint8_t           Version;                  //协议版本号
	uint16_t          Length;                   //有效数据长度,即从Length字段到CRC字段包含的实际数据长度(单位为Byte,不包含Length字段和CRC字段,OID_List长度以实际使用的数据空间为准)
	uint8_t           DeviceID[6];              //设备ID号
	uint8_t           RouteFlag;                //路由标志
	uint16_t          NodeAddr;                 //路由节点地址
	uint16_t          PDU_Type;                 //操作指示
	uint8_t           Seq;                      //报文序号(1~255)
	CommandType  OID_List[MAX];            //OID序列,一帧数据可以包含多个OID,最多不超过20个
	uint16_t          CrcCode;                  //16位CRC校验码,计算范围为从Preamble到CrcCode的全部数据(包括Preamble和CrcCode,CrcCode初值为0xFFFF)
	uint8_t           OID_Count;                //OID序列计数器
};

//结构体声明
// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
struct DataFrame                             //下发配置参数等帧格式
{
	uint8_t               Preamble;                 //帧前导码
	uint8_t               Version;                  //协议版本号
	uint16_t              Length;                   //有效数据长度,即从Length字段到CRC字段包含的实际数据长度(单位为Byte,不包含Length字段和CRC字段,OID_List长度以实际使用的数据空间为准)
	uint8_t               DeviceID[6];              //设备ID号
	uint8_t               RouteFlag;                //路由标志
	uint16_t              NodeAddr;                 //路由节点地址
	uint16_t              PDU_Type;                 //操作指示
	uint8_t               Seq;                      //报文序号(1~255)
	struct TagStruct TagList[MAX];             //Tag序列,一帧数据可以包含多个Tag,最多不超过20个,而且一帧数据总长度(包括9字节帧头)不能超过256
	uint16_t              CrcCode;                  //16位CRC校验码,计算范围为从Preamble到CrcCode的全部数据(包括Preamble和CrcCode,CrcCode初值为0xFFFF)
	uint8_t               Tag_Count;                //Tag序列计数器

};

//结构体声明
// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
struct  SpecialDataFrame                     //业务数据上传帧格式
{
	uint8_t                      Preamble;                 //帧前导码
	uint8_t                      Version;                  //协议版本号
	uint16_t                     Length;                   //有效数据长度,即从Length字段到CRC字段包含的实际数据长度(单位为Byte,不包含Length字段和CRC字段,OID_List长度以实际使用的数据空间为准)
	uint8_t                      DeviceID[6];              //设备ID号
	uint8_t                      RouteFlag;                //路由标志
	uint16_t                     NodeAddr;                 //路由节点地址
	uint16_t                     PDU_Type;                 //操作指示
	uint8_t                      Seq;                      //报文序号(1~255)
	struct TagStruct        SysTime;                  //系统时间,表示第一个数据的采集时间
	struct TagStruct        BattEnergy;               //电池剩余电量,例如xx%,仅为百分号前面的部分
	struct SpecialTagStruct TagList[MAX];                  //Tag序列,一帧数据可以包含1个Tag,而且一帧数据总长度不能超过100
	uint16_t                     CrcCode;                  //16位CRC校验码,计算范围为从Preamble到CrcCode的全部数据(包括Preamble和CrcCode,CrcCode初值为0xFFFF)
	uint8_t                      Tag_Count;                //Tag序列计数器
//	uint8_t                      nb_rssi;
};
// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
#if defined ( __CC_ARM )

// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
#pragma pop

// -----------------------------------------------------------------------------
// DESCRIPTION:
// -----------------------------------------------------------------------------
#endif




uint16_t  TrapRequest(uint8_t* pSendBuff,uint8_t Optype);
uint16_t  StartupRequest(uint8_t* pSendBuff, uint8_t Optype);
#endif