Azure 云中的 MQTT 代理

MQTT broker in Azure cloud

我有一个带有 MQTT 客户端的后端设备连接到开源 MQTT 代理 (Mosquitto)。另一方面,我有许多带有 GUI 应用程序的前端设备(PC、平板电脑、手机)也连接到代理。所以这里 Mosquitto 充当后端设备和前端设备之间的通信点,只是在它们之间转发消息。有时传输的数据量可能非常高(例如 1 MB / 分钟)。

一台后端设备+多台前端设备就是一次安装。我需要为同时运行的数千个此类安装准备基础设施。所以我的服务需要非常可扩展。我的公司使用 Azure 云解决方案,所以我开始学习这个解决方案,我必须承认我有点困惑。我读过我需要使用 IoT Hub,但它需要 MQTT 网关才能与 MQTT 设备通信。另一方面,如果我理解得很好,网关需要在某些 VM 上 运行,所以在这里我失去了解决方案的可扩展性。我对吗?现在,如果我需要支持 100k 或 500k 设备,那么我将需要另一个 VM?还有一件事是我需要将所有这些与一些 Web 服务集成(用于管理后端和前端设备),所以我需要在 Web 服务和 MQTT 代理之间建立一些连接...

在我开始使用 Azure 之前,我想象过,我将简单地启动一个 MQTT 代理服务,神奇的是它具有高度可扩展性,并且能够为数千台设备提供服务。

谁能告诉我怎么咬那个?

目前 Azure 中没有对 MQTT 协议的官方支持,只有 public 支持 AMQP 和 HTTP 的 IoT Hub 预览版。 为了将 MQTT 设备连接到物联网中心,Microsoft 提供了一个名为 "framework" 的物联网协议网关 (https://github.com/Azure/azure-iot-protocol-gateway),它在 MQTT 和 AMQP 之间执行协议转换。 IoT 协议网关可以作为 Azure 工作者角色安装在本地或云端。在第二个场景中,您拥有 Azure 提供的可伸缩性和与辅助角色实例相关的功能。 由于 IoT 中心(仍处于 public 预览版)和 IoT 协议网关本身的生命周期较短,此解决方案绝对是新的。

您的第一个解决方案基于使用您应该安装在 VM 中的第三方 MQTT 代理(如 mosquitto)。 AFAIK mosquitto 不像 HiveMQ 代理那样支持集群(请参阅此处的另一个回复:Cluster forming with Mosquitto broker)。

关于 Web 服务和 MQTT 代理之间的连接的最后一件事。 在这种情况下,Web 服务应使用您需要包含在 Web 服务本身中的 MQTT 客户端将对他的调用(从前端)转换为在 MQTT 代理上发布的消息。

即使使用 AWS,以下 link 也可能有用: https://groups.google.com/forum/#!topic/mqtt/19jqofoPLro

保罗.

Azure IoT 中心现在以本地方式处理 MQTT。不再需要协议网关。 https://azure.microsoft.com/en-us/documentation/articles/iot-hub-mqtt-support/

如果您刚刚花了最后一个小时尝试形成 MQTT 用户名和密码,这将对您有很大帮助: https://github.com/Azure/azure-content/blob/master/articles/iot-hub/iot-hub-devguide.md#example

Example:

Username (DeviceId is case sensitive): iothubname.azure-devices.net/DeviceId

Password (Generate SAS with Device Explorer): SharedAccessSignature sr=iothubname.azure-devices.net%2fdevices%2fDeviceId&sig=kPszxZZZZZZZZZZZZZZZZZAhLT%2bV7o%3d&se=1487709501

在 Windows 上使用 PahoMQTT.fx 进行了测试。我无法使用 mosquitto 对其进行身份验证,我已经付出了合理的努力,甚至尝试使用 stunnel 以防万一 mosquitto 的 TLS 支持'不要削减它。 Mosquitto 可能没有正确处理长密码或类似的东西。它会引发身份验证错误。转义 %& 没有帮助。

如果有人让 Mosquitto 与 Azure IoT Hub 一起工作,请睁大眼睛。

...有人做了(感谢 Timothy 的评论)

Mosquitto_pub works, I verified by monitoring with Device Explorer Twin. Example:

mosquitto_pub -h IOTHubACMxxx.azure-devices.net
    -p 8883
    --cafile "C:\Users\jlaird\Documents\dev\azureca.crt"
    -t devices/eACM1/messages/events/
    -m "john says hello to azure from mosquitto"
    -i eACM1
    -u IOTHubACMxxx.azure-devices.net/eACM1/?api-version=2018-06-30
    -P "SharedAccessSignature sr=IOTHubACMxxx.azure-devices.net&sig=obfuscate&se=1593013589&skn=device"