【问题标题】:Connecting a Mosquitto MQTT C client to Azure IoT-hub将 Mosquitto MQTT C 客户端连接到 Azure IoT-hub
【发布时间】:2018-03-21 10:16:46
【问题描述】:

正如标题所述,我在将 Mosquitto MQTT 客户端(用 C 编写)连接到我的 Azure IoT 集线器时遇到了困难。我之前已经设法连接到许多不同的平台(例如 Amazon EC2、ThingsBoard、TheThings.io、SierraWireless 等),所以我知道我的客户端非常可靠。

这里的困难在于我需要某种证书才能被允许连接,但我不确定我需要做什么。

我添加了以下配置以使其正常工作:

mosquitto_opts_set(client, MOSQ_OPT_PROTOCOL_VERSION, "MQTT_PROTOCOL_V311");
mosquitto_tls_set(client, "/home/ca-certificates.crt", NULL, NULL, NULL, NULL);
mosquitto_tls_insecure_set(client, 1);
mosquitto_tls_opts_set(client, 0, "tlsv1", NULL);
mosquitto_username_pw_set(client, "hubname.azure-devices.net/deviceName", "SharedAccessSignature=SharedAccessSignature sr=hubname.azure-devices.net%2Fdevices%2FdeviceName&sig=sigValue&se=1553087157");

在上面的代码中,“hubname”、“deviceName”和“sigValue”当然在我的代码中被替换为实际值。

谁能指出我做错了什么,或者我需要采取哪些其他配置步骤?

【问题讨论】:

    标签: ssl mqtt tls1.2 mosquitto azure-iot-hub


    【解决方案1】:

    我在 Windows 上安装 mosquitto 并成功发送带有命令的消息:

    mosquitto_pub -d -h hubname.azure-devices.net -i "device1" -u "hubname.azure-devices.net/device1" -P "SharedAccessSignature sr=hubname.azure-devices.net%2Fdevices%2Fdevice1&sig=sig&se=1553325061" -m "hi from mosquitto client" -t "devices/device1/messages/events/" -p 8883 --cafile \path-to-cert-file\IoTHubTest.cer -V mqttv311
    

    根据您提供的信息,可能是证书引起的问题。

    Azure IoT Hub 使用 DigiCert Baltimore 根证书来保护设备连接。 (请注意,中国 Azure 没有使用 Cyber​​Trust Root CA。而是仍然使用 WoSign Root CA。

    您可以通过从以下位置复制证书信息来创建此文件 certs.c 在 Azure IoT SDK for C 中。包括行 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE-----,去掉 " 标记 每行的开头和结尾,并删除 \r\n 字符 每行的结尾。

    这里我将它保存为 IoTHubTest.cer。

    希望对你有帮助。

    【讨论】:

    • 我试过这个方法,但我收到这些消息:- 客户端 DiscoverTest4 发送 CONNECT 客户端 DiscoverTest4 收到 CONNACK (5) 连接被拒绝:未授权。
    • @Sanyamkoul 发布一个新问题并描述您做了什么以及您的设置,例如您在 Azure IoT Hub 上注册的身份验证方法设备类型等。我相信有人会帮助您。
    【解决方案2】:

    终于设法让事情正常进行。原来我在没有 SSL 支持的情况下交叉编译了我的 Mosquitto 客户端。所以再次编译安装后,现在这些函数都返回1,就可以连接成功了。

    mosquitto_opts_set(client, MOSQ_OPT_PROTOCOL_VERSION, "MQTT_PROTOCOL_V311");
    mosquitto_tls_set(client, NULL, /etc/ssl/certs, NULL, NULL, NULL);
    mosquitto_tls_insecure_set(client, 1);
    mosquitto_tls_opts_set(client, 0, "tlsv1", NULL);
    mosquitto_username_pw_set(client, "hubname.azure-devices.net/deviceName", "SharedAccessSignature=SharedAccessSignature sr=hubname.azure-devices.net%2Fdevices%2FdeviceName&sig=sigValue&se=1553087157");
    

    【讨论】: