Mqtt

= Was ist MQTT? =
MQTT (Message Queuing Telemetry Transport) ist ein kleines einfaches Transportprotokoll um Daten zwischen Clients über einen Broker zu transportieren. Mehr dazu auf Wikipedia: https://de.wikipedia.org/wiki/MQTT
= Distributed MQTT =
Es gibt MQTT Broker die man verteilt ohne eigentlichen Master betreiben kann. Somit kann jeder einen eigenen Broker betreiben und sich dem Cluster anschließen. Wenn nun im Router der MQTT Broker manuell konfigurierbar ist, kann jeder User jeden Broker nutzen. Da auch jeder Daten an den Broker schicken kann ist somit das System komplett dezentral ausgelegt. Theoretisch können auch eigene Broker ohne Cluster betrieben werden, wenn jemand sein eigenes Netz bauen will. Dezentralität fördert Möglichkeiten.
== vernemq ==
Hier hatte ich leider Probleme das ordentlich zum laufen zu bekommen. Das Clustering hat immer wieder in einzelne Richtungen nicht funktioniert tlw. kam ein Clusterjoin gar nicht zustande.
== EMQ-X ==
Läuft aktuell und macht einen guten Eindruck.
=== Installationsanleitung ===
* Notwendige Systeme
** Linux System (Anleitung bezieht sich auf Debian 11 aber es sind sicherlich auch andere Distributionen möglich sowie wohl auch unter Windows. Es gibt auch was für Docker wobei Windows und Docker ungetestet ist)
** Feste Freifunk IPv4 Adresse aus dem 10.50/16 oder 10.83/16 Netz, IPv6 für das Clustering hab ich nicht hinbekommen. Für Zugriff von Clients ist IPv6 problemlos möglich (egal ob public oder ULA), die IPv4 wird nur für das Cluster benötigt.
Grundsätzlich kann sich an dieser Dokumentation orientiert werden: https://www.emqx.io/docs/en/v4.3/getting-started/install.html
* wget https://github.com/emqx/emqx/releases/download/v4.4.2/emqx-edge-4.4.2-otp24.1.5-3-debian11-amd64.deb
* apt install ./emqx-edge-4.4.2-otp24.1.5-3-debian11-amd64.deb
* systemctl start emqx
* prüfen ob emqx läuft: emqx_ctl status
** Ausgabe in etwa "Node 'emqx@127.0.0.1' 4.4.2 is started"
* Unter http://$IP:18083/ sollte ein WebUI erscheinen. Default Zugang ist admin und Passwort public
** unbedingt unter General -> Users das Passwort vom Admin ändern
* Die config Datei unter /etc/emqx/emqx.conf anpassen:
** node.name ändern in freiwählbar@IPv4 Adresse 
** Den Rest hab ich mir noch nicht genauer angeguckt... Anpassungen bisher nicht nötig
** Danach emqx neustarten: systemctl restart emqx
** Im WebUI unter Monitor kann rechts oben geprüft werden ob die Änderung übernommen wurde oder mit dem Kommando emqx_ctl status 
* emqx bedient sich auf der Kommandozeile mit dem Tool emqx_ctl
* Um das Cluster zu joinen folgendes eingeben: 
** emqx_ctl cluster join USERNAME@IP 
*** USERNAME@IP muss durch ein bereits vorhandenen Node ersetzt werden, weiter unten findet ihr eine Liste von bereits aktiven Nodes, sucht euch einfach einen davon aus. Es ist egal welcher, ihr werdet am Ende sowieso automatisch mit allen verbunden.
* Nun seid ihr im Cluster verbunden und solltet alle MQTT Nachrichten erhalten, prüfen kann man dies z.b. mit Mosquitto am PC
** mosquitto_sub -h IPADRESSE -t '/#' -p 1883 -v
*** Hier kann auch eine IPv6 Adresse vom emqx Server verwendet werden. Es sollten nach spätestens 5 Minuten Nachrichten von den Routerstatusdaten zu sehen sein, die bereits MQTT nutzen
* Trage deinen Server unten mit ein, damit auch andere sich über dich mit dem Cluster verbinden können oder ihn einfach nutzen können.
== mosquitto-cluster ==
https://github.com/hui6075/mosquitto-cluster
noch ungetestet
= Einsatzzwecke =
== Monitoring ==
Wenn der Router seine Monitoringdaten an den MQTT Broker schickt, kann sie dort jeder abgreifen und jeder ein eigenes Monitoring o.ä. Sachen betreiben. Monitoringbetreiber können auf Wunsch filtern welche Router sie haben wollen und welche nicht. Es ist dem Monitoringbetreiber überlassen, welche Daten er einliest und welche nicht, vorhanden sind alle die dort Daten hinschicken.
Das ganze ist mittlerweile im aktuellen Layer 3 Release enthalten und kann verwendet werden. Einfach im WebUI unter mqtt Server einen Server eintragen, sinnvollerweise schließt man sich dem MQTT-Cluster an, damit die Daten auch mit anderen MQTT Server getauscht werden.
Ein Beispiel wie so ein Monitoring ausschauen kann, ist hier zu finden: https://grafana.dresel.systems/d/Freifunkrouter/freifunkrouter?orgId=1&var-Router=Karo&var-s2nproxy=All
Hier ist auch schon der s2nproxy integriert welcher allderdings noch WIP ist.
Die Daten können auf den MQTT Cluster (IPs unten) unter /monitoring/v1/# abgegriffen werden
== Konfiguration Austausch ==
!!Dies ist nur eine Idee und es gibt noch keinen Code und keine wirklichen Grundlagen dafür!!
Über MQTT können auch Konfigurationsdateien ausgetauscht werden. Wenn man das für die komplette /etc/config/gateway macht, ist es möglich mit einem Mausklick einen Router komplett automatisch zu konfigurieren. Dies soll aber expliziet optional sein und eine manuelle Konfiguration nach wie vor möglich sein.
=== Beispiel IPv6 Adressen ===
Router können zum Beispiel IPv6 Adressen am Broker abfragen und verschiedene Betreiber können IPv6 Adressen anbieten. Somit muss der User sich keine Adressen mehr manuell klicken sondern kann mit einen Knopfdruck sich automatisch Adressen auf seinen Layer 3 Router konfigurieren.
=== Komplett automatische konfiguration ===
Auch eine komplette automatische Konfiguration ist denkbar wenn noch wireguard und ipv4 mit abgehandelt wird. Dann ist am Ende einen Layer 3 Router in Betrieb nehmen genauso einfach wie aktuell einen v2 Router.
= Aktuelle Broker =
Aktuell betreibe ich ein eigenes Test-MQTT-Cluster Netzwerk auf Basis von emqx. Zugreifen kann man auf das Cluster über:
* 2a01:4f8:221:2d08::129
* 2a01:4f8:221:2d08::130
* fd43:5602:29bd:ffff::1883 Anycast im Freifunknetz, wenn euer Node sicher ordentlich läuft, dürft ihr diese Adresse im Freifunk announcen und ebenfalls im anycast System teilnehmen.
jeweils Port 1883.
Der MQTT Server wird komplett offen betrieben. Aufgrund der dezentralität ist es wünschenswert das möglichst viele Leute einen eigenen MQTT Server betreiben und sich dem Cluster anschließen. Für das emqx Cluster können folgende IP Adressen verwendet werden um sich anzuschließen (Anleitung weiter oben)
* ChrisD1@10.83.227.166
* ChrisD2@10.83.227.167
* nasemqx@10.50.186.37