2017-07-22 2 views
0

Ich versuche, eine kleine Anwendung zu schreiben, die viele Geräte simuliert, die Nachrichten über MQTT-Protokoll an einen iot-Hub mit der azure iot-device-client sdk-Version verbinden und senden: 1.3.31. Irgendwann wird dies Multithreading sein und es wird Tausende von simulierten Geräten gleichzeitig verbinden. Dies scheint mit dem Geräte-Client sdk nicht möglich zu sein. Kann das Gerät SDK auf diese Weise verwendet werden?Unterstützt das Azure iot-Gerät sdk mehrere Geräte, die gleichzeitig eine Verbindung herstellen?

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(); 
    } 
}); 

Als ich dies laufe ich jedes anderes Gerät erhalte die Verbindung mit dem Rest mit diesem Fehler forcably getrennt bekommen:

java.io.IOException: Unable to subscribe to topic :devices/sim_3/messages/devicebound/# because java.io.EOFExceptionConnection lost at 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) at com.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)

Antwort

1

Für MQTT Protokoll ist es nicht möglich, mehrere Geräte über die gleiche TLS-Verbindung unterstützt Verbindungs gleichzeitig.

IoT Hub only supports one active MQTT connection per device. Any new MQTT connection on behalf of the same device ID causes IoT Hub to drop the existing connection.

Für Ihren Anwendungsfall können Sie AMQP wählen. Es unterstützt Verbindungsmultiplexing über Geräte hinweg.

Ref: choose a communication protocol.

+0

ich unter der Annahme war, dass jeder DeviceClient eine separate MQTT Verbindung machen würde, wie ich für jeden unterschiedliche deviceId/Anmeldeinformationen tun liefern. Außerdem möchten wir auf das Messaging von Geräte-Twin- und Methoden zugreifen, das nicht über AMQP unterstützt wird. – darrickc

1

Zusätzlich zu Ritas Antwort empfehle ich, für jedes simulierte MQTT-Gerät eine eigene AppDomain und eine einfache (rohe) MQTT-Client-Bibliothek zu verwenden (z. B. M2Mqtt). Dieses Konzept wurde in der Azure IoT Hub Tester verwendet, wo jedes MQTT-Gerät isoliert, gehostet, abonniert und in eigener AppDomain veröffentlicht wird. Der folgende Bildschirm Code-Schnipsel zeigt 30 Geräte virtuelle MQTT zum IoT Hub Azure verbunden:

enter image description here

Verwandte Themen