diff --git a/doc/08.QCloud_IoTHub_Quick_Start.md b/doc/08.QCloud_IoTHub_Quick_Start.md index 4dc9ced9bef9223992fb471ac1d66ccb033b7ead..ac3bf0d0706c8c639f8c86f9c6c11136f114a431 100644 --- a/doc/08.QCloud_IoTHub_Quick_Start.md +++ b/doc/08.QCloud_IoTHub_Quick_Start.md @@ -200,7 +200,7 @@ Client和Broker之间的发布和订阅是根据主题(Topic)来进行的, 不 在本节中, 我们介绍如何使用腾讯TencentOS tiny与腾讯云通过MQTT进行通信. -腾讯IoT OS集成了对MQTT和腾讯云的支持, 开发者只需要通过简单的设置即可实现与腾讯云的通信, 整体步骤主要包含: +TencentOS Tiny 集成了对MQTT和腾讯云的支持, 开发者只需要通过简单的设置即可实现与腾讯云的通信, 整体步骤主要包含: - 项目工程中添加MQTT组件相关文件 - 适配AT HAL层串口及网络接口函数 @@ -209,15 +209,9 @@ Client和Broker之间的发布和订阅是根据主题(Topic)来进行的, 不 **项目工程中添加MQTT组件相关文件** -在工程中新建`hal`、`at`和`mqtt`组, 并添加下列源文件,可以参考TencentOS_tiny\board\TencentOS_tiny_EVB_MX\KEIL\tencent_os_mqtt工程: +在工程添加hal、at、devices、和mqtt client源码, 可以参考TencentOS-tiny\board\TencentOS_tiny_EVB_MX_Plus\KEIL\mqttclient工程 -![](image/iothub_guide/mqtt_file.png) -上述文件分别位于`TencentOS_tiny\net\at`, `TencentOS_tiny\components\connectivity\Eclipse-Paho-MQTT`和`TencentOS_tiny\platform\hal\st\stm32l4xx\src`目录下. - -相应的, 也需要引入对应的头文件 - -![](image/iothub_guide/mqtt_header.png) **适配AT HAL层串口及网络接口函数** @@ -278,23 +272,16 @@ esp8266_sal_init(hal_uart_port_t uart_port); ![](image/iothub_guide/dev_info.png) -开发者在终端节点开发过程中, 可以自行修改MQTT配置文件`mqtt_config.h` +开发者在终端节点开发过程中, 可以自行修改MQTT配置参数 ```shell -#ifndef TOS_MQTT_CONFIG_H -#define TOS_MQTT_CONFIG_H - -#define MQTT_SERVER_IP "111.230.189.156" -#define MQTT_SERVER_PORT "1883" -#define MQTT_PRODUCT_ID "25KCIUIR1G" -#define MQTT_DEV_NAME "dev1" -#define MQTT_CLIENT_ID "25KCIUIR1Gdev1" -#define MQTT_USR_NAME "25KCIUIR1Gdev1;12010126;R2MUQ;1618721647" -#define MQTT_PASSWORD "bd9755216393179086306766bf7d428dca7d6a1c8a78b305adc281706a5eb963;hmacsha256" -#define MQTT_SUBSCRIBE_TOPIC "25KCIUIR1G/dev1/control" -#define MQTT_PUBLISH_TOPIC "25KCIUIR1G/dev1/event" - -#endif +#define IOTHUB_MQTT_IP "111.230.189.156" +#define IOTHUB_MQTT_PORT "1883" +#define IOTHUB_MQTT_CLIENT_ID "KHHIXM0JJ5dev001" +#define IOTHUB_MQTT_USERNAME "KHHIXM0JJ5dev001;12010126;9K3WO;1647628324" +#define IOTHUB_MQTT_PASSWD "53696f22a061ed2524b1de185815ad2fcae7739afd3f395cb6131521da7f0bb7;hmacsha256" +#define IOTHUB_MQTT_PUB_TOPIC "KHHIXM0JJ5/dev001/data" +#define IOTHUB_MQTT_SUB_TOPIC "KHHIXM0JJ5/dev001/control" ``` 如上所示, 需要腾讯云设备信息自行修改`Product ID`, `Device Name`和`Password`,`MQTT_USR_NAME`,`MQTT_PASSWORD`,`MQTT_SUBSCRIBE_TOPIC`,`MQTT_PUBLISH_TOPIC`,订阅/发布的topic, 如果采用默认的control和event如图即可, 也可自行设置. 开发者将其放置到自己的工程目录下任意位置并在工程中添加头文件引用即可. @@ -304,88 +291,93 @@ esp8266_sal_init(hal_uart_port_t uart_port); 以下是与腾讯云对接并收发信息的例程: ```c -void mqtt_demo(void) +/* Tencent IoThub Device Info */ +#define IOTHUB_MQTT_IP "111.230.189.156" +#define IOTHUB_MQTT_PORT "1883" +#define IOTHUB_MQTT_CLIENT_ID "KHHIXM0JJ5dev001" +#define IOTHUB_MQTT_USERNAME "KHHIXM0JJ5dev001;12010126;9K3WO;1647628324" +#define IOTHUB_MQTT_PASSWD "53696f22a061ed2524b1de185815ad2fcae7739afd3f395cb6131521da7f0bb7;hmacsha256" +#define IOTHUB_MQTT_PUB_TOPIC "KHHIXM0JJ5/dev001/data" +#define IOTHUB_MQTT_SUB_TOPIC "KHHIXM0JJ5/dev001/control" + +static void tos_topic_handler(void* client, message_data_t* msg) { - int count = 1; - int sock_id = 0; - uint8_t read_data[40]; - int read_len; - char topic[30]; - char buffer[32]; - - mqtt_con_param_t con_param; - con_param.keep_alive_interval = 2000; - con_param.cleansession = 1; - con_param.username = MQTT_USR_NAME; - con_param.password = MQTT_PASSWORD; - con_param.client_id = MQTT_CLIENT_ID; - - mqtt_pub_param_t pub_param; - pub_param.dup = 0; - pub_param.qos = 0; - pub_param.retained = 0; - pub_param.id = 0; - pub_param.topic = MQTT_PUBLISH_TOPIC; - - mqtt_sub_param_t sub_param; - sub_param.count = 1; - sub_param.dup = 0; - sub_param.id = 1; - sub_param.req_qos = 0; - sub_param.topic = MQTT_SUBSCRIBE_TOPIC; + (void) client; + MQTT_LOG_I("-----------------------------------------------------------------------------------"); + MQTT_LOG_I("%s:%d %s()...\ntopic: %s, qos: %d. \nmessage:\n\t%s\n", __FILE__, __LINE__, __FUNCTION__, + msg->topic_name, msg->message->qos, (char*)msg->message->payload); + MQTT_LOG_I("-----------------------------------------------------------------------------------\n"); +} + +void mqttclient_task(void) +{ + int error; + + char buf[100] = { 0 }; + + mqtt_client_t *client = NULL; + + mqtt_message_t msg; + + memset(&msg, 0, sizeof(msg)); + #ifdef USE_ESP8266 esp8266_sal_init(HAL_UART_PORT_0); - esp8266_join_ap("SheldonDai", "srnr6x9xbhmb0"); + esp8266_join_ap("Mculover666", "mculover666"); #endif #ifdef USE_NB_BC35 int bc35_28_95_sal_init(hal_uart_port_t uart_port); bc35_28_95_sal_init(HAL_UART_PORT_0); #endif - - sock_id = tos_mqtt_connect(MQTT_SERVER_IP, MQTT_SERVER_PORT, &con_param); - - printf("socket id: %d\r\n",sock_id); - - if (tos_mqtt_subscribe(sock_id, &sub_param) != 0) { - printf("subscribe failed!!!\n"); + +#ifdef USE_EC600S + ec600s_sal_init(HAL_UART_PORT_0); +#endif + + + mqtt_log_init(); + + client = mqtt_lease(); + + mqtt_set_port(client, IOTHUB_MQTT_PORT); + mqtt_set_host(client, IOTHUB_MQTT_IP); + mqtt_set_client_id(client, IOTHUB_MQTT_CLIENT_ID); + mqtt_set_user_name(client, IOTHUB_MQTT_USERNAME); + mqtt_set_password(client, IOTHUB_MQTT_PASSWD); + mqtt_set_clean_session(client, 1); + + error = mqtt_connect(client); + + MQTT_LOG_D("mqtt connect error is %#x", error); + + mqtt_subscribe(client, IOTHUB_MQTT_SUB_TOPIC, QOS0, tos_topic_handler); + + MQTT_LOG_D("mqtt subscribe error is %#x", error); + + memset(&msg, 0, sizeof(msg)); + + for (;;) { + + sprintf(buf, "welcome to mqttclient, this is a publish test, a rand number: %d ...", random_number()); + + msg.qos = QOS0; + msg.payload = (void *) buf; + + error = mqtt_publish(client, IOTHUB_MQTT_PUB_TOPIC, &msg); + + tos_task_delay(4000); } +} + +void application_entry(void *arg) +{ + mqttclient_task(); while (1) { - memset(buffer, 0, sizeof(buffer)); - - snprintf(buffer, sizeof(buffer), "@%3.1f@%3.1f@%.1f", 25.8,80.6, 90.1); - - printf("publish topic\r\n"); - pub_param.topic = MQTT_PUBLISH_TOPIC; - pub_param.payload = (unsigned char *)buffer; - pub_param.payload_len = sizeof(buffer); - if (tos_mqtt_publish(sock_id, &pub_param) != 0) { - printf("publish failed!!!\n"); - } - - printf("MQTT count: %d\r\n",count); - printf("read buf\r\n"); - read_len = tos_mqtt_receive(topic, sizeof(topic), read_data, sizeof(read_data)); - if (read_len >= 0) { - printf("---------->topic: %s, payload: %s, payload_len: %d\n", topic, read_data, read_len); - } - - count++; - osDelay(1000); + printf("This is a mqtt demo!\r\n"); + tos_task_delay(1000); } } ``` - -可以看到, 其中核心的接口为: - -`tos_mqtt_connect`: 连接腾讯云 - -`tos_mqtt_subscribe`: 订阅Topic - -`tos_mqtt_receive`: 读取订阅消息 - -`tos_mqtt_publish`: 发布消息 - -开发者可以根据自己的业务需求来调用这些接口完成特定的业务逻辑.