2017-07-22 84 views
0

我正在嘗試編寫一個小應用程序來模擬許多設備使用azure iot-device-client sdk版本連接並通過MQTT協議將消息發送到iot集線器:1.3.31。最終這將是多線程的,它將有數以千計的模擬設備同時連接。這對設備客戶端sdk來說似乎不可行。設備sdk可以這樣使用嗎?Azure iot設備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(); 
    } 
}); 

當我運行此我得到了休息越來越forcably斷開與此錯誤連接所有其他設備:

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)

回答

1

對於MQTT協議,它不支持在同一TLS連接來連接多個設備同時。

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.

對於您的用例,您可以選擇AMQP。它支持跨設備的連接複用。

參考文獻:choose a communication protocol

+0

我的假設是每個DeviceClient將進行單獨的MQTT連接,我確實提供針對每個不同的DeviceID /憑證下。此外,我們希望訪問不通過AMQP支持的設備信息和方法信息。 – darrickc

1

除了Rita的回答,我建議使用每個模擬的MQTT設備自己的AppDomain和輕量級(原始)MQTT客戶端庫(例如M2Mqtt)。 此概念已在Azure IoT Hub Tester中使用,其中每個MQTT設備都被隔離,託管,訂閱並在自己的AppDomain中發佈。下面的屏幕片段顯示了連接到物聯網天青座30個虛擬MQTT設備:

enter image description here

相關問題