mqtt.c 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332
  1. #include <regex.h>
  2. #include <time.h>
  3. #include "common.h"
  4. #include "cJSON.h"
  5. #include "mqtt.h"
  6. #include "thread.h"
  7. #include "mongoose.h"
  8. #include "elog.h"
  9. #include "lock.h"
  10. #include "sys.h"
  11. #include "Cellular.h"
  12. #include "xlist.h"
  13. #include "websocket_handle.h"
  14. #include "switch_ctrl.h"
  15. #include "sqlite_handle.h"
  16. #if(CHIP_TYPE == CHIP_T113s)
  17. #include <openssl/evp.h>
  18. #include <openssl/hmac.h>
  19. #endif
  20. #if 1
  21. #define LOGD log_d
  22. #define LOGE log_e
  23. #define LOGW log_w
  24. #else
  25. #define LOGD printf
  26. #define LOGE printf
  27. #define LOGW printf
  28. #endif
  29. #define CONN_PERIOD 5000 //ms
  30. #define SEND_PERIOD 3000 //ms
  31. #define BGET(flag,mask) ((flag)&(1<<(mask)))
  32. #define BSET(flag,mask) ((flag)|=(1<<(mask)))
  33. typedef struct mg_mgr mgr_t;
  34. typedef struct mg_timer mg_timer_t;
  35. typedef struct mg_mqtt_opts mg_opts_t;
  36. typedef struct mg_connection mg_conn_t;
  37. typedef struct {
  38. int id;
  39. char topic[256];
  40. char content[2048];
  41. }mqtt_pkt_t;
  42. typedef struct {
  43. mgr_t mgr;
  44. mg_conn_t *c;
  45. mqtt_server_t ser;
  46. pthread_t tid;
  47. int quit;
  48. void *h;
  49. }mqtt_conn_t;
  50. typedef struct {
  51. int inited;
  52. char prod_id[32];
  53. mqtt_conn_t conn[MQTT_SER_MAX];
  54. handle_t list;
  55. mg_timer_t *timer;
  56. GlobalDeviceManager *dm;
  57. }mqtt_handle_t;
  58. #ifdef USE_MQTT
  59. char *topic_sub[MQTT_SUB_MAX]={
  60. "/pdu/%s/control/power/all_channel",
  61. "/pdu/%s/control/power/+",
  62. "/pdu/%s/control/sensor/+",
  63. "/pdu/%s/control/device/restart",
  64. "/pdu/%s/control/device/reset",
  65. "/pdu/%s/control/service",
  66. };
  67. char *topic_pub[MQTT_PUB_MAX] = {
  68. "/pdu/%s/info/device",
  69. "/pdu/%s/status/network",
  70. "/pdu/%s/status/power/all_channel",
  71. "/pdu/%s/status/power/%d",
  72. "/pdu/%s/status/sensor/%d",
  73. "/pdu/%s/status/service",
  74. "/pdu/%s/alarm/network",
  75. "/pdu/%s/alarm/power",
  76. "/pdu/%s/alarm/sensor",
  77. };
  78. const char *serv_str[SERV_MAX]={
  79. "ntp",
  80. "smtp",
  81. "message",
  82. "mqtt",
  83. "cloud",
  84. "telnet",
  85. "snmp_v1",
  86. "snmp_v2c",
  87. "snmp_v3",
  88. "snmp_trap",
  89. };
  90. static mqtt_handle_t mqHandle={0};
  91. static int my_recv(char *topic, char *data);
  92. static void mqtt_fn(mg_conn_t *c, int ev, void *ev_data);
  93. static int send_stat(mqtt_conn_t *conn, int type);
  94. static int get_serv(char *json);
  95. static void* client_thread(void *arg);
  96. /////////////////////////////////////////////////////////
  97. typedef struct {
  98. char user[64];
  99. char passwd[64];
  100. }user_account_t;
  101. typedef struct {
  102. char *instanceId;
  103. char *host;
  104. char *topic;
  105. char *groupId;
  106. char *clientId;
  107. char *accessKey;
  108. char *secretKey;
  109. uint16_t port;
  110. }mqtt_account_t;
  111. static mqtt_account_t mqtt_aliyun={
  112. "post-cn-0w73xnchz01",
  113. "post-cn-0w73xnchz01.mqtt.aliyuncs.com",
  114. "SmartPDU",
  115. "GID_PDU",
  116. "smartPDU_23542352",
  117. "LTAI5tAfuRj1JkB8ZjDS2p3i",
  118. "p4FrWlrFim9zM9A5mYxjK99EqKrSHh",
  119. 8883,
  120. };
  121. static int get_account(mqtt_account_t *host, user_account_t *user)
  122. {
  123. unsigned int len=0;
  124. char tempData[100];
  125. char clientIdUrl[64];
  126. //username和 Password 签名模式下的设置方法,参考文档 https://help.aliyun.com/document_detail/48271.html?spm=a2c4g.11186623.6.553.217831c3BSFry7
  127. sprintf(clientIdUrl, "%s@@@%s", host->groupId, host->clientId);
  128. HMAC(EVP_sha1(), host->secretKey, strlen(host->secretKey), (const unsigned char*)clientIdUrl, strlen(clientIdUrl), (unsigned char*)tempData, &len);
  129. int passwdLen = EVP_EncodeBlock((unsigned char *) user->passwd, (const unsigned char*)tempData, len);
  130. user->passwd[passwdLen] = '\0';
  131. sprintf(user->user,"Signature|%s|%s", host->accessKey, host->instanceId);
  132. return 0;
  133. }
  134. static void set_status(mqtt_conn_t *conn, int flag)
  135. {
  136. mqtt_handle_t *h=(mqtt_handle_t*)conn->h;
  137. int id=conn->ser.id;
  138. h->dm->mqttInfo.ser[id].status = flag;
  139. }
  140. static char *get_int_str(int n)
  141. {
  142. static char tmp[32];
  143. snprintf(tmp, sizeof(tmp), "%d", n);
  144. return tmp;
  145. }
  146. static char *get_float_str(float n)
  147. {
  148. static char tmp[32];
  149. snprintf(tmp, sizeof(tmp), "%0.3f", n);
  150. return tmp;
  151. }
  152. static int get_date_time(char *d, char *t)
  153. {
  154. time_t now;
  155. struct tm* tm;
  156. time(&now);
  157. tm = localtime(&now);
  158. if(!tm) {
  159. return -1;
  160. }
  161. sprintf(d, "%04d-%02d-%02d", tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday);
  162. sprintf(t, "%02d:%02d:%02d", tm->tm_hour, tm->tm_min, tm->tm_sec);
  163. return 0;
  164. }
  165. static int sub_one(mg_conn_t *c, char *topic)
  166. {
  167. int r=-1;
  168. mg_opts_t opts={0};
  169. opts.topic = mg_str(topic);
  170. opts.qos = 1;
  171. mg_mqtt_sub(c, &opts);
  172. return 0;
  173. }
  174. static int my_sub(mg_conn_t *c, char * prod_id)
  175. {
  176. int i;
  177. char topic[1024];
  178. for(i=0; i<MQTT_SUB_MAX; i++) {
  179. snprintf(topic, sizeof(topic), topic_sub[i], prod_id);
  180. sub_one(c, topic);
  181. }
  182. return 0;
  183. }
  184. static int pub_one(mg_conn_t *c, char *topic, char *data)
  185. {
  186. int r=-1;
  187. mg_opts_t opts={0};
  188. opts.topic = mg_str(topic);
  189. opts.message = mg_str(data);
  190. opts.qos = 1;
  191. opts.retain = false;
  192. mg_mqtt_pub(c, &opts);
  193. return 0;
  194. }
  195. static int my_pub(mqtt_conn_t *conn, char *topic, char *data)
  196. {
  197. if(conn->c) {
  198. pub_one(conn->c, topic, data);
  199. }
  200. return 0;
  201. }
  202. static GlobalPowerManger* get_power(mqtt_handle_t *h, int ch)
  203. {
  204. GlobalPowerManger *tmp=NULL;
  205. list_for_each_entry(tmp, &h->dm->_globalPowerManger.list, list)
  206. {
  207. if(tmp->product_ch_id==ch) {
  208. return tmp;
  209. }
  210. }
  211. return NULL;
  212. }
  213. static int set_ch(mqtt_handle_t *h, int ch, int flag)
  214. {
  215. int r;
  216. GlobalPowerManger *tmp=NULL;
  217. list_for_each_entry(tmp, &h->dm->_globalPowerManger.list, list)
  218. {
  219. if(tmp==NULL) {
  220. break;
  221. }
  222. if(tmp->product_ch_id==ch) {
  223. r = g_switch_set_all_chn_ctrl(&h->dm->_globalRelaySampManger, tmp, tmp->product_saddr, tmp->product_ch_addr, flag, false);
  224. if(r<0) {
  225. LOGE("___ g_switch_set_all_chn_ctrl failed, saddr: %d, ch_addr: %d\n", tmp->product_saddr, tmp->product_ch_addr);
  226. }
  227. break;
  228. }
  229. if(ch==0xff) {
  230. g_switch_set_all_ctrl(&h->dm->_globalRelaySampManger, tmp->product_ch_type, tmp->product_saddr, flag);
  231. }
  232. }
  233. return 0;
  234. }
  235. static GlobalSensorManger* get_sensor(mqtt_handle_t *h, int id)
  236. {
  237. GlobalSensorManger *tmp=NULL;
  238. lock_s_hold(LOCK_ID_SENSOR);
  239. list_for_each_entry(tmp, &h->dm->_globalSensorManger.list, list)
  240. {
  241. if(tmp->sensor_id==id) {
  242. return tmp;
  243. }
  244. }
  245. lock_s_release(LOCK_ID_SENSOR);
  246. return NULL;
  247. }
  248. //////////////////////////////////////////////////////////////
  249. static int get_url(mqtt_server_t *ser, char *url)
  250. {
  251. int port=1883;
  252. char *head="mqtts";
  253. if(!ser->server[0] || !ser->port[0] || !ser->mode) {
  254. return -1;
  255. }
  256. port = atoi(ser->port);
  257. if(port==1883) {
  258. head = "mqtt";
  259. }
  260. else if(port==8883) {
  261. head = "mqtts";
  262. }
  263. else if(port==8083) {
  264. head = "ws";
  265. }
  266. else if(port==8884) {
  267. head = "wss";
  268. }
  269. sprintf(url, "%s://%s:%d", head, ser->server, port);
  270. return 0;
  271. }
  272. static int start_one(mqtt_conn_t *conn)
  273. {
  274. int r;
  275. if(conn->tid==0) {
  276. conn->quit = 0;
  277. r = pthread_create(&conn->tid, NULL, client_thread, conn);
  278. }
  279. return r;
  280. }
  281. static int stop_one(mqtt_conn_t *conn)
  282. {
  283. if(conn->tid) {
  284. conn->quit = 1;
  285. pthread_join(conn->tid, NULL);
  286. conn->tid = 0;
  287. }
  288. return 0;
  289. }
  290. static int stop_all(mqtt_handle_t *h)
  291. {
  292. int i;
  293. for(i=0; i<MQTT_SER_MAX; i++) {
  294. stop_one(&h->conn[i]);
  295. }
  296. return 0;
  297. }
  298. static int mg_mqtt_bind(mg_conn_t *c)
  299. {
  300. int r=0;
  301. if(cellular_is_connected()) {
  302. r = sys_bind_nic(NIC_USB, (int)c->fd);
  303. }
  304. return r;
  305. }
  306. static int conn_one(mqtt_conn_t *conn)
  307. {
  308. int r=-1;
  309. mqtt_handle_t *h=&mqHandle;
  310. if(!conn->c) {
  311. char url[1024];
  312. if(conn->ser.plat==MQTT_PLAT_ALIYUN) {
  313. user_account_t user;
  314. mqtt_aliyun.clientId = conn->ser.cid;
  315. get_account(&mqtt_aliyun, &user);
  316. strcpy(conn->ser.user, user.user);
  317. strcpy(conn->ser.password, user.passwd);
  318. }
  319. mg_opts_t opts={
  320. .clean = true,
  321. .qos = 1,
  322. .version = 4,
  323. .keepalive = 30,
  324. .topic = mg_str("hello"),
  325. .message = mg_str("bye"),
  326. .client_id = mg_str(conn->ser.cid),
  327. .user = mg_str(conn->ser.user),
  328. .pass = mg_str(conn->ser.password),
  329. };
  330. get_url(&conn->ser, url);
  331. conn->c = mg_mqtt_connect(&conn->mgr, url, &opts, mqtt_fn, conn);
  332. if(conn->c) {
  333. //mg_mqtt_bind(conn->c);
  334. sprintf(conn->ser.cid, "smartPDU_%s\n", h->prod_id);
  335. my_sub(conn->c, h->prod_id);
  336. r = 0;
  337. }
  338. }
  339. return r;
  340. }
  341. static int my_check(mqtt_handle_t *h)
  342. {
  343. int i,j,r=-1;
  344. char url[1024];
  345. mqtt_server_t *ser=h->dm->mqttInfo.ser;
  346. for(i=0; i<MQTT_SER_MAX; i++) {
  347. r = get_url(&ser[i], url);
  348. if((r==0)) {
  349. if(h->conn[i].tid==0) {
  350. h->conn[i].ser = ser[i];
  351. h->conn[i].h = h;
  352. start_one(&h->conn[i]);
  353. }
  354. }
  355. else {
  356. if(h->conn[i].tid) {
  357. stop_one(&h->conn[i]);
  358. }
  359. }
  360. }
  361. return 0;
  362. }
  363. static int my_send(mqtt_conn_t *conn)
  364. {
  365. int r=-1;
  366. mqtt_handle_t *h=(mqtt_handle_t*)conn->h;
  367. list_node_t *ln=NULL;
  368. r = xlist_take_node(h->list, &ln, 0);
  369. if(r==0) {
  370. mqtt_pkt_t *pkt=(mqtt_pkt_t*)ln->data.buf;
  371. my_pub(conn, pkt->topic, pkt->content);
  372. xlist_back_node(h->list, ln);
  373. }
  374. return r;
  375. }
  376. static int send_once(mqtt_conn_t *conn)
  377. {
  378. send_stat(conn, MQTT_PUB_INFO_DEVICE);
  379. send_stat(conn, MQTT_PUB_STAT_NETWORK);
  380. return 0;
  381. }
  382. static void send_period(mqtt_conn_t *conn)
  383. {
  384. send_stat(conn, MQTT_PUB_STAT_POWER_ALL);
  385. send_stat(conn, MQTT_PUB_STAT_POWER_CHN);
  386. send_stat(conn, MQTT_PUB_STAT_SENSOR);
  387. send_stat(conn, MQTT_PUB_STAT_SERVICE);
  388. send_stat(conn, MQTT_PUB_INFO_DEVICE);
  389. send_stat(conn, MQTT_PUB_STAT_NETWORK);
  390. }
  391. static void timer_conn_fn(void *arg)
  392. {
  393. mqtt_conn_t *conn=(mqtt_conn_t*)arg;
  394. conn_one(conn);
  395. }
  396. static void timer_period_fn(void *arg)
  397. {
  398. mqtt_conn_t *conn=(mqtt_conn_t*)arg;
  399. send_period(conn);
  400. }
  401. static void timer_add(mqtt_conn_t *conn)
  402. {
  403. mg_timer_add(&conn->mgr, CONN_PERIOD, MG_TIMER_REPEAT | MG_TIMER_RUN_NOW, timer_conn_fn, conn);
  404. mg_timer_add(&conn->mgr, SEND_PERIOD, MG_TIMER_REPEAT | MG_TIMER_RUN_NOW, timer_period_fn, conn);
  405. }
  406. static void mqtt_fn(mg_conn_t *c, int ev, void *ev_data)
  407. {
  408. mqtt_conn_t *conn=((mqtt_conn_t*)(c->fn_data));
  409. switch(ev) {
  410. case MG_EV_OPEN:
  411. {
  412. // c->is_hexdumping = 1;
  413. }
  414. break;
  415. case MG_EV_CONNECT:
  416. {
  417. char url[1024];
  418. get_url(&conn->ser, url);
  419. if (mg_url_is_ssl(url)) {
  420. struct mg_tls_opts opts = {.ca = mg_str(conn->ser.cert),
  421. .name = mg_url_host(conn->ser.server)};
  422. mg_tls_init(c, &opts);
  423. }
  424. }
  425. break;
  426. case MG_EV_MQTT_OPEN:
  427. {
  428. send_once(conn);
  429. set_status(conn, 1);
  430. }
  431. break;
  432. case MG_EV_POLL:
  433. {
  434. my_send(conn);
  435. }
  436. break;
  437. case MG_EV_MQTT_MSG:
  438. {
  439. struct mg_mqtt_message *mm=(struct mg_mqtt_message*)ev_data;
  440. if(mm && mm->topic.buf && mm->data.buf) {
  441. my_recv(mm->topic.buf, mm->data.buf);
  442. }
  443. }
  444. break;
  445. case MG_EV_ERROR:
  446. {
  447. //MG_ERROR(("___MG_EV_ERROR, %p %s", c->fd, (char *) ev_data));
  448. //memset(mc->flag, 0, sizeof(mc->flag));
  449. }
  450. break;
  451. case MG_EV_CLOSE:
  452. {
  453. conn->c = NULL;
  454. set_status(conn, 0);
  455. }
  456. break;
  457. }
  458. }
  459. static void* client_thread(void *arg)
  460. {
  461. int r;
  462. mqtt_conn_t *conn=(mqtt_conn_t*)arg;
  463. mg_mgr_init(&conn->mgr);
  464. conn->mgr.dns4.url = "udp://114.114.114.114:53";
  465. //conn->mgr.dns6.url = "udp://114.114.114.114:53";
  466. timer_add(conn);
  467. while(conn->quit==0) {
  468. mg_mgr_poll(&conn->mgr, 1000);
  469. }
  470. if(conn->c)mg_mqtt_disconnect(conn->c, NULL);
  471. mg_mgr_free(&conn->mgr);
  472. conn->c = NULL;
  473. pthread_exit(NULL);
  474. }
  475. #endif
  476. static void* mqtt_thread(void *arg)
  477. {
  478. #ifdef USE_MQTT
  479. int r;
  480. thread_handle_t *th=(thread_handle_t*)arg;
  481. mqtt_handle_t *h=(mqtt_handle_t*)th->arg;
  482. while(th->quit==0) {
  483. my_check(h);
  484. sleep(1);
  485. }
  486. stop_all(h);
  487. #endif
  488. pthread_exit(NULL);
  489. }
  490. //////////////////////////////////////////////////////////////////////////
  491. int mqtt_init(void)
  492. {
  493. int r=-1;
  494. #ifdef USE_MQTT
  495. mqtt_handle_t *h=&mqHandle;
  496. memset(h, 0, sizeof(mqtt_handle_t));
  497. //mg_log_set(MG_LL_DEBUG);
  498. h->dm = &__globalDeviceManage;
  499. strcpy( h->prod_id,h->dm->_globalDevInfo.product.number);
  500. //sys_get_chip_id(&h->prod_id);
  501. list_cfg_t lc;
  502. lc.mode = LIST_FULL_FIFO;
  503. lc.max = 100;
  504. lc.log = 0;
  505. h->list = xlist_init(&lc);
  506. dev_mqtt_init(h->dm->db, &h->dm->mqttInfo);
  507. thread_start(THREAD_ID_MQTT, mqtt_thread, h);
  508. h->inited = 1; r = 0;
  509. #endif
  510. return r;
  511. }
  512. int mqtt_deinit(void)
  513. {
  514. int r=-1;
  515. #ifdef USE_MQTT
  516. mqtt_handle_t *h=&mqHandle;
  517. thread_stop(THREAD_ID_MQTT);
  518. xlist_free(h->list);
  519. h->inited = 0; r = 0;
  520. #endif
  521. return r;
  522. }
  523. static int send_stat(mqtt_conn_t *conn, int type)
  524. {
  525. int i,r=-1;
  526. #ifdef USE_MQTT
  527. float p1,p2,p3;
  528. char topic[256];
  529. char* content=NULL;
  530. char buf[20],date[40],time[40];
  531. mqtt_handle_t *h=(mqtt_handle_t*)conn->h;
  532. if((!conn->c) || (type<0) || (type>=MQTT_PUB_MAX)) {
  533. return -1;
  534. }
  535. if((type!=MQTT_PUB_STAT_POWER_CHN) && (type!=MQTT_PUB_STAT_SENSOR)) {
  536. snprintf(topic, sizeof(topic), topic_pub[type], h->prod_id);
  537. }
  538. switch(type) {
  539. case MQTT_PUB_INFO_DEVICE:
  540. {
  541. cJSON* root=cJSON_CreateObject();
  542. if(root) {
  543. int nch = 0;
  544. GlobalPowerManger *chiterator;
  545. list_for_each_entry(chiterator, &h->dm->_globalPowerManger.list, list)
  546. {
  547. nch++;
  548. }
  549. int nsen = 0;
  550. GlobalSensorManger *sensoriterator;
  551. list_for_each_entry(sensoriterator, &h->dm->_globalSensorManger.list, list)
  552. {
  553. nsen++;
  554. }
  555. cJSON_AddStringToObject(root,"id", h->prod_id);
  556. cJSON_AddStringToObject(root,"name",h->dm->_globalDevInfo.product.name);
  557. cJSON_AddStringToObject(root,"type",g_product_type_str[h->dm->_globalDevInfo.product.pwr_type]);
  558. cJSON_AddStringToObject(root,"firmware", VERSION);
  559. cJSON_AddStringToObject(root,"channel_num", get_int_str(nch));
  560. cJSON_AddStringToObject(root,"sensor_num", get_int_str(nsen));
  561. get_date_time(date, time);
  562. cJSON_AddStringToObject(root,"date", date);
  563. cJSON_AddStringToObject(root,"time", time);
  564. content = cJSON_Print(root);
  565. my_pub(conn, topic, content);
  566. cJSON_free(content);
  567. cJSON_Delete(root);
  568. }
  569. }
  570. break;
  571. case MQTT_PUB_STAT_NETWORK:
  572. {
  573. NetworkInfo_t nw4,nw6;
  574. int r4 = sys_get_net(&nw4, IP_V4);
  575. int r6 = sys_get_net(&nw6, IP_V6);
  576. cJSON* root=cJSON_CreateObject();
  577. if(root) {
  578. if(r4==0) {
  579. cJSON_AddStringToObject(root,"lan_ipv4_link", nw4.mode?"1":"0");
  580. cJSON_AddStringToObject(root,"lan_ipv4_address", nw4.ip_address);
  581. cJSON_AddStringToObject(root,"lan_ipv4_mask", nw4.mask);
  582. }
  583. else {
  584. cJSON_AddStringToObject(root,"lan_ipv4_link", "");
  585. cJSON_AddStringToObject(root,"lan_ipv4_address", "");
  586. cJSON_AddStringToObject(root,"lan_ipv4_mask", "");
  587. }
  588. if(r4==0) {
  589. cJSON_AddStringToObject(root,"lan_ipv6_link", nw6.mode?"1":"0");
  590. cJSON_AddStringToObject(root,"lan_ipv6_address", nw6.ip_address);
  591. cJSON_AddStringToObject(root,"lan_ipv6_subnet_length", nw6.mask);
  592. }
  593. else {
  594. cJSON_AddStringToObject(root,"lan_ipv6_link", "");
  595. cJSON_AddStringToObject(root,"lan_ipv6_address", "");
  596. cJSON_AddStringToObject(root,"lan_ipv6_subnet_length", "");
  597. }
  598. if(0) {
  599. cJSON_AddStringToObject(root,"wifi_ipv4_link", "");
  600. cJSON_AddStringToObject(root,"wifi_ipv4_address", "");
  601. cJSON_AddStringToObject(root,"wifi_ipv4_mask", "");
  602. cJSON_AddStringToObject(root,"wifi_ipv6_link", "");
  603. cJSON_AddStringToObject(root,"wifi_ipv6_address", "");
  604. cJSON_AddStringToObject(root,"wifi_ipv6_mask", "");
  605. }
  606. cJSON_AddStringToObject(root,"modbus_address", get_int_str(h->dm->_globalDevInfo.cascade.addr));
  607. cJSON_AddStringToObject(root,"modbus_baud", get_int_str(h->dm->_globalDevInfo.cascade.baudrate));
  608. cJSON_AddStringToObject(root,"modbus_mode", get_int_str(h->dm->_globalDevInfo.cascade.mode));
  609. cJSON_AddStringToObject(root,"vpn_enable", "0");
  610. get_date_time(date, time);
  611. cJSON_AddStringToObject(root,"date", date);
  612. cJSON_AddStringToObject(root,"time", time);
  613. content = cJSON_Print(root);
  614. my_pub(conn, topic, content);
  615. cJSON_free(content);
  616. cJSON_Delete(root);
  617. }
  618. }
  619. break;
  620. case MQTT_PUB_STAT_POWER_ALL:
  621. {
  622. int cnt=1;
  623. pwrall_info_t *pall=websocket_get_pwrall();
  624. if (pall->ph3)
  625. {
  626. cnt = 3;
  627. }
  628. cJSON *root = cJSON_CreateObject();
  629. if (root)
  630. {
  631. cJSON *data_root_array = cJSON_CreateArray();
  632. for (i = 0; i < cnt; i++)
  633. {
  634. _OverAllPwrAckInfo *info = &pall->ch[i];
  635. cJSON *data_filed = cJSON_CreateObject();
  636. if (data_filed)
  637. {
  638. sprintf(buf, "L%d", i + 1);
  639. if (cnt == 3)
  640. cJSON_AddStringToObject(data_filed, "phase", buf);
  641. cJSON_AddStringToObject(data_filed, "voltage", get_float_str(info->voltage));
  642. cJSON_AddStringToObject(data_filed, "current", get_float_str(info->current));
  643. cJSON_AddStringToObject(data_filed, "power", get_float_str(info->power / 1000));
  644. cJSON_AddStringToObject(data_filed, "consumption", get_float_str(info->consumption));
  645. if (h->dm->_globalDevInfo.product.pwr_type != SmartPDU_DC)
  646. {
  647. cJSON_AddStringToObject(data_filed, "power_factor", get_float_str(info->factor));
  648. cJSON_AddStringToObject(data_filed, "power_freq", get_float_str(info->freq));
  649. p1 = info->power;
  650. p3 = info->factor>0 ? (p1 / info->factor) : 0.0f;
  651. p2 = p3 - p1;
  652. cJSON_AddStringToObject(data_filed, "pactive_power", get_float_str(p1));
  653. cJSON_AddStringToObject(data_filed, "reactive_power", get_float_str(p2));
  654. cJSON_AddStringToObject(data_filed, "apparent_power", get_float_str(p3));
  655. }
  656. cJSON_AddItemToObject(data_root_array, "power_status", data_filed);
  657. }
  658. }
  659. cJSON_AddItemToObject(root, "power_status", data_root_array);
  660. cJSON_AddStringToObject(root, "voltage_over", get_int_str(h->dm->_globalPowerManger._PowerWarninginfo.w_voltage_up));
  661. cJSON_AddStringToObject(root, "voltage_low", get_int_str(h->dm->_globalPowerManger._PowerWarninginfo.w_voltage_down));
  662. cJSON_AddStringToObject(root, "current_over", get_int_str(h->dm->_globalPowerManger._PowerWarninginfo.w_current));
  663. cJSON_AddStringToObject(root, "power_over", get_int_str(h->dm->_globalPowerManger._PowerWarninginfo.w_power));
  664. cJSON_AddStringToObject(root, "consumption_over", get_int_str(h->dm->_globalPowerManger._PowerWarninginfo.w_consumption));
  665. get_date_time(date, time);
  666. cJSON_AddStringToObject(root, "date", date);
  667. cJSON_AddStringToObject(root, "time", time);
  668. content = cJSON_Print(root);
  669. my_pub(conn, topic, content);
  670. cJSON_free(content);
  671. cJSON_Delete(root);
  672. }
  673. }
  674. break;
  675. case MQTT_PUB_STAT_POWER_CHN:
  676. {
  677. int quit=0;
  678. GlobalPowerManger *tmp=NULL;
  679. lock_s_hold(LOCK_ID_POWER_UPDATE);
  680. list_for_each_entry(tmp, &h->dm->_globalPowerManger.list, list)
  681. {
  682. if(tmp==NULL) {
  683. break;
  684. }
  685. cJSON* root=cJSON_CreateObject();
  686. if(root) {
  687. cJSON_AddStringToObject(root,"id", get_int_str(tmp->product_ch_id));
  688. cJSON_AddStringToObject(root,"name", tmp->product_ch_name);
  689. cJSON_AddStringToObject(root,"status", get_int_str(tmp->_PowerInfo.status));
  690. cJSON_AddStringToObject(root,"voltage", get_float_str(tmp->_PowerInfo.voltage));
  691. cJSON_AddStringToObject(root, "current", get_float_str(tmp->_PowerInfo.current));
  692. cJSON_AddStringToObject(root, "power", get_float_str(tmp->_PowerInfo.power));
  693. cJSON_AddStringToObject(root, "consumption", get_float_str(tmp->_PowerInfo.consumption));
  694. cJSON_AddStringToObject(root, "voltage_over", get_int_str(tmp->_PowerWarninginfo.w_voltage_up));
  695. cJSON_AddStringToObject(root, "voltage_low", get_int_str(tmp->_PowerWarninginfo.w_voltage_down));
  696. cJSON_AddStringToObject(root, "current_over", get_int_str(tmp->_PowerWarninginfo.w_current));
  697. cJSON_AddStringToObject(root, "power_over", get_int_str(tmp->_PowerWarninginfo.w_power));
  698. cJSON_AddStringToObject(root, "consumption_over", get_int_str(tmp->_PowerWarninginfo.w_consumption));
  699. if (h->dm->_globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree)
  700. {
  701. cJSON_AddStringToObject(root, "phase_loss_L1", get_int_str(tmp->_PowerWarninginfo.w_phase_lossA));
  702. cJSON_AddStringToObject(root, "phase_loss_L2", get_int_str(tmp->_PowerWarninginfo.w_phase_lossB));
  703. cJSON_AddStringToObject(root, "phase_loss_L3", get_int_str(tmp->_PowerWarninginfo.w_phase_lossC));
  704. }
  705. if (h->dm->_globalDevInfo.product.pwr_type != SmartPDU_DC)
  706. {
  707. cJSON_AddStringToObject(root, "power_freq", get_float_str(tmp->_PowerInfo.freq));
  708. cJSON_AddStringToObject(root, "power_factor", get_float_str(tmp->_PowerInfo.factor));
  709. p1 = tmp->_PowerInfo.power;
  710. p3 = tmp->_PowerInfo.factor>0 ? (p1 / tmp->_PowerInfo.factor) : 0.0f;
  711. p2 = p3 - p1;
  712. cJSON_AddStringToObject(root, "pactive_power", get_float_str(p1));
  713. cJSON_AddStringToObject(root, "reactive_power", get_float_str(p2));
  714. cJSON_AddStringToObject(root, "apparent_power", get_float_str(p3));
  715. }
  716. cJSON* data_root_array = cJSON_CreateArray();
  717. if (h->dm->_globalDevInfo.product.pwr_type == TREE_AC_TYPE|| h->dm->_globalDevInfo.product.pwr_type==DOUBLE_AC_TYPE|| h->dm->_globalDevInfo.product.pwr_type==SmartPDU_Tree_AC_One_B)
  718. {
  719. GlobalTreeACManager *_TreeACTemp = NULL;
  720. // 判断是否三相单输出情况下
  721. int phnum = 0;
  722. list_for_each_entry(_TreeACTemp, &tmp->list_Tree_AC, list_Tree_AC)
  723. {
  724. if(_TreeACTemp->product_ph_outputStatus == 1 &&_TreeACTemp->product_ph_type >= 0 && _TreeACTemp->product_ph_type < 3)
  725. {
  726. cJSON *data_filed = cJSON_CreateObject();
  727. cJSON_AddStringToObject(data_filed, "phase_type", g_product_t_ac_type_str[_TreeACTemp->product_ph_type]);
  728. cJSON_AddStringToObject(data_filed, "phase_voltage", get_float_str(_TreeACTemp->_PowerInfo.voltage));
  729. cJSON_AddStringToObject(data_filed, "phase_current", get_float_str(_TreeACTemp->_PowerInfo.current));
  730. cJSON_AddStringToObject(data_filed, "phase_power", get_float_str(_TreeACTemp->_PowerInfo.power));
  731. cJSON_AddStringToObject(data_filed, "phase_consumption", get_float_str(_TreeACTemp->_PowerInfo.consumption));
  732. cJSON_AddItemToObject(data_root_array, "phase_data", data_filed);
  733. }
  734. }
  735. }
  736. cJSON_AddItemToObject(root, "phase_data", data_root_array);
  737. get_date_time(date, time);
  738. cJSON_AddStringToObject(root,"date", date);
  739. cJSON_AddStringToObject(root,"time", time);
  740. snprintf(topic, sizeof(topic), topic_pub[type], h->prod_id, tmp->product_ch_id);
  741. content = cJSON_Print(root);
  742. my_pub(conn, topic, content);
  743. cJSON_free(content);
  744. cJSON_Delete(root);
  745. }
  746. }
  747. lock_s_release(LOCK_ID_POWER_UPDATE);
  748. }
  749. break;
  750. case MQTT_PUB_STAT_SENSOR:
  751. {
  752. GlobalSensorManger *tmp=NULL;
  753. lock_s_hold(LOCK_ID_SENSOR);
  754. list_for_each_entry(tmp, &h->dm->_globalSensorManger.list, list)
  755. {
  756. if(tmp==NULL) {
  757. break;
  758. }
  759. cJSON* root=cJSON_CreateObject();
  760. if(root) {
  761. cJSON_AddStringToObject(root,"name", tmp->sensor_name);
  762. cJSON_AddStringToObject(root,"type", get_int_str(tmp->sensor_type));
  763. cJSON_AddStringToObject(root,"modbus_address", get_int_str(tmp->sensor_addr));
  764. cJSON_AddStringToObject(root,"node", get_int_str(tmp->sensor_node_number));
  765. cJSON_AddStringToObject(root,"status", get_int_str(tmp->sensor_status));
  766. cJSON_AddStringToObject(root,"value_num", get_int_str(tmp->sensor_val_count));
  767. cJSON_AddStringToObject(root,"value1", get_float_str(tmp->Cur_sensor_info.val1));
  768. cJSON_AddStringToObject(root,"value2", get_float_str(tmp->Cur_sensor_info.val2));
  769. cJSON_AddStringToObject(root, "value1_over", get_int_str(tmp->warning_status.sensor_val1_upper));
  770. cJSON_AddStringToObject(root, "value1_low", get_int_str(tmp->warning_status.sensor_val1_lower));
  771. cJSON_AddStringToObject(root, "value2_over", get_int_str(tmp->warning_status.sensor_val2_upper));
  772. cJSON_AddStringToObject(root, "value2_low", get_int_str(tmp->warning_status.sensor_val2_lower));
  773. get_date_time(date, time);
  774. cJSON_AddStringToObject(root,"date", date);
  775. cJSON_AddStringToObject(root,"time", time);
  776. snprintf(topic, sizeof(topic), topic_pub[type], h->prod_id, tmp->sensor_id);
  777. content = cJSON_Print(root);
  778. my_pub(conn, topic, content);
  779. cJSON_free(content);
  780. cJSON_Delete(root);
  781. }
  782. }
  783. lock_s_release(LOCK_ID_SENSOR);
  784. }
  785. break;
  786. case MQTT_PUB_STAT_SERVICE:
  787. {
  788. cJSON* root=cJSON_CreateObject();
  789. if(root) {
  790. int flag = get_serv(NULL);
  791. cJSON_AddStringToObject(root,"telnet", BGET(flag, SERV_TELNET)?"1":"0");
  792. cJSON_AddStringToObject(root,"smtp", BGET(flag, SERV_SMTP)?"1":"0");
  793. cJSON_AddStringToObject(root,"snmp_v1", BGET(flag, SERV_SNMP_V1)?"1":"0");
  794. cJSON_AddStringToObject(root,"snmp_v2c", BGET(flag, SERV_SNMP_V2C)?"1":"0");
  795. cJSON_AddStringToObject(root,"snmp_v3", BGET(flag, SERV_SNMP_V3)?"1":"0");
  796. cJSON_AddStringToObject(root,"snmp_trap", BGET(flag, SERV_SNMP_TRAP)?"1":"0");
  797. cJSON_AddStringToObject(root,"message", BGET(flag, SERV_MESG)?"1":"0");
  798. cJSON_AddStringToObject(root,"mqtt", BGET(flag, SERV_MQTT)?"1":"0");
  799. cJSON_AddStringToObject(root,"cloud", BGET(flag, SERV_CLOUD)?"1":"0");
  800. cJSON_AddStringToObject(root,"ntp", BGET(flag, SERV_NTP)?"1":"0");
  801. get_date_time(date, time);
  802. cJSON_AddStringToObject(root,"date", date);
  803. cJSON_AddStringToObject(root,"time", time);
  804. content = cJSON_Print(root);
  805. my_pub(conn, topic, content);
  806. cJSON_free(content);
  807. cJSON_Delete(root);
  808. }
  809. }
  810. break;
  811. default:
  812. return -1;
  813. }
  814. #endif
  815. return r;
  816. }
  817. static int post_alarm(int type, int subtype, char *content, alarm_para_t *para)
  818. {
  819. int r=-1;
  820. #ifdef USE_MQTT
  821. char topic[256];
  822. mqtt_handle_t *h=&mqHandle;
  823. char date[40],time[40];
  824. int pub_type;
  825. char *json_str=NULL;
  826. if(!h->inited) {
  827. return -1;
  828. }
  829. if(type==ALARM_TYPE_POWER) {
  830. pub_type = MQTT_PUB_ALARM_POWER;
  831. }
  832. else if(type==ALARM_TYPE_SENSOR) {
  833. pub_type = MQTT_PUB_ALARM_SENSOR;
  834. }
  835. else if(type==ALARM_TYPE_NETWORK) {
  836. pub_type = MQTT_PUB_ALARM_NETWORK;
  837. }
  838. else {
  839. return -1;
  840. }
  841. snprintf(topic, sizeof(topic), topic_pub[pub_type], h->prod_id);
  842. get_date_time(date, time);
  843. switch(pub_type) {
  844. case MQTT_PUB_ALARM_NETWORK:
  845. case MQTT_PUB_ALARM_SENSOR:
  846. case MQTT_PUB_ALARM_POWER:
  847. {
  848. cJSON* root=cJSON_CreateObject();
  849. if(root) {
  850. if(MQTT_PUB_ALARM_SENSOR==pub_type)cJSON_AddStringToObject(root,"sensor_id", get_int_str(para->id));
  851. else if(MQTT_PUB_ALARM_POWER==pub_type)cJSON_AddStringToObject(root,"channel_id", get_int_str(para->id));
  852. else cJSON_AddStringToObject(root,"id", get_int_str(para->id));
  853. cJSON_AddStringToObject(root, "context", content);
  854. if (MQTT_PUB_ALARM_POWER == pub_type)
  855. {
  856. cJSON_AddStringToObject(root, "action", get_int_str(para->action));
  857. cJSON_AddStringToObject(root, "action_para", get_int_str(para->actionId));
  858. }
  859. cJSON_AddStringToObject(root, "date", date);
  860. cJSON_AddStringToObject(root, "time", time);
  861. json_str = cJSON_Print(root);
  862. cJSON_Delete(root);
  863. }
  864. }
  865. break;
  866. }
  867. mqtt_pkt_t pkt;
  868. pkt.id = pub_type;
  869. snprintf(pkt.topic, sizeof(pkt.topic), "%s", topic);
  870. snprintf(pkt.content, sizeof(pkt.content), "%s", json_str);
  871. r = xlist_append(h->list, 0, &pkt, sizeof(pkt));
  872. cJSON_free(json_str);
  873. #endif
  874. return r;
  875. }
  876. int mqtt_post_alarm(int type, int subtype, char *content, alarm_para_t *para)
  877. {
  878. return post_alarm(type, subtype, content, para);
  879. }
  880. #ifdef USE_MQTT
  881. //////////////////////////////////////////////////////////
  882. static int get_cmd(char *json)
  883. {
  884. int cmd=-1;
  885. cJSON* cjson=cJSON_Parse(json);
  886. if(cjson) {
  887. cJSON* order=cJSON_GetObjectItem(cjson,"order");
  888. if(order && order->valuestring) {
  889. cmd = atoi(order->valuestring);
  890. }
  891. cJSON_Delete(cjson);
  892. }
  893. return cmd;
  894. }
  895. static int get_serv(char *json)
  896. {
  897. int i,flag=0;
  898. cJSON* tmp=NULL;
  899. if(json) {
  900. cJSON* cjson=cJSON_Parse(json);
  901. if(cjson) {
  902. for(i=0; i<SERV_MAX; i++) {
  903. tmp = cJSON_GetObjectItem(cjson, serv_str[i]);
  904. if(tmp && tmp->valuestring) {
  905. flag |= (atoi(tmp->valuestring)<<i);
  906. }
  907. }
  908. cJSON_Delete(cjson);
  909. }
  910. }
  911. else {
  912. if(thread_is_running(THREAD_ID_NTP)) {
  913. BSET(flag, SERV_NTP);
  914. }
  915. if(thread_is_running(THREAD_ID_MAIL)) {
  916. BSET(flag, SERV_SMTP);
  917. }
  918. if(thread_is_running(THREAD_ID_MQTT)) {
  919. BSET(flag, SERV_MQTT);
  920. }
  921. #if 0
  922. if(thread_is_running(SERV_MESG)) {
  923. BSET(flag, SERV_MESG);
  924. }
  925. if(thread_is_running(THREAD_ID_CLOUD)) {
  926. BSET(flag, SERV_CLOUD);
  927. }
  928. if(thread_is_running(THREAD_ID_TELNET)) {
  929. BSET(flag, SERV_TELNET);
  930. }
  931. #endif
  932. if(sys_is_running("snmpd")) {
  933. BSET(flag, SERV_NTP);
  934. }
  935. if(thread_is_running(THREAD_ID_NTP)) {
  936. BSET(flag, SERV_NTP);
  937. }
  938. }
  939. return flag;
  940. }
  941. static int set_serv(int flag)
  942. {
  943. if(BGET(flag,SERV_NTP)) {
  944. if(!thread_is_running(THREAD_ID_NTP)) {
  945. //thread_stop(THREAD_ID_NTP);
  946. }
  947. }
  948. else {
  949. if(thread_is_running(THREAD_ID_NTP)) {
  950. thread_stop(THREAD_ID_NTP);
  951. }
  952. }
  953. if(BGET(flag,SERV_SMTP)) {
  954. if(!thread_is_running(THREAD_ID_MAIL)) {
  955. //thread_stop(THREAD_ID_MAIL);
  956. }
  957. }
  958. else {
  959. if(thread_is_running(THREAD_ID_MAIL)) {
  960. thread_stop(THREAD_ID_MAIL);
  961. }
  962. }
  963. if(BGET(flag,SERV_MQTT)) {
  964. }
  965. else {
  966. }
  967. if(BGET(flag,SERV_MESG)) {
  968. }
  969. else {
  970. }
  971. if(BGET(flag,SERV_CLOUD)) {
  972. }
  973. else {
  974. }
  975. if(BGET(flag,SERV_TELNET)) {
  976. }
  977. else {
  978. }
  979. if(BGET(flag,SERV_SNMP_V1) || BGET(flag,SERV_SNMP_V2C) || BGET(flag,SERV_SNMP_V3) || BGET(flag,SERV_SNMP_TRAP)) {
  980. }
  981. else {
  982. }
  983. return 0;
  984. }
  985. static int my_recv(char *topic, char *data)
  986. {
  987. int i,r,cmd;
  988. #ifdef USE_MQTT
  989. char *p,temp[512];
  990. int flag=0;
  991. mqtt_handle_t *h=&mqHandle;
  992. for(i=0; i<MQTT_SUB_MAX; i++) {
  993. snprintf(temp, sizeof(temp), topic_sub[i], h->prod_id);
  994. p = strrchr(temp, '+');
  995. if(p) p[0] = 0;
  996. if(strstr(topic, temp)) {
  997. switch(i) {
  998. case MQTT_SUB_CMD_POWER_ALL:
  999. {
  1000. cmd = get_cmd(data);
  1001. LOGD("___ MQTT_SUB_CMD_POWER_ALL, %d\n", cmd);
  1002. if(cmd==0 || cmd==1) {
  1003. set_ch(h, 0xff, cmd);
  1004. }
  1005. }
  1006. break;
  1007. case MQTT_SUB_CMD_POWER_CHN:
  1008. {
  1009. int ch=atoi(topic+strlen(temp));
  1010. cmd = get_cmd(data);
  1011. LOGD("___ MQTT_SUB_CMD_POWER_CHN, %d, %d\n", ch, cmd);
  1012. if(cmd==0 || cmd==1) {
  1013. set_ch(h, ch, cmd);
  1014. }
  1015. }
  1016. break;
  1017. case MQTT_SUB_CMD_SENSOR:
  1018. {
  1019. int id=atoi(topic+strlen(temp));
  1020. cmd = get_cmd(data);
  1021. switch(id) {
  1022. case SENSOR_TYPE_TEMP_HUMI:
  1023. break;
  1024. case SENSOR_TYPE_SMOKE:
  1025. break;
  1026. case SENSOR_TYPE_WATER:
  1027. break;
  1028. case SENSOR_TYPE_ACCESS:
  1029. break;
  1030. case SENSOR_TYPE_GAS:
  1031. break;
  1032. case SENSOR_TYPE_AIR_PRESS:
  1033. break;
  1034. case SENSOR_TYPE_TEMP_DOUBLE:
  1035. break;
  1036. case SENSOR_TYPE_TEMP:
  1037. break;
  1038. case SENSOR_TYPE_LEAK:
  1039. break;
  1040. }
  1041. LOGD("___ MQTT_SUB_CMD_POWER_CHN, %d\n", id);
  1042. }
  1043. break;
  1044. case MQTT_SUB_CMD_RESTART:
  1045. {
  1046. cmd = get_cmd(data);
  1047. LOGD("___ MQTT_SUB_CMD_RESTART, %d\n", cmd);
  1048. if(cmd==0) {
  1049. system("shutdown");
  1050. }
  1051. else if(cmd==1) {
  1052. system("reboot");
  1053. }
  1054. }
  1055. break;
  1056. case MQTT_SUB_CMD_RESET:
  1057. {
  1058. cmd = get_cmd(data);
  1059. LOGD("___ MQTT_SUB_CMD_RESET, %d\n", cmd);
  1060. if(cmd==1) {
  1061. sys_set_factory();
  1062. }
  1063. }
  1064. break;
  1065. case MQTT_SUB_CMD_SERVICE:
  1066. {
  1067. flag = get_serv(data);
  1068. LOGD("___ MQTT_SUB_CMD_SERVICE, 0x%08x\n", flag);
  1069. set_serv(flag);
  1070. }
  1071. break;
  1072. }
  1073. }
  1074. }
  1075. #endif
  1076. return 0;
  1077. }
  1078. #endif
  1079. int mqtt_test(void)
  1080. {
  1081. #ifdef USE_MQTT
  1082. int cnt=0;
  1083. mqtt_handle_t *h=&mqHandle;
  1084. mqtt_info_t mInfo={0};
  1085. mqtt_server_t ser={
  1086. .id = 0,
  1087. .mode = 1,
  1088. .cid = "mqtlx_e92334545tet3465",
  1089. .name = "serverX",
  1090. .server = "192.168.1.12",
  1091. .port = "1883",
  1092. //root
  1093. //root0219107X
  1094. .user = "gowone100",
  1095. .password = "gowone100",
  1096. //.user = "gowone101",
  1097. //.password = "gowone101",
  1098. };
  1099. mInfo.ser[0] = ser;
  1100. h->dm->mqttInfo = mInfo;
  1101. #endif
  1102. return 0;
  1103. }