handle.upload.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. /******************************************************************
  2. ** Copyright (c) 2009 Wuhan xiyun Technology Co., Ltd .
  3. ** FileName: handle.upload.c
  4. ** Author: chw
  5. ** Mail:
  6. ** Editor: chw
  7. ** Date: 2020-12-03 13:34
  8. ** Version: 2020-12-03
  9. ** File Description: 处理mqtt的设备数据上传 包含:1.设备连接相关指令 2.设备电器或传感器数据上传
  10. ** Param explain: char* mac : 网关MAC地址
  11. char* subMac :子节点MAC地址
  12. MQTTAsync_message *pubmsg : 消息结构体
  13. MYSQL *_db :数据库连接
  14. char *topicName : 消息主题
  15. ******************************************************************/
  16. //查询指令发送表是否有数据
  17. int is_have_data_inDB(char* mac,MYSQL *_db)
  18. {
  19. MYSQL_RES* res = NULL;
  20. int row_count;
  21. char query_sql[512] = {0};
  22. sprintf(query_sql,"select id from dev_cmd_send where device_mac = '%s'",mac);
  23. excuteSql(_db,query_sql);
  24. res = mysql_store_result(_db);
  25. if (NULL == res)
  26. {
  27. return 1;
  28. }
  29. //获取行数
  30. row_count = mysql_num_rows(res);
  31. if(row_count<1)
  32. {
  33. mysql_free_result(res);
  34. return 1;
  35. }
  36. mysql_free_result(res);
  37. return 0;
  38. }
  39. //在数组中查询mac是否在二维数组中
  40. int isexist_mac(char* subMac,char string_subMac[][13],int count)
  41. {
  42. int i = 0;
  43. for(i = 0;i<count;i++)
  44. {
  45. if(strcmp(subMac,string_subMac[i]) == 0)
  46. {
  47. log("%s 子节点重复,跳过! \n",subMac);
  48. return 1;
  49. }
  50. }
  51. return 0;
  52. }
  53. //------ 连接指令 -------------------------------------------------------
  54. //设备上电
  55. int do_CN_FTC(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  56. {
  57. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  58. UNUSED(topicName);
  59. //校验长度
  60. if(pubmsg->payloadlen != 18 && pubmsg->payloadlen != 19)
  61. return 1;
  62. char update_sql[512] = {0};
  63. char update_table_cmd_send[100];
  64. char mac[25] = {0};
  65. char gateway_version[10] = {0};
  66. unsigned char* data = pubmsg->payload;
  67. Hex2Str((const char*)data,mac,12);
  68. memcpy(gateway_version,data+12,pubmsg->payloadlen-12);
  69. log("↑ %s 上电,网关版本号:%s \n",mac,gateway_version);
  70. sprintf(update_sql,"update dev_info_gateway a ,dev_status b set a.device_version = '%s',a.last_poweron_time = now(),a.version_update_time = now(),b.current_online = 1,b.update_time = now() "
  71. "where a.device_mac = '%s' and a.device_mac = b.device_mac",gateway_version,mac);
  72. excuteSql(_db,update_sql);
  73. //更新指令发送表设备在线状态
  74. if(is_have_data_inDB(mac,_db) == 0)
  75. {
  76. sprintf(update_table_cmd_send,"update dev_cmd_send set current_online = 1 where device_mac = '%s'",mac);
  77. excuteSql(_db,update_table_cmd_send);
  78. log("%s 数据库有指令,更新指令发送表设备在线状态为1 \n",mac);
  79. }
  80. return 0;
  81. }
  82. //设备重连
  83. int do_CN_RCN(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  84. {
  85. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  86. UNUSED(topicName);
  87. //校验长度
  88. if(pubmsg->payloadlen != 18 && pubmsg->payloadlen != 19)
  89. return 1;
  90. char update_sql[512] = {0};
  91. char update_table_cmd_send[100];
  92. char mac[25] = {0};
  93. char gateway_version[10] = {0};
  94. unsigned char* data = pubmsg->payload;
  95. Hex2Str((const char*)data,mac,12);
  96. memcpy(gateway_version,data+12,pubmsg->payloadlen-12);
  97. log("↑ %s 重连,网关版本号:%s \n",mac,gateway_version);
  98. sprintf(update_sql,"update dev_info_gateway a ,dev_status b set a.device_version = '%s',a.last_reconnection_time = now(),a.version_update_time = now(),b.current_online = 1,b.update_time = now() "
  99. "where a.device_mac = '%s' and a.device_mac = b.device_mac",gateway_version,mac);
  100. excuteSql(_db,update_sql);
  101. //更新指令发送表设备在线状态
  102. if(is_have_data_inDB(mac,_db) == 0)
  103. {
  104. sprintf(update_table_cmd_send,"update dev_cmd_send set current_online = 1 where device_mac = '%s'",mac);
  105. excuteSql(_db,update_table_cmd_send);
  106. log("%s 数据库有指令,更新指令发送表设备在线状态为1 \n",mac);
  107. }
  108. return 0;
  109. }
  110. //------ 设备数据上传指令 ----------------------------------------------------
  111. //猪称重数据
  112. int do_DT_PIG(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  113. {
  114. UNUSED(topicName);
  115. UNUSED(_db);
  116. //校验长度,变长只比较最小
  117. if(pubmsg->payloadlen<15)
  118. return 1;
  119. char insert_sql[512] = {0};
  120. char update_sql[512] = {0};
  121. char log_str[512] = {0};
  122. char mac[25] = {0};
  123. char ear_id[15]; //耳标
  124. float f_weight = 0;//体重
  125. char2int ciWeight;
  126. char stime[64] = {0};//时间
  127. int affectedRows = 0;
  128. //mac
  129. unsigned char* data = pubmsg->payload;
  130. //Hex2Str((const char*)data,mac,12);
  131. memcpy(mac,data,12);
  132. //时间
  133. sprintf(stime,"%d/%d/%d %d:%d:%d",data[12],data[13],data[14],data[15],data[16],data[17]);
  134. //耳标
  135. memcpy(ear_id,data+18,15);
  136. //体重
  137. memcpy(ciWeight.c_char,data+33,4);
  138. EndianSwap((unsigned char*)ciWeight.c_char,0,4);
  139. f_weight = ((float)ciWeight.i_int)/10.0;
  140. sprintf(insert_sql,"insert into dev_pig_history_202205(device_mac,acqusition_time,ear_id,weight,update_time)values('%s',str_to_date('%s', '%%Y-%%m-%%d %%h:%%i:%%s'),'%s',%f,now())",
  141. mac,stime,ear_id,f_weight);
  142. excuteSql(_db,insert_sql);
  143. sprintf(update_sql,"update dev_pig_status set weight = %f, acqusition_time = str_to_date('%s', '%%Y-%%m-%%d %%h:%%i:%%s'),update_time = now() where device_mac = '%s' and ear_id = '%s'",
  144. f_weight,stime,mac,ear_id);
  145. excuteSql(_db,update_sql);
  146. affectedRows = mysql_affected_rows(_db);
  147. if (affectedRows < 1)
  148. {
  149. sprintf(insert_sql,"insert into dev_pig_status(device_mac,ear_id,acqusition_time,update_time,weight)values('%s','%s',str_to_date('%s', '%%Y-%%m-%%d %%h:%%i:%%s'),now(),%f)",
  150. mac,ear_id,stime,f_weight);
  151. excuteSql(_db,insert_sql);
  152. }
  153. sprintf(log_str,"↑ 收到猪称重数据,网关:%s,采集时间:%s ,耳标:%s ,体重:%f",mac,stime,ear_id,f_weight);
  154. log("%s \n",log_str);
  155. return 0;
  156. }
  157. //流量计数据
  158. int do_DT_COP(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  159. {
  160. UNUSED(topicName);
  161. UNUSED(_db);
  162. //校验长度,变长只比较最小
  163. if(pubmsg->payloadlen<15)
  164. return 1;
  165. char update_sql[512] = {0};
  166. char insert_sql[512] = {0};
  167. char log_str[512] = {0};
  168. char mac[25] = {0};
  169. char temp[64] = {0};
  170. memset(temp,0x0,64);
  171. char2short water_temp1; //水温1
  172. float f_water_temp1 = 0.0;
  173. char2short water_temp2; //水温2
  174. float f_water_temp2 = 0.0;
  175. char2int flow_rate; //瞬时流量
  176. float f_flow_rate = 0.0;
  177. char2int forward_integer_part; //正向累计整数部分
  178. char2short forward_decimal_part; //正向累计小数部分
  179. float forward_accumulative_flow = 0.0; //正向累计流量
  180. char2int reverse_integer_part; //反向累计整数部分
  181. char2short reverse_decimal_part; //反向累计小数部分
  182. float reverse_accumulative_flow = 0.0; //反向累计流量
  183. char2short active_power_a; //a相有功功率
  184. float f_active_power_a = 0.0;
  185. char2short active_power_b; //b相有功功率
  186. float f_active_power_b = 0.0;
  187. char2short active_power_c; //c相有功功率
  188. float f_active_power_c = 0.0;
  189. char2short total_active_power; //总共有功功率
  190. float f_total_active_power = 0.0;
  191. //mac
  192. unsigned char* data = pubmsg->payload;
  193. Hex2Str((const char*)data,mac,12);
  194. //水温1
  195. memcpy(water_temp1.c_char,data+12,2);
  196. EndianSwap((unsigned char*)water_temp1.c_char,0,2);
  197. f_water_temp1 = ((float)water_temp1.i_short)/10.0;
  198. //水温2
  199. memcpy(water_temp2.c_char,data+14,2);
  200. EndianSwap((unsigned char*)water_temp2.c_char,0,2);
  201. f_water_temp2 = ((float)water_temp2.i_short)/10.0;
  202. //瞬时流量
  203. memcpy(flow_rate.c_char,data+16,4);
  204. EndianSwap((unsigned char*)flow_rate.c_char,0,4);
  205. f_flow_rate = ((float)flow_rate.i_int)/1000.0;
  206. //正向累计流量
  207. memcpy(forward_integer_part.c_char,data+20,4);
  208. EndianSwap((unsigned char*)forward_integer_part.c_char,0,4);
  209. memcpy(forward_decimal_part.c_char,data+24,2);
  210. EndianSwap((unsigned char*)forward_decimal_part.c_char,0,2);
  211. sprintf(temp,"%d.%u",forward_integer_part.i_int,forward_decimal_part.i_short);
  212. forward_accumulative_flow = atof(temp);
  213. memset(temp,0x0,64);
  214. //反向累计流量
  215. memcpy(reverse_integer_part.c_char,data+26,4);
  216. EndianSwap((unsigned char*)reverse_integer_part.c_char,0,4);
  217. memcpy(reverse_decimal_part.c_char,data+30,2);
  218. EndianSwap((unsigned char*)reverse_decimal_part.c_char,0,2);
  219. sprintf(temp,"%d.%d",reverse_integer_part.i_int,reverse_decimal_part.i_short);
  220. reverse_accumulative_flow = atof(temp);
  221. //a相有功功率
  222. memcpy(active_power_a.c_char,data+32,2);
  223. EndianSwap((unsigned char*)active_power_a.c_char,0,2);
  224. f_active_power_a = ((float)active_power_a.i_short)/1000.0;
  225. f_active_power_a = abs(f_active_power_a);
  226. //b相有功功率
  227. memcpy(active_power_b.c_char,data+34,2);
  228. EndianSwap((unsigned char*)active_power_b.c_char,0,2);
  229. f_active_power_b = ((float)active_power_b.i_short)/1000.0;
  230. f_active_power_b = abs(f_active_power_b);
  231. //c相有功功率
  232. memcpy(active_power_c.c_char,data+36,2);
  233. EndianSwap((unsigned char*)active_power_c.c_char,0,2);
  234. f_active_power_c = ((float)active_power_c.i_short)/1000.0;
  235. f_active_power_c = abs(f_active_power_c);
  236. //总共有功功率
  237. memcpy(total_active_power.c_char,data+38,2);
  238. EndianSwap((unsigned char*)total_active_power.c_char,0,2);
  239. f_total_active_power = ((float)total_active_power.i_short)/1000.0;
  240. f_total_active_power = abs(f_total_active_power);
  241. sprintf(update_sql,"update dev_status_flowmeter set current_online = 1,update_time = now(),water_temp1 = %f,water_temp2 = %f,flow_rate = %f,"
  242. "forward_accumulative_flow = %f,reverse_accumulative_flow = %f,active_power_a = %f,active_power_b = %f,"
  243. " active_power_c = %f,total_active_power = %f where gateway_mac = '%s'",f_water_temp1,f_water_temp2,f_flow_rate,
  244. forward_accumulative_flow,reverse_accumulative_flow,f_active_power_a,f_active_power_b,f_active_power_c,f_total_active_power,mac);
  245. sprintf(insert_sql,"insert into dev_flowmeter_history_202203(gateway_mac,update_time,water_temp1,water_temp2,flow_rate,forward_accumulative_flow,"
  246. "reverse_accumulative_flow,active_power_a,active_power_b,active_power_c,total_active_power)values('%s',now(),%f,%f,%f,%f,%f,%f,%f,%f,%f)",
  247. mac,f_water_temp1,f_water_temp2,f_flow_rate,forward_accumulative_flow,reverse_accumulative_flow,f_active_power_a,f_active_power_b,f_active_power_c,f_total_active_power);
  248. sprintf(log_str,"↑ 收到电流计数据,网关:%s,水温1:%f ,水温2:%f ,瞬时流量:%f ,正向累计流量:%f ,反向累计流量:%f ,a相有功功率:%f ,b相有功功率:%f ,c相有功功率:%f ,总共有功功率:%f",
  249. mac,f_water_temp1,f_water_temp2,f_flow_rate,forward_accumulative_flow,reverse_accumulative_flow,f_active_power_a,f_active_power_b,f_active_power_c,f_total_active_power);
  250. excuteSql(_db,update_sql);
  251. excuteSql(_db,insert_sql);
  252. log("%s \n",log_str);
  253. return 0;
  254. }
  255. //设备传感器数据
  256. int do_DT_SDT(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  257. {
  258. UNUSED(topicName);
  259. UNUSED(_db);
  260. //校验长度,变长只比较最小
  261. if(pubmsg->payloadlen<15)
  262. return 1;
  263. char update_sql[512] = {0};
  264. char log_str[512] = {0};
  265. char mac[25] = {0};
  266. int count; //传感器数量
  267. int line_count = 0;//线温计数
  268. int step = 13;
  269. int i= 0;
  270. unsigned char* data = pubmsg->payload;
  271. Hex2Str((const char*)data,mac,12);
  272. count = data[12];
  273. if(count<1) return 1;
  274. sprintf(update_sql,"update dev_status set current_online = 1,");
  275. sprintf(log_str,"↑ 收到传感器数据,网关:%s",mac);
  276. for(i = 0;i<count;i++)
  277. {
  278. if(step == pubmsg->payloadlen)
  279. return 1;
  280. int subType = data[step]; //节点类型
  281. step += 1;
  282. if(subType == 1) //温湿度传感器
  283. {
  284. //20210408 温湿度非255才更新
  285. if(data[step] != 255 && data[step+1] != 255)
  286. {
  287. sprintf(update_sql,"%s current_temperature=%d,current_humidity=%d,",update_sql,(char)data[step],(char)data[step+1]);
  288. sprintf(log_str,"%s,温度:%d,湿度:%d",log_str,(char)data[step],(char)data[step+1]);
  289. }
  290. step += 2;
  291. }
  292. else if(subType == 2) //陀螺仪传感器
  293. {
  294. char2short x_offset,y_offset,z_offset;
  295. x_offset.c_char[0] = data[step+1];
  296. x_offset.c_char[1] = data[step];
  297. y_offset.c_char[0] = data[step+3];
  298. y_offset.c_char[1] = data[step+2];
  299. z_offset.c_char[0] = data[step+5];
  300. z_offset.c_char[1] = data[step+4];
  301. sprintf(update_sql,"%s x_angle_offset=%f,y_angle_offset=%f,z_angle_offset=%f,",
  302. update_sql,((double)x_offset.i_short)/10.0,((double)y_offset.i_short)/10.0,((double)z_offset.i_short)/10.0);
  303. sprintf(log_str,"%s,x倾斜角:%.2f,y倾斜角:%.2f,z倾斜角:%.2f",
  304. log_str,((double)x_offset.i_short)/10.0,((double)y_offset.i_short)/10.0,((double)z_offset.i_short)/10.0);
  305. step += 6;
  306. }
  307. else if(subType == 3) //环境亮度传感器
  308. {
  309. char2short environmentLuminance;
  310. environmentLuminance.c_char[0] = data[step+1];
  311. environmentLuminance.c_char[1] = data[step];
  312. sprintf(update_sql,"%s environment_luminance=%u,",update_sql,(unsigned short)environmentLuminance.i_short);
  313. sprintf(log_str,"%s,环境光亮度:%u",log_str,(unsigned short)environmentLuminance.i_short);
  314. step += 2;
  315. }
  316. else if(subType == 4) //线温传感器
  317. {
  318. line_count += 1;
  319. //20210408 线温非255才更新
  320. if(data[step] != 255)
  321. {
  322. sprintf(update_sql,"%s line_temperature%d=%d,",update_sql,line_count,(char)data[step]);
  323. sprintf(log_str,"%s,线温%d:%d",log_str,line_count,(char)data[step]);
  324. }
  325. step += 1;
  326. }
  327. else
  328. {
  329. log("↑ %s,类型:%d,无法识别节点类型! \n",mac,subType);
  330. return 1;
  331. }
  332. }
  333. if(strlen(update_sql)>25)
  334. {
  335. sprintf(update_sql+strlen(update_sql)-1," where device_mac='%s'",mac);
  336. excuteSql(_db,update_sql);
  337. //sendtoqueue(m_pque,update_sql);
  338. log("%s \n",log_str);
  339. }
  340. else
  341. {
  342. log("%s,无传感器数据或者数据无效!\n",log_str);
  343. }
  344. return 0;
  345. }
  346. //设备电气数据
  347. int do_DT_EPD(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  348. {
  349. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  350. UNUSED(topicName);
  351. //校验长度,变长只比较最小
  352. if(pubmsg->payloadlen<12)
  353. return 1;
  354. char update_sql[512] = {0};
  355. char update_sql2[512] = {0};
  356. char insert_sql[512] = {0};
  357. char head_str[100] = {0};
  358. char data_str[1024] = {0};
  359. char string_mac[30][13] = {};//保存子节点数组
  360. char mac[25] = {0};
  361. int count; //节点数量
  362. int step = 13;
  363. int i= 0;
  364. struct timeval tv;
  365. unsigned int time1; //开始时间
  366. unsigned int time2; //结束时间
  367. unsigned char* data = pubmsg->payload;
  368. Hex2Str((const char*)data,mac,12);
  369. count = data[12];
  370. if(count<1) return 1;
  371. gettimeofday(&tv,NULL);
  372. time1 = tv.tv_sec*1000*1000 + tv.tv_usec;
  373. sprintf(update_sql2,"update dev_status set current_online = 1,update_time = now() where device_mac = '%s'",mac);
  374. excuteSql(_db,update_sql2);
  375. for(i = 0;i<count;i++)
  376. {
  377. if(step == pubmsg->payloadlen)
  378. return 1;
  379. char subMac[30] = {0}; //节点mac
  380. Hex2Str((const char*)(data+step),subMac,6);
  381. strcpy(string_mac[i],subMac);
  382. step += 6;
  383. int subType = data[step]; //节点类型
  384. step += 1;
  385. if(i == 0)
  386. {
  387. sprintf(head_str,"↑ 收到电气数据,网关:%s",mac);
  388. }
  389. if(subType == 1) //总表
  390. {
  391. char2int energy;
  392. memcpy(energy.c_char,data+step,4);
  393. EndianSwap((unsigned char*)energy.c_char,0,4);
  394. step += 4;
  395. //如果子节点上传数据重复,跳过解析当前节点
  396. if(isexist_mac(subMac,string_mac,i) == 1) continue;
  397. //log("%d.总表:%s,电能:%d",i+1,subMac,energy.i_int);
  398. sprintf(data_str,"%s %d.总表:%s,电能:%d ;",data_str,i+1,subMac,energy.i_int);
  399. sprintf(update_sql,"update dev_status set current_online = 1,current_energy = %d,update_time = now() where device_mac = '%s'",
  400. energy.i_int,subMac);
  401. excuteSql(_db,update_sql);
  402. //sendtoqueue(m_pque,update_sql);
  403. sprintf(insert_sql,"insert into %s(device_mac,gateway_mac,device_type,current_energy,update_time)values('%s','%s',1,%d,%d)",
  404. GetCurrentNYTable(),subMac,mac,energy.i_int,timeGloble_g);
  405. excuteSql(_db,insert_sql);
  406. //sendtoqueue(m_pque,insert_sql);
  407. }
  408. else if(subType == 2) //智能空开节点
  409. {
  410. char2int energy;
  411. char2int power;
  412. char2int current;
  413. char2int voltage;
  414. char2int relay;
  415. char dMac[30] = {0};
  416. //电压
  417. memcpy(voltage.c_char,data+step,4);
  418. EndianSwap((unsigned char*)voltage.c_char,0,4);
  419. step += 4;
  420. //电流
  421. memcpy(current.c_char,data+step,4);
  422. EndianSwap((unsigned char*)current.c_char,0,4);
  423. step += 4;
  424. //功率
  425. memcpy(power.c_char,data+step,4);
  426. EndianSwap((unsigned char*)power.c_char,0,4);
  427. step += 4;
  428. //电能
  429. memcpy(energy.c_char,data+step,4);
  430. EndianSwap((unsigned char*)energy.c_char,0,4);
  431. step += 4;
  432. //继电器状态,20210318 从2个字节改为4个字节
  433. relay.i_int = 0;
  434. relay.c_char[3] = data[step];
  435. relay.c_char[2] = data[step+1];
  436. relay.c_char[1] = data[step+2];
  437. relay.c_char[0] = data[step+3];
  438. step += 4;
  439. //如果子节点上传数据重复,跳过解析当前节点
  440. if(isexist_mac(subMac,string_mac,i) == 1) continue;
  441. int relay_state = 0;
  442. //0x0100 手动合闸,0x0 继电器合闸;20210303新增0x0400 远程合闸;20210318新增4个类型 0x00010000 定时合闸,0x080000 过压恢复合闸,0x100000 欠压恢复合闸,0x200000上电合闸
  443. if(relay.i_int == 0x0100 || relay.i_int == 0x0000 || relay.i_int == 0x0400 || relay.i_int == 0x010000
  444. || relay.i_int == 0x080000 || relay.i_int == 0x100000 || relay.i_int == 0x200000)
  445. {
  446. relay_state = 1;
  447. }
  448. else if (relay.i_int == 0x0000FFFF) //0x0000FFFF 此状态不更新继电器状态
  449. {
  450. relay_state = -1;
  451. }
  452. //debug("relay:%d,char[0]:%02x,char[1]:%02x,char[2]:%02x,char[3]:%02x \n",relay.i_int,relay.c_char[0],relay.c_char[1],relay.c_char[2],relay.c_char[3]);
  453. if(strcmp(subMac,"0F0000000001") == 0) //网关数据
  454. {
  455. strcpy(dMac,mac);
  456. }
  457. else
  458. {
  459. strcpy(dMac,subMac);
  460. //log("↑ 收到电气数据,网关:%s,智能空开:%s,电压:%d,电流:%d,功率:%d,电能:%d,继电器状态:%d,code:%02x%02x \n",mac,subMac,voltage.i_int,current.i_int,power.i_int,energy.i_int,relay_state,relay.c_char[1],relay.c_char[0]);
  461. sprintf(data_str,"%s %d.智能空开:%s,电压:%d,电流:%d,功率:%d,电能:%d,继电器状态:%d,code:%02x%02x%02x%02x;",
  462. data_str,i+1,subMac,voltage.i_int,current.i_int,power.i_int,energy.i_int,relay_state,
  463. (unsigned char)relay.c_char[3],(unsigned char)relay.c_char[2],(unsigned char)relay.c_char[1],(unsigned char)relay.c_char[0]);
  464. }
  465. if(relay_state == -1)//0x0000FFFF 此状态不更新继电器状态
  466. {
  467. sprintf(update_sql,"update dev_status set current_online = 1, current_voltage = %d,current_electric = %d,current_power = %d,current_energy = %d,update_time=now(),electric_update_flag=1 where device_mac ='%s'",
  468. abs(voltage.i_int),abs(current.i_int),abs(power.i_int),abs(energy.i_int),dMac);
  469. }
  470. else
  471. {
  472. sprintf(update_sql,"update dev_status set current_online = 1, current_voltage = %d,current_electric = %d,current_power = %d,current_energy = %d,current_on_off = %d,original_relay = %d,update_time=now(),electric_update_flag=1 where device_mac ='%s'",
  473. abs(voltage.i_int),abs(current.i_int),abs(power.i_int),abs(energy.i_int),relay_state,abs(relay.i_int),dMac);
  474. }
  475. //excuteSql(_db,update_sql);
  476. //sendtoqueue(m_pque,update_sql);
  477. if(relay_state == -1)//0x0000FFFF 此状态不更新继电器状态
  478. {
  479. sprintf(insert_sql,"insert into %s(device_mac,gateway_mac,device_type,current_voltage,current_electric,current_power,current_energy,update_time)"
  480. "values('%s','%s',2,%d,%d,%d,%d,%d)",GetCurrentNYTable(),dMac,mac,voltage.i_int,current.i_int,power.i_int,energy.i_int,timeGloble_g);
  481. }
  482. else
  483. {
  484. sprintf(insert_sql,"insert into %s(device_mac,gateway_mac,device_type,current_voltage,current_electric,current_power,current_energy,current_on_off,update_time)"
  485. "values('%s','%s',2,%d,%d,%d,%d,%d,%d)",GetCurrentNYTable(),dMac,mac,voltage.i_int,current.i_int,power.i_int,energy.i_int,relay_state,timeGloble_g);
  486. }
  487. //excuteSql(_db,insert_sql);
  488. //sendtoqueue(m_pque,insert_sql);
  489. //如果数据异常,放弃写入数据库
  490. if(voltage.i_int < 26000 && current.i_int < 300000 && voltage.i_int>=0 && current.i_int>=0)
  491. {
  492. excuteSql(_db,update_sql);
  493. excuteSql(_db,insert_sql);
  494. }
  495. //继电器报警
  496. //RelayAlarm(mac,subMac,relay.i_int,_db);
  497. //如果是网关,跳过最后打印日志
  498. if(strcmp(subMac,"0F0000000001") == 0)
  499. {
  500. gettimeofday(&tv,NULL);
  501. time2 = tv.tv_sec*1000*1000 + tv.tv_usec;
  502. log("↑ 收到电气数据,网关:%s,电压:%d,电流:%d,功率:%d,电能:%d,继电器状态:%d,code:%02x%02x%02x%02x,cost:%d微秒 \n",
  503. mac,voltage.i_int,current.i_int,power.i_int,energy.i_int,relay_state,
  504. (unsigned char)relay.c_char[3],(unsigned char)relay.c_char[2],(unsigned char)relay.c_char[1],(unsigned char)relay.c_char[0],(time2-time1));
  505. return 0;
  506. }
  507. }
  508. else if(subType == 3) //调光节点
  509. {
  510. //组号
  511. int group = data[step];
  512. step += 1;
  513. //亮度
  514. int luminance = data[step];
  515. step += 1;
  516. //调光模式
  517. int dimming_mode = data[step];
  518. step += 1;
  519. //调光类型
  520. int dimming_type = data[step];
  521. step += 1;
  522. //电压
  523. int voltage = data[step];
  524. step += 1;
  525. //电流
  526. char2int current;
  527. memset(&current,0x0,4);
  528. current.c_char[0] = data[step+1];
  529. current.c_char[1] = data[step];
  530. debug("电流: data[step]:%02X,data[step+1]:%02X,C_CHAR:%02X %02X %02X %02X \n",data[step],data[step+1],current.c_char[0],current.c_char[1],current.c_char[2],current.c_char[3]);
  531. step += 2;
  532. //如果子节点上传数据重复,跳过解析当前节点
  533. if(isexist_mac(subMac,string_mac,i) == 1) continue;
  534. //log("↑ 收到电气数据,网关:%s,调光节点:%s,组号:%d,亮度:%d,调光模式:%d,调光类型:%d,电压:%d,电流:%d \n",mac,subMac,group,luminance,
  535. //dimming_mode,dimming_type,abs(voltage),abs(current.i_int));
  536. sprintf(data_str,"%s %d.调光节点:%s,组号:%d,亮度:%d,调光模式:%d,调光类型:%d,电压:%d,电流:%d ;",
  537. data_str,i+1,subMac,group,luminance,dimming_mode,dimming_type,abs(voltage),abs(current.i_int));
  538. sprintf(update_sql,"update dev_status set current_online = 1, current_luminance = %d,device_group = %d,current_voltage = %d,current_electric = %d,"
  539. "update_time=now() where device_mac ='%s'",luminance,group,abs(voltage),abs(current.i_int),subMac);
  540. excuteSql(_db,update_sql);
  541. //sendtoqueue(m_pque,update_sql);
  542. sprintf(insert_sql,"insert into %s(device_mac,gateway_mac,device_type,device_luminance,device_group,current_voltage,current_electric,update_time)"
  543. "values('%s','%s',3,%d,%d,%d,%d,%d)",GetCurrentNYTable(),subMac,mac,luminance,group,voltage,current.i_int,timeGloble_g);
  544. excuteSql(_db,insert_sql);
  545. //sendtoqueue(m_pque,insert_sql);
  546. }
  547. else if(subType == 4) //烟感节点
  548. {
  549. //报警状态
  550. int alarm = 0;
  551. alarm = data[step];
  552. step += 1;
  553. //如果子节点上传数据重复,跳过解析当前节点
  554. if(isexist_mac(subMac,string_mac,i) == 1) continue;
  555. //log("↑ 收到电气数据,网关:%s,烟感节点:%s,报警状态:%d",mac,subMac,alarm);
  556. sprintf(data_str,"%s %d.烟感节点:%s,报警状态:%d ;",data_str,i+1,subMac,alarm);
  557. }
  558. else
  559. {
  560. log("↑ 收到电气数据,网关:%s,节点:%s,类型:%d,无法识别节点类型! \n",mac,subMac,subType);
  561. return 1;
  562. }
  563. }
  564. //log("%s,%s \n",head_str,data_str);
  565. gettimeofday(&tv,NULL);
  566. time2 = tv.tv_sec*1000*1000 + tv.tv_usec;
  567. log("%s,%scost:%d微秒\n",head_str,data_str,(time2-time1));
  568. return 0;
  569. }
  570. //SIM卡ICCID号
  571. int do_DT_SIM(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  572. {
  573. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  574. //校验长度
  575. if(CheckMsgLength(topicName, pubmsg,32))
  576. return 1;
  577. char update_sql[512] = {0};
  578. char mac[25] = {0};
  579. char sim[21] = {0};
  580. unsigned char* data = pubmsg->payload;
  581. Hex2Str((const char*)data,mac,12);
  582. memcpy(sim,data+12,20);
  583. log("↑ 收到SIM卡ICCID数据,网关:%s,iccid:%s \n",mac,sim);
  584. sprintf(update_sql,"update dev_info_gateway set sim_iccid = '%s' where device_mac ='%s'",sim,mac);
  585. excuteSql(_db,update_sql);
  586. return 0;
  587. }