| 
					
				 | 
			
			
				@@ -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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |