本文介绍:
Azure IoT Hub 对MQTT的支持;
使用MQTT 而不用Azure IoT Hub Device SDK 连接IoT Hub并双向通讯;
使用Azure IoT Hub 的 Device SDK时,SDK封装了常见的 设备到云的消息,从云端控制设备,设备孪生属性等相关操作, 无需关注MQTT中的主题订阅。
IoT Hub必须使用TLS/SSL,因此IoT Hub不支持端口1883通讯,默认采用8883。
IoT Hub 不是完整的MQTT 服务,并没有支持MQTT 3.1.1规范中的所有行为。
IoT Hub 的设备SDK默认使用 Qos 1与IoT Hub交换消息, CleanSession标志默认为0;
SDK中的默认超时时间及其是否可配置:
语言 | 默认的 keep-alive 时间间隔 | 可配置性 |
---|---|---|
Node.js | 180 秒 | 否 |
Java | 230 秒 | 否 |
C | 240 秒 | 是 |
C# | 300 秒 | 是 |
Python | 60 秒 | 否 |
Azure IoT Hub 的特有限制:IoT 中心将服务器端最大超时限制为 29.45 分钟(1767 秒),可设置的客户端最大 keep-alive 值为 1767 / 1.5 = 1177
秒。 任何流量都将重置 keep-alive。 例如,成功的 SAS 令牌刷新会重置 keep-alive
本文参考:https://docs.microsoft.com/zh-cn/azure/iot-hub/iot-hub-mqtt-support
视频演示:
重点图文步骤:
案例:使用MQTTX https://github.com/emqx/MQTTX 和 VS Code 测试Azure IoT Hub
下载并安装MQTTX客户端工具;
下载并安装VS Code 及IoT Hub扩展(请参照文档 https://www.51azure.cloud/post/2020/4/15/azure-iot-hub-1-prepare 中VS Code 部分);
一. 在MQTTX中连接Azure IoT Hub:
1.点击1添加按钮;
2.名称随意输入,此处表示连接的名称,不重复即可。
3.ClientID 填写 IoT Hub中Device ID:
4. 服务器地址为 mqtts,后边地址为IoT Hub的主机名:
5.端口8883
6.用户名
“用户名”字段使用 {iothubhostname}/{device_id}/?api-version=2018-06-30
,其中 {iothubhostname}
是 IoT 中心的完整 CName。
例如,如果 IoT 中心的名称为 sean-iot-hub.azure-devices.net,设备的名称为 Device001,则完整“用户名”字段应包含:
sean-iot-hub.azure-devices.net/Device001/?api-version=2018-06-30
7.密码:
“密码”字段使用 SAS 令牌。 对于 HTTPS 和 AMQP 协议,SAS 令牌的格式是相同的:
SharedAccessSignature sig={signature-string}&se={expiry}&sr={URL-encoded-resourceURI}
可以在VS Code中生成 SAS 或通过Azure cli生成(https://docs.microsoft.com/zh-cn/cli/azure/ext/azure-iot/iot/hub?view=azure-cli-latest#ext-azure-iot-az-iot-hub-generate-sas-token)
在VS Code中,右键设备,生成sas,输入sas有效期,即可在下方的output窗口中出现sas token。
8.SSL/TLS:true
9.证书类型:CA signed server
其余值保持默认即可。
二. 开始向指定的主题发送设备到云的遥测消息
成功建立连接后,设备可以使用 devices/{device_id}/messages/events/
作为主题名称将消息发送到IoT Hub:
可在VS Code中 start monitoring built-in event endpoint 开始监控设备到云的消息:
三.开始订阅 从云到设备的主题,接受云端消息:
若要从 IoT 中心接收消息,设备应使用 devices/{device_id}/messages/devicebound/#
作为 主题筛选器 来进行订阅。
尝试从 VS Code 发送 C2D的消息,选择 send c2d message to device:
在上方输入message内容并按回车:
MQTTX 客户端接收到消息: