#ifndef __GATEWAY_MESSAGE_H #define __GATEWAY_MESSAGE_H #include "stm32f2xx.h" #include "FreeRTOS.h" #include "task.h" #include "malloc.h" // 解析发过来的数据是modbus还是dlt645 #define MODBUS_WRITE 4 //本机用于区分读写 #define MODBUS_READ 3 #define DLT645_07 1 #define DLT645_97 2 extern uint8_t protocol_485; #define MODBUS 3 // 网关所存储的modbus写命令 typedef struct _GATEWAY_WRITE_MODBUS_COMMAND { uint16_t registerByteNum; uint8_t slaveAddress; uint8_t functionCode; uint8_t dataType; //数据类型 uint8_t keyword[20]; // 所写属性的名称 uint8_t bigLittleFormat; uint16_t registerAddress; // 寄存器地址 uint8_t write_command_flag; // 是否成功写入的标志 struct _GATEWAY_WRITE_MODBUS_COMMAND *nextParams; } GATEWAY_WRITE_MODBUS_COMMAND; // 网关所存储的modbus读命令 typedef struct _GATEWAY_READ_MODBUS_COMMAND { uint8_t slaveAddress; uint8_t functionCode; uint8_t keyword[20]; // 所读属性的名称 uint16_t registerAddress; // 寄存器地址 uint8_t read_command_flag; // 是否成功读取到的标志 uint32_t value; //读取到的数据值 uint16_t registerByteNum; uint8_t decimalPoint; struct _GATEWAY_READ_MODBUS_COMMAND *nextParams; } GATEWAY_READ_MODBUS_COMMAND; // 节点所存储都DLT645读指令 typedef struct _GATEWAY_READ_DLT645_COMMAND { uint8_t deviceID645[6]; uint8_t keyword[20]; // 所读属性的名称 uint32_t Identification; // 645数据标识 uint8_t data[9]; // 读到的数据 uint8_t rxLen; // 从机应答值的长度 struct _GATEWAY_READ_DLT645_COMMAND *nextParams; } GATEWAY_READ_DLT645_COMMAND; typedef struct _PARAMS_PROTOCOL_COMMAND { GATEWAY_READ_MODBUS_COMMAND *gateway_read_modbus_command; GATEWAY_WRITE_MODBUS_COMMAND *gateway_write_modbus_command; GATEWAY_READ_DLT645_COMMAND *gateway_read_dlt645_command; }PARAMS_PROTOCOL_COMMAND; // 节点包含的设备信息 typedef struct _DEVICE_PARAMS { uint8_t aliveflag; // 存活证明(由轮询来进行保证,当有轮询回应是确定其存活,当链路变化时立即上报设备已经死去,当轮询有相应的相应值时去上报已经存活) uint8_t deviceID[20]; uint8_t protocol; // 所属协议类型 1:modbus read 2:modbus write 3:dlt97 4:dlt07 一个设备只能存在一个协议 uint8_t MDBbigLittleFormat; uint8_t MDBdataType; PARAMS_PROTOCOL_COMMAND *params; struct _DEVICE_PARAMS *nextDevice; // 指向下一个设备地址 } DEVICE_PARAMS; // 网关包含的设备信息 typedef struct _GATEWAY_PARAMS { uint8_t data_valid_flag; // 数据有效标志 0xF1:有效 其它:无效 uint8_t host[20]; // MQTT服务器地址 uint16_t port; // MQTT服务器端口号 uint8_t messageTopic[50]; // MQTT消息主题 uint8_t commandTopic[50]; // MQTT指令主题 uint8_t username[20]; //MQTT用户名 uint8_t passwd[20]; // MQTT用户密码 uint8_t deviceId[25]; // 设备ID uint8_t dataSource; // 协议类型 0 保留 1 表示645协议 2表示modbus协议 uint8_t dataType645; // 645协议数据类型 0 保留 1 表示07版本 2表示97版本 uint32_t pollTime; // 轮询时间 uint32_t inboundTime; uint8_t state; // 检测是否上位机配置过当上位机配置过该状态位,则以后均不走http获取相应配置 置位值为0xF1 uint8_t gatewayId[10]; // 固化信息 uint8_t gatewayMode[10]; // 工作模式、后续版本迭代使用 uint8_t gateName[10]; // 网关相关信息 // 包含的设备结构体 uint8_t deviceCount; DEVICE_PARAMS *device_params; // 外设的串口工作属性仅只有一个 uint32_t baudrate; // 波特率 uint8_t dataBits; // 数据位 uint8_t checkBit; // 校验位 uint8_t stopBit; // 停止位 uint8_t flowControl; // 流控制 uint8_t parity; //校验位 uint8_t bandwidth; } GATEWAY_PARAMS; void addGatewayParams(char *gatewayString); void addDevice(char *string); int parseIntField(const char *data, const char *field); void parseStringField(const char *data, const char *field, char *value); GATEWAY_PARAMS *get_gateway_config_params(void); int extract_substring(const char *input_string, const char *start_token, const char *end_token, char *result); #endif