Implementacja protokołu MQTT w aplikacji webowej - "SmartHome"

0

Cześć, biorę się za kolejny studencki projekt do cv i mam kilka pytań na początku. Chciałbym zrobić coś w stylu aplikacji webowej SmartHome postawionej na raspberryPi zarządzającej urządzeniami na mikrokontrolerach. Do aplikacji użyję Razor Pages/Blazor z SignalR, ponieważ jestem ciekaw tych bibliotek.

  1. Do komunikacji z urządzeniami chciałbym użyć protokołu MQTT, zainstalowałem RabbitMQ na raspberry i sprawdziłem za pomocą skryptów w Pythonie. Wszystko działa na mqtt 3.1.1, jednak nie wiem jak zaimplementować całą warstwę w aplikacji. Domyślam się żeby użyć EventHandler na każdą wiadomość, ale nie wiem jak asynchronicznie subskrybować tematy w mqtt(w tle aplikacji webowej). Próbowałem znaleźć przykłady, ale jakoś trudno do samego mqtt, dlatego proszę o podpowiedź.
  2. Na tym forum padła raz odpowiedź żeby użyć Mosquitto zamiast RabbitMQ do samej komunikacji między urządzeniami. Znalazłem tylko, że rabbit nie obsługuje QoS 2, ale są większe różnice dla mqtt?
  3. Jest jakaś biblioteka która umożliwiałaby subskrybowanie tematu jako attribute routing jako client? Zależy mi żeby uzyskać z tematu wiadomości np. devices/{deviceID}/temperature, ponieważ chciałbym aby użytkownik jako administrator mógł dodawać urządzenia do bazy danych i aplikacja później sprawdzała czy istnieje dane urządzenie. Czy po prostu aplikacja ma subskrybować wszystkie devices/temperature i w polu wiadomości będzie przesyłane id urządzenia?
  4. Całą warstwę(jako oddzielny projekt) udostępnić pozostałym, żeby w odpowiedzi na http mogły wysłać wiadomość mqtt typu włącz lampkę?

Z góry dziękuję za każde podpowiedzi jak zaimplementować komunikację z tym protokołem.

0

@PieciaJunior:

MQTT dedykowany jest jako oszczędny i niskopoziomowy, dający się stosować w małych urządzeniach bateryjnych na różnych dziwnych słabych łączach, być może uboższy logicznie itd - RabbitMQ to piętro wyżej, raczej złożoność logiczna ale nie oszczędzanie bajtów

Ale może to już wiesz.

0

@AnyKtokolwiek: Właśnie czytałem, że RabbitMQ to głównie ten protokół amqp do kolejkowanych wiadomości. Ale serwer obsługuje również protokół MQTT 3.1.1, który bez problemu działa mi z prostym kodem na arduino i przy okazji ma fajny interfejs do administrowania po http. Więc chyba zostawię Rabbita, bo i tak to studencki projekt i urządzenia będą pod zasilaniem, ewentualnie jest na tym samym porcie co Mosquitto więc podmiana nie będzie problemem. Główny problem to właśnie implementacja warstwy w .Necie, bo cała dokumentacja RabbitMQ i nuget RabbitMQ.Client dotyczy właśnie protokołu amqp do mikroserwisów. Znalazłem bibliotekę MQTTNet, ale tam też są przykłady napisane tylko w konsoli i trochę utknąłem w martwym punkcie z integracją do asp.net. Za wszelkie podpowiedzi będę wdzięczny^^

0

MQTTnet ma integrację z ASP.NET Core.
Na szybko przykładu nie znalazłem na githubie ale tak wynika z kodu:
https://github.com/chkr1011/MQTTnet/blob/master/Source/MQTTnet.AspnetCore/Extensions/ServiceCollectionExtensions.cs

2

Jest jakaś biblioteka która umożliwiałaby subskrybowanie tematu jako attribute routing jako client? Zależy mi żeby uzyskać z tematu wiadomości np. devices/{deviceID}/temperature, ponieważ chciałbym aby użytkownik jako administrator mógł dodawać urządzenia do bazy danych i aplikacja później sprawdzała czy istnieje dane urządzenie. Czy po prostu aplikacja ma subskrybować wszystkie devices/temperature i w polu wiadomości będzie przesyłane id urządzenia?

Subskrybujesz devices/+/temperature i wszelkie coś, co jest "pomiędzy" ci w to "wpadnie" - i dostaniesz jakiego kanału dokładnie to przyszło, więc ID urządzenia sobie wyciągniesz. M2Mqtt na pewno to potrafi, ale wszystkie biblioteki powinny, bo to standard.

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