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 消息作为响应
我想向 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 消息作为响应