zhao006 před 1 rokem
rodič
revize
d40e679f70

+ 4 - 4
app/MDKProject/lora_gateway.uvoptx

@@ -185,7 +185,7 @@
         <Mm>
           <WinNumber>1</WinNumber>
           <SubType>8</SubType>
-          <ItemText>payload</ItemText>
+          <ItemText>cJSONstring</ItemText>
           <AccSizeX>0</AccSizeX>
         </Mm>
       </MemoryWindow1>
@@ -195,7 +195,7 @@
       <DebugFlag>
         <trace>0</trace>
         <periodic>1</periodic>
-        <aLwin>0</aLwin>
+        <aLwin>1</aLwin>
         <aCover>0</aCover>
         <aSer1>0</aSer1>
         <aSer2>0</aSer2>
@@ -839,7 +839,7 @@
 
   <Group>
     <GroupName>HARDWARE</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
@@ -2079,7 +2079,7 @@
 
   <Group>
     <GroupName>MODBUS</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>

binární
app/OBJ/lora_gateway.axf


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 18617 - 17861
app/OBJ/lora_gateway.hex


+ 3 - 3
app/System/includes/gateway_message.h

@@ -73,12 +73,12 @@ typedef struct _DEVICE_PARAMS
 typedef struct _GATEWAY_PARAMS
 {
 	uint8_t data_valid_flag;  // 数据有效标志  0xF1:有效  其它:无效
-	char host[20];		  // MQTT服务器地址
+	uint8_t host[20];		  // MQTT服务器地址
 	uint16_t port;			  // MQTT服务器端口号
 	uint8_t messageTopic[50]; // MQTT消息主题
 	uint8_t commandTopic[50]; // MQTT指令主题
-	char username[20];			//MQTT用户名
-	char passwd[20];				// 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版本

+ 6 - 5
app/System/includes/task.h

@@ -11,11 +11,12 @@
 extern void data_task(void *pdata);
 
 typedef struct _value{
-		char PowerValue;
-		char TempValue;
-		char ModeValue;
-		char FanValue;
-		char RoomTempValue;
+	  uint8_t deviceId[25];
+		uint8_t PowerValue;
+		uint8_t TempValue;
+		uint8_t ModeValue;
+		uint8_t FanValue;
+		uint8_t RoomTempValue;
 	}value;
 
 void WRITE_MODBUS_DATA(char* buf);

+ 6 - 6
app/System/source/sys_mqtt.c

@@ -96,6 +96,7 @@ void mqtt_outputMsg(MQTTString *name, uint8_t *msgbuf, int msglen, uint16_t id,
 * @retval 1: 消息正常处理
 *        -2: 帧数据包错误
 *************************************************************/
+
 int mqtt_recvPublishMessage(int sock, uint8_t *pbuf, int buflen)
 {
 	uint8_t dup, retained;
@@ -107,7 +108,8 @@ int mqtt_recvPublishMessage(int sock, uint8_t *pbuf, int buflen)
 	
   if(MQTTDeserialize_publish(&dup, &qos, &retained, &packetid, &topicName, &payload, &payloadlen, pbuf, buflen) == 1)
 	{
-		mqtt_outputMsg(&topicName, payload, payloadlen, packetid, qos);
+		mqtt_outputMsg(&topicName, payload, payloadlen, packetid, qos);	
+		WRITE_MODBUS_DATA(payload);
 	}
   else return -2;
 	
@@ -272,8 +274,7 @@ void mqtt_userReceiveThread(void *arg)
 	int len;	
 	int packetType;
 	int msg;
-	char* buf = malloc(512);
-	
+	char* cJSONstring = malloc(64);
 	MQTT_PRINTF("mqtt receivethread start \r\n");
 	
 	while(1)
@@ -302,12 +303,11 @@ void mqtt_userReceiveThread(void *arg)
 			memset(mqtt_recvbuffer, 0, MQTT_RECVBUF_LENTH);
 			packetType = MQTTPacket_read(mqtt_recvbuffer, len, transport_getdata);
 			mqtt_userReceiveMessage(mysock, packetType, mqtt_recvbuffer, len);
-			buf = (char*)&mqtt_recvbuffer;
-			WRITE_MODBUS_DATA(buf);
 		}
+		memset(cJSONstring, 0, 64);
 		OSTimeDly(1);
 	}
-	free(buf);
+	free(cJSONstring);
 }
 
 #define  APP_TASK_MQTTMAIN_PRIO            6

+ 113 - 73
app/System/source/task.c

@@ -17,6 +17,7 @@
 #include "sys_mqtt.h"
 #include "gateway_message.h"
 #include "MQTTClient.h"
+#include "cJSON.h"
 
 void master_task(uint8_t *string,uint16_t stringlength);
 void slave_task();
@@ -46,45 +47,45 @@ void data_task(void *pdata)
 	pdata = pdata;
 //	Radio = RadioDriverInit();
 //	Radio->Init();
-//	mmodbus_init(1);
+	mmodbus_init(1);
 
 	char *device_config_json = mymalloc(SRAMEX, 9 * 1024);
 	read_file("device.txt", device_config_json);
 	addGatewayParams(device_config_json);
 	myfree(SRAMEX, device_config_json);
-//	GATEWAY_PARAMS *get;
-//	get= get_gateway_config_params();
-//	int deviceIndex=0;
-//	DEVICE_PARAMS *current_device=get->device_params;
-//	
-//	uint32_t baudrate = get->baudrate;
-//	uint8_t databits = get->dataBits;
-//	uint8_t stopbits = get->stopBit;
-//	uint8_t parity = get->parity;
-//	uint8_t flowcontrol = get->flowControl;
-//	Config_485_Port(baudrate, databits, stopbits, parity, flowcontrol);
-//	 
-//	uint8_t string[256];
-//	uint16_t bufferLength;
-//	OS_Q_DATA Qnum;
-//	StringInfo message;
-//	char *mqttRecv;
-//	uint8_t err;
-// 	while (current_device!=NULL)
-//	{
-//		READ_MODBUS_DATA(current_device);
-//		if(current_device->nextDevice!=NULL) 
-//		{
-//			current_device=current_device->nextDevice;	
-//		}
-//		else
-//		{		
-//			int msg = MBOX_USER_PUBLISHQOS2;	
-//			if(mqtt_connectFlag==1) OSMboxPost(mqtt_sendMseeageMbox, &msg);
-//			memset(pubJsonString,0,strlen(pubJsonString));
-//			current_device=get->device_params;			
-//		}			
-//	}
+	GATEWAY_PARAMS *get;
+	get= get_gateway_config_params();
+	int deviceIndex=0;
+	DEVICE_PARAMS *current_device=get->device_params;
+	
+	uint32_t baudrate = get->baudrate;
+	uint8_t databits = get->dataBits;
+	uint8_t stopbits = get->stopBit;
+	uint8_t parity = get->parity;
+	uint8_t flowcontrol = get->flowControl;
+	Config_485_Port(baudrate, databits, stopbits, parity, flowcontrol);
+	 
+	uint8_t string[256];
+	uint16_t bufferLength;
+	OS_Q_DATA Qnum;
+	StringInfo message;
+	char *mqttRecv;
+	uint8_t err;
+ 	while (current_device!=NULL)
+	{
+		READ_MODBUS_DATA(current_device);
+		if(current_device->nextDevice!=NULL) 
+		{
+			current_device=current_device->nextDevice;	
+		}
+		else
+		{		
+			int msg = MBOX_USER_PUBLISHQOS2;	
+			if(mqtt_connectFlag==1) OSMboxPost(mqtt_sendMseeageMbox, &msg);
+			memset(pubJsonString,0,strlen(pubJsonString));
+			current_device=get->device_params;			
+		}			
+	}
 }
 
 	#if 0   //测试代码不经过转发直接进行相应的解析
@@ -95,7 +96,16 @@ void data_task(void *pdata)
 			nodeSendReaddValue(node_string,&node_string_Length);
 			GatewayProtocolAnalysis(node_string,node_string_Length);
 #endif			
- 	
+ 
+/*
+*********************************************************************************************************
+*	函 数 名: int READ_MODBUS_DATA(DEVICE_PARAMS *device)
+*	功能说明: 读取当前节点上的modbus数据
+*	形    参:DEVICE_PARAMS *device  当前设备
+*	返 回 值:  1 :成功  0:失败
+*********************************************************************************************************
+*/
+
 int READ_MODBUS_DATA(DEVICE_PARAMS *device)
 	{
 		DEVICE_PARAMS *current_device=device;
@@ -205,48 +215,78 @@ int READ_MODBUS_DATA(DEVICE_PARAMS *device)
 	}
 		return 1;
 }
+	/*
+*********************************************************************************************************
+*	函 数 名:void WRITE_MODBUS_DATA(char* cJSONstring)
+*	功能说明: 接收mqtt数据并写入modbus寄存器
+*	形    参:char* cJSONstring mqtt接收到的数据
+*	返 回 值: 无
+*********************************************************************************************************
+*/
 
-void WRITE_MODBUS_DATA(char* buf){
+value data = {0};
+void WRITE_MODBUS_DATA(char* cJSONstring){
 	GATEWAY_PARAMS* get;
 	get = get_gateway_config_params();
-	GATEWAY_WRITE_MODBUS_COMMAND *currentModbusParams = get->device_params->params->gateway_write_modbus_command;
-
-	value data;
-	data.PowerValue = parseIntField(buf, "\"power\":");
-	data.TempValue = parseIntField(buf, "\"temp\":");
-	data.ModeValue = parseIntField(buf, "\"mode\":");
-	data.FanValue = parseIntField(buf, "\"fan\":");
-	data.RoomTempValue = parseIntField(buf, "\"roomTemp\":");
+	DEVICE_PARAMS* current_device = get->device_params;
+	
+	
+	cJSON *root = cJSON_Parse(cJSONstring);
+	
+	const char *deviceId = cJSON_GetStringValue(cJSON_GetObjectItem(root, "deviceId"));	
+	const cJSON *power = cJSON_GetObjectItemCaseSensitive(root, "power");
+	const cJSON *temp = cJSON_GetObjectItemCaseSensitive(root, "temp");
+	const cJSON *mode = cJSON_GetObjectItemCaseSensitive(root, "mode");
+	const cJSON *fan = cJSON_GetObjectItemCaseSensitive(root, "fan");
+	
 	uint16_t slaveAddress;
 	uint16_t number;
-
-	if(data.PowerValue){
-			slaveAddress = currentModbusParams->slaveAddress;
-			number =currentModbusParams->registerAddress;
-			mmodbus_writeHoldingRegister16i(slaveAddress, number, data.PowerValue);
-	}
-	if(data.TempValue){
-			currentModbusParams = currentModbusParams->nextParams;
-			slaveAddress = currentModbusParams->slaveAddress;
-			number =currentModbusParams->registerAddress;
-			mmodbus_writeHoldingRegister16i(slaveAddress, number, data.TempValue);
-	}
-	if(data.ModeValue){
-			currentModbusParams = currentModbusParams->nextParams;
-			slaveAddress = currentModbusParams->slaveAddress;
-			number =currentModbusParams->registerAddress;
-			mmodbus_writeHoldingRegister16i(slaveAddress, number, data.ModeValue);
-	}
-	if(data.FanValue){
-			currentModbusParams = currentModbusParams->nextParams;
-			slaveAddress = currentModbusParams->slaveAddress;
-			number =currentModbusParams->registerAddress;
-			mmodbus_writeHoldingRegister16i(slaveAddress, number, data.FanValue);
-	}
-	if(data.RoomTempValue){
-			currentModbusParams = currentModbusParams->nextParams;
-			slaveAddress = currentModbusParams->slaveAddress;
-			number =currentModbusParams->registerAddress;
-			mmodbus_writeHoldingRegister16i(slaveAddress, number, data.RoomTempValue);
+	uint16_t data;
+	
+	while(current_device){
+		char* device_ID = current_device->deviceID;
+		GATEWAY_WRITE_MODBUS_COMMAND *currentModbusParams = current_device->params->gateway_write_modbus_command;
+		int time = 900;//60
+		if(!strcmp(device_ID,deviceId)){
+			OSTimeDlyHMSM(0, 0, 0, time);	
+			OSIntEnter();
+			if(power){
+					slaveAddress = currentModbusParams->slaveAddress;
+					number =currentModbusParams->registerAddress;
+					data = power->valueint;
+					mmodbus_writeHoldingRegister16i(slaveAddress, number, data);
+					OSTimeDlyHMSM(0, 0, 0, time);
+			}
+			if(temp){
+					currentModbusParams = currentModbusParams->nextParams;
+					slaveAddress = currentModbusParams->slaveAddress;
+					number =currentModbusParams->registerAddress;
+					data = temp->valueint;
+					mmodbus_writeHoldingRegister16i(slaveAddress, number, data);
+					OSTimeDlyHMSM(0, 0, 0, time);
+			}
+			if(mode){
+					currentModbusParams = currentModbusParams->nextParams;
+					slaveAddress = currentModbusParams->slaveAddress;
+					number =currentModbusParams->registerAddress;
+					data = mode->valueint;
+					mmodbus_writeHoldingRegister16i(slaveAddress, number, data);
+					OSTimeDlyHMSM(0, 0, 0, time);
+			}
+			if(fan){
+					currentModbusParams = currentModbusParams->nextParams;
+					slaveAddress = currentModbusParams->slaveAddress;
+					number =currentModbusParams->registerAddress;
+					data = fan->valueint;
+					mmodbus_writeHoldingRegister16i(slaveAddress, number, data);
+					OSTimeDlyHMSM(0, 0, 0, time);
+			}
+		OSIntExit();
+		}
+		current_device = current_device->nextDevice;
 	}
+	
+	
+	
+	cJSON_Delete(root);
 }

+ 2 - 2
app/mqtt/MQTTClient.c

@@ -54,8 +54,8 @@ int mqtt_connectToMqttServer(int sock)
 	
 	//配置连接参数
 	data.clientID.cstring = CLIENT_ID;
-	data.username.cstring = get->username;
-	data.password.cstring = get->passwd;
+	data.username.cstring = (char*)get->username;
+	data.password.cstring = (char*)get->passwd;
 	data.keepAliveInterval = KEEPLIVE_TIME;
 	data.MQTTVersion = MQTT_VERSION;     
 	data.cleansession = 1;