cmd.c 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488
  1. /******************************************************************
  2. ** Copyright (c) 2009 Wuhan xiyun Technology Co., Ltd .
  3. ** FileName: cmd.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 服务发送业务指令实现
  10. ** Param explain: char* mac : 网关MAC地址
  11. char* subMac :子节点MAC地址
  12. MQTTAsync_message *pubmsg : 消息结构体
  13. MYSQL *_db :数据库连接
  14. ******************************************************************/
  15. #include "core.h"
  16. #include "cmd.h"
  17. //时间同步
  18. int SendNTP(char *mac)
  19. {
  20. //获取系统时间
  21. time_t timep;
  22. struct tm *p;
  23. time(&timep);
  24. p = gmtime(&timep);
  25. int year2 = (p->tm_year+1900)%100;
  26. int mon = p->tm_mon + 1;
  27. int day = p->tm_mday;
  28. int hour = p->tm_hour + 8;
  29. int minc = p->tm_min;
  30. int sec = p->tm_sec;
  31. //debug("%s 2时间同步发送结果",mac);
  32. //填充报文
  33. char buf[10] = {0};
  34. buf[0] = (char)year2;
  35. buf[1] = (char)mon;
  36. buf[2] = (char)day;
  37. buf[3] = (char)hour;
  38. buf[4] = (char)minc;
  39. buf[5] = (char)sec;
  40. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  41. sendData.payload = buf;
  42. sendData.payloadlen = 6;
  43. sendData.qos = 0;
  44. sendData.retained = 0;
  45. //主题
  46. char topicName[256];
  47. if(strcmp(mac,"") == 0)
  48. {
  49. sprintf(topicName,"NTP");
  50. }
  51. else
  52. {
  53. sprintf(topicName,"PP/%s/CFG/NTP",mac);
  54. }
  55. //发送
  56. int ret = my_mqqta_sendmsg(topicName, &sendData);
  57. log(" ↓发送时间同步指令,结果:%d,时间:%d-%d-%d %d:%d:%d,主题:%s \n",ret,buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],topicName);
  58. return ret;
  59. }
  60. //校验协议长度
  61. int CheckMsgLength(char *topicName,MQTTAsync_message *pubmsg,int protocal_length)
  62. {
  63. UNUSED(topicName);
  64. if(pubmsg->payloadlen != protocal_length)
  65. {
  66. unsigned char* p = pubmsg->payload;
  67. if(pubmsg->payloadlen < 512)
  68. {
  69. char pdata[1024] = {0};
  70. Hex2Str((const char*)p,pdata,pubmsg->payloadlen);
  71. elog("error len--topicName:%s payloadlen:%d,msg:%s\n",topicName,pubmsg->payloadlen,pdata);
  72. }
  73. else
  74. {
  75. elog("error len--topicName:%s payloadlen:%d,msg:数据大于512\n",topicName,pubmsg->payloadlen);
  76. }
  77. return 1;
  78. }
  79. return 0;
  80. }
  81. //备份服务器ip发送
  82. int SendBakIP(char *mac , MYSQL *_db)
  83. {
  84. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  85. MYSQL_RES* res = NULL;
  86. MYSQL_ROW row;
  87. char query[1024] = {0};
  88. char topicName[256];
  89. char ip[20] = {0};
  90. int bakport = 0;
  91. char buf[256] = {0};
  92. char sendPrint[256] = {0};
  93. //数据库查询
  94. sprintf(query,"select bak_ip,bak_port from dev_info_gateway where device_mac ='%s'",mac);
  95. excuteSql(_db,query);
  96. res = mysql_store_result(_db);
  97. if (NULL == res)
  98. {
  99. return 1;
  100. }
  101. row = mysql_fetch_row(res);
  102. if (NULL == row)
  103. {
  104. mysql_free_result(res);
  105. return 1;
  106. }
  107. if(!row[0] || !row[1])
  108. {
  109. log("%s bak_ip 或者 bak_port 为空 \n",mac);
  110. mysql_free_result(res);
  111. return 1;
  112. }
  113. strcpy(ip,row[0]);
  114. bakport = atoi(row[1]);
  115. mysql_free_result(res);
  116. //主题
  117. if(strcmp(mac,"") == 0)
  118. {
  119. return 1;
  120. }
  121. sprintf(topicName,"PP/%s/CFG/BKS",mac);
  122. //填充报文
  123. unsigned long lIP = inet_addr(ip);
  124. memcpy(buf,&lIP,4);
  125. buf[4] = ((char*)&bakport)[1];
  126. buf[5] = ((char*)&bakport)[0];
  127. sendData.payload = buf;
  128. sendData.payloadlen = 6;
  129. sendData.qos = 0;
  130. sendData.retained = 0;
  131. //发送
  132. int ret = my_mqqta_sendmsg(topicName, &sendData);
  133. Hex2Str(buf,sendPrint,sendData.payloadlen);
  134. log(" ↓发送备份服务器ip指令,结果:%d,网关:%s,ip:%s,bakport:%d,报文:%s \n",ret,mac,ip,bakport,sendPrint);
  135. return ret;
  136. }
  137. //节点信息表发送
  138. int SendSubInfo(char *mac , MYSQL *_db)
  139. {
  140. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  141. MYSQL_RES* res = NULL;
  142. MYSQL_ROW row;
  143. char query[1024] = {0};
  144. char buf[256] = {0};
  145. char topicName[256];
  146. char sendPrint[256] = {0};
  147. int row_count;
  148. int ret = 0;
  149. //数据库查询
  150. sprintf(query,"select device_mac,device_type from dev_info_node where gateway_mac ='%s'",mac);
  151. excuteSql(_db,query);
  152. res = mysql_store_result(_db);
  153. if (NULL == res)
  154. {
  155. return 1;
  156. }
  157. //获取行数
  158. row_count = mysql_num_rows(res);
  159. if(row_count<1)
  160. {
  161. log("%s 没有查询到子节点 \n",mac);
  162. mysql_free_result(res);
  163. return 1;
  164. }
  165. //循环取出
  166. int i = 0;
  167. buf[0] = row_count;
  168. for (i = 0; i < row_count; i++)
  169. {
  170. char subMac[30] = {0};
  171. unsigned char nodeMac[30] = {0};
  172. int noteType = 0;
  173. row = mysql_fetch_row(res);
  174. if(!row[0] || !row[1])
  175. {
  176. log("%s 节点mac或者类型为空 \n",mac);
  177. continue;
  178. }
  179. strcpy(subMac,row[0]);//子节点
  180. HexStrToByte(subMac,nodeMac,12);
  181. noteType = atoi(row[1]);//节点类型
  182. memcpy(buf+1+7*i,nodeMac,6);
  183. buf[1+7*i+6] = noteType;
  184. }
  185. mysql_free_result(res);
  186. //主题
  187. if(strcmp(mac,"") == 0)
  188. {
  189. return 1;
  190. }
  191. sprintf(topicName,"PP/%s/CFG/NAT",mac);
  192. //填充报文
  193. sendData.payload = buf;
  194. sendData.payloadlen = row_count*7 + 1;
  195. sendData.qos = 0;
  196. sendData.retained = 0;
  197. //发送
  198. ret = my_mqqta_sendmsg(topicName, &sendData);
  199. Hex2Str(buf,sendPrint,sendData.payloadlen);
  200. log(" ↓发送节点信息表指令,结果:%d,网关:%s,报文:%s \n",ret,mac,sendPrint);
  201. return ret;
  202. }
  203. //额定电压发送
  204. int SendRatedVoltage(char *mac,char *subMac,MYSQL *_db)
  205. {
  206. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  207. MYSQL_RES* res = NULL;
  208. MYSQL_ROW row;
  209. char query[1024] = {0};
  210. unsigned char buf[256] = {0};
  211. unsigned char nodeMac[30] = {0};
  212. char topicName[256];
  213. int rated_voltage;
  214. int device_type;
  215. //数据库查询
  216. if (strcmp(subMac,"") == 0) //网关
  217. {
  218. sprintf(query,"select rated_voltage,device_type from dev_info_gateway where device_mac ='%s'",mac);
  219. HexStrToByte("0F0000000001",nodeMac,12);
  220. }
  221. else
  222. {
  223. sprintf(query,"select rated_voltage,device_type from dev_info_node where device_mac ='%s'",subMac);
  224. HexStrToByte(subMac,nodeMac,12);
  225. }
  226. excuteSql(_db,query);
  227. res = mysql_store_result(_db);
  228. if (NULL == res)
  229. {
  230. return 1;
  231. }
  232. row = mysql_fetch_row(res);
  233. if (NULL == row)
  234. {
  235. mysql_free_result(res);
  236. return 1;
  237. }
  238. if(!row[0] || !row[1])
  239. {
  240. log("%s 额定电压或者设备类型为空 \n",mac);
  241. mysql_free_result(res);
  242. return 1;
  243. }
  244. rated_voltage = (atof(row[0]))*100;
  245. if (strcmp(subMac,"") == 0) //网关
  246. {
  247. device_type = 2;
  248. }
  249. else
  250. {
  251. device_type = atoi(row[1]);
  252. }
  253. mysql_free_result(res);
  254. debug("数据库查询:rated_voltage:%d,device_type:%d \n",rated_voltage,device_type);
  255. //主题
  256. if(strcmp(mac,"") == 0)
  257. {
  258. return 1;
  259. }
  260. sprintf(topicName,"PP/%s/CFG/SRV",mac);
  261. //填充报文
  262. memcpy(buf,nodeMac,6);
  263. buf[6] = device_type;
  264. buf[7] = ((char*)&rated_voltage)[1];
  265. buf[8] = ((char*)&rated_voltage)[0];
  266. sendData.payload = buf;
  267. sendData.payloadlen = 9;
  268. sendData.qos = 0;
  269. sendData.retained = 0;
  270. //发送
  271. int ret = my_mqqta_sendmsg(topicName, &sendData);
  272. log(" ↓发送额定电压设置指令,结果:%d,网关:%s,节点:%s,额定电压:%d,设备类型:%d \n",ret,mac,subMac,rated_voltage,device_type);
  273. return ret;
  274. }
  275. //额定电流发送
  276. int SendRatedCurrent(char *mac,char *subMac,MYSQL *_db)
  277. {
  278. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  279. MYSQL_RES* res = NULL;
  280. MYSQL_ROW row;
  281. char query[1024] = {0};
  282. unsigned char buf[256] = {0};
  283. unsigned char nodeMac[30] = {0};
  284. char topicName[256];
  285. int rated_current;
  286. int device_type;
  287. //数据库查询
  288. if (strcmp(subMac,"") == 0) //网关
  289. {
  290. sprintf(query,"select rated_current,device_type from dev_info_gateway where device_mac ='%s'",mac);
  291. HexStrToByte("0F0000000001",nodeMac,12);
  292. }
  293. else
  294. {
  295. sprintf(query,"select rated_current,device_type from dev_info_node where device_mac ='%s'",subMac);
  296. HexStrToByte(subMac,nodeMac,12);
  297. }
  298. excuteSql(_db,query);
  299. res = mysql_store_result(_db);
  300. if (NULL == res)
  301. {
  302. return 1;
  303. }
  304. row = mysql_fetch_row(res);
  305. if (NULL == row)
  306. {
  307. mysql_free_result(res);
  308. return 1;
  309. }
  310. if(!row[0] || !row[1])
  311. {
  312. log("%s 额定电流或者设备类型为空 \n",mac);
  313. mysql_free_result(res);
  314. return 1;
  315. }
  316. rated_current = (atof(row[0]))*10000;
  317. if (strcmp(subMac,"") == 0) //网关
  318. {
  319. device_type = 2;
  320. }
  321. else
  322. {
  323. device_type = atoi(row[1]);
  324. }
  325. mysql_free_result(res);
  326. debug("数据库查询:rated_current:%d,device_type:%d \n",rated_current,device_type);
  327. //主题
  328. if(strcmp(mac,"") == 0)
  329. {
  330. return 1;
  331. }
  332. sprintf(topicName,"PP/%s/CFG/SRC",mac);
  333. //填充报文
  334. memcpy(buf,nodeMac,6);
  335. buf[6] = device_type;
  336. buf[7] = ((char*)&rated_current)[3];
  337. buf[8] = ((char*)&rated_current)[2];
  338. buf[9] = ((char*)&rated_current)[1];
  339. buf[10] = ((char*)&rated_current)[0];
  340. sendData.payload = buf;
  341. sendData.payloadlen = 11;
  342. sendData.qos = 0;
  343. sendData.retained = 0;
  344. //发送
  345. int ret = my_mqqta_sendmsg(topicName, &sendData);
  346. log(" ↓发送额定电流设置指令,结果:%d,网关:%s,节点:%s,额定电流:%d,设备类型:%d \n",ret,mac,subMac,rated_current,device_type);
  347. return ret;
  348. }
  349. /*
  350. //传感器阈值发送
  351. int SendBakIP(char *mac)
  352. {
  353. return 0;
  354. } */
  355. //远程重启
  356. int SendRestart(char *mac)
  357. {
  358. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  359. char topicName[256];
  360. //主题
  361. if(strcmp(mac,"") == 0)
  362. {
  363. return 1;
  364. }
  365. sprintf(topicName,"PP/%s/CTR/RRS",mac);
  366. sendData.payload = NULL;
  367. sendData.payloadlen = 0;
  368. sendData.qos = 0;
  369. sendData.retained = 0;
  370. //发送
  371. int ret = my_mqqta_sendmsg(topicName, &sendData);
  372. log(" ↓发送远程重启指令,结果:%d,网关:%s \n",ret,mac);
  373. return ret;
  374. }
  375. //设备恢复出厂设置
  376. int SendFactoryReset(char *mac)
  377. {
  378. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  379. char topicName[256];
  380. //主题
  381. if(strcmp(mac,"") == 0)
  382. {
  383. return 1;
  384. }
  385. sprintf(topicName,"PP/%s/CTR/SFR",mac);
  386. sendData.payload = NULL;
  387. sendData.payloadlen = 0;
  388. sendData.qos = 0;
  389. sendData.retained = 0;
  390. //发送
  391. int ret = my_mqqta_sendmsg(topicName, &sendData);
  392. log(" ↓发送设备恢复出厂设置指令,结果:%d,网关:%s \n",ret,mac);
  393. return ret;
  394. }
  395. //服务器跳转
  396. int SendServerJump(char *mac,MYSQL *_db)
  397. {
  398. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  399. MYSQL_RES* res = NULL;
  400. MYSQL_ROW row;
  401. char query[1024] = {0};
  402. char topicName[256];
  403. char jump_ip[20] = {0};
  404. int jump_port = 0;
  405. char buf[256] = {0};
  406. //数据库查询
  407. sprintf(query,"select jump_ip,jump_port from dev_info_gateway where device_mac ='%s'",mac);
  408. excuteSql(_db,query);
  409. res = mysql_store_result(_db);
  410. if (NULL == res)
  411. {
  412. return 1;
  413. }
  414. row = mysql_fetch_row(res);
  415. if (NULL == row)
  416. {
  417. mysql_free_result(res);
  418. return 1;
  419. }
  420. if(!row[0] || !row[1])
  421. {
  422. log("%s jump_ip 或者 jump_port 为空",mac);
  423. mysql_free_result(res);
  424. return 1;
  425. }
  426. strcpy(jump_ip,row[0]);
  427. jump_port = atoi(row[1]);
  428. mysql_free_result(res);
  429. //主题
  430. if(strcmp(mac,"") == 0)
  431. {
  432. return 1;
  433. }
  434. sprintf(topicName,"PP/%s/CTR/RS",mac);
  435. //填充报文
  436. unsigned long lIP = inet_addr(jump_ip);
  437. memcpy(buf,&lIP,4);
  438. buf[4] = ((char*)&jump_port)[1];
  439. buf[5] = ((char*)&jump_port)[0];
  440. sendData.payload = buf;
  441. sendData.payloadlen = 6;
  442. sendData.qos = 0;
  443. sendData.retained = 0;
  444. //发送
  445. int ret = my_mqqta_sendmsg(topicName, &sendData);
  446. log(" ↓发送服务器跳转指令,结果:%d,网关:%s,jump_ip:%s,jump_port:%d \n",ret,mac,jump_ip,jump_port);
  447. return ret;
  448. }
  449. //ota升级
  450. int SendRemoteUpgrade(char *mac,MYSQL *_db)
  451. {
  452. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  453. MYSQL_RES* res = NULL;
  454. MYSQL_ROW row;
  455. char query[1024] = {0};
  456. char topicName[256];
  457. char upgrade_ip[20] = {0};
  458. int upgrade_port = 0;
  459. char ota_file[256] = {0};
  460. int ota_mode = 0;
  461. char buf[256] = {0};
  462. //数据库查询
  463. sprintf(query,"select upgrade_ip,upgrade_port,file_name,ota_mode from dev_info_gateway where device_mac ='%s'",mac);
  464. excuteSql(_db,query);
  465. res = mysql_store_result(_db);
  466. if (NULL == res)
  467. {
  468. return 1;
  469. }
  470. row = mysql_fetch_row(res);
  471. if (NULL == row)
  472. {
  473. mysql_free_result(res);
  474. return 1;
  475. }
  476. if(!row[0] || !row[1] || !row[3] || !row[4])
  477. {
  478. log("%s upgrade_ip 或者 upgrade_port 为空 或者 file_name、ota_mode为空",mac);
  479. mysql_free_result(res);
  480. return 1;
  481. }
  482. strcpy(upgrade_ip,row[0]);
  483. upgrade_port = atoi(row[1]);
  484. strcpy(ota_file,row[2]);
  485. ota_mode = atoi(row[3]);
  486. mysql_free_result(res);
  487. //主题
  488. if(strcmp(mac,"") == 0)
  489. {
  490. return 1;
  491. }
  492. sprintf(topicName,"PP/%s/CTR/OTA",mac);
  493. //填充报文
  494. unsigned long lIP = inet_addr(upgrade_ip);
  495. memcpy(buf,&lIP,4);
  496. buf[4] = ((char*)&upgrade_port)[1];
  497. buf[5] = ((char*)&upgrade_port)[0];
  498. sendData.payload = buf;
  499. sendData.payloadlen = 6;
  500. sendData.qos = 0;
  501. sendData.retained = 0;
  502. //文件加入升级文件链表
  503. UpgradeFileAddFromDB(file_list,ota_file,_db,ota_mode);
  504. //发送
  505. int ret = my_mqqta_sendmsg(topicName, &sendData);
  506. log(" ↓发送服务器远程升级指令,结果:%d,网关:%s,upgrade_ip:%s,upgrade_port:%d,file_name:%s,ota_mode:%d \n",ret,mac,upgrade_ip,upgrade_port,ota_file,ota_mode);
  507. return ret;
  508. }
  509. //远程手动调光
  510. int SendManualDimming(char* mac,int group,int luminance,int dimmingType)
  511. {
  512. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  513. char topicName[256];
  514. char buf[256] = {0};
  515. //主题
  516. if(strcmp(mac,"") == 0)
  517. {
  518. return 1;
  519. }
  520. sprintf(topicName,"PP/%s/CTR/RDC",mac);
  521. //填充报文
  522. buf[0] = group;
  523. buf[1] = luminance;
  524. buf[2] = dimmingType;
  525. sendData.payload = buf;
  526. sendData.payloadlen = 3;
  527. sendData.qos = 0;
  528. sendData.retained = 0;
  529. //发送
  530. int ret = my_mqqta_sendmsg(topicName, &sendData);
  531. log(" ↓发送手动调光指令,结果:%d,网关:%s,组号:%d,亮度:%d,调光类型:%d \n",ret,mac,group,luminance,dimmingType);
  532. return ret;
  533. }
  534. //远程开关控制
  535. int SendSwitchControl(char* mac,char* subMac,int type,int on_off)
  536. {
  537. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  538. char topicName[256];
  539. char buf[256] = {0};
  540. unsigned char nodeMac[30] = {0};
  541. //主题
  542. if(strcmp(mac,"") == 0)
  543. {
  544. return 1;
  545. }
  546. sprintf(topicName,"PP/%s/CTR/RSC",mac);
  547. //填充报文
  548. if(strcmp(subMac,"") == 0)
  549. {
  550. HexStrToByte("0F0000000001",nodeMac,12);
  551. memcpy(buf,nodeMac,6);
  552. buf[6] = 2;
  553. buf[7] = on_off;
  554. }
  555. else
  556. {
  557. HexStrToByte(subMac,nodeMac,12);
  558. memcpy(buf,nodeMac,6);
  559. buf[6] = type;
  560. buf[7] = on_off;
  561. }
  562. sendData.payload = buf;
  563. sendData.payloadlen = 8;
  564. sendData.qos = 0;
  565. sendData.retained = 0;
  566. //发送
  567. int ret = my_mqqta_sendmsg(topicName, &sendData);
  568. log(" ↓发送远程开关控制指令,结果:%d,网关:%s,类型:%d,开关动作:%d\n",ret,mac,type,on_off);
  569. return ret;
  570. }
  571. //远程开关编组控制
  572. int SendSwitchGroupControl(char* mac,int group,int type,int on_off)
  573. {
  574. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  575. char topicName[256];
  576. char buf[256] = {0};
  577. //主题
  578. if(strcmp(mac,"") == 0)
  579. {
  580. return 1;
  581. }
  582. sprintf(topicName,"PP/%s/CTR/RGC",mac);
  583. //填充报文
  584. buf[0] = group;
  585. buf[1] = type;
  586. buf[2] = on_off;
  587. sendData.payload = buf;
  588. sendData.payloadlen = 3;
  589. sendData.qos = 0;
  590. sendData.retained = 0;
  591. //发送
  592. int ret = my_mqqta_sendmsg(topicName, &sendData);
  593. log(" ↓发送远程开关编组控制指令,结果:%d,网关:%s,组号:%d,类型:%d,开关动作:%d\n",ret,mac,group,type,on_off);
  594. return ret;
  595. }
  596. //删除子节点
  597. int SendDeleteNode(char* mac,char* subMac,int nodeType)
  598. {
  599. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  600. char topicName[256];
  601. char buf[256] = {0};
  602. unsigned char nodeMac[30] = {0};
  603. //主题
  604. if(strcmp(mac,"") == 0)
  605. {
  606. return 1;
  607. }
  608. sprintf(topicName,"PP/%s/CTR/RCN",mac);
  609. //填充报文
  610. HexStrToByte(subMac,nodeMac,12);
  611. memcpy(buf,nodeMac,6);
  612. buf[6] = nodeType;
  613. sendData.payload = buf;
  614. sendData.payloadlen = 7;
  615. sendData.qos = 0;
  616. sendData.retained = 0;
  617. //发送
  618. int ret = my_mqqta_sendmsg(topicName, &sendData);
  619. log(" ↓发送删除子节点指令,结果:%d,网关:%s,节点:%s,节点类型:%d \n",ret,mac,subMac,nodeType);
  620. return ret;
  621. }
  622. //设备数据上传间隔设置
  623. int SendDataInterval(char* mac,MYSQL *_db)
  624. {
  625. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  626. MYSQL_RES* res = NULL;
  627. MYSQL_ROW row;
  628. char query[1024] = {0};
  629. char topicName[256];
  630. int upload_interval_unit = 0;
  631. int upload_interval = 0;
  632. char buf[256] = {0};
  633. //数据库查询
  634. sprintf(query,"select upload_interval_unit,upload_interval from dev_info_gateway where device_mac ='%s'",mac);
  635. excuteSql(_db,query);
  636. res = mysql_store_result(_db);
  637. if (NULL == res)
  638. {
  639. return 1;
  640. }
  641. row = mysql_fetch_row(res);
  642. if (NULL == row)
  643. {
  644. mysql_free_result(res);
  645. return 1;
  646. }
  647. if(!row[0] || !row[1])
  648. {
  649. log("%s upload_interval_unit 或者 upload_interval 为空",mac);
  650. mysql_free_result(res);
  651. return 1;
  652. }
  653. upload_interval_unit = atoi(row[0]);
  654. upload_interval = atoi(row[1]);
  655. mysql_free_result(res);
  656. //主题
  657. if(strcmp(mac,"") == 0)
  658. {
  659. return 1;
  660. }
  661. sprintf(topicName,"PP/%s/CFG/ULI",mac);
  662. //填充报文
  663. buf[0] = upload_interval_unit;
  664. buf[1] = upload_interval;
  665. sendData.payload = buf;
  666. sendData.payloadlen = 2;
  667. sendData.qos = 0;
  668. sendData.retained = 0;
  669. //发送
  670. int ret = my_mqqta_sendmsg(topicName, &sendData);
  671. log(" ↓发送设备数据上传间隔设置指令,结果:%d,网关:%s,上传间隔单位:%d,上传间隔:%d \n",ret,mac,upload_interval_unit,upload_interval);
  672. return ret;
  673. }
  674. //开关时间段设置
  675. int SendOnOffTime(char* mac,char* subMac,MYSQL *_db)
  676. {
  677. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  678. MYSQL_RES* res = NULL;
  679. MYSQL_ROW row;
  680. char query[1024] = {0};
  681. char topicName[256];
  682. int device_type = 0;
  683. char open_time[10] = {0};
  684. char close_time[10] = {0};
  685. int time1 = 0;
  686. int time2 = 0;
  687. int time3 = 0;
  688. int time4 = 0;
  689. char buf[256] = {0};
  690. unsigned char dMac[30] = {0};
  691. //判断网关 子节点
  692. if(strcmp(subMac,"") == 0) //网关
  693. {
  694. sprintf(query,"select device_type,open_time,close_time from dev_info_gateway where device_mac ='%s'",mac);
  695. HexStrToByte("0F0000000001",dMac,12);
  696. }
  697. else
  698. {
  699. sprintf(query,"select device_type,open_time,close_time from dev_info_node where device_mac ='%s'",subMac);
  700. HexStrToByte(subMac,dMac,12);
  701. }
  702. //数据库查询
  703. excuteSql(_db,query);
  704. res = mysql_store_result(_db);
  705. if (NULL == res)
  706. {
  707. return 1;
  708. }
  709. row = mysql_fetch_row(res);
  710. if (NULL == row)
  711. {
  712. mysql_free_result(res);
  713. return 1;
  714. }
  715. if(!row[0] || !row[1] || !row[2])
  716. {
  717. log("%s device_type,open_time,close_time 为空",mac);
  718. mysql_free_result(res);
  719. return 1;
  720. }
  721. if (strcmp(subMac,"") == 0) //网关
  722. {
  723. device_type = 2;
  724. }
  725. else
  726. {
  727. device_type = atoi(row[0]);
  728. }
  729. strcpy(open_time,row[1]);
  730. strcpy(close_time,row[2]);
  731. mysql_free_result(res);
  732. time1 = atoi(strtok(open_time,":"));
  733. time2 = atoi(strtok(NULL,":"));
  734. time3 = atoi(strtok(close_time,":"));
  735. time4 = atoi(strtok(NULL,":"));
  736. //主题
  737. if(strcmp(mac,"") == 0)
  738. {
  739. return 1;
  740. }
  741. sprintf(topicName,"PP/%s/CFG/STS",mac);
  742. //填充报文
  743. memcpy(buf,dMac,6);
  744. buf[6] = device_type;
  745. buf[7] = time1;
  746. buf[8] = time2;
  747. buf[9] = time3;
  748. buf[10] = time4;
  749. sendData.payload = buf;
  750. sendData.payloadlen = 11;
  751. sendData.qos = 0;
  752. sendData.retained = 0;
  753. //发送
  754. int ret = my_mqqta_sendmsg(topicName, &sendData);
  755. log(" ↓发送开关时间段设置指令,结果:%d,网关:%s,节点:%s,设备类型:%d,合闸时间: %02d:%02d,拉闸时间: %02d:%02d \n",ret,mac,subMac,device_type,time1,time2,time3,time4);
  756. return ret;
  757. }
  758. //多个开关时间段设置,新增20201228
  759. int SendOnOffTimeMuilt(char* mac,char* subMac,MYSQL *_db)
  760. {
  761. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  762. MYSQL_RES* res = NULL;
  763. MYSQL_ROW row;
  764. char query[1024] = {0};
  765. char topicName[256];
  766. int device_type = 0;
  767. char switch_time1[10] = {0};
  768. char switch_time2[10] = {0};
  769. char switch_time3[10] = {0};
  770. char switch_time4[10] = {0};
  771. int time1 = 0;
  772. int time2 = 0;
  773. int time3 = 0;
  774. int time4 = 0;
  775. int time5 = 0;
  776. int time6 = 0;
  777. int time7 = 0;
  778. int time8 = 0;
  779. int swith_action1 = 0;
  780. int swith_action2 = 0;
  781. int swith_action3 = 0;
  782. int swith_action4 = 0;
  783. int t1 = 0;
  784. int t2 = 0;
  785. int t3 = 0;
  786. int t4 = 0;
  787. int time_count = 2;
  788. char buf[256] = {0};
  789. unsigned char dMac[30] = {0};
  790. //判断网关 子节点
  791. if(strcmp(subMac,"") == 0) //网关
  792. {
  793. sprintf(query,"select device_type,swith_time1,swith_time2,swith_time3,swith_time4,swith_action1,swith_action2,swith_action3,swith_action4 "
  794. "from dev_info_gateway where device_mac ='%s'",mac);
  795. HexStrToByte("0F0000000001",dMac,12);
  796. }
  797. else
  798. {
  799. sprintf(query,"select device_type,swith_time1,swith_time2,swith_time3,swith_time4,swith_action1,swith_action2,swith_action3,swith_action4 "
  800. "from dev_info_node where device_mac ='%s'",subMac);
  801. HexStrToByte(subMac,dMac,12);
  802. }
  803. //数据库查询
  804. excuteSql(_db,query);
  805. res = mysql_store_result(_db);
  806. if (NULL == res)
  807. {
  808. return 1;
  809. }
  810. row = mysql_fetch_row(res);
  811. if (NULL == row)
  812. {
  813. mysql_free_result(res);
  814. return 1;
  815. }
  816. //优化 新增对查询字段长度的判断 20210930 chw
  817. if(!row[0] || !row[1] || !row[2] || !row[5] || !row[6] || strlen(row[1])!=5 || strlen(row[2])!=5 || strlen(row[5])!=1 || strlen(row[6])!=1)
  818. {
  819. log("%s,%s 设备类型,第一组时间点、开关动作字段为空 \n",mac,subMac);
  820. mysql_free_result(res);
  821. return 1;
  822. }
  823. strcpy(switch_time1,row[1]);
  824. strcpy(switch_time2,row[2]);
  825. swith_action1 = atoi(row[5]);
  826. swith_action2 = atoi(row[6]);
  827. time1 = atoi(strtok(switch_time1,":"));
  828. time2 = atoi(strtok(NULL,":"));
  829. time3 = atoi(strtok(switch_time2,":"));
  830. time4 = atoi(strtok(NULL,":"));
  831. sendData.payloadlen = 14;
  832. //处理时间前大后小问题 20230525
  833. if(time1 > time3 || (time1 == time3 && time2 > time4))
  834. {
  835. t1 = time1;
  836. t2 = time2;
  837. t3 = time3;
  838. t4 = time4;
  839. time1 = t3;
  840. time2 = t4;
  841. time3 = t1;
  842. time4 = t2;
  843. swith_action1 = 0;
  844. swith_action2 = 1;
  845. }
  846. //优化 新增对查询字段长度的判断 20210930 chw
  847. if(!row[3] || !row[4] || !row[7] || !row[8] || strlen(row[3])!=5 || strlen(row[4])!=5 || strlen(row[7])!=1 || strlen(row[8])!=1)
  848. {
  849. log("%s,%s 设备类型,第二组时间点、开关动作字段为空,只发送第一组 \n",mac,subMac);
  850. }
  851. else
  852. {
  853. time_count = 4;
  854. sendData.payloadlen = 20;
  855. strcpy(switch_time3,row[3]);
  856. strcpy(switch_time4,row[4]);
  857. swith_action3 = atoi(row[7]);
  858. swith_action4 = atoi(row[8]);
  859. time5 = atoi(strtok(switch_time3,":"));
  860. time6 = atoi(strtok(NULL,":"));
  861. time7 = atoi(strtok(switch_time4,":"));
  862. time8 = atoi(strtok(NULL,":"));
  863. buf[14] = time5;
  864. buf[15] = time6;
  865. buf[16] = swith_action3;
  866. buf[17] = time7;
  867. buf[18] = time8;
  868. buf[19] = swith_action4;
  869. }
  870. if (strcmp(subMac,"") == 0) //网关
  871. {
  872. device_type = 2;
  873. }
  874. else
  875. {
  876. device_type = atoi(row[0]);
  877. }
  878. mysql_free_result(res);
  879. //主题
  880. if(strcmp(mac,"") == 0)
  881. {
  882. return 1;
  883. }
  884. sprintf(topicName,"PP/%s/CFG/STS",mac);
  885. //填充报文
  886. memcpy(buf,dMac,6);
  887. buf[6] = device_type;
  888. buf[7] = time_count;
  889. buf[8] = time1;
  890. buf[9] = time2;
  891. buf[10] = swith_action1;
  892. buf[11] = time3;
  893. buf[12] = time4;
  894. buf[13] = swith_action2;
  895. sendData.payload = buf;
  896. sendData.qos = 0;
  897. sendData.retained = 0;
  898. //发送
  899. int ret = my_mqqta_sendmsg(topicName, &sendData);
  900. log(" ↓发送开关时间段设置指令,结果:%d,网关:%s,节点:%s,设备类型:%d,时间点一:%02d:%02d,时间二:%02d:%02d,时间点三:%02d:%02d,时间点四:%02d:%02d,动作1:%d,动作2:%d,动作3:%d,动作4:%d \n",
  901. ret,mac,subMac,device_type,time1,time2,time3,time4,time5,time6,time7,time8,swith_action1,swith_action2,swith_action3,swith_action4);
  902. return ret;
  903. }
  904. //获取子节点版本号
  905. int SendGetSubVersion(char* mac,char* subMac)
  906. {
  907. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  908. char topicName[256];
  909. char buf[256] = {0};
  910. unsigned char nodeMac[30] = {0};
  911. //主题
  912. if(strcmp(mac,"") == 0)
  913. {
  914. return 1;
  915. }
  916. sprintf(topicName,"PP/%s/CFG/GNV",mac);
  917. //填充报文
  918. if(strcmp(subMac,"") == 0)
  919. {
  920. HexStrToByte("0F0000000001",nodeMac,12);
  921. }
  922. else
  923. {
  924. HexStrToByte(subMac,nodeMac,12);
  925. }
  926. memcpy(buf,nodeMac,6);
  927. sendData.payload = buf;
  928. sendData.payloadlen = 6;
  929. sendData.qos = 0;
  930. sendData.retained = 0;
  931. //发送
  932. int ret = my_mqqta_sendmsg(topicName, &sendData);
  933. log(" ↓发送获取子节点版本号指令,结果:%d,网关:%s,节点:%s \n",ret,mac,subMac);
  934. return ret;
  935. }
  936. //开关控制模式设置从数据库info表
  937. int SendSwitchModeFromDB(char* mac,char* subMac,MYSQL* _db)
  938. {
  939. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  940. MYSQL_RES* res = NULL;
  941. MYSQL_ROW row;
  942. char query[1024] = {0};
  943. char topicName[256];
  944. int device_type = 0;
  945. int control_mode = 0;
  946. char buf[256] = {0};
  947. unsigned char dMac[30] = {0};
  948. //判断网关 子节点
  949. if(strcmp(subMac,"") == 0) //网关
  950. {
  951. sprintf(query,"select device_type,control_mode from dev_info_gateway where device_mac ='%s'",mac);
  952. HexStrToByte("0F0000000001",dMac,12);
  953. }
  954. else
  955. {
  956. sprintf(query,"select device_type,control_mode from dev_info_node where device_mac ='%s'",subMac);
  957. HexStrToByte(subMac,dMac,12);
  958. }
  959. //数据库查询
  960. excuteSql(_db,query);
  961. res = mysql_store_result(_db);
  962. if (NULL == res)
  963. {
  964. return 1;
  965. }
  966. row = mysql_fetch_row(res);
  967. if (NULL == row)
  968. {
  969. mysql_free_result(res);
  970. return 1;
  971. }
  972. if(!row[0] || !row[1])
  973. {
  974. log("%s device_type,control_mode 为空",dMac);
  975. mysql_free_result(res);
  976. return 1;
  977. }
  978. if (strcmp(subMac,"") == 0) //网关
  979. {
  980. device_type = 2;
  981. }
  982. else
  983. {
  984. device_type = atoi(row[0]);
  985. }
  986. control_mode = atoi(row[1]);
  987. mysql_free_result(res);
  988. //主题
  989. if(strcmp(mac,"") == 0)
  990. {
  991. return 1;
  992. }
  993. sprintf(topicName,"PP/%s/CFG/SCM",mac);
  994. //填充报文
  995. memcpy(buf,dMac,6);
  996. buf[6] = device_type;
  997. buf[7] = control_mode;
  998. sendData.payload = buf;
  999. sendData.payloadlen = 8;
  1000. sendData.qos = 0;
  1001. sendData.retained = 0;
  1002. //发送
  1003. int ret = my_mqqta_sendmsg(topicName, &sendData);
  1004. log(" ↓发送开关控制模式指令,结果:%d,网关:%s,节点:%s,节点类型:%d,控制模式:%d \n",ret,mac,subMac,device_type,control_mode);
  1005. return ret;
  1006. }
  1007. //调光节点分组设置
  1008. int SendDimmingNodeGroup(char* mac,char* subMac,MYSQL* _db)
  1009. {
  1010. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  1011. MYSQL_RES* res = NULL;
  1012. MYSQL_ROW row;
  1013. char query[1024] = {0};
  1014. char topicName[256];
  1015. int device_type = 0;
  1016. int device_group = 0;
  1017. char time_seg1[10] = {0};
  1018. char time_seg2[10] = {0};
  1019. char time_seg3[10] = {0};
  1020. char time_seg4[10] = {0};
  1021. int time1[2] = {0};
  1022. int time2[2] = {0};
  1023. int time3[2] = {0};
  1024. int time4[2] = {0};
  1025. int dimming_seg1 = 0;
  1026. int dimming_seg2 = 0;
  1027. int dimming_seg3 = 0;
  1028. int dimming_seg4 = 0;
  1029. int dimming_mode = 0;
  1030. int dimming_type = 0;
  1031. char buf[256] = {0};
  1032. unsigned char nodeMac[30] = {0};
  1033. sprintf(query,"select device_type,device_group,time_seg1,time_seg2,time_seg3,time_seg4,dimming_seg1,dimming_seg2,dimming_seg3,dimming_seg4,"
  1034. "dimming_mode,dimming_type from dev_info_node where device_mac ='%s'",subMac);
  1035. //数据库查询
  1036. excuteSql(_db,query);
  1037. res = mysql_store_result(_db);
  1038. if (NULL == res)
  1039. {
  1040. log("%s 调光节点分组 NULL == res \n",subMac);
  1041. return 1;
  1042. }
  1043. row = mysql_fetch_row(res);
  1044. if (NULL == row)
  1045. {
  1046. log("%s 调光节点分组 NULL == row \n",subMac);
  1047. mysql_free_result(res);
  1048. return 1;
  1049. }
  1050. if(!row[0] || !row[1] || !row[2] || !row[3] || !row[4] || !row[5] || !row[6] || !row[7] || !row[8] || !row[9] || !row[10] || !row[11])
  1051. {
  1052. log("%s 调光节点分组有字段设置为空! \n",subMac);
  1053. mysql_free_result(res);
  1054. return 1;
  1055. }
  1056. if(strlen(row[0]) == 0 || strlen(row[1]) == 0 || strlen(row[2]) == 0 || strlen(row[3]) == 0 || strlen(row[4]) == 0 \
  1057. || strlen(row[5]) == 0 || strlen(row[6]) == 0 || strlen(row[7]) == 0 || strlen(row[8]) == 0 || strlen(row[9]) == 0 || strlen(row[10]) == 0 || strlen(row[11]) == 0)
  1058. {
  1059. log("%s 调光节点分组有时间设置为空白! \n",subMac);
  1060. mysql_free_result(res);
  1061. return 1;
  1062. }
  1063. device_type = atoi(row[0]);
  1064. device_group = atoi(row[1]);
  1065. strcpy(time_seg1,row[2]);
  1066. strcpy(time_seg2,row[3]);
  1067. strcpy(time_seg3,row[4]);
  1068. strcpy(time_seg4,row[5]);
  1069. dimming_seg1 = atoi(row[6]);
  1070. dimming_seg2 = atoi(row[7]);
  1071. dimming_seg3 = atoi(row[8]);
  1072. dimming_seg4 = atoi(row[9]);
  1073. dimming_mode = atoi(row[10]);
  1074. dimming_type = atoi(row[11]);
  1075. mysql_free_result(res);
  1076. time1[0] = atoi(strtok(time_seg1,":"));
  1077. time1[1] = atoi(strtok(NULL,":"));
  1078. time2[0] = atoi(strtok(time_seg2,":"));
  1079. time2[1] = atoi(strtok(NULL,":"));
  1080. time3[0] = atoi(strtok(time_seg3,":"));
  1081. time3[1] = atoi(strtok(NULL,":"));
  1082. time4[0] = atoi(strtok(time_seg4,":"));
  1083. time4[1] = atoi(strtok(NULL,":"));
  1084. //主题
  1085. if(strcmp(mac,"") == 0)
  1086. {
  1087. return 1;
  1088. }
  1089. sprintf(topicName,"PP/%s/CFG/DGS",mac);
  1090. //填充报文
  1091. HexStrToByte(subMac,nodeMac,12);
  1092. memcpy(buf,nodeMac,6);
  1093. buf[6] = device_type;
  1094. buf[7] = device_group;
  1095. buf[8] = time1[0];
  1096. buf[9] = time1[1];
  1097. buf[10] = dimming_seg1;
  1098. buf[11] = time2[0];
  1099. buf[12] = time2[1];
  1100. buf[13] = dimming_seg2;
  1101. buf[14] = time3[0];
  1102. buf[15] = time3[1];
  1103. buf[16] = dimming_seg3;
  1104. buf[17] = time4[0];
  1105. buf[18] = time4[1];
  1106. buf[19] = dimming_seg4;
  1107. buf[20] = dimming_mode;
  1108. buf[21] = dimming_type;
  1109. sendData.payload = buf;
  1110. sendData.payloadlen = 22;
  1111. sendData.qos = 0;
  1112. sendData.retained = 0;
  1113. //发送
  1114. int ret = my_mqqta_sendmsg(topicName, &sendData);
  1115. log(" ↓发送调光节点分组设置指令,结果:%d,网关:%s,节点:%s,节点类型:%d,组号:%d,时间1: %02d:%02d,时间2: %02d:%02d,时间3: %02d:%02d,时间4: %02d:%02d,亮度1:%d,,亮度2:%d,"
  1116. "亮度3:%d,亮度4:%d,调光模式:%d,调光类型:%d \n",ret,mac,subMac,device_type,device_group,time1[0],time1[1],time2[0],time2[1],time3[0],time3[1],
  1117. time4[0],time4[1],dimming_seg1,dimming_seg2,dimming_seg3,dimming_seg4,dimming_mode,dimming_type);
  1118. usleep(500000);
  1119. return ret;
  1120. }
  1121. //调光节点分组数据修改
  1122. int SendDimmingNodeGroupModify(char* mac,int group,MYSQL* _db)
  1123. {
  1124. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  1125. MYSQL_RES* res = NULL;
  1126. MYSQL_ROW row;
  1127. char query[1024] = {0};
  1128. char topicName[256];
  1129. int device_group = 0;
  1130. char time_seg1[10] = {0};
  1131. char time_seg2[10] = {0};
  1132. char time_seg3[10] = {0};
  1133. char time_seg4[10] = {0};
  1134. int time1[2] = {0};
  1135. int time2[2] = {0};
  1136. int time3[2] = {0};
  1137. int time4[2] = {0};
  1138. int dimming_seg1 = 0;
  1139. int dimming_seg2 = 0;
  1140. int dimming_seg3 = 0;
  1141. int dimming_seg4 = 0;
  1142. int dimming_mode = 0;
  1143. int dimming_type = 0;
  1144. char buf[256] = {0};
  1145. sprintf(query,"select device_group,time_seg1,time_seg2,time_seg3,time_seg4,dimming_seg1,dimming_seg2,dimming_seg3,dimming_seg4,"
  1146. "dimming_mode,dimming_type from dev_dimming_group where gateway_mac ='%s' and device_group = %d",mac,group);
  1147. //数据库查询
  1148. excuteSql(_db,query);
  1149. res = mysql_store_result(_db);
  1150. if (NULL == res)
  1151. {
  1152. return 1;
  1153. }
  1154. row = mysql_fetch_row(res);
  1155. if (NULL == row)
  1156. {
  1157. log("%s 调光节点分组记录为空! \n",mac);
  1158. mysql_free_result(res);
  1159. return 1;
  1160. }
  1161. if(!row[0] || !row[1] || !row[2] || !row[3] || !row[4] || !row[5] || !row[6] || !row[7] || !row[8] || !row[9] || !row[10])
  1162. {
  1163. log("%s 调光节点分组有节点为空! \n",mac);
  1164. mysql_free_result(res);
  1165. return 1;
  1166. }
  1167. device_group = atoi(row[0]);
  1168. strcpy(time_seg1,row[1]);
  1169. strcpy(time_seg2,row[2]);
  1170. strcpy(time_seg3,row[3]);
  1171. strcpy(time_seg4,row[4]);
  1172. dimming_seg1 = atoi(row[5]);
  1173. dimming_seg2 = atoi(row[6]);
  1174. dimming_seg3 = atoi(row[7]);
  1175. dimming_seg4 = atoi(row[8]);
  1176. dimming_mode = atoi(row[9]);
  1177. dimming_type = atoi(row[10]);
  1178. mysql_free_result(res);
  1179. time1[0] = atoi(strtok(time_seg1,":"));
  1180. time1[1] = atoi(strtok(NULL,":"));
  1181. time2[0] = atoi(strtok(time_seg2,":"));
  1182. time2[1] = atoi(strtok(NULL,":"));
  1183. time3[0] = atoi(strtok(time_seg3,":"));
  1184. time3[1] = atoi(strtok(NULL,":"));
  1185. time4[0] = atoi(strtok(time_seg4,":"));
  1186. time4[1] = atoi(strtok(NULL,":"));
  1187. //主题
  1188. if(strcmp(mac,"") == 0)
  1189. {
  1190. return 1;
  1191. }
  1192. sprintf(topicName,"PP/%s/CFG/DGM",mac);
  1193. //填充报文
  1194. buf[0] = device_group;
  1195. buf[1] = time1[0];
  1196. buf[2] = time1[1];
  1197. buf[3] = dimming_seg1;
  1198. buf[4] = time2[0];
  1199. buf[5] = time2[1];
  1200. buf[6] = dimming_seg2;
  1201. buf[7] = time3[0];
  1202. buf[8] = time3[1];
  1203. buf[9] = dimming_seg3;
  1204. buf[10] = time4[0];
  1205. buf[11] = time4[1];
  1206. buf[12] = dimming_seg4;
  1207. buf[13] = dimming_mode;
  1208. buf[14] = dimming_type;
  1209. sendData.payload = buf;
  1210. sendData.payloadlen = 15;
  1211. sendData.qos = 0;
  1212. sendData.retained = 0;
  1213. //发送
  1214. int ret = my_mqqta_sendmsg(topicName, &sendData);
  1215. log(" ↓发送调光节点分组数据修改指令,结果:%d,网关:%s,组号:%d,时间1: %02d:%02d,时间2: %02d:%02d,时间3: %02d:%02d,时间4: %02d:%02d,亮度1:%d,,亮度2:%d,"
  1216. "亮度3:%d,亮度4:%d,调光模式:%d,调光类型:%d \n",ret,mac,device_group,time1[0],time1[1],time2[0],time2[1],
  1217. time3[0],time3[1],time4[0],time4[1],dimming_seg1,dimming_seg2,dimming_seg3,dimming_seg4,dimming_mode,dimming_type);
  1218. return ret;
  1219. }
  1220. //传感器报警阈值设置
  1221. int SendSensorThreshold(char* mac,MYSQL* _db)
  1222. {
  1223. MQTTAsync_message sendData = MQTTAsync_message_initializer;
  1224. MYSQL_RES* res = NULL;
  1225. MYSQL_ROW row;
  1226. char query[1024] = {0};
  1227. char topicName[256];
  1228. char buf[256] = {0};
  1229. int temperature_min = 0;
  1230. int temperature_max = 100;
  1231. int humidity_min = 0;
  1232. int humidity_max = 100;
  1233. double x_offset_max = 5.0;
  1234. double y_offset_max = 5.0;
  1235. double z_offset_max = 5.0;
  1236. int line_temperature_max = 100;
  1237. int step = 0;
  1238. char sendPrint[256] = {0};
  1239. char vlog[512] = {0};
  1240. sprintf(query,"select temperature_min,temperature_max,humidity_min,humidity_max,x_offset_max,y_offset_max,z_offset_max,line_temperature_max "
  1241. "from dev_info_gateway where device_mac = '%s'",mac);
  1242. excuteSql(_db,query);
  1243. res = mysql_store_result(_db);
  1244. if (NULL == res)
  1245. {
  1246. return 1;
  1247. }
  1248. row = mysql_fetch_row(res);
  1249. if (NULL == row)
  1250. {
  1251. mysql_free_result(res);
  1252. return 1;
  1253. }
  1254. //读取到温湿度配置
  1255. if(row[0] && row[1] && row [2] && row [3])
  1256. {
  1257. temperature_min = atoi(row[0]);
  1258. temperature_max = atoi(row[1]);
  1259. humidity_min = atoi(row[2]);
  1260. humidity_max = atoi(row[3]);
  1261. buf[step] = 1;
  1262. buf[step+1] = temperature_min;
  1263. buf[step+2] = temperature_max;
  1264. buf[step+3] = humidity_min;
  1265. buf[step+4] = humidity_max;
  1266. step += 5;
  1267. sprintf(vlog,"%s温度最小值:%d,温度最大值:%d,湿度最小值:%d,湿度最大值:%d;",vlog,temperature_min,temperature_max,humidity_min,humidity_max);
  1268. }
  1269. //读取陀螺仪配置
  1270. if(row[4] && row[5] && row [6])
  1271. {
  1272. x_offset_max = atof(row[4]);
  1273. y_offset_max = atof(row[5]);
  1274. z_offset_max = atof(row[6]);
  1275. int x_offset_max_i = (int)(x_offset_max*10);
  1276. int y_offset_max_i = (int)(y_offset_max*10);
  1277. int z_offset_max_i = (int)(z_offset_max*10);
  1278. buf[step] = 2;
  1279. buf[step+1] = ((char*)&x_offset_max_i)[1];
  1280. buf[step+2] = ((char*)&x_offset_max_i)[0];
  1281. buf[step+3] = ((char*)&y_offset_max_i)[1];
  1282. buf[step+4] = ((char*)&y_offset_max_i)[0];
  1283. buf[step+5] = ((char*)&z_offset_max_i)[1];
  1284. buf[step+6] = ((char*)&z_offset_max_i)[0];
  1285. step += 7;
  1286. sprintf(vlog,"%sx倾斜角最大值:%f,y倾斜角最大值:%f,z倾斜角最大值:%f;",vlog,x_offset_max,y_offset_max,z_offset_max);
  1287. }
  1288. //读取线温阈值配置
  1289. if(row[7])
  1290. {
  1291. buf[step] = 4;
  1292. line_temperature_max = atoi(row[7]);
  1293. buf[step+1] = line_temperature_max;
  1294. step += 2;
  1295. sprintf(vlog,"%s线温最大值:%d;",vlog,line_temperature_max);
  1296. }
  1297. mysql_free_result(res);
  1298. if(strlen(vlog) == 0)
  1299. {
  1300. log("数据库没有读取到传感器阈值!网关:%s",mac);
  1301. return 1;
  1302. }
  1303. //主题
  1304. if(strcmp(mac,"") == 0)
  1305. {
  1306. return 1;
  1307. }
  1308. sprintf(topicName,"PP/%s/CFG/SAT",mac);
  1309. //填充报文
  1310. sendData.payload = buf;
  1311. sendData.payloadlen = step;
  1312. sendData.qos = 0;
  1313. sendData.retained = 0;
  1314. //发送
  1315. int ret = my_mqqta_sendmsg(topicName, &sendData);
  1316. Hex2Str(buf,sendPrint,sendData.payloadlen);
  1317. log(" ↓发送传感器阈值指令,结果:%d,网关:%s,sendPrint:%s,%s \n",ret,mac,sendPrint,vlog);
  1318. return ret;
  1319. }
  1320. //电表节点分组设置
  1321. //int ()