开源MQTT托管设备接入示例

开源MQTT托管形态设备接入物联网平台时,需使用自定义的Username、Password、SN信息作为设备密钥进行设备身份认证。本文以C语言代码为例,基于开源MQTT库(paho.mqtt.c),介绍设备接入开源MQTT托管型实例。

使用前必读

本文操作步骤以普通用户权限为例。如果您在操作过程中涉及到管理员权限才能执行的操作,可尝试使用sudo命令执行。

前提条件

已完成以下操作:

  1. 当前阿里云账号开通的物联网平台服务下已购过MQTT型企业版实例。

    重要

    在当前阿里云账号下:如果有MQTT型企业版实例,可继续使用。如果没有MQTT型企业版实例,不支持新购MQTT型企业版实例。

  2. 创建产品:创建产品时,根据业务需要配置相关参数。

  3. 批量创建设备:在已创建产品下导入设备认证信息SN(可选)、MQTT Username和MQTT Password。

背景信息

仅需要使用MQTT连接和消息上下行的场景中,为降低使用成本,设备接入物联网平台MQTT型企业版实例时,可使用Username、Password、SN信息作为设备密钥进行设备身份认证。

准备工作

本文示例支持使用C开发环境:Ubuntu 18.04或20.04版本操作系统。

操作步骤

  1. 执行以下命令,安装依赖库。

    sudo apt-get install build-essential gcc make cmake cmake-gui cmake-curses-gui
    sudo apt-get install libssl-dev
  2. 执行以下命令,安装MQTT开源库Paho。

    git clone https://github.com/eclipse/paho.mqtt.c.git
    mkdir build && cd build
    cmake ../paho.mqtt.c -DPAHO_WITH_SSL=TRUE -DCMAKE_INSTALL_PREFIX="/usr/lib"
    make -j
    sudo make install && cd ..
  3. 编写设备模拟程序文件aiot_mqtt_demo.c

    该示例代码包含设备使用MQTT协议的建连、断开以及消息的订阅、收发。订阅和发布消息的自定义Topic,需您在物联网平台控制台添加。具体操作,请参见自定义Topic

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include "MQTTClient.h"
    
    int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
    {
        printf("message recv < topic [%s], payload [%s]\n", topicName, (char *)message->payload);
        MQTTClient_freeMessage(&message);
        MQTTClient_free(topicName);
        return 1;
    }
    
    int main(int argc, char* argv[])
    {
        MQTTClient client;
        MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
        MQTTClient_SSLOptions ssl_opts = MQTTClient_SSLOptions_initializer;
        int rc;
    
        /* 创建一个mqtt_client */
        const char *host = "ssl://iot-****.mqtt.iothub.aliyuncs.com:443";
        const char *client_id = "";
        MQTTClient_create(&client, host, client_id, MQTTCLIENT_PERSISTENCE_NONE, NULL);
    
        MQTTClient_setCallbacks(client, NULL, NULL, msgarrvd, NULL);
        /* 配置建连参数:证书、用户名、密码 */
        ssl_opts.trustStore = "root.crt";
        conn_opts.ssl = &ssl_opts;
        conn_opts.username = "test_0001";
        conn_opts.password = "password_0001";
    
        /* mqtt完成建连 */
        if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
            printf("Failed to connect, return code %d\n", rc);
            exit(EXIT_FAILURE);
        }
        printf("connect success username %s, password %s\n", conn_opts.username, conn_opts.password);
    
        /* 订阅消息 */
        MQTTClient_subscribe(client, "/user/aiot_mqtt_demo_downraw", 1);
    
        /* 生成消息并循环发布消息 */
        MQTTClient_message pubmsg = MQTTClient_message_initializer;
        const char *topic = "/user/aiot_mqtt_demo_upraw";
        pubmsg.payload = "Hello Service!";
        pubmsg.payloadlen = (int)strlen(pubmsg.payload);
        pubmsg.qos = 1;
        for(int i = 0; i < 100; i++) {
            MQTTClient_publishMessage(client, topic, &pubmsg, NULL);
            printf("message send > topic [%s], payload [%s]\n", topic, (char *)pubmsg.payload);
            sleep(10);
        }
    
        /* 断开连接并删除client */
        MQTTClient_disconnect(client, 10000);
        MQTTClient_destroy(&client);
        return rc;
    }
  4. 在以上代码中配置实际设备相关参数。

    参数

    说明

    host

    MQTT设备接入地址,格式为ssl://${实例id}.mqtt.iothub.aliyuncs.com:1883

    ${实例id}为实例ID,您可在物联网平台控制台实例概览页面,查看实例的ID值。

    client_id

    客户端ID,需自定义,长度不可超过64个字符。建议使用设备的MAC地址或SN码,方便您识别区分不同的客户端。

    conn_opts.username

    已在物联网平台注册的MQTT Username和MQTT Password。具体内容,请参见批量添加设备:MQTT型实例

    conn_opts.password

    ssl_opts.trustStore

    根证书文件路径。

    您需要下载根证书。根证书说明,请参见CA Certificates

  5. 编译运行。

    gcc -o aiot_mqtt_demo aiot_mqtt_demo.c -lpaho-mqtt3cs
    ./aiot_mqtt_demo

    运行成功后,设备的状态即为在线

    image