handle.ack.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. /******************************************************************
  2. ** Copyright (c) 2009 Wuhan xiyun Technology Co., Ltd .
  3. ** FileName: handle.ack.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. //远程开关控制确认
  18. int do_ACK_CTR_RSC(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  19. {
  20. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  21. //校验长度
  22. if(CheckMsgLength(topicName, pubmsg,20))
  23. return 1;
  24. char update_sql[256] = {0};
  25. char update_sql2[256] = {0};
  26. char mac[25] = {0}; //网关mac
  27. char subMac[13] = {0}; //节点mac
  28. unsigned char* data = pubmsg->payload;
  29. Hex2Str((const char*)data,mac,12);
  30. Hex2Str((const char*)(data+12),subMac,6);
  31. if(strcmp(subMac,"0F0000000001")==0)//网关
  32. {
  33. log("↑ 收到远程开关控制确认,网关:%s,类型:%d,动作:%d \n",mac,data[18],data[19]);
  34. sprintf(update_sql,"update dev_info_gateway set ack_switch = 1 where device_mac = '%s'",mac);
  35. //更新dev_status表网关开关状态
  36. sprintf(update_sql2,"update dev_status set current_on_off = %d,update_time = now() where device_mac = '%s'",data[19],mac);
  37. }
  38. else //节点
  39. {
  40. log("↑ 收到远程开关控制确认,网关:%s,节点:%s,节点类型:%d,动作:%d \n",mac,subMac,data[18],data[19]);
  41. sprintf(update_sql,"update dev_info_node set ack_switch = 1 where device_mac = '%s'",subMac);
  42. //更新dev_status表节点开关状态
  43. sprintf(update_sql2,"update dev_status set current_on_off = %d,update_time = now() where device_mac = '%s'",data[19],subMac);
  44. }
  45. excuteSql(_db,update_sql);
  46. excuteSql(_db,update_sql2);
  47. return 0;
  48. }
  49. //远程开关编组控制确认
  50. int do_ACK_CTR_RGC(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  51. {
  52. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  53. //校验长度
  54. if(CheckMsgLength(topicName, pubmsg,15))
  55. return 1;
  56. char update_sql[256] = {0};
  57. char update_sql2[256] = {0};
  58. char mac[25] = {0}; //网关mac
  59. unsigned char* data = pubmsg->payload;
  60. Hex2Str((const char*)data,mac,12);
  61. log("↑ 收到远程开关编组控制确认,网关:%s,组号:%d,类型:%d,动作:%d \n",mac,data[12],data[13],data[14]);
  62. //更新dev_status表节点开关状态
  63. sprintf(update_sql,"update dev_status set current_on_off = %d,update_time = now() where "
  64. "device_mac in(select device_mac from dev_info_node where gateway_mac = '%s' and device_group = %d)",data[14],mac,data[12]);
  65. sprintf(update_sql2,"update dev_info_gateway set ack_group_switch = 1 where device_mac = '%s'",mac);
  66. excuteSql(_db,update_sql);
  67. excuteSql(_db,update_sql2);
  68. return 0;
  69. }
  70. //------ 配置指令确认 ------------------------------------------------------
  71. //备份服务器配置确认
  72. int do_ACK_CFG_BKS(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  73. {
  74. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  75. //校验长度
  76. if(CheckMsgLength(topicName, pubmsg,18))
  77. return 1;
  78. char update_sql[512] = {0};
  79. char mac[25] = {0};
  80. char ip[4] = {0};
  81. int port = 0;
  82. unsigned char* data = pubmsg->payload;
  83. Hex2Str((const char*)data,mac,12);
  84. memcpy(ip,data+12,4);
  85. port = (data[16]<<16) + (data[17]<<24);
  86. log("↑ 收到备份服务器配置确认,网关:%s \n",mac);
  87. sprintf(update_sql,"update dev_info_gateway set ack_ip = 1 where device_mac = '%s'",
  88. mac);
  89. excuteSql(_db,update_sql);
  90. return 0;
  91. }
  92. //上传间隔配置确认
  93. int do_ACK_CFG_ULI(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  94. {
  95. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  96. //校验长度
  97. if(CheckMsgLength(topicName, pubmsg,14))
  98. return 1;
  99. char update_sql[512] = {0};
  100. char mac[25] = {0};
  101. unsigned char* data = pubmsg->payload;
  102. Hex2Str((const char*)data,mac,12);
  103. log("↑ 收到上传间隔配置确认,网关:%s,单位:%d,数值:%d \n",mac,data[12],data[13]);
  104. sprintf(update_sql,"update dev_info_gateway set ack_upload_interval = 1 where device_mac = '%s'",
  105. mac);
  106. excuteSql(_db,update_sql);
  107. return 0;
  108. }
  109. //开关时间段确认
  110. int do_ACK_CFG_STS(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  111. {
  112. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  113. //校验长度
  114. if(CheckMsgLength(topicName, pubmsg,23))
  115. return 1;
  116. char update_sql[512] = {0};
  117. char mac[25] = {0}; //网关mac
  118. char subMac[13] = {0}; //节点mac
  119. unsigned char* data = pubmsg->payload;
  120. Hex2Str((const char*)data,mac,12);
  121. Hex2Str((const char*)(data+12),subMac,6);
  122. if(strcmp(subMac,"0F0000000001")==0)//网关
  123. {
  124. log("↑ 收到开关时间段确认,网关:%s,类型:%d \n",mac,data[18]);
  125. sprintf(update_sql,"update dev_info_gateway set ack_switch_time = 1 where device_mac = '%s'",
  126. mac);
  127. }
  128. else //节点
  129. {
  130. log("↑ 收到开关时间段确认,网关:%s,节点:%s,节点类型:%d \n",mac,subMac,data[18]);
  131. sprintf(update_sql,"update dev_info_node set ack_switch_time = 1 where device_mac = '%s'",
  132. subMac);
  133. }
  134. excuteSql(_db,update_sql);
  135. return 0;
  136. }
  137. //额定电压设置确认
  138. int do_ACK_CFG_SRV(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  139. {
  140. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  141. //校验长度
  142. if(CheckMsgLength(topicName, pubmsg,21))
  143. return 1;
  144. char update_sql[512] = {0};
  145. char mac[25] = {0}; //网关mac
  146. char subMac[13] = {0}; //节点mac
  147. int rate_voltage = 0;
  148. unsigned char* data = pubmsg->payload;
  149. Hex2Str((const char*)data,mac,12);
  150. Hex2Str((const char*)(data+12),subMac,6);
  151. ((char*)&rate_voltage)[0] = data[20];
  152. ((char*)&rate_voltage)[1] = data[19];
  153. if(strcmp(subMac,"0F0000000001")==0)//网关
  154. {
  155. log("↑ 收到额定电压设置确认,网关:%s,类型:%d,阈值:%d \n",mac,data[18],rate_voltage);
  156. sprintf(update_sql,"update dev_info_gateway set ack_rated_voltage = 1 where device_mac = '%s'",mac);
  157. }
  158. else //节点
  159. {
  160. log("↑ 收到额定电压设置确认,网关:%s,节点:%s,节点类型:%d,阈值:%d \n",mac,subMac,data[18],rate_voltage);
  161. sprintf(update_sql,"update dev_info_node set ack_rated_voltage = 1 where device_mac = '%s'",subMac);
  162. }
  163. excuteSql(_db,update_sql);
  164. return 0;
  165. }
  166. //额定电流配置确认
  167. int do_ACK_CFG_SRC(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  168. {
  169. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  170. //校验长度
  171. if(CheckMsgLength(topicName, pubmsg,23))
  172. return 1;
  173. char update_sql[512] = {0};
  174. char mac[25] = {0}; //网关mac
  175. char subMac[13] = {0}; //节点mac
  176. int rate_current = 0;
  177. unsigned char* data = pubmsg->payload;
  178. Hex2Str((const char*)data,mac,12);
  179. Hex2Str((const char*)(data+12),subMac,6);
  180. ((char*)&rate_current)[0] = data[22];
  181. ((char*)&rate_current)[1] = data[21];
  182. ((char*)&rate_current)[2] = data[20];
  183. ((char*)&rate_current)[3] = data[19];
  184. if(strcmp(subMac,"0F0000000001")==0)//网关
  185. {
  186. log("↑ 收到额定电流设置确认,网关:%s,类型:%d,阈值:%d \n",mac,data[18],rate_current);
  187. sprintf(update_sql,"update dev_info_gateway set ack_rated_current = 1 where device_mac = '%s'",mac);
  188. }
  189. else //节点
  190. {
  191. log("↑ 收到额定电流设置确认,网关:%s,节点:%s,节点类型:%d,阈值:%d \n",mac,subMac,data[18],rate_current);
  192. sprintf(update_sql,"update dev_info_node set ack_rated_current = 1 where device_mac = '%s'",subMac);
  193. }
  194. excuteSql(_db,update_sql);
  195. return 0;
  196. }
  197. //开关控制模式确认
  198. int do_ACK_CFG_SCM(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  199. {
  200. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  201. //校验长度
  202. if(CheckMsgLength(topicName, pubmsg,20))
  203. return 1;
  204. char update_sql[512] = {0};
  205. char mac[25] = {0}; //网关mac
  206. char subMac[13] = {0}; //节点mac
  207. unsigned char* data = pubmsg->payload;
  208. Hex2Str((const char*)data,mac,12);
  209. Hex2Str((const char*)(data+12),subMac,6);
  210. if(strcmp(subMac,"0F0000000001")==0)//网关
  211. {
  212. log("↑ 收到开关控制模式设置确认,网关:%s,类型:%d,控制模式:%d \n",mac,data[18],data[19]);
  213. sprintf(update_sql,"update dev_info_gateway set ack_switch_mode = 1 where device_mac = '%s'",mac);
  214. }
  215. else //节点
  216. {
  217. log("↑ 收到开关控制模式设置确认,网关:%s,节点:%s,节点类型:%d,控制模式:%d \n",mac,subMac,data[18],data[19]);
  218. sprintf(update_sql,"update dev_info_node set ack_switch_mode = 1 where device_mac = '%s'",subMac);
  219. }
  220. excuteSql(_db,update_sql);
  221. return 0;
  222. }
  223. //传感器阈值配置确认
  224. int do_ACK_CFG_SAT(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  225. {
  226. UNUSED(topicName);
  227. char update_sql[512] = {0};
  228. char mac[25] = {0};
  229. unsigned char* data = pubmsg->payload;
  230. Hex2Str((const char*)data,mac,12);
  231. log("↑ 收到传感器阈值配置确认,网关:%s \n",mac);
  232. sprintf(update_sql,"update dev_info_gateway set ack_sensor_threshold = 1 where device_mac = '%s'",
  233. mac);
  234. excuteSql(_db,update_sql);
  235. return 0;
  236. }
  237. //调光节点分组设置确认
  238. int do_ACK_CFG_DGS(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  239. {
  240. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  241. //校验长度
  242. if(CheckMsgLength(topicName, pubmsg,34))
  243. return 1;
  244. char update_sql[512] = {0};
  245. char mac[25] = {0}; //网关mac
  246. char subMac[13] = {0}; //节点mac
  247. unsigned char* data = pubmsg->payload;
  248. Hex2Str((const char*)data,mac,12);
  249. Hex2Str((const char*)(data+12),subMac,6);
  250. log("↑ 收到调光节点分组设置确认,网关:%s,节点mac:%s,组号:%d \n",mac,subMac,data[19]);
  251. sprintf(update_sql,"update dev_info_node set ack_group_set = 1 where device_mac = '%s'",subMac);
  252. excuteSql(_db,update_sql);
  253. return 0;
  254. }
  255. //子节点版本号回复
  256. int do_ACK_CFG_GNV(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  257. {
  258. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  259. //校验长度
  260. if(CheckMsgLength(topicName, pubmsg,23))
  261. return 1;
  262. char update_sql[512] = {0};
  263. char mac[25] = {0}; //网关mac
  264. char subMac[13] = {0}; //节点mac
  265. char node_version[10] = {0};
  266. unsigned char* data = pubmsg->payload;
  267. Hex2Str((const char*)data,mac,12);
  268. Hex2Str((const char*)(data+12),subMac,6);
  269. memcpy(node_version,data+18,5);
  270. log("↑ 收到子节点版本号回复,网关:%s,节点:%s,版本号:%s \n",mac,subMac,node_version);
  271. sprintf(update_sql,"update dev_info_node set device_version = '%s',version_update_time = now() where device_mac = '%s'",node_version,subMac);
  272. excuteSql(_db,update_sql);
  273. return 0;
  274. }
  275. //远程手动调光确认
  276. int do_ACK_CTR_RDC(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  277. {
  278. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  279. //校验长度
  280. if(CheckMsgLength(topicName, pubmsg,15))
  281. return 1;
  282. char update_sql[512] = {0};
  283. char mac[25] = {0}; //网关mac
  284. int group,luminuance,dimming_type;
  285. unsigned char* data = pubmsg->payload;
  286. Hex2Str((const char*)data,mac,12);
  287. group = data[12];
  288. luminuance = data[13];
  289. dimming_type = data[14];
  290. log("↑ 收到远程手动调光确认,网关:%s,组号:%d,亮度:%d,调光类型:%d \n",mac,group,luminuance,dimming_type);
  291. sprintf(update_sql,"update dev_dimming_group set current_brightness = %d,ack_group_dimming = 1 where gateway_mac = '%s' and device_group = %d",luminuance,mac,group);
  292. excuteSql(_db,update_sql);
  293. return 0;
  294. }
  295. //远程升级返回确认
  296. int do_ACK_OTA(char *topicName, MQTTAsync_message *pubmsg, MYSQL *_db)
  297. {
  298. //debug("topicName=%s payloadlen=%d\n", topicName, pubmsg->payloadlen);
  299. //校验长度
  300. UNUSED(topicName);
  301. char update_sql[512] = {0};
  302. char mac[25] = {0}; //网关mac
  303. char error_code; //错误码 00:文件接收OK,FE:旧文件不对,01:文件长度不对,02:文件crc32值不对
  304. char app_name[256] = {0}; //本地当前APP 名称 只有在旧文件错误(FE)时,才有这部分
  305. int status = 0;
  306. char comment[256] = {0};
  307. unsigned char* data = pubmsg->payload;
  308. Hex2Str((const char*)data,mac,12);
  309. error_code = (char)data[12];
  310. status = (int)error_code;
  311. if(error_code == (char)0xFE)//旧文件不对
  312. {
  313. strcpy(app_name,(char*)data+13);
  314. sprintf(comment,"error_code:0xFE,app_name:%s",app_name);
  315. status = 3;
  316. }
  317. else if(error_code == (char)0x00)//文件接收OK
  318. {
  319. sprintf(comment,"error_code:0x00,文件接收ok");
  320. status = 2;
  321. }
  322. else if(error_code == (char)0x01)//文件长度不对
  323. {
  324. sprintf(comment,"error_code:0x01,文件长度不对");
  325. status = 3;
  326. }
  327. else if(error_code == (char)0x02)//文件crc32值不对
  328. {
  329. sprintf(comment,"error_code:0x02,文件crc32值不对");
  330. status = 3;
  331. }
  332. log("↑ 收到远程升级返回确认,网关:%s,状态or错误码:%02x,本地当前APP:%s \n",mac,error_code,app_name);
  333. sprintf(update_sql,"update dev_status_upgrade set status = %d,comment = '%s',update_time = now() where gateway_mac = '%s'",status,comment,mac);
  334. log(update_sql);
  335. excuteSql(_db,update_sql);
  336. return 0;
  337. }