mqtt_multi_region-example.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. /*
  2. * Copyright (c) 2014-2016 Alibaba Group. All rights reserved.
  3. * License-Identifier: Apache-2.0
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  6. * not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  13. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. */
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include <stdarg.h>
  22. #include <unistd.h>
  23. #include "iot_import.h"
  24. #include "iot_export.h"
  25. #include "exports/iot_export_cmp.h"
  26. /* Singapore Domain */
  27. #define PRODUCT_KEY_SG "a1eYfJ2QGei"
  28. #define DEVICE_NAME_SG "Test1"
  29. #define DEVICE_SECRET_SG "teVDZgu2T3qnDQ2MeUVqGoBZ3qxKPYHL"
  30. /* Japan Domain */
  31. #define PRODUCT_KEY_JP "a1R9GUtrTPd"
  32. #define DEVICE_NAME_JP "Test1"
  33. #define DEVICE_SECRET_JP "cVhDbPYGoSBIpfnFXjJYKXBtVXa19rRY"
  34. /* America Domain */
  35. #define PRODUCT_KEY_US "a1FGqgmMbcg"
  36. #define DEVICE_NAME_US "Test1"
  37. #define DEVICE_SECRET_US "5jGnXkBY7HeHChZPDZzEHcqIeYdnvPkl"
  38. /* Germany Domain */
  39. #define PRODUCT_KEY_GER "a1jKEbfQ7at"
  40. #define DEVICE_NAME_GER "Test1"
  41. #define DEVICE_SECRET_GER "818ExRExkfDGF8p3ElX3DzSFNBzKnE8F"
  42. /* Shanghai Domain */
  43. #if defined(ON_DAILY)
  44. #define PRODUCT_KEY "gsYfsxQJgeD"
  45. #define DEVICE_NAME "DailyEnvDN"
  46. #define DEVICE_SECRET "y1vzFkEgcuXnvkAfm627pwarx4HRNikX"
  47. #else
  48. #define PRODUCT_KEY "a1IfbZi3oDt"
  49. #define DEVICE_NAME "Test1"
  50. #define DEVICE_SECRET "kuzVoswkUIdb9uXm4T8ykIJushFym8RL"
  51. #endif
  52. char __product_key[PRODUCT_KEY_LEN + 1];
  53. char __device_name[DEVICE_NAME_LEN + 1];
  54. char __device_secret[DEVICE_SECRET_LEN + 1];
  55. /* These are pre-defined topics */
  56. #define TOPIC_UPDATE "/"PRODUCT_KEY"/"DEVICE_NAME"/update"
  57. #define TOPIC_ERROR "/"PRODUCT_KEY"/"DEVICE_NAME"/update/error"
  58. #define TOPIC_GET "/"PRODUCT_KEY"/"DEVICE_NAME"/get"
  59. #define TOPIC_DATA "/"PRODUCT_KEY"/"DEVICE_NAME"/data"
  60. /* These are pre-defined topics format*/
  61. #define TOPIC_UPDATE_FMT "/%s/%s/update"
  62. #define TOPIC_ERROR_FMT "/%s/%s/update/error"
  63. #define TOPIC_GET_FMT "/%s/%s/get"
  64. #define TOPIC_DATA_FMT "/%s/%s/data"
  65. #define MQTT_MSGLEN (1024)
  66. #define EXAMPLE_TRACE(fmt, ...) \
  67. do { \
  68. HAL_Printf("%s|%03d :: ", __func__, __LINE__); \
  69. HAL_Printf(fmt, ##__VA_ARGS__); \
  70. HAL_Printf("%s", "\r\n"); \
  71. } while(0)
  72. static int user_argc;
  73. static char **user_argv;
  74. void event_handle(void *pcontext, void *pclient, iotx_mqtt_event_msg_pt msg)
  75. {
  76. uintptr_t packet_id = (uintptr_t)msg->msg;
  77. iotx_mqtt_topic_info_pt topic_info = (iotx_mqtt_topic_info_pt)msg->msg;
  78. switch (msg->event_type) {
  79. case IOTX_MQTT_EVENT_UNDEF:
  80. EXAMPLE_TRACE("undefined event occur.");
  81. break;
  82. case IOTX_MQTT_EVENT_DISCONNECT:
  83. EXAMPLE_TRACE("MQTT disconnect.");
  84. break;
  85. case IOTX_MQTT_EVENT_RECONNECT:
  86. EXAMPLE_TRACE("MQTT reconnect.");
  87. break;
  88. case IOTX_MQTT_EVENT_SUBCRIBE_SUCCESS:
  89. EXAMPLE_TRACE("subscribe success, packet-id=%u", (unsigned int)packet_id);
  90. break;
  91. case IOTX_MQTT_EVENT_SUBCRIBE_TIMEOUT:
  92. EXAMPLE_TRACE("subscribe wait ack timeout, packet-id=%u", (unsigned int)packet_id);
  93. break;
  94. case IOTX_MQTT_EVENT_SUBCRIBE_NACK:
  95. EXAMPLE_TRACE("subscribe nack, packet-id=%u", (unsigned int)packet_id);
  96. break;
  97. case IOTX_MQTT_EVENT_UNSUBCRIBE_SUCCESS:
  98. EXAMPLE_TRACE("unsubscribe success, packet-id=%u", (unsigned int)packet_id);
  99. break;
  100. case IOTX_MQTT_EVENT_UNSUBCRIBE_TIMEOUT:
  101. EXAMPLE_TRACE("unsubscribe timeout, packet-id=%u", (unsigned int)packet_id);
  102. break;
  103. case IOTX_MQTT_EVENT_UNSUBCRIBE_NACK:
  104. EXAMPLE_TRACE("unsubscribe nack, packet-id=%u", (unsigned int)packet_id);
  105. break;
  106. case IOTX_MQTT_EVENT_PUBLISH_SUCCESS:
  107. EXAMPLE_TRACE("publish success, packet-id=%u", (unsigned int)packet_id);
  108. break;
  109. case IOTX_MQTT_EVENT_PUBLISH_TIMEOUT:
  110. EXAMPLE_TRACE("publish timeout, packet-id=%u", (unsigned int)packet_id);
  111. break;
  112. case IOTX_MQTT_EVENT_PUBLISH_NACK:
  113. EXAMPLE_TRACE("publish nack, packet-id=%u", (unsigned int)packet_id);
  114. break;
  115. case IOTX_MQTT_EVENT_PUBLISH_RECVEIVED:
  116. EXAMPLE_TRACE("topic message arrived but without any related handle: topic=%.*s, topic_msg=%.*s",
  117. topic_info->topic_len,
  118. topic_info->ptopic,
  119. topic_info->payload_len,
  120. topic_info->payload);
  121. break;
  122. case IOTX_MQTT_EVENT_BUFFER_OVERFLOW:
  123. EXAMPLE_TRACE("buffer overflow, %s", msg->msg);
  124. break;
  125. default:
  126. EXAMPLE_TRACE("Should NOT arrive here.");
  127. break;
  128. }
  129. }
  130. static void _demo_message_arrive(void *pcontext, void *pclient, iotx_mqtt_event_msg_pt msg)
  131. {
  132. iotx_mqtt_topic_info_pt ptopic_info = (iotx_mqtt_topic_info_pt) msg->msg;
  133. /* print topic name and topic message */
  134. EXAMPLE_TRACE("----");
  135. EXAMPLE_TRACE("packetId: %d", ptopic_info->packet_id);
  136. EXAMPLE_TRACE("Topic: '%.*s' (Length: %d)",
  137. ptopic_info->topic_len,
  138. ptopic_info->ptopic,
  139. ptopic_info->topic_len);
  140. EXAMPLE_TRACE("Payload: '%.*s' (Length: %d)",
  141. ptopic_info->payload_len,
  142. ptopic_info->payload,
  143. ptopic_info->payload_len);
  144. EXAMPLE_TRACE("----");
  145. }
  146. int mqtt_client(void)
  147. {
  148. int rc = 0, msg_len, cnt = 0;
  149. void *pclient;
  150. iotx_conn_info_pt pconn_info;
  151. iotx_mqtt_param_t mqtt_params;
  152. iotx_mqtt_topic_info_t topic_msg;
  153. char msg_pub[128];
  154. char *msg_buf = NULL, *msg_readbuf = NULL;
  155. char topic_update[IOTX_URI_MAX_LEN] = {0};
  156. char topic_error[IOTX_URI_MAX_LEN] = {0};
  157. char topic_get[IOTX_URI_MAX_LEN] = {0};
  158. char topic_data[IOTX_URI_MAX_LEN] = {0};
  159. if (NULL == (msg_buf = (char *)HAL_Malloc(MQTT_MSGLEN))) {
  160. EXAMPLE_TRACE("not enough memory");
  161. rc = -1;
  162. goto do_exit;
  163. }
  164. if (NULL == (msg_readbuf = (char *)HAL_Malloc(MQTT_MSGLEN))) {
  165. EXAMPLE_TRACE("not enough memory");
  166. rc = -1;
  167. goto do_exit;
  168. }
  169. HAL_GetProductKey(__product_key);
  170. HAL_GetDeviceName(__device_name);
  171. HAL_GetDeviceSecret(__device_secret);
  172. /* Device AUTH */
  173. if (0 != IOT_SetupConnInfo(__product_key, __device_name, __device_secret, (void **)&pconn_info)) {
  174. EXAMPLE_TRACE("AUTH request failed!");
  175. rc = -1;
  176. goto do_exit;
  177. }
  178. HAL_Snprintf(topic_update,IOTX_URI_MAX_LEN,TOPIC_UPDATE_FMT,__product_key,__device_name);
  179. HAL_Snprintf(topic_error,IOTX_URI_MAX_LEN,TOPIC_ERROR_FMT,__product_key,__device_name);
  180. HAL_Snprintf(topic_get,IOTX_URI_MAX_LEN,TOPIC_GET_FMT,__product_key,__device_name);
  181. HAL_Snprintf(topic_data,IOTX_URI_MAX_LEN,TOPIC_DATA_FMT,__product_key,__device_name);
  182. /* Initialize MQTT parameter */
  183. memset(&mqtt_params, 0x0, sizeof(mqtt_params));
  184. mqtt_params.port = pconn_info->port;
  185. mqtt_params.host = pconn_info->host_name;
  186. mqtt_params.client_id = pconn_info->client_id;
  187. mqtt_params.username = pconn_info->username;
  188. mqtt_params.password = pconn_info->password;
  189. mqtt_params.pub_key = pconn_info->pub_key;
  190. mqtt_params.request_timeout_ms = 2000;
  191. mqtt_params.clean_session = 0;
  192. mqtt_params.keepalive_interval_ms = 60000;
  193. mqtt_params.pread_buf = msg_readbuf;
  194. mqtt_params.read_buf_size = MQTT_MSGLEN;
  195. mqtt_params.pwrite_buf = msg_buf;
  196. mqtt_params.write_buf_size = MQTT_MSGLEN;
  197. mqtt_params.handle_event.h_fp = event_handle;
  198. mqtt_params.handle_event.pcontext = NULL;
  199. /* Construct a MQTT client with specify parameter */
  200. pclient = IOT_MQTT_Construct(&mqtt_params);
  201. if (NULL == pclient) {
  202. EXAMPLE_TRACE("MQTT construct failed");
  203. rc = -1;
  204. goto do_exit;
  205. }
  206. /* Initialize topic information */
  207. memset(&topic_msg, 0x0, sizeof(iotx_mqtt_topic_info_t));
  208. strcpy(msg_pub, "update: hello! start!");
  209. topic_msg.qos = IOTX_MQTT_QOS1;
  210. topic_msg.retain = 0;
  211. topic_msg.dup = 0;
  212. topic_msg.payload = (void *)msg_pub;
  213. topic_msg.payload_len = strlen(msg_pub);
  214. rc = IOT_MQTT_Publish(pclient, topic_update, &topic_msg);
  215. if (rc < 0) {
  216. IOT_MQTT_Destroy(&pclient);
  217. EXAMPLE_TRACE("error occur when publish");
  218. rc = -1;
  219. goto do_exit;
  220. }
  221. EXAMPLE_TRACE("\n publish message: \n topic: %s\n payload: \%s\n rc = %d", topic_update, topic_msg.payload, rc);
  222. /* Subscribe the specific topic */
  223. rc = IOT_MQTT_Subscribe(pclient, topic_data, IOTX_MQTT_QOS1, _demo_message_arrive, NULL);
  224. if (rc < 0) {
  225. IOT_MQTT_Destroy(&pclient);
  226. EXAMPLE_TRACE("IOT_MQTT_Subscribe() failed, rc = %d", rc);
  227. rc = -1;
  228. goto do_exit;
  229. }
  230. /* Initialize topic information */
  231. memset(msg_pub, 0x0, 128);
  232. strcpy(msg_pub, "data: hello! start!");
  233. memset(&topic_msg, 0x0, sizeof(iotx_mqtt_topic_info_t));
  234. topic_msg.qos = IOTX_MQTT_QOS1;
  235. topic_msg.retain = 0;
  236. topic_msg.dup = 0;
  237. topic_msg.payload = (void *)msg_pub;
  238. topic_msg.payload_len = strlen(msg_pub);
  239. rc = IOT_MQTT_Publish(pclient, topic_data, &topic_msg);
  240. EXAMPLE_TRACE("\n publish message: \n topic: %s\n payload: \%s\n rc = %d", topic_data, topic_msg.payload, rc);
  241. IOT_MQTT_Yield(pclient, 200);
  242. do {
  243. /* Generate topic message */
  244. cnt++;
  245. msg_len = snprintf(msg_pub, sizeof(msg_pub), "{\"attr_name\":\"temperature\", \"attr_value\":\"%d\"}", cnt);
  246. if (msg_len < 0) {
  247. EXAMPLE_TRACE("Error occur! Exit program");
  248. rc = -1;
  249. break;
  250. }
  251. topic_msg.payload = (void *)msg_pub;
  252. topic_msg.payload_len = msg_len;
  253. rc = IOT_MQTT_Publish(pclient, topic_data, &topic_msg);
  254. if (rc < 0) {
  255. EXAMPLE_TRACE("error occur when publish");
  256. rc = -1;
  257. break;
  258. }
  259. #ifdef MQTT_ID2_CRYPTO
  260. EXAMPLE_TRACE("packet-id=%u, publish topic msg='0x%02x%02x%02x%02x'...",
  261. (uint32_t)rc,
  262. msg_pub[0], msg_pub[1], msg_pub[2], msg_pub[3]
  263. );
  264. #else
  265. EXAMPLE_TRACE("packet-id=%u, publish topic msg=%s", (uint32_t)rc, msg_pub);
  266. #endif
  267. /* handle the MQTT packet received from TCP or SSL connection */
  268. IOT_MQTT_Yield(pclient, 200);
  269. /* infinite loop if running with 'loop' argument */
  270. if (user_argc >= 2 && !strcmp("loop", user_argv[1])) {
  271. HAL_SleepMs(2000);
  272. cnt = 0;
  273. }
  274. } while (cnt < 1);
  275. IOT_MQTT_Yield(pclient, 200);
  276. IOT_MQTT_Unsubscribe(pclient, topic_data);
  277. IOT_MQTT_Yield(pclient, 200);
  278. IOT_MQTT_Destroy(&pclient);
  279. do_exit:
  280. if (NULL != msg_buf) {
  281. HAL_Free(msg_buf);
  282. }
  283. if (NULL != msg_readbuf) {
  284. HAL_Free(msg_readbuf);
  285. }
  286. return rc;
  287. }
  288. int ali_mqtt_region_test(int argc, char **argv)
  289. {
  290. int opt;
  291. char region[5];
  292. int domain_type;
  293. while ((opt = getopt(argc, argv, "r:")) != -1)
  294. {
  295. if ('r' == opt)
  296. {
  297. strncpy(region, optarg, (strlen(optarg)>5)?5:strlen(optarg));
  298. }
  299. else
  300. {
  301. HAL_Printf("usage: mqtt_multi_region-example -r [PARAMTER]\r\n");
  302. HAL_Printf("\t-r sh \t\tSelect Shanghai demain.\r\n");
  303. HAL_Printf("\t-r sg \t\tSelect Singapore demain.\r\n");
  304. HAL_Printf("\t-r jp \t\tSelect Japan demain.\r\n");
  305. HAL_Printf("\t-r us \t\tSelect America demain.\r\n");
  306. HAL_Printf("\t-r ger\t\tSelect Germany demain.\r\n");
  307. return 1;
  308. }
  309. }
  310. if (0 == strncmp(region, "sg", strlen("sg")))
  311. {
  312. domain_type = IOTX_CLOUD_DOMAIN_SG;
  313. HAL_SetProductKey(PRODUCT_KEY_SG);
  314. HAL_SetDeviceName(DEVICE_NAME_SG);
  315. HAL_SetDeviceSecret(DEVICE_SECRET_SG);
  316. EXAMPLE_TRACE("Singapore Domain selected");
  317. }
  318. else if (0 == strncmp(region, "jp", strlen("jp")))
  319. {
  320. domain_type = IOTX_CLOUD_DOMAIN_JP;
  321. HAL_SetProductKey(PRODUCT_KEY_JP);
  322. HAL_SetDeviceName(DEVICE_NAME_JP);
  323. HAL_SetDeviceSecret(DEVICE_SECRET_JP);
  324. EXAMPLE_TRACE("Japan Domain selected");
  325. }
  326. else if (0 == strncmp(region, "us", strlen("us")))
  327. {
  328. domain_type = IOTX_CLOUD_DOMAIN_US;
  329. HAL_SetProductKey(PRODUCT_KEY_US);
  330. HAL_SetDeviceName(DEVICE_NAME_US);
  331. HAL_SetDeviceSecret(DEVICE_SECRET_US);
  332. EXAMPLE_TRACE("America Domain selected");
  333. }
  334. else if (0 == strncmp(region, "ger", strlen("ger")))
  335. {
  336. domain_type = IOTX_CLOUD_DOMAIN_GER;
  337. HAL_SetProductKey(PRODUCT_KEY_GER);
  338. HAL_SetDeviceName(DEVICE_NAME_GER);
  339. HAL_SetDeviceSecret(DEVICE_SECRET_GER);
  340. EXAMPLE_TRACE("Germany Domain selected");
  341. }
  342. else
  343. {
  344. domain_type = IOTX_CLOUD_DOMAIN_SH;
  345. HAL_SetProductKey(PRODUCT_KEY);
  346. HAL_SetDeviceName(DEVICE_NAME);
  347. HAL_SetDeviceSecret(DEVICE_SECRET);
  348. EXAMPLE_TRACE("Shanghai Domain selected");
  349. }
  350. IOT_OpenLog("mqtt");
  351. IOT_SetLogLevel(IOT_LOG_DEBUG);
  352. IOT_SetupDomain(domain_type);
  353. mqtt_client();
  354. IOT_DumpMemoryStats(IOT_LOG_DEBUG);
  355. IOT_CloseLog();
  356. EXAMPLE_TRACE("out of sample!");
  357. return 0;
  358. }