| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- /*
- * Copyright (C) 2015-2018 Alibaba Group Holding Limited
- *
- * Again edit by rt-thread group
- * Change Logs:
- * Date Author Notes
- * 2019-07-21 MurphyZhao first edit
- */
- #include "rtthread.h"
- #include "dev_sign_api.h"
- #include "mqtt_api.h"
- char DEMO_PRODUCT_KEY[IOTX_PRODUCT_KEY_LEN + 1] = {0};
- char DEMO_DEVICE_NAME[IOTX_DEVICE_NAME_LEN + 1] = {0};
- char DEMO_DEVICE_SECRET[IOTX_DEVICE_SECRET_LEN + 1] = {0};
- void *HAL_Malloc(uint32_t size);
- void HAL_Free(void *ptr);
- void HAL_Printf(const char *fmt, ...);
- int HAL_GetProductKey(char product_key[IOTX_PRODUCT_KEY_LEN + 1]);
- int HAL_GetDeviceName(char device_name[IOTX_DEVICE_NAME_LEN + 1]);
- int HAL_GetDeviceSecret(char device_secret[IOTX_DEVICE_SECRET_LEN]);
- uint64_t HAL_UptimeMs(void);
- int HAL_Snprintf(char *str, const int len, const char *fmt, ...);
- #define EXAMPLE_TRACE(fmt, ...) \
- do { \
- HAL_Printf("%s|%03d :: ", __func__, __LINE__); \
- HAL_Printf(fmt, ##__VA_ARGS__); \
- HAL_Printf("%s", "\r\n"); \
- } while(0)
- static void example_message_arrive(void *pcontext, void *pclient, iotx_mqtt_event_msg_pt msg)
- {
- iotx_mqtt_topic_info_t *topic_info = (iotx_mqtt_topic_info_pt) msg->msg;
- switch (msg->event_type) {
- case IOTX_MQTT_EVENT_PUBLISH_RECEIVED:
- /* print topic name and topic message */
- EXAMPLE_TRACE("Message Arrived:");
- EXAMPLE_TRACE("Topic : %.*s", topic_info->topic_len, topic_info->ptopic);
- EXAMPLE_TRACE("Payload: %.*s", topic_info->payload_len, topic_info->payload);
- EXAMPLE_TRACE("\n");
- break;
- default:
- break;
- }
- }
- static int example_subscribe(void *handle)
- {
- int res = 0;
- const char *fmt = "/%s/%s/user/get";
- char *topic = NULL;
- int topic_len = 0;
- topic_len = strlen(fmt) + strlen(DEMO_PRODUCT_KEY) + strlen(DEMO_DEVICE_NAME) + 1;
- topic = HAL_Malloc(topic_len);
- if (topic == NULL) {
- EXAMPLE_TRACE("memory not enough");
- return -1;
- }
- memset(topic, 0, topic_len);
- HAL_Snprintf(topic, topic_len, fmt, DEMO_PRODUCT_KEY, DEMO_DEVICE_NAME);
- res = IOT_MQTT_Subscribe(handle, topic, IOTX_MQTT_QOS0, example_message_arrive, NULL);
- if (res < 0) {
- EXAMPLE_TRACE("subscribe failed");
- HAL_Free(topic);
- return -1;
- }
- HAL_Free(topic);
- return 0;
- }
- static int example_publish(void *handle)
- {
- int res = 0;
- const char *fmt = "/%s/%s/user/get";
- char *topic = NULL;
- int topic_len = 0;
- char *payload = "{\"message\":\"hello!\"}";
- topic_len = strlen(fmt) + strlen(DEMO_PRODUCT_KEY) + strlen(DEMO_DEVICE_NAME) + 1;
- topic = HAL_Malloc(topic_len);
- if (topic == NULL) {
- EXAMPLE_TRACE("memory not enough");
- return -1;
- }
- memset(topic, 0, topic_len);
- HAL_Snprintf(topic, topic_len, fmt, DEMO_PRODUCT_KEY, DEMO_DEVICE_NAME);
- res = IOT_MQTT_Publish_Simple(0, topic, IOTX_MQTT_QOS0, payload, strlen(payload));
- if (res < 0) {
- EXAMPLE_TRACE("publish failed, res = %d", res);
- HAL_Free(topic);
- return -1;
- }
- HAL_Free(topic);
- return 0;
- }
- static void example_event_handle(void *pcontext, void *pclient, iotx_mqtt_event_msg_pt msg)
- {
- EXAMPLE_TRACE("msg->event_type : %d", msg->event_type);
- }
- /*
- * NOTE: About demo topic of /${productKey}/${deviceName}/user/get
- *
- * The demo device has been configured in IoT console (https://iot.console.aliyun.com)
- * so that its /${productKey}/${deviceName}/user/get can both be subscribed and published
- *
- * We design this to completely demonstrate publish & subscribe process, in this way
- * MQTT client can receive original packet sent by itself
- *
- * For new devices created by yourself, pub/sub privilege also requires being granted
- * to its /${productKey}/${deviceName}/user/get for successfully running whole example
- */
- static int mqtt_example_main(int argc, char *argv[])
- {
- void *pclient = NULL;
- int res = 0;
- int loop_cnt = 0;
- iotx_mqtt_param_t mqtt_params;
- HAL_GetProductKey(DEMO_PRODUCT_KEY);
- HAL_GetDeviceName(DEMO_DEVICE_NAME);
- HAL_GetDeviceSecret(DEMO_DEVICE_SECRET);
- EXAMPLE_TRACE("mqtt example");
- /* Initialize MQTT parameter */
- /*
- * Note:
- *
- * If you did NOT set value for members of mqtt_params, SDK will use their default values
- * If you wish to customize some parameter, just un-comment value assigning expressions below
- *
- **/
- memset(&mqtt_params, 0x0, sizeof(mqtt_params));
- /**
- *
- * MQTT connect hostname string
- *
- * MQTT server's hostname can be customized here
- *
- * default value is ${productKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com
- */
- /* mqtt_params.host = "something.iot-as-mqtt.cn-shanghai.aliyuncs.com"; */
- /**
- *
- * MQTT connect port number
- *
- * TCP/TLS port which can be 443 or 1883 or 80 or etc, you can customize it here
- *
- * default value is 1883 in TCP case, and 443 in TLS case
- */
- /* mqtt_params.port = 1883; */
- /**
- *
- * MQTT request timeout interval
- *
- * MQTT message request timeout for waiting ACK in MQTT Protocol
- *
- * default value is 2000ms.
- */
- /* mqtt_params.request_timeout_ms = 2000; */
- /**
- *
- * MQTT clean session flag
- *
- * If CleanSession is set to 0, the Server MUST resume communications with the Client based on state from
- * the current Session (as identified by the Client identifier).
- *
- * If CleanSession is set to 1, the Client and Server MUST discard any previous Session and Start a new one.
- *
- * default value is 0.
- */
- /* mqtt_params.clean_session = 0; */
- /**
- *
- * MQTT keepAlive interval
- *
- * KeepAlive is the maximum time interval that is permitted to elapse between the point at which
- * the Client finishes transmitting one Control Packet and the point it starts sending the next.
- *
- * default value is 60000.
- */
- /* mqtt_params.keepalive_interval_ms = 60000; */
- /**
- *
- * MQTT write buffer size
- *
- * Write buffer is allocated to place upstream MQTT messages, MQTT client will be limitted
- * to send packet no longer than this to Cloud
- *
- * default value is 1024.
- *
- */
- /* mqtt_params.write_buf_size = 1024; */
- /**
- *
- * MQTT read buffer size
- *
- * Write buffer is allocated to place downstream MQTT messages, MQTT client will be limitted
- * to recv packet no longer than this from Cloud
- *
- * default value is 1024.
- *
- */
- /* mqtt_params.read_buf_size = 1024; */
- /**
- *
- * MQTT event callback function
- *
- * Event callback function will be called by SDK when it want to notify user what is happening inside itself
- *
- * default value is NULL, which means PUB/SUB event won't be exposed.
- *
- */
- mqtt_params.handle_event.h_fp = example_event_handle;
- pclient = IOT_MQTT_Construct(&mqtt_params);
- if (NULL == pclient) {
- EXAMPLE_TRACE("MQTT construct failed");
- return -1;
- }
- res = example_subscribe(pclient);
- if (res < 0) {
- IOT_MQTT_Destroy(&pclient);
- return -1;
- }
- while (1) {
- if (0 == loop_cnt % 20) {
- example_publish(pclient);
- }
- IOT_MQTT_Yield(pclient, 200);
- loop_cnt += 1;
- }
- return 0;
- }
- #ifdef FINSH_USING_MSH
- MSH_CMD_EXPORT_ALIAS(mqtt_example_main, ali_mqtt_sample, ali coap sample);
- #endif
|