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