flutter/dart подключайтесь к Azure через mqtts

#flutter #dart #mqtt #azure-iot-hub

Вопрос:

Я пытаюсь подключиться к нашему серверу MQTT в Azure.

Я использую MQTTBox в качестве нашей тестовой платформы, и он успешно подключается к протоколу: mqtts host: .azure-devices.net/$iothub/пользователь websocket: .azure-devices.net/testdevice/?api-version=2018-06-30 пароль: ‘SharedAccessSignature sr=.azure-устройства.сеть/devices/testdeviceamp;sig=xxxxxxx»

Я попробовал библиотеку mqtt_client, в которой возникла проблема с входом «$» в конечную точку сервера и выводом «»Исключение SocketException: Неудачный поиск хоста: ‘mqttQueue.azure-devices.net/$iothub/websocket » (Ошибка ОС: Нет адреса, связанного с именем хоста, errno = 7)»

 final client = MqttServerClient('<hubname>.azure-devices.net/$iothub/websocket', '');
client.port = 8883;
client.secure = true;

final connMess = MqttConnectMessage()
      .authenticateAs('<hubname>.azure-devices.net/testdevice/?api-version=2018-06-30',
      'SharedAccessSignature sr=<hubname>.azure-devices.net/devices/testdeviceamp;sig=xxxxxxx')
      .withClientIdentifier('testdevice')
      .withWillTopic('devices/testdevice/messages/events/') // If you set this you must set a will message
      .withWillMessage('My Will message')
      .startClean() // Non persistent session for testing
      .withWillQos(MqttQos.atLeastOnce);

client.connectionMessage = connMess;

try {
  await client.connect();
}
 

Я также безуспешно пытался

 final client = MqttServerClient('HostName=<hubname>.azure-devices.net;DeviceId=testDevice;SharedAccessKey=m....Y=','')
 

Любой рабочий пример для Azure в dart/flutter приветствуется, так как я не могу сопоставить заданные параметры Azure с параметрами в библиотеке.

Комментарии:

1. Я подозреваю, что вам нужно передать URL-адрес (например MqttServerClient('wss://<hubname>.azure-devices.net/$iothub/websocke', '') ) в соответствии с примером .

2. Это относится только к веб-сокетам: — (. Для разработчика, для mqtt, имя хоста должно быть ТОЛЬКО именем хоста, готовым для nslookup, а не полностью сформированным URL-адресом с префиксом протокола или любым путем.

3. Я предполагал, что вы используете веб-сайты (ссылка действительно заканчивается /websocket …). Если вы не используете websockets, то включение пути не имеет смысла (так что да, вам нужно будет указать исходное имя хоста/IP и порт).

4. Наконец-то нашел ответ: а) MqttServerClient(‘mqttQueue. azure-устройства. net’, «) без каких-либо путей/протоколов, необходимых в MQTTbox и других тестовых платформах b) .Проверка подлинности(‘<имя концентратора>.azure-devices.net/testdevice, ,…) без протокола, который задокументирован неправильно.

Ответ №1:

 final client = MqttServerClient('<hubname>.azure-devices.net', '');
client.useWebSocket = false;
client.port = 8883;
client.autoReconnect = true;
client.keepAlivePeriod = 3600;

final String user = '<hubname>.azure-devices.net/<your device id>';
late String password; // <== password string is obtained elsewhere
final connMess = MqttConnectMessage()
      .withClientIdentifier(clientIdentifier)
      .startClean();
client.connectionMessage = connMess; 
client.connect(username, password);