Azure IoT 中心 - 发布和订阅相同的 MQTT 主题

Azure IoT Hub - Publish and subscribe to same MQTT topic

我想向 IoT 中心发布一条消息,并通过同一主题接收消息。我连接到 IoT 中心,然后订阅了我向其发送消息的同一主题,但我没有收到任何消息。作为客户,我正在使用 MQTTX windows。在云端点(遥测数据)正确发送和接收消息。

这是我的 MQTT 客户端的屏幕截图:MQTT Client

Azure IoT 中心不是通用的 MQTT 代理,查看更多详细信息here

我建议您也阅读 Azure IoT Edge MQTT broker 的文档。

更新:

根据你的需要,比如一个round trip time的测试,下面是一个如何实现这个loopback的例子Azure 物联网中心。请注意,Iot Central 应用程序具有 built-in 强大的功能,可在不使用额外的 Azure 资源(例如 Azure 函数)的情况下简化您的测试。

此示例的概念基于以下内容:

  • REST API 用于调用持久命令(排队命令)以生成 C2D 消息。
  • 使用数据转换 将消息导出到 webhook 目标

首先,我们必须为我们的测试创建一个设备模板(在我的示例环回中):

{
"@id": "dtmi:rk2022iotcfree:loopback_24v;1",
"@type": "Interface",
"contents": [
    {
        "@id": "dtmi:rk2022iotcfree:loopback_24v:message;1",
        "@type": "Command",
        "displayName": {
            "en": "Message"
        },
        "name": "message",
        "request": {
            "@type": "CommandPayload",
            "displayName": {
                "en": "Info"
            },
            "name": "Info",
            "schema": {
                "@type": "Object",
                "displayName": {
                    "en": "Object"
                },
                "fields": [
                    {
                        "displayName": {
                            "en": "ts"
                        },
                        "name": "ts",
                        "schema": "dateTime"
                    },
                    {
                        "displayName": {
                            "en": "msg"
                        },
                        "name": "msg",
                        "schema": "string"
                    }
                ]
            }
        },
        "durable": true
    },
    {
        "@id": "dtmi:rk2022iotcfree:loopback_24v:counter;1",
        "@type": "Telemetry",
        "displayName": {
            "en": "Counter"
        },
        "name": "counter",
        "schema": "double"
    },
    {
        "@id": "dtmi:rk2022iotcfree:loopback_24v:time;1",
        "@type": "Telemetry",
        "displayName": {
            "en": "Timestamp"
        },
        "name": "time",
        "schema": "double"
    }
],
"displayName": {
    "en": "loopback"
},
"@context": [
    "dtmi:iotcentral:context;2",
    "dtmi:dtdl:context;2"
]

}

一旦我们有了设备模板,我们就可以创建一个设备(在我的例子中 device1)并分配给这个设备模板(环回)。

现在,我们需要声明一个目标 webhook 端点:

其中 回调 URL 是:

https://2a92220d-42e3-4a73-b700-2cb858c9c5e7.azureiotcentral.com/api/devices/device1/commands/message?api-version=1.2-preview

并且 授权令牌 生成为 IoT Central Api 令牌

下一步是为此目标端点声明数据转换

 import "iotc" as iotc;
 if .device.id == "device1" then
 { 
  request: {
    Info:{
      ts:.enqueuedTime,
      msg:("Feedback from device: id=" + .device.id + ", counter=" + (.telemetry | iotc::find(.name == "counter").value | tostring) + ", time=" + (.telemetry | iotc::find(.name == "time").value | tostring))
    }
  }
}
else
  empty
end  

这就是 IoT Central 应用程序的全部内容。基于上述数据转换,任何从 device1 接收到的遥测数据消息都将导出到 webhook 端点以调用 C2D 消息。

在我的示例中,设备端使用了我的虚拟 MQTT 设备工具(Azure IoT Hub Tester or Azure IoT Central Tester),但也可以使用任何其他类似工具或 MQTT 客户端。

正如您在上面的屏幕片段中看到的,device1 发送了遥测数据,例如 counter时间,设备收到C2D消息:

如上面的屏幕片段所示,有三个时间戳。两个突出显示的时间戳表示往返时间(从设备到 IoT Central 再返回到设备)。第三个表示 IoT Central 应用程序中的时间戳:

Start device:     2022-05-19T13:50:06.4213024Z
IoT Central App:  2022-05-19T13:50:07.107Z
End device:       2022-05-19T13:50:13.6934397Z

我看到您在透明网关模式中使用 MQTTX 作为 IoT Edge 的叶设备,其中 Edge 只会将消息传递到 IoTHub。

IoTHub 不支持自定义主题或回复同一主题,因此此“devices/plc2/messages/events/topic”将不起作用

订阅设备/{device_id}/messages/devicebound/# 将有效,但您需要明确发送该 device_id 的 C2D 消息作为响应