Połączenie protokołem MQTT z Azure

0

Cześć,

Pytanie do znawców komunikacji MQTT z Azure. Nie znam się jeszcze na tym i mam pewne wątpliwości.
Chciałbym połączyć się z hubem IOT Azure'a. Z tego co wiem to port do łączenia się to port o numerze 8883.
Pytanie - czy to ten port służy do bezpośredniej komunikacji po MQTT czy może ten port służy do czego innego?
Niby próba połączenia z tym portem po TLS zwraca mi certyfikat *.azure-devices.net, ale nie mam pewności czy to pod ten port mam kierować komunikację MQTT?

W jaki sposób w ogóle używać stringa "HostName=;DeviceID=;SharedAccessKey=*" podczas zestawiania połączenia z Azure? Planuję wykorzystać protokół MQTT w pewnym rozwiązaniu embedded z niewielką ilością pamięci więc chcę to zrobić najprościej i najbardziej niskopoziomowo jak się da.

1

Tak, port 8883 to port MQTT dla Azure IoT Huba. Tak, służy do komunikacji po MQTT z IoT Hubem. Uwaga, komunikacja jest po TLS (więc tu już będą problemy, kiedyś np. ESP8266 sobie niezbyt radziło, nie wiem jak teraz).

Dane z DeviceConnectionString są ci potrzebne do nawiązania komunikacji - w pakiecie CONNECT podczas logowania musisz z tych danych skorzystać. Patrz https://docs.microsoft.com/pl-pl/azure/iot-hub/iot-hub-mqtt-support#using-the-mqtt-protocol-directly-as-a-device.

Aczkolwiek musisz wygenerować sobie SharedAccessToken i to jego się używa jako hasła, a SharedAccessKey służy do wygenerowania tokena. Patrz https://docs.microsoft.com/pl-pl/azure/iot-hub/iot-hub-devguide-security#security-tokens. Stworzenie tokena "samemu" wymaga wyliczania BASE64 i HMAC. Token można sobie wygenerować off-line, zapisać w urządzeniu i go używać - patrz kawałek tego tekstu o bezpośrednim używaniu MQTT, tam jest przykład przez Device Explorera - ale one chyba mają określony czas życia, nie pamiętam czy można zrobić nieskończenie żyjące.

Słowa "najprościej" i "Azure IoT" w jednym akapicie to przesada ;)

0
Ktos napisał(a):

Tak, port 8883 to port MQTT dla Azure IoT Huba. Tak, służy do komunikacji po MQTT z IoT Hubem. Uwaga, komunikacja jest po TLS (więc tu już będą problemy, kiedyś np. ESP8266 sobie niezbyt radziło, nie wiem jak teraz).

(...)
Słowa "najprościej" i "Azure IoT" w jednym akapicie to przesada ;)

Ok, dzięki za odpowiedź. Aktualnie próbuję za pomocą programu mosquitto wysłać coś i odebrać z Azure IoT huba. Wygenerowałem sobie SAS-a i niby udaje się coś wysłać przy pomocy mosquitto_pub ale jeśli chodzi o odebranie tych danych przez mosquitto_sub to coś nie działa. Poniżej jak to wygląda:

Publikowanie stringa daje taki efekt:

Client device received CONNACK (0)
Client device sending PUBLISH (d0, q0, r0, m1, 'devices/device/messages/events/', ... (22 bytes))
Client device sending DISCONNECT

A po stronie subskrybenta:

Client device received CONNACK (0)
Client device sending SUBSCRIBE (Mid: 1, Topic: devices/device/messages/events/, QoS: 0, Options: 0x00)
Client device received SUBACK
Subscribed (mid: 1): 0
Client device sending PINGREQ
Client device received PINGRESP

Gdzieś na jakiejś stronce widziałem, że przychodzą komunikaty PUBLISH po stronie subskrybenta, natomiast u mnie ich nie ma. Pytanko - czy trzeba coś ustawić/wyklikać w Azure IoT hubie na ich stronce, żeby te moje komunikaty przychodziły do mnie?

Edit: Przed chwilą sprawdziłem podobne akcje ale na innym brokerze i tam udaje mi się odbierać to co publikuję. O co biega z tym Azurem że nie działa?

0

A jak wysyłasz na inne topici to działa?

Nie mam teraz możliwości sprawdzić, ale ja mam wrażenie, że devices/{deviceId}/messages/events/ jest specjalnym topiciem na który wysyłasz dane, które potem mogą być przekazywane do Event Hub, Azure Storage czy innych rzeczy. Ogólnie: nie traktuj IoT Huba jako "zwykłego" brokera MQTT, a bardziej jako coś, do czego wysyłasz dane, które potem są przekazywane gdzieś dalej - zwłaszcza dotyczy to telemetrii.

0

No właśnie tak myślałem - wysyłam SUBSCRIBE albo PUBLISH na brokera i sprawa załatwiona. A tu jednak nie tak.
Czyli ten IoT hub to raczej jakiś multiplekser dla różnych usług Azure'a?

Próbowałem teraz użyć innych topic-ów ale nic to nie zmienia.

1

Przyznam, ze nigdy nie próbowałem używać Azure IoT Huba jako po prostu brokera, bo zawsze mi to było potrzebne tylko aby osiągnąć device-to-cloud i cloud-to-device, a nie device-to-device :) Ale na to wygląda, że rzeczywiście jest tylko "bramką", aby odbierać dane z urządzeń w chmurze (i coś dalej z nimi robić).

Po przegooglaniu trochę znalazłem potwierdzenie: "And although MQTT support is there in IOT Hub, it is not 100% MQTT compatible. Device to Device communication is just no possible!" (https://www.linkedin.com/pulse/how-mqtt-microsoft-azure-iot-hub-satish-pagare/). To samo mniej więcej napisane tutaj: https://georgik.rocks/microsoft-azure-iot-hub-mqtt-device-to-device-communication-is-not-supported/

Więc jeśli potrzebujesz konkretnie "normalnego" MQTT, to Azure IoT Hub może nie być dla ciebie. Aczkolwiek zależy co konkretnie potrzebujesz osiągnąć.

Możesz też zobaczyć jakieś obejście przez Azure Functions: https://channel9.msdn.com/Events/TechDaysOnline/MVP-Led-Techdays-Online/Simplifying-IoT-Hub-device-to-device-communication-with-Azure-Functions

1 użytkowników online, w tym zalogowanych: 0, gości: 1