#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);