mqtt.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  1. /*******************************************************************************
  2. * Copyright (c) 2012, 2020 IBM Corp.
  3. *
  4. * All rights reserved. This program and the accompanying materials
  5. * are made available under the terms of the Eclipse Public License v2.0
  6. * and Eclipse Distribution License v1.0 which accompany this distribution.
  7. *
  8. * The Eclipse Public License is available at
  9. * https://www.eclipse.org/legal/epl-2.0/
  10. * and the Eclipse Distribution License is available at
  11. * http://www.eclipse.org/org/documents/edl-v10.php.
  12. *
  13. * Contributors:
  14. * Ian Craggs - initial contribution
  15. * Ian Craggs - add full capability
  16. *******************************************************************************/
  17. #include "plt.h"
  18. #include <mqtt_sm.h>
  19. #define MQTT_CACHE_DATA_BASE "../data/mqtt.db"
  20. #define MQTT_CACHE_TABLE "mqtt_cache"
  21. #define TX_BUFF_TO_CACHE_USAGE (75.0)
  22. #define CACHE_TO_TX_BUFF_USAGE (65.0)
  23. #define CACHE_FILE_MEMORY_SIZE_MAX (40 * 1024 * 1024)
  24. static mqtt_ringbuffer_t mqtt_txbuf;
  25. static pthread_mutex_t mqtt_txbuf_mutex;
  26. static mqtt_ringbuffer_t mqtt_rxbuf;
  27. static pthread_mutex_t mqtt_rxbuf_mutex;
  28. static void *mqtt_cache_handle = NULL;
  29. double mqtt_get_timeofday()
  30. {
  31. struct timeval tv;
  32. struct timezone tz;
  33. gettimeofday(&tv, &tz);
  34. return (double)tv.tv_sec * 1000 + (double)tv.tv_usec / 1000;
  35. }
  36. static void mqtt_connlost(void *context, char *cause)
  37. {
  38. log_dbg("%s, mqtt connection lost, cause: %s\n", __func__, cause);
  39. MDL.mqtt.connlost = 1;
  40. /*
  41. mqtt_lock_txbuf();
  42. MQTTClient_destroy(&MDL.mqtt->cli);
  43. mqtt->reconncnt++;
  44. if(mqtt_connect()!=0){
  45. mqtt->connect = 0;
  46. }else{
  47. mqtt->connect = 1;
  48. }
  49. mqtt_unlock_txbuf();
  50. */
  51. }
  52. static int mqtt_msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
  53. {
  54. struct mqtt_t *dev = &MDL.mqtt;
  55. struct statemachine_t *sm = &MDL.mqtt.sm;
  56. int rc = 0;
  57. mqtt_ringbuffer_element_t e;
  58. char *pdst = NULL;
  59. char *psrc = NULL;
  60. int i;
  61. // log_dbg("%s, Message arrived, topic:%s topic len:%d payload len:%d", __func__, topicName,topicLen, message->payloadlen);
  62. rc = MQTTClient_receive(dev->cli, &topicName, &topicLen, &message, 30);
  63. if (message)
  64. {
  65. log_dbg("%s, Message arrived, topic:%s topic len:%d payload len:%d", __func__, topicName, topicLen, message->payloadlen);
  66. strcpy(e.sztopic, topicName);
  67. strncpy(e.szpayload, (const char *)message->payload, message->payloadlen);
  68. log_dbg("%s, payload:%s", __func__, e.szpayload);
  69. MQTTClient_freeMessage(&message);
  70. MQTTClient_free(topicName);
  71. mqtt_lock_rxbuf();
  72. mqtt_queue_rxbuf(e);
  73. mqtt_unlock_rxbuf();
  74. }
  75. return 1;
  76. }
  77. // static int mqtt_msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
  78. // {
  79. // int i;
  80. // char* topicptr;
  81. // char topicbuf[1024];
  82. // char plbuf[1024];
  83. // char* payloadptr;
  84. // char szreqid[256];
  85. // char* pszreqid = szreqid;
  86. // char* p = NULL;
  87. // int reqid = 0;
  88. // mqtt_ringbuffer_element_t e;
  89. // /*
  90. // p = plbuf;
  91. // payloadptr = message->payload;
  92. // for( i = 0; i < message->payloadlen; i++ ){
  93. // *p++ = *payloadptr++;
  94. // }
  95. // *p = 0;
  96. // p = topicbuf;
  97. // topicptr = topicName;
  98. // for( i = 0; i < topicLen; i++ ){
  99. // *p++ = *topicptr++;
  100. // }
  101. // *p = 0;
  102. // */
  103. // log_dbg("%s, Message arrived, topic:%s topic len:%d payload len:%d",
  104. // __func__, topicbuf,topicLen, message->payloadlen);
  105. // #if 0
  106. // if( topicLen > 0 ){
  107. // p = strrchr(topicName, '/');
  108. // if( p != NULL ){
  109. // p++;
  110. // while( *p != 0){
  111. // *pszreqid++ = *p++;
  112. // }
  113. // *pszreqid = 0;
  114. // reqid = atoi(szreqid);
  115. // log_dbg("%s, requestid:%s|%d", __func__, szreqid, reqid);
  116. // e.cmd = CMD_MQTT_SENDKV;
  117. // e.sztopic[0] = 0;
  118. // e.szpayload[0] = 0;
  119. // strcpy(e.szpayload, plbuf);
  120. // sprintf(e.sztopic,"v1/devices/me/rpc/response/%s",szreqid);
  121. // mqtt_lock_txbuf();
  122. // mqtt_ringbuffer_queue(mqtt_rb, e);
  123. // mqtt_unlock_txbuf();
  124. // }
  125. // }
  126. // #endif
  127. // MQTTClient_freeMessage(&message);
  128. // MQTTClient_free(topicName);
  129. // return 0;
  130. // }
  131. static void mqtt_delivered(void *context, MQTTClient_deliveryToken dt)
  132. {
  133. struct mqtt_t *dev = &MDL.mqtt;
  134. if (dev->dbg)
  135. {
  136. log_dbg("%s, Message with token value %d delivery confirmed", __func__, dt);
  137. }
  138. }
  139. extern char MQTTSERVIP[16];
  140. extern int MQTTSERVPORT;
  141. int mqtt_connect(void)
  142. {
  143. int ret = 0;
  144. int rc;
  145. char buf[256];
  146. struct mqtt_t *mqtt = &MDL.mqtt;
  147. int qos = 2;
  148. UUID4_STATE_T state;
  149. UUID4_T uuid;
  150. uuid4_seed(&state);
  151. uuid4_gen(&state, &uuid);
  152. char buf_uuid[UUID4_STR_BUFFER_SIZE];
  153. if (!uuid4_to_s(uuid, buf_uuid, sizeof(buf_uuid)))
  154. {
  155. ret = -1;
  156. }
  157. sprintf(mqtt->szclientid, "%s-%d-%s", MDL.szDevName, MDL.adr, buf_uuid);
  158. MQTTClient_connectOptions tmpconn_opts = MQTTClient_connectOptions_initializer;
  159. mqtt->conn_opts = tmpconn_opts;
  160. strcpy(mqtt->szservip, MDL.szmqtt_servip);
  161. mqtt->servport = MDL.mqtt_servport;
  162. // sprintf(buf,"tcp://%s:%d",mqtt->szservip,mqtt->servport);
  163. sprintf(buf, "%s:%d", mqtt->szservip, mqtt->servport);
  164. MQTTClient_create(&mqtt->cli, buf, mqtt->szclientid, MQTTCLIENT_PERSISTENCE_NONE, NULL);
  165. mqtt->conn_opts.keepAliveInterval = 100;
  166. mqtt->conn_opts.cleansession = 1;
  167. // mqtt->conn_opts.username = mqtt->szaccesstoken;
  168. // mqtt->conn_opts.username = mqtt->szusername;
  169. // mqtt->conn_opts.password = mqtt->szpasswd;
  170. MQTTClient_setCallbacks(mqtt->cli, NULL, mqtt_connlost, mqtt_msgarrvd, NULL);
  171. if ((rc = MQTTClient_connect(mqtt->cli, &mqtt->conn_opts)) != MQTTCLIENT_SUCCESS)
  172. {
  173. log_dbg("%s, MQTTClient_connect fail, msg:%s", __func__, MQTTClient_strerror(rc));
  174. ret = -1;
  175. }
  176. sprintf(buf, "%s_SUB", MDL.szDevName);
  177. rc = MQTTClient_subscribe(mqtt->cli, buf, qos);
  178. if (rc != MQTTCLIENT_SUCCESS && rc != qos)
  179. {
  180. ret = -2;
  181. }
  182. if (ret < 0)
  183. {
  184. log_dbg("%s, mqtt connect fail, return code %d\n", __func__, rc);
  185. }
  186. else
  187. {
  188. log_dbg("%s, mqtt connect ok, return code %d\n", __func__, rc);
  189. }
  190. return ret;
  191. }
  192. int mqtt_sub(const char *topic, int qos)
  193. {
  194. struct mqtt_t *dev = &MDL.mqtt;
  195. int rc = 0;
  196. rc = MQTTClient_subscribe(dev->cli, topic, qos);
  197. if (rc != MQTTCLIENT_SUCCESS)
  198. {
  199. log_dbg("%s, MQTTClient_subscribe fail, rc: %d msg:%s", __func__, rc, MQTTClient_strerror(rc));
  200. rc = -1;
  201. }
  202. return rc;
  203. }
  204. int mqtt_get_state()
  205. {
  206. return MDL.mqtt.sm.state;
  207. }
  208. int mqtt_get_tz()
  209. {
  210. return MDL.mqtt.timezone;
  211. }
  212. /* tx ringbuffer handle */
  213. void mqtt_init_txbuf()
  214. {
  215. mqtt_ringbuffer_init(&mqtt_txbuf);
  216. }
  217. void mqtt_lock_txbuf()
  218. {
  219. pthread_mutex_lock(&mqtt_txbuf_mutex);
  220. }
  221. void mqtt_unlock_txbuf()
  222. {
  223. pthread_mutex_unlock(&mqtt_txbuf_mutex);
  224. }
  225. void mqtt_queue_txbuf(mqtt_ringbuffer_element_t data)
  226. {
  227. mqtt_ringbuffer_queue(&mqtt_txbuf, data);
  228. }
  229. int mqtt_dequeue_txbuf(mqtt_ringbuffer_element_t *data)
  230. {
  231. return mqtt_ringbuffer_dequeue(&mqtt_txbuf, data);
  232. }
  233. int mqtt_peek_txbuf(mqtt_ringbuffer_element_t *data, mqtt_ringbuffer_size_t index)
  234. {
  235. return mqtt_ringbuffer_peek(&mqtt_txbuf, data, 0);
  236. }
  237. int mqtt_get_cmd()
  238. {
  239. return MDL.mqtt.cmd;
  240. }
  241. void mqtt_reset_cmd()
  242. {
  243. MDL.mqtt.cmd = CMD_SM_DONE;
  244. }
  245. /* rx ringbuffer handle */
  246. void mqtt_init_rxbuf()
  247. {
  248. mqtt_ringbuffer_init(&mqtt_rxbuf);
  249. }
  250. void mqtt_lock_rxbuf()
  251. {
  252. pthread_mutex_lock(&mqtt_rxbuf_mutex);
  253. }
  254. void mqtt_unlock_rxbuf()
  255. {
  256. pthread_mutex_unlock(&mqtt_rxbuf_mutex);
  257. }
  258. void mqtt_queue_rxbuf(mqtt_ringbuffer_element_t data)
  259. {
  260. mqtt_ringbuffer_queue(&mqtt_rxbuf, data);
  261. }
  262. int mqtt_dequeue_rxbuf(mqtt_ringbuffer_element_t *data)
  263. {
  264. return mqtt_ringbuffer_dequeue(&mqtt_rxbuf, data);
  265. }
  266. int mqtt_peek_rxbuf(mqtt_ringbuffer_element_t *data, mqtt_ringbuffer_size_t index)
  267. {
  268. return mqtt_ringbuffer_peek(&mqtt_rxbuf, data, 0);
  269. }
  270. int mqtt_pub(char *sztopic, char *szpayload)
  271. {
  272. double pub_time;
  273. int ret = 0;
  274. int rc;
  275. struct mqtt_t *dev = &MDL.mqtt;
  276. MQTTClient_message msg = MQTTClient_message_initializer;
  277. dev->pub_starttime = mqtt_get_timeofday();
  278. msg.payload = szpayload;
  279. msg.payloadlen = (int)strlen(szpayload);
  280. msg.qos = 1;
  281. msg.retained = 0;
  282. rc = MQTTClient_publishMessage(dev->cli, sztopic, &msg, &dev->token);
  283. if (rc != MQTTCLIENT_SUCCESS)
  284. {
  285. log_dbg("%s, Failed to publish message: topic %s, payload %s, error msg : %s\n", __func__, sztopic, szpayload, MQTTClient_strerror(rc));
  286. dev->pub_failed++;
  287. ret = -2;
  288. goto leave;
  289. }
  290. rc = MQTTClient_waitForCompletion(dev->cli, dev->token, 100000L);
  291. if (rc != MQTTCLIENT_SUCCESS)
  292. {
  293. log_dbg("%s, MQTTClient_waitForCompletion Failed, topic %s, payload %s, error msg : %s\n", __func__, sztopic, szpayload, MQTTClient_strerror(rc));
  294. dev->pub_failed++;
  295. ret = -2;
  296. goto leave;
  297. }
  298. else
  299. {
  300. dev->pub_endtime = mqtt_get_timeofday();
  301. pub_time = dev->pub_endtime - dev->pub_starttime;
  302. dev->pub_totalcnt += 1;
  303. dev->pub_totaltime += pub_time;
  304. dev->pub_ave = dev->pub_totaltime / dev->pub_totalcnt;
  305. if (pub_time > dev->pub_max)
  306. {
  307. dev->pub_max = pub_time;
  308. }
  309. if (dev->pub_totalcnt > 1000000)
  310. {
  311. dev->pub_totalcnt = 0.0;
  312. dev->pub_totaltime = 0.0;
  313. dev->pub_ave = 0.0;
  314. dev->pub_max = 0.0;
  315. }
  316. if (dev->pub_failed > dev->pub_maxFailcnt)
  317. {
  318. dev->pub_maxFailcnt = dev->pub_failed;
  319. }
  320. dev->pub_totalFailcnt += dev->pub_failed;
  321. dev->pub_failed = 0;
  322. }
  323. leave:
  324. if (dev->dbg && ret != 0)
  325. {
  326. log_dbg("%s, ret:%d", __func__, ret);
  327. }
  328. return ret;
  329. }
  330. int mqtt_send_sm_cmd(int cmd)
  331. {
  332. MDL.mqtt.cmd = cmd;
  333. log_dbg("%s, cmd:%d", __func__, cmd);
  334. }
  335. static void mqtt_deal_with_cache(void)
  336. {
  337. struct mqtt_t *dev = &MDL.mqtt;
  338. double *txbuf_usage = &dev->txbuf_usage;
  339. mqtt_ringbuffer_element_t e;
  340. int rc = 0;
  341. int cache_item_nb = 0;
  342. int cache_item_idx = 0;
  343. static int count = 0;
  344. if (mqtt_cache_handle == NULL)
  345. {
  346. return;
  347. }
  348. if (*txbuf_usage > TX_BUFF_TO_CACHE_USAGE)
  349. {
  350. // get file memory size
  351. long cache_memroy_size = 0;
  352. mqtt_cache_get_memory_size(mqtt_cache_handle, &cache_memroy_size);
  353. if (cache_memroy_size > CACHE_FILE_MEMORY_SIZE_MAX)
  354. {
  355. return;
  356. }
  357. mqtt_lock_txbuf();
  358. rc = mqtt_peek_txbuf(&e, 0);
  359. mqtt_unlock_txbuf();
  360. if (rc == 1)
  361. {
  362. // write to cache
  363. if (mqtt_cache_write_one_payload(mqtt_cache_handle, MQTT_CACHE_TABLE, e) == 0)
  364. { // if success,delet from buf
  365. mqtt_lock_txbuf();
  366. mqtt_dequeue_txbuf(&e);
  367. mqtt_unlock_txbuf();
  368. }
  369. }
  370. }
  371. else if (*txbuf_usage < CACHE_TO_TX_BUFF_USAGE)
  372. {
  373. rc = mqtt_cache_get_payload_nb(mqtt_cache_handle, MQTT_CACHE_TABLE, &cache_item_nb);
  374. if (cache_item_nb > 0 && rc == 0)
  375. { // have payload in cache
  376. // read one payload
  377. e.sztopic[0] = 0;
  378. e.szpayload[0] = 0;
  379. mqtt_cache_read_one_payload(mqtt_cache_handle, MQTT_CACHE_TABLE, &e, &cache_item_idx);
  380. e.cmd = CMD_MQTT_SENDKV;
  381. // add to txbuf
  382. mqtt_lock_txbuf();
  383. mqtt_queue_txbuf(e);
  384. mqtt_unlock_txbuf();
  385. // delete from cache
  386. mqtt_cache_delete_one_payload(mqtt_cache_handle, MQTT_CACHE_TABLE, cache_item_idx);
  387. count++;
  388. if (count > 500)
  389. {
  390. count = 0;
  391. // free memory
  392. mqtt_cache_free_memory(mqtt_cache_handle);
  393. }
  394. } // else have no data in cache
  395. }
  396. else
  397. {
  398. // do nothing
  399. }
  400. }
  401. static void mqtt_db_cache_thrd_main(void *param)
  402. {
  403. log_dbg("%s, ++", __func__);
  404. // open or cread cache table
  405. mqtt_cache_open(MQTT_CACHE_DATA_BASE, MQTT_CACHE_TABLE, &mqtt_cache_handle);
  406. while (1)
  407. {
  408. mqtt_deal_with_cache();
  409. usleep(10000); /* 10ms */
  410. }
  411. log_dbg("%s, --", __func__);
  412. }
  413. static void *mqtt_thrd_main(void *param)
  414. {
  415. struct mqtt_t *dev = &MDL.mqtt;
  416. pthread_t xthrd;
  417. log_dbg("%s, ++", __func__);
  418. /* reset pub timings */
  419. dev->enable = 1;
  420. dev->pub_totalcnt = 0.0;
  421. dev->pub_totaltime = 0.0;
  422. dev->pub_ave = 0.0;
  423. dev->pub_max = 0.0;
  424. mqtt_init_txbuf();
  425. mqtt_init_rxbuf();
  426. pthread_mutex_init(&mqtt_txbuf_mutex, NULL);
  427. pthread_mutex_init(&mqtt_rxbuf_mutex, NULL);
  428. mqtt_sm_init();
  429. while (1)
  430. {
  431. mqtt_sm();
  432. usleep(10000); /* 10ms */
  433. }
  434. log_dbg("%s, --", __func__);
  435. return NULL;
  436. }
  437. static int mqtt_dbcb_0(void *para, int ncolumn, char **columnvalue, char *columnname[])
  438. {
  439. int i;
  440. struct dbcbparam_t *pcbparam = (struct dbcbparam_t *)para;
  441. struct mqtt_t *dev = &MDL.mqtt;
  442. pcbparam->nrow++;
  443. log_dbg("%s, ++,row:%d, col:%d", __func__, pcbparam->nrow, ncolumn);
  444. if (pcbparam->nrow > 1)
  445. {
  446. log_dbg("%s, mqtt cfg rows is more than 1!", __func__);
  447. return -1;
  448. }
  449. for (i = 0; i < ncolumn; i++)
  450. {
  451. if (strcmp("enable", columnname[i]) == 0)
  452. {
  453. dev->enable = atoi(columnvalue[i]);
  454. }
  455. else if (strcmp("servip", columnname[i]) == 0)
  456. {
  457. strcpy(dev->szservip, columnvalue[i]);
  458. }
  459. else if (strcmp("servport", columnname[i]) == 0)
  460. {
  461. dev->servport = atoi(columnvalue[i]);
  462. }
  463. else if (strcmp("clientid", columnname[i]) == 0)
  464. {
  465. strcpy(dev->szclientid, columnvalue[i]);
  466. }
  467. else if (strcmp("username", columnname[i]) == 0)
  468. {
  469. strcpy(dev->szusername, columnvalue[i]);
  470. }
  471. else if (strcmp("passwd", columnname[i]) == 0)
  472. {
  473. strcpy(dev->szpasswd, columnvalue[i]);
  474. }
  475. else if (strcmp("timezone", columnname[i]) == 0)
  476. {
  477. dev->timezone = atoi(columnvalue[i]);
  478. }
  479. }
  480. pcbparam->ret = 0;
  481. log_dbg("%s, mqtt config : %s, --,ret:%d", __func__, dev->szservip, pcbparam->ret);
  482. log_dbg("%s, --,ret:%d", __func__, pcbparam->ret);
  483. return 0;
  484. }
  485. int mqtt_init()
  486. {
  487. pthread_t xthrd;
  488. int rc = 0;
  489. int ret = 0;
  490. struct mqtt_t *dev = &MDL.mqtt;
  491. char *errmsg = NULL;
  492. char sql[1024];
  493. struct dbcbparam_t cbparam;
  494. sqlite3 *db = NULL;
  495. log_dbg("%s, ++", __func__);
  496. // plt_lock_projdb();
  497. // db = plt_get_projdb();
  498. // sprintf(sql, "select * from mqtt");
  499. // cbparam.nrow = 0;
  500. // rc = sqlite3_exec(db, sql, mqtt_dbcb_0, (void *)&cbparam, &errmsg);
  501. // plt_unlock_projdb();
  502. // if (rc != SQLITE_OK)
  503. // {
  504. // ret = -1;
  505. // }
  506. // else if (cbparam.ret != 0)
  507. // {
  508. // ret = -2;
  509. // }
  510. // else
  511. {
  512. // sprintf(dev->szclientid, "ctn-%d-%s", ctn[1].idx_in_ess, ctn[1].szprojId);
  513. if (pthread_create(&xthrd, NULL, mqtt_thrd_main, NULL) != 0)
  514. {
  515. log_dbg("%s, create mqtt thrd main fail", __func__);
  516. ret = -1;
  517. }
  518. }
  519. log_dbg("%s--, ret:%d", __func__, ret);
  520. return ret;
  521. }
  522. int mqtt_get_txbuf_used(void)
  523. {
  524. return mqtt_ringbuffer_num_items(&mqtt_txbuf);
  525. }
  526. int mqtt_get_txbuf_size(void)
  527. {
  528. return mqtt_ringbuffer_size(&mqtt_txbuf);
  529. }
  530. int mqtt_get_rxbuf_used(void)
  531. {
  532. return mqtt_ringbuffer_num_items(&mqtt_rxbuf);
  533. }
  534. int mqtt_get_rxbuf_size(void)
  535. {
  536. return mqtt_ringbuffer_size(&mqtt_rxbuf);
  537. }
  538. char *mqtt_get_state_str(void)
  539. {
  540. return MDL.mqtt.sm.szstate;
  541. }
  542. int mqtt_get_stp(void)
  543. {
  544. return MDL.mqtt.sm.step;
  545. }
  546. char *mqtt_get_err_str(void)
  547. {
  548. return MDL.mqtt.sm.szerrcode;
  549. }
  550. int mqtt_get_tick(void)
  551. {
  552. return MDL.mqtt.sm.tick;
  553. }
  554. double mqtt_get_timing_ave(void)
  555. {
  556. return MDL.mqtt.sm.timing_ave;
  557. }
  558. double mqtt_get_timing_cur(void)
  559. {
  560. return MDL.mqtt.sm.timing_cur;
  561. }
  562. double mqtt_get_timing_max(void)
  563. {
  564. return MDL.mqtt.sm.timing_max;
  565. }
  566. int mqtt_get_enable(void)
  567. {
  568. return MDL.mqtt.enable;
  569. }
  570. char *mqtt_get_servip_str(void)
  571. {
  572. return MDL.mqtt.szservip;
  573. }
  574. int mqtt_get_servport(void)
  575. {
  576. return MDL.mqtt.servport;
  577. }
  578. char *mqtt_get_client_id(void)
  579. {
  580. return MDL.mqtt.szclientid;
  581. }
  582. double mqtt_get_txbuf_usage(void)
  583. {
  584. return MDL.mqtt.txbuf_usage;
  585. }
  586. char *mqtt_get_access_token(void)
  587. {
  588. return MDL.mqtt.szaccesstoken;
  589. }
  590. int mqtt_get_tool_data(char *buf)
  591. {
  592. struct mqtt_t *dev = &MDL.mqtt;
  593. struct statemachine_t *sm = &dev->sm;
  594. char buf_temp[8192];
  595. sprintf(buf, " MQTT ");
  596. sm_get_summary(sm, buf_temp, sizeof(buf_temp));
  597. strcat(buf, buf_temp);
  598. sprintf(buf_temp, " en:%d tz:%d servip:%s servport:%d clientid:%s accesstoken:%s txbufusage:%.1f rxbufusage:%.1f\n",
  599. dev->enable, dev->timezone, dev->szservip, dev->servport, dev->szclientid, dev->szaccesstoken, dev->txbuf_usage, dev->rxbuf_usage);
  600. strcat(buf, buf_temp);
  601. return 0;
  602. }
  603. int mqtt_set_dbg(int val)
  604. {
  605. struct mqtt_t *dev = &MDL.mqtt;
  606. dev->dbg = val;
  607. return 0;
  608. }