我正在尝试编写一个小应用程序来模拟许多设备通过MQTT协议连接和发送消息到物联网集线器,使用azure物联网设备-设备-客户端sdk版本: 1.3.31。最终,这将是多线程,它将有数千个模拟设备同时连接。这在设备客户端sdk看来是不可能的。设备sdk可以这样使用吗?
IotHubClientProtocol protocol = IotHubClientProtocol.MQTT;
List<String> conns = new ArrayList<>();
//conns.add() 10 times with correct connection strings
conns.forEach((newConnString) -> {
try {
DeviceClient client = new DeviceClient(newConnString, protocol);
client.open();
System.out.println("connected - "+newConnString);
} catch (Exception e) {
e.printStackTrace();
}
});当我运行这个程序时,我会看到与其他设备连接的所有设备都会因为这个错误而被迫断开连接:
无法订阅主题:设备/sim_3/messages/devicebound/#,因为在com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection.open(MqttIotHubConnection.java:140) at com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttTransport.open(MqttTransport.java:83) at com.microsoft.azure.sdk.iot.device.DeviceIO.open(DeviceIO.java:212) atcom.microsoft.azure.sdk.iot.device.DeviceClient.open(DeviceClient.java:197) at com.company.Main.lambda$main$0(Main.java:49) at java.util.ArrayList.forEach(ArrayList.java:1249) at com.company.Main.main(Main.java:45)
发布于 2017-07-24 07:55:39
除了Rita的答案之外,我还建议为每个模拟MQTT设备使用自己的AppDomain和轻量级(raw) MQTT客户端库(例如M2Mqtt)。这个概念已在Azure IoT集线器测试仪中使用,其中每个MQTT设备被隔离、托管、订阅并在自己的AppDomain中发布。下面的屏幕片段显示了连接到Azure IoT集线器的30个虚拟MQTT设备:

发布于 2017-07-24 05:43:31
对于MQTT协议,不支持在同一个TLS连接上同时连接多个设备。
IoT集线器只支持每个设备一个活动的MQTT连接。代表同一设备ID的任何新的MQTT连接都会导致IoT集线器删除现有连接。
对于用例,可以选择AMQP。它支持跨设备的连接多路复用。
参考文献:选择通信协议.
https://stackoverflow.com/questions/45250232
复制相似问题