Funkcje MQTT obsługiwane przez funkcję brokera MQTT usługi Azure Event Grid
MQTT to protokół transportu komunikatów publikuj-subskrybujący, który został zaprojektowany dla środowisk ograniczonych. Jest ona wydajna, skalowalna i niezawodna, dzięki czemu jest to złoty standard komunikacji w scenariuszach IoT. Broker MQTT obsługuje klientów, którzy publikują i subskrybują komunikaty za pośrednictwem protokołu MQTT w wersji 3.1.1, MQTT 3.1.1 za pośrednictwem obiektów WebSocket, MQTT v5 i MQTT v5 za pośrednictwem protokołu WebSocket. Broker MQTT obsługuje również komunikację między MQTT (MQTT 3.1.1 i MQTT 5).
Protokół MQTT v5 wprowadził wiele ulepszeń dotyczących protokołu MQTT w wersji 3.1.1 w celu zapewnienia bardziej bezproblemowej, przejrzystej i wydajnej komunikacji. Dodano:
- Lepsze raportowanie błędów.
- Bardziej przezroczysti klienci komunikacji za pośrednictwem funkcji, takich jak właściwości użytkownika i typ zawartości.
- Większa kontrola nad klientami za pośrednictwem funkcji, takich jak wygaśnięcie komunikatu i sesji.
- Standardowe ważne wzorce, takie jak wzorzec żądania-odpowiedź.
Przepływ połączenia:
Klienci MQTT muszą łączyć się za pośrednictwem protokołu TLS 1.2 lub TLS 1.3. Próby pominięcia tego kroku kończą się niepowodzeniem z połączeniem.
Podczas nawiązywania połączenia z brokerem MQTT użyj następujących portów podczas komunikacji za pośrednictwem protokołu MQTT:
- MQTT v3.1.1 i MQTT v5 na porcie TCP 8883
- Protokół MQTT w wersji 3.1.1 za pośrednictwem protokołu WebSocket i MQTTv5 za pośrednictwem protokołu WebSocket na porcie TCP 443.
Pakiet CONNECT powinien zawierać następujące właściwości:
- Pole ClientId jest wymagane i powinno zawierać nazwę sesji klienta. Nazwa sesji musi być unikatowa w przestrzeni nazw. Możesz użyć nazwy uwierzytelniania klienta jako nazwy sesji, jeśli każdy klient używa jednej sesji na klienta. Jeśli jeden klient korzysta z wielu sesji, musi używać różnych wartości parametru ClientId dla każdej sesji.
- Pole Nazwa użytkownika jest wymagane, jeśli podczas tworzenia przestrzeni nazw nie wybrano wartości w alternatywnej nazwieAuthenticationNameSources. W takim przypadku należy podać nazwę uwierzytelniania klienta w polu Nazwa użytkownika. Ta nazwa musi być zgodna z podaną nazwą uwierzytelniania i wartością w polu certyfikatu klienta, które zostało określone podczas tworzenia zasobu klienta.
Dowiedz się więcej o uwierzytelnianiu klienta.
Obsługa wielu sesji
Obsługa wielu sesji umożliwia klientom MQTT aplikacji uzyskanie bardziej skalowalnej i niezawodnej implementacji przez połączenie z brokerem MQTT z wieloma aktywnymi sesjami w tym samym czasie.
Konfiguracja przestrzeni nazw
Przed użyciem tej funkcji należy skonfigurować przestrzeń nazw tak, aby zezwalała na wiele sesji na klienta. Wykonaj następujące kroki, aby skonfigurować wiele sesji na klienta w witrynie Azure Portal:
- Przejdź do przestrzeni nazw w witrynie Azure Portal.
- W obszarze Konfiguracja zmień wartość maksymalnej liczby sesji klienta na nazwę uwierzytelniania na żądaną liczbę sesji na klienta.
- Wybierz Zastosuj.
Uwaga
W przypadku konfiguracji interfejsu wiersza polecenia platformy Azure zaktualizuj właściwość MaxClientSessionsPerAuthenticationName w ładunku przestrzeni nazw z żądaną wartością.
Przepływ połączenia:
Pakiety CONNECT dla każdej sesji powinny zawierać następujące właściwości:
- Podaj właściwość Username w pakiecie CONNECT, aby oznaczyć nazwę uwierzytelniania klienta.
- Podaj właściwość ClientID w pakiecie CONNECT, aby oznaczyć nazwę sesji, taką jak co najmniej jedna wartość identyfikatora ClientID dla każdej nazwy użytkownika.
Na przykład następujące kombinacje nazw użytkowników i identyfikatorów ClientId w pakiecie CONNECT umożliwiają klientowi "Mgmt-application" nawiązywanie połączenia z brokerem MQTT za pośrednictwem trzech niezależnych sesji:
- Pierwsza sesja:
- Nazwa użytkownika:
Mgmt-application
- ClientId:
Mgmt-Session1
- Nazwa użytkownika:
- Druga sesja:
- Nazwa użytkownika:
Mgmt-application
- ClientId:
Mgmt-Session2
- Nazwa użytkownika:
- Trzecia sesja:
- Nazwa użytkownika:
Mgmt-application
- ClientId:
Mgmt-Session3
- Nazwa użytkownika:
Aby uzyskać więcej informacji, zobacz Jak ustanowić wiele sesji dla jednego klienta.
Obsługa sesji:
- Jeśli klient próbuje przejąć aktywną sesję innego klienta, przedstawiając jego nazwę sesji z inną nazwą uwierzytelniania, żądanie połączenia zostanie odrzucone z powodu nieautoryzowanego błędu. Jeśli na przykład klient B próbuje nawiązać połączenie z sesją 123 przypisaną w tym czasie dla klienta A, żądanie połączenia klienta B zostanie odrzucone. Oznacza to, że jeśli ten sam klient próbuje ponownie nawiązać połączenie z tymi samymi nazwami sesji i tą samą nazwą uwierzytelniania, może przejąć istniejącą sesję.
- Jeśli zasób klienta zostanie usunięty bez zakończenia sesji, inni klienci nie będą mogli używać nazwy sesji do momentu wygaśnięcia sesji. Jeśli na przykład klient B tworzy sesję o nazwie sesji 123, klient B zostanie usunięty, klient A nie może nawiązać połączenia z sesją 123, dopóki nie wygaśnie.
- Limit liczby sesji na klienta ma zastosowanie do sesji online i offline w dowolnym momencie. Rozważmy na przykład przestrzeń nazw z maksymalną sesją klienta na nazwę uwierzytelniania ustawioną na 1. Jeśli klient A łączy się z sesją trwałą 123, a następnie zostanie rozłączony, klient A nie będzie mógł nawiązać połączenia z nową sesją 456, ponieważ jej sesja 123 jest nadal aktywna, nawet jeśli jest w trybie offline. W związku z tym zalecamy, aby ten sam klient zawsze ponownie łączył się z tymi samymi statycznymi nazwami sesji, w przeciwieństwie do generowania nowej nazwy sesji z każdym ponownym połączeniem.
Funkcje MQTT
Funkcja brokera MQTT usługi Azure Event Grid obsługuje następujące funkcje MQTT:
Jakość usług (QoS)
Broker MQTT obsługuje protokół QoS 0 i 1, który definiuje gwarancję dostarczania komunikatów w pakietach PUBLISH i SUBSCRIBE między klientami i brokerem MQTT. QoS 0 gwarantuje co najwyżej raz dostawy; komunikaty z usługą QoS 0 nie są potwierdzane przez subskrybenta ani nie są przekazywane ponownie przez wydawcę. QoS 1 gwarantuje co najmniej jednokrotne dostarczanie; komunikaty są potwierdzane przez subskrybenta i są ponownie przekazywane przez wydawcę, jeśli nie zostały potwierdzone. Funkcja QoS umożliwia klientom kontrolowanie wydajności i niezawodności komunikacji.
Sesje trwałe
Broker MQTT obsługuje trwałe sesje dla protokołu MQTT w wersji 3.1.1, tak aby broker MQTT zachowywał informacje o sesji klienta w przypadku rozłączeń w celu zapewnienia niezawodności komunikacji. Te informacje obejmują subskrypcje klienta i pominięte/ niezaznaczone komunikaty QoS 1. Klienci mogą skonfigurować sesję trwałą za pomocą ustawienia flagi cleanSession w pakiecie CONNECT na wartość false.
Czyszczenie daty rozpoczęcia i wygaśnięcia sesji
Protokół MQTT w wersji 5 wprowadził funkcje czystego uruchamiania i wygasania sesji jako ulepszenia dotyczące protokołu MQTT w wersji 3.1.1 w obsłudze trwałości sesji. Clean Start to funkcja umożliwiająca klientowi rozpoczęcie nowej sesji z brokerem MQTT, odrzucającą wszystkie poprzednie dane sesji. Wygaśnięcie sesji umożliwia klientowi informowanie brokera MQTT, gdy nieaktywna sesja zostanie uznana za wygasłą i automatycznie usuniętą. W pakiecie CONNECT klient może ustawić flagę Clean Start na true i/lub krótki interwał wygaśnięcia sesji ze względów bezpieczeństwa lub uniknąć potencjalnych konfliktów danych, które mogły wystąpić podczas poprzedniej sesji. Klient może również ustawić czysty początek na false i/lub długi interwał wygaśnięcia sesji, aby zapewnić niezawodność i wydajność sesji trwałych.
Maksymalna konfiguracja interwału wygaśnięcia sesji
Możesz skonfigurować maksymalny interwał wygaśnięcia sesji dozwolony dla wszystkich klientów łączących się z przestrzenią nazw usługi Event Grid. W przypadku klientów MQTT w wersji 3.1.1 skonfigurowany limit jest stosowany jako domyślny interwał wygaśnięcia sesji dla wszystkich sesji trwałych. W przypadku klientów MQTT v5 skonfigurowany limit jest stosowany jako maksymalna wartość właściwości Interwał wygaśnięcia sesji w pakiecie CONNECT; dowolna wartość, która przekracza limit, jest dostosowywana. Wartość domyślna dla tej właściwości przestrzeni nazw to 1 godzina i może zostać przedłużona do 8 godzin. Wykonaj następujące kroki, aby skonfigurować maksymalny interwał wygaśnięcia sesji w witrynie Azure Portal:
- Przejdź do przestrzeni nazw w witrynie Azure Portal.
- W obszarze Konfiguracja zmień wartość dla maksymalnego interwału wygaśnięcia sesji w godzinach na żądany limit.
- Wybierz Zastosuj.
Przepełnienie sesji
Broker MQTT utrzymuje kolejkę komunikatów dla każdej aktywnej sesji MQTT, która nie jest połączona, dopóki klient nie połączy się ponownie z brokerem MQTT w celu odbierania komunikatów w kolejce. Jeśli klient nie nawiązuje połączenia w celu odbierania w kolejce komunikatów QOS1, kolejka sesji zacznie gromadzić komunikaty, dopóki nie osiągnie limitu: 100 komunikatów lub 1 MB. Gdy kolejka osiągnie limit w ciągu cyklu życia sesji, sesja zostanie zakończona.
Ostatnie wiadomości Will i Testament (LWT)
Last Will and Testament (LWT) powiadamia klientów MQTT o nagłych rozłączeniach innych klientów MQTT. Można użyć LWT, aby zapewnić przewidywalny i niezawodny przepływ komunikacji między klientami MQTT podczas nieoczekiwanych rozłączeń, co jest cenne w scenariuszach, w których komunikacja w czasie rzeczywistym, niezawodność systemu i skoordynowane działania są krytyczne. Klienci, którzy współpracują ze sobą w celu wykonywania złożonych zadań, mogą reagować na komunikaty LWT, dostosowując swoje zachowanie, redystrybuując zadania lub przejmują pewne obowiązki w celu utrzymania wydajności i stabilności systemu. Aby użyć LWT, klient może określić komunikat will, będzie temat, a pozostałe właściwości will w pakiecie CONNECT podczas połączenia. Gdy klient nagle rozłącza się, broker MQTT publikuje komunikat will do wszystkich klientów, którzy zasubskrybowali ten temat. Aby zmniejszyć szum z powodu wahań rozłączeń, klient może ustawić interwał opóźnienia na wartość większą niż zero. W takim przypadku, jeśli klient zostanie nagle rozłączony, ale przywróci połączenie przed wygaśnięciem interwału opóźnienia, komunikat zostanie opublikowany.
Właściwości użytkownika
Broker MQTT obsługuje właściwości użytkownika w pakietach PUBLISH MQTT v5, które umożliwiają dodawanie niestandardowych par klucz-wartość w nagłówku komunikatu w celu zapewnienia większego kontekstu komunikatu. Przypadki użycia właściwości użytkownika są uniwersalne. Tej funkcji można użyć do uwzględnienia celu lub źródła komunikatu, aby odbiorca mógł obsłużyć komunikat bez analizowania ładunku, zapisywania zasobów obliczeniowych. Na przykład komunikat z właściwością użytkownika wskazującą jego przeznaczenie jako "ostrzeżenie" może wyzwolić inną logikę obsługi niż komunikat z celem "informacji".
Wzorzec odpowiedzi na żądanie
MQTTv5 wprowadził pola w nagłówku pakietów PUBLISH MQTT, które zapewniają kontekst komunikatu odpowiedzi we wzorcu żądania-odpowiedzi. Te pola obejmują temat odpowiedzi i identyfikator korelacji, którego osoba odpowiadająca może użyć w odpowiedzi bez wcześniejszej konfiguracji. Informacje o odpowiedzi umożliwiają wydajniejszą komunikację ze standardowym wzorcem odpowiedzi na żądanie, który jest używany w scenariuszach poleceń i kontroli.
Interwał wygaśnięcia komunikatu:
W programie MQTT v5 interwał wygasania komunikatów umożliwia wyświetlanie komunikatów o konfigurowalnej cyklu życia. Interwał wygaśnięcia komunikatu jest definiowany jako interwał czasu między czasem publikowania komunikatu w brokerze MQTT a czasem, w jakim broker MQTT musi odrzucić komunikat, który nie jest obsługiwany. Ta funkcja jest przydatna w scenariuszach, w których komunikaty są ważne tylko przez określony czas, takie jak polecenia wrażliwe na czas, przesyłanie strumieniowe danych w czasie rzeczywistym lub alerty zabezpieczeń. Ustawiając interwał wygaśnięcia komunikatu, broker MQTT może automatycznie usuwać nieaktualne komunikaty, zapewniając, że tylko odpowiednie informacje są dostępne dla subskrybentów. Jeśli interwał wygaśnięcia komunikatu jest ustawiony na zero, oznacza to, że komunikat nigdy nie powinien wygasać.
Aliasy tematów:
W programie MQTT v5 aliasy tematów umożliwiają klientowi używanie krótszego aliasu zamiast pełnej nazwy tematu w opublikowanym komunikacie. Broker MQTT utrzymuje mapowanie między aliasem tematu a rzeczywistą nazwą tematu. Ta funkcja może zaoszczędzić przepustowość sieci i zmniejszyć rozmiar nagłówka komunikatu, szczególnie w przypadku tematów o długich nazwach. Jest to przydatne w scenariuszach, w których ten sam temat jest wielokrotnie publikowany w wielu komunikatach, takich jak w sieciach czujników. Broker MQTT obsługuje maksymalnie 10 aliasów tematów. Klient może użyć pola Alias tematu w pakiecie PUBLISH, aby zastąpić pełną nazwę tematu odpowiednim aliasem.
Sterowanie przepływem
W MQTT v5 sterowanie przepływem odnosi się do mechanizmu zarządzania szybkością i rozmiarem komunikatów, które klient może obsłużyć. Sterowanie przepływem można skonfigurować przez ustawienie maksymalnego rozmiaru pakietów i maksymalnych parametrów w pakiecie CONNECT. Parametr Receive Maximum umożliwia klientowi ograniczenie liczby komunikatów wysyłanych przez brokera do liczby komunikatów, które klient może obsłużyć. Parametr Maksymalny rozmiar pakietu definiuje maksymalny rozmiar pakietów, które klient może odbierać. Broker MQTT ma limit rozmiaru komunikatów 512 KiB. Ta funkcja zapewnia niezawodność i stabilność komunikacji dla ograniczonych urządzeń z ograniczoną szybkością przetwarzania lub możliwościami przechowywania.
Negatywne potwierdzenia i pakiet rozłączenia zainicjowany przez serwer
W przypadku protokołu MQTT v5 broker MQTT może wysyłać negatywne potwierdzenia (NACKs) i inicjowane przez serwer pakiety rozłączania, które zapewniają klientowi więcej informacji o błędach dostarczania komunikatów lub połączenia. Te funkcje pomagają klientowi zdiagnozować przyczynę awarii i podjąć odpowiednie działania korygujące. Broker MQTT używa kodów przyczyn zdefiniowanych w specyfikacji MQTT v5.
Bieżące ograniczenia
Broker MQTT dodaje więcej funkcji MQTT v5 i MQTT v3.1.1 w przyszłości w celu dostosowania ich do specyfikacji MQTT. Poniższa lista zawiera szczegółowe informacje o bieżących różnicach między funkcjami obsługiwanymi przez brokera MQTT i specyfikacjami MQTT:
Bieżące ograniczenia MQTTv5
Protokół MQTT v5 obecnie różni się od specyfikacji MQTT v5 w następujący sposób:
- Subskrypcje udostępnione nie są jeszcze obsługiwane.
- Zachowaj flagę nie jest jeszcze obsługiwana.
- Maksymalny interwał opóźnienia to 300.
- Maksymalna wartość QoS wynosi 1.
- Maksymalny rozmiar pakietu to 512 KiB
- Kolejność komunikatów nie jest gwarantowana.
- Identyfikatory subskrypcji nie są obsługiwane.
- Przypisane identyfikatory klienta nie są jeszcze obsługiwane.
- Wartość maksymalna aliasu tematu to 10. Serwer nie przypisuje obecnie żadnych aliasów tematów dla komunikatów wychodzących. Klienci mogą przypisywać aliasy tematów i używać ich w ramach ustawionego limitu.
- CONNACK nie zwraca właściwości Informacje o odpowiedzi, nawet jeśli żądanie CONNECT zawiera właściwość Informacje o odpowiedzi żądania.
- Właściwości użytkownika w programie CONNECT, SUBSCRIBE, DISCONNECT, PUBACK, pakiety AUTH nie są używane przez usługę, więc nie są obsługiwane. Jeśli którekolwiek z tych żądań zawiera właściwości użytkownika, żądanie zakończy się niepowodzeniem.
- Jeśli serwer odbierze element PUBACK od klienta z kodem odpowiedzi bez powodzenia, połączenie zostanie przerwane.
- Zachowaj żywą wartość maksymalną wynosi 1160 sekund.
Bieżące ograniczenia MQTTv3.1.1
MQTT v5 obecnie różni się od specyfikacji MQTT v3.1.1 w następujący sposób:
- QoS2 i Zachowaj flagę nie są jeszcze obsługiwane. Żądanie publikowania z flagą zachowania lub QoS2 kończy się niepowodzeniem i zamyka połączenie.
- Kolejność komunikatów nie jest gwarantowana.
- Zachowaj żywą wartość maksymalną wynosi 1160 sekund.
Przykłady kodu:
To repozytorium zawiera przykłady kodu C#, C i Python, które pokazują, jak wysyłać dane telemetryczne, wysyłać polecenia i emitować alerty. Certyfikaty utworzone za pomocą przykładów są odpowiednie do testowania, ale nie są odpowiednie dla środowisk produkcyjnych.
Następne kroki:
Dowiedz się więcej o MQTT:
Dowiedz się więcej o brokerze MQTT: