开源MQTT托管形态设备接入物联网平台时,需使用自定义的Username、Password、SN信息作为设备密钥进行设备身份认证。本文以C语言代码为例,基于开源MQTT库(paho.mqtt.c),介绍设备接入开源MQTT托管型实例。
使用前必读
本文操作步骤以普通用户权限为例。如果您在操作过程中涉及到管理员权限才能执行的操作,可尝试使用sudo
命令执行。
前提条件
已完成以下操作:
背景信息
仅需要使用MQTT连接和消息上下行的场景中,为降低使用成本,设备接入物联网平台MQTT型企业版实例时,可使用Username、Password、SN信息作为设备密钥进行设备身份认证。
准备工作
本文示例支持使用C开发环境:Ubuntu 18.04或20.04版本操作系统。
操作步骤
执行以下命令,安装依赖库。
sudo apt-get install build-essential gcc make cmake cmake-gui cmake-curses-gui sudo apt-get install libssl-dev
执行以下命令,安装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 ..
编写设备模拟程序文件
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; }
在以上代码中配置实际设备相关参数。
参数
说明
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。
编译运行。
gcc -o aiot_mqtt_demo aiot_mqtt_demo.c -lpaho-mqtt3cs ./aiot_mqtt_demo
运行成功后,设备的状态即为在线。