zhao006 il y a 8 mois
Parent
commit
78dafe30bd

+ 6 - 1
app/HARDWARE/sources/usart.c

@@ -1,6 +1,7 @@
 #include "usart.h"
 #include "mmodbus.h"
 #include "dlt645.h"
+#include "gateway_message.h"
 
 uint8_t UART6_RX_BUF[BUFF_SIZE];
 uint8_t UART6_RX_STAT=0;
@@ -452,7 +453,11 @@ void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)
 	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
 }
 void USART3_IRQHandler(){
-			//mmodbus_callback();
+			GATEWAY_PARAMS *get;
+			get= get_gateway_config_params();
+			if(get->device_params->protocol == 3)
+			mmodbus_callback();
+			else if(get->device_params->protocol == 1 || get->device_params->protocol == 2)
 			dlt_callback();
 }
 

+ 2 - 2
app/MDKProject/lora_gateway.uvoptx

@@ -120,7 +120,7 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGUARM</Key>
-          <Name>(	?d</Name>
+          <Name></Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
@@ -2043,7 +2043,7 @@
       <GroupNumber>15</GroupNumber>
       <FileNumber>141</FileNumber>
       <FileType>1</FileType>
-      <tvExp>0</tvExp>
+      <tvExp>1</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
       <PathWithFileName>..\dlt\src\dlt645_2007.c</PathWithFileName>

BIN
app/OBJ/lora_gateway.axf


Fichier diff supprimé car celui-ci est trop grand
+ 18511 - 18431
app/OBJ/lora_gateway.hex


+ 1 - 1
app/System/includes/sys_mqtt.h

@@ -46,7 +46,7 @@ void mqtt_threadCreate(void);
 
 #define jsonMaxSize 1000
 extern char pubJsonString[jsonMaxSize];
-extern char pubJsonStringCopy[jsonMaxSize];
+//extern char pubJsonStringCopy[jsonMaxSize];
 #endif 
 
 

+ 10 - 2
app/System/includes/task.h

@@ -7,13 +7,21 @@
 //主要的数据处理线程
 #define DATA_TASK_PRIO 8
 #define DATA_STK_SIZE  2*1024
-#define   GetCurrentTime()  OSTimeGet()
+
+#define GetCurrentTime()  OSTimeGet()
 extern void data_task(void *pdata);
 extern tRadioDriver *Radio;
 
+/* 写入modbus寄存器 */
 void write_modbus_data(char* buf);
-void send_mqtt(char*buf, int jsonCunt);
+/* 发送至mqtt */
+void send_mqtt(char*buf, int jsonCunt,char*pubJsonStringCopy);
+/* 比较data1与data2*/
 void find_difference(char* data1, char* data2, char* string);
+/* 读取设备数据 */
 int read_device_data(DEVICE_PARAMS *current_device,char* buf);
 
+void send_modbus_data(GATEWAY_PARAMS *get, char* buf, int jsonCunt, char*pubJsonStringCopy);
+void send_dlt645_data(GATEWAY_PARAMS *get, char* buf, int jsonCunt, char*pubJsonStringCopy);
+
 #endif

+ 62 - 32
app/System/source/task.c

@@ -35,7 +35,7 @@ void data_task(void *pdata)
 		OS_CPU_SR cpu_sr;
 		pdata = pdata;
 		dlt645_init(100);
-		//mmodbus_init(1);
+		mmodbus_init(1);
 		
 		int jsonCunt = 1;	
 		char *device_config_json = mymalloc(SRAMEX, 9 * 1024);
@@ -48,17 +48,19 @@ void data_task(void *pdata)
 		DEVICE_PARAMS *current_device=get->device_params;
 //		Config_485_Port(get->baudrate, get->dataBits, get->stopBit, get->parity, get->flowControl);
 		char *buf = mymalloc(SRAMEX, 9 * 1024);	// 接收读取的数据
+		char *pubJsonStringCopy = mymalloc(SRAMEX, 9 * 1024);	// 备份数据
 		memset(buf, 0, 9 * 1024);	
 		while (current_device!=NULL)
 		{						
 				read_device_data(current_device, buf);	//读取数据	
-				send_mqtt(buf, jsonCunt);								//发送数据
+				send_mqtt(buf, jsonCunt,pubJsonStringCopy);								//发送数据
 				jsonCunt = 0;		
 				memset(buf,0,strlen(buf));	
 				current_device=get->device_params;		
 				OSTimeDly(1);
 		}
 		myfree(SRAMEX, buf);
+		myfree(SRAMEX,pubJsonStringCopy);
 }	
 /*
 *********************************************************************************************************
@@ -134,11 +136,11 @@ int read_device_data(DEVICE_PARAMS *device, char* buf)
 										sprintf(buf + strlen(buf), "{\"deviceId\":\"%s\",\"%s\":%d},", 
 																							current_device->deviceID, currentModbusParams->keyword, value);									
 								}
-								else
-								{
-										printf("read modbus register fail\n");
-										return 0;
-								}
+//								else
+//								{
+//										printf("read modbus register fail\n");
+//										return 0;
+//								}
 								
 								/* 每读完一个寄存器,进行message判断 */
 								mqtt_to_device();
@@ -156,10 +158,11 @@ int read_device_data(DEVICE_PARAMS *device, char* buf)
 								}												
 						}					
 				}
-				 if (current_device->protocol == DLT645_2007 || current_device->protocol == DLT645_97)
+				else if (current_device->protocol == DLT645_2007 || current_device->protocol == DLT645_97)
 				{
 						protocol_485=2;
 						uint8_t read_buf[10];
+						uint32_t dltValue;
 						
 						currentDLT645Params->rxLen = 0;
 						memset(read_buf, 0, 10);
@@ -192,11 +195,15 @@ int read_device_data(DEVICE_PARAMS *device, char* buf)
 										memcpy(currentDLT645Params->data, read_buf, 9);
 										currentDLT645Params->rxLen = 9;
 								}
-								sprintf(buf + strlen(buf), "{\"identifier\":\"%s\",\"deviceID645\":\"%02x%02x%02x%02x%02x%02x\",\"identifier645\":%d}",
+															
+								dltValue = currentDLT645Params->data[0] << 24 | currentDLT645Params->data[1] << 16|
+																		currentDLT645Params->data[2] << 8  | currentDLT645Params->data[3];
+					
+								sprintf(buf + strlen(buf), "{\"identifier\":\"%s\",\"deviceID645\":\"%02x%02x%02x%02x%02x%02x\",\"identifier645\":%d,\"value\":%X}",
 																				currentDLT645Params->keyword, currentDLT645Params->deviceID645[0],
 																				currentDLT645Params->deviceID645[1],currentDLT645Params->deviceID645[2],
 																				currentDLT645Params->deviceID645[3],currentDLT645Params->deviceID645[4],
-																				currentDLT645Params->deviceID645[5],currentDLT645Params->Identification);
+																				currentDLT645Params->deviceID645[5],currentDLT645Params->Identification,dltValue);
 								
 			
 						}
@@ -204,10 +211,7 @@ int read_device_data(DEVICE_PARAMS *device, char* buf)
 //						{
 //								currentDLT645Params->rxLen = 0;
 //								printf("read DLT current data fail\n");
-//						}
-								/* 每读完一个寄存器,进行message判断 */
-								mqtt_to_device();
-					
+//						}				
 								currentDLT645Params = currentDLT645Params->nextParams;		
 								if (currentDLT645Params == NULL)	
 								{
@@ -233,15 +237,11 @@ int read_device_data(DEVICE_PARAMS *device, char* buf)
 *********************************************************************************************************
 */
 void write_modbus_data(char* cJSONstring)
-{
-		uint16_t data;
-		uint16_t number;
-		uint16_t slaveAddress;
-		
+{	
 		GATEWAY_PARAMS* get;
 		get = get_gateway_config_params();
 		DEVICE_PARAMS* current_device = get->device_params;
-		
+		/* 利用cJSOn_Parse解析数据,获取各类型数据 */
 		cJSON *root = cJSON_Parse(cJSONstring);
 		const char *deviceId = cJSON_GetStringValue(cJSON_GetObjectItem(root, "deviceId"));	
 		const cJSON *power = cJSON_GetObjectItemCaseSensitive(root, "power");
@@ -253,9 +253,10 @@ void write_modbus_data(char* cJSONstring)
 		{
 				char* device_ID = (char*)current_device->deviceID;
 				GATEWAY_WRITE_MODBUS_COMMAND *currentModbusParams = current_device->params->gateway_write_modbus_command;
-				if(!strcmp(device_ID,deviceId))
+				if(!strcmp(device_ID,deviceId)) //匹配ID
 				{
 						OSTimeDly(100);
+					/* 写入寄存器操作 */
 						if(power)
 						{
 								mmodbus_writeHoldingRegister16i(currentModbusParams->slaveAddress, 
@@ -346,34 +347,63 @@ void find_difference(char* buf, char* pubJsonStringCopy, char* string)
 *	返 回 值: 无
 *********************************************************************************************************
 */
-void send_mqtt(char*buf, int jsonCunt){
+void send_mqtt(char*buf, int jsonCunt, char*pubJsonStringCopy){
 		GATEWAY_PARAMS *get;
 		get= get_gateway_config_params();
-		time1 = GetCurrentTime();
+		if(get->device_params->protocol == MODBUS_READ)
+				send_modbus_data(get, buf, jsonCunt,pubJsonStringCopy);// modbus数据通道
+		else if(get->device_params->protocol == DLT645_2007 || get->device_params->protocol == DLT645_1997)
+				send_dlt645_data(get, buf, jsonCunt,pubJsonStringCopy);// DLT645数据通道
 		
-		if(jsonCunt || time2  <= time1 - (3 * 1000)) // 20s进行一次
+}
+/*
+*********************************************************************************************************
+*	函 数 名: void send_modbus_data(GATEWAY_PARAMS *get, char*buf, int jsonCunt, char*pubJsonStringCopy)
+*	功能说明: 发送modubs数据需求的通道
+*	形    参: 参数1:网关信息 参数2: 读取的信息 参数3: 第一次发送标志 参数4: 备份信息
+*	返 回 值: 无
+*********************************************************************************************************
+*/
+
+void send_modbus_data(GATEWAY_PARAMS *get, char*buf, int jsonCunt, char*pubJsonStringCopy){
+		time1 = GetCurrentTime();// 获取当前时间
+		if(jsonCunt || time2  <= time1 - (20 * 1000)) // 20s进行一次
 		{
 				memset(pubJsonStringCopy,0, strlen(pubJsonStringCopy));
 				memcpy(pubJsonStringCopy + strlen(pubJsonStringCopy), buf, strlen(buf));//备份上一次的数据
-				sprintf(pubJsonString,"{\"DEVICEID\":\"%s\",\"data\":[%s]",get->deviceId, buf);									
-				
+				sprintf(pubJsonString,"{\"DEVICEID\":\"%s\",\"data\":[%s]",get->deviceId, buf);	// 组成要发送的json语句
 				int msg = MBOX_USER_PUBLISHQOS0;	
 				if(mqtt_connectFlag==1) OSMboxPost(mqtt_sendMseeageMbox, &msg);
-				time2 = GetCurrentTime();			
+				time2 = GetCurrentTime();	// 获取当前时间		
 		}
 		else
 		{
-				if(strcmp(buf,pubJsonStringCopy))
+				if(strcmp(buf,pubJsonStringCopy)) // 比较两次数据是否不同
 				{
 						memset(string, 0 , strlen(string));
-						find_difference(buf, pubJsonStringCopy, string);	
+						find_difference(buf, pubJsonStringCopy, string);// 比较两次采集的数据不同之处
 						memset(pubJsonString,0, strlen(pubJsonString));
-						sprintf(pubJsonString,"{\"deviceId\":\"%s\",\"data\":[{%s}]}",get->deviceId, string);
+						sprintf(pubJsonString,"{\"DEVICEID\":\"%s\",\"data\":[{%s}]}",get->deviceId, string);// 组成要发送的json语句
 						memset(pubJsonStringCopy,0, strlen(pubJsonStringCopy));
-						sprintf(pubJsonStringCopy, buf, strlen(buf));
-					
+						sprintf(pubJsonStringCopy, buf, strlen(buf));// 备份当前数据		
 						int msg = MBOX_USER_PUBLISHQOS0;	
 						if(mqtt_connectFlag==1) OSMboxPost(mqtt_sendMseeageMbox, &msg);	
 				}
 		}	
+	
 }
+/*
+*********************************************************************************************************
+*	函 数 名: void send_dlt645_data(GATEWAY_PARAMS *get, char*buf, int jsonCunt, char*pubJsonStringCopy)
+*	功能说明: 发送modubs数据需求的通道
+*	形    参: 参数1:网关信息 参数2: 读取的信息 参数3: 第一次发送标志 参数4: 备份信息
+*	返 回 值: 无
+*********************************************************************************************************
+*/
+void send_dlt645_data(GATEWAY_PARAMS *get, char*buf, int jsonCunt, char*pubJsonStringCopy){
+		memset(pubJsonStringCopy,0, strlen(pubJsonStringCopy));
+		memcpy(pubJsonStringCopy + strlen(pubJsonStringCopy), buf, strlen(buf));//备份上一次的数据
+		sprintf(pubJsonString,"{\"DEVICEID\":\"%s\",\"data\":[%s]",get->deviceId, buf);	// 组成要发送的json语句
+		int msg = MBOX_USER_PUBLISHQOS0;	
+		if(mqtt_connectFlag==1) OSMboxPost(mqtt_sendMseeageMbox, &msg);
+}