MQTT

Aus TippvomTibb
Zur Navigation springen Zur Suche springen

Es ist mal wieder soweit. Heute habe ich meine Arbeit an meinem 'MQTT-System' wieder aufgenommen. Schnell mal die aktuelle Installationssituation gecheckt und den Rahmen für die anstehenden Test abgesteckt.


Installation

Als MQTT-Paket wird mosquitto bei openSuSE mitgeliefert. Ich habe mich bewußt erst mal gegen die integrierte Variante in FHEM (MQTT2_SERVER) da ein ein Blick in Wiki und ins Forum von FHEM wieder das übliche Durcheinander hat. Da verliert man sich zu schnell in irgendwelchen Spezialproblemen. Also mal nachschauen, ob ich das Paket auf dem Server schon installiert hatte.

zypper se MQTT

Es ist zum Mäusemelken. Mosquitto wird so nicht gefunden, also besser immer gleich mit der Option -d (Search also in package summaries and descriptions. Default: false) suchen.

zypper se -d MQTT
Loading repository data...
Reading installed packages...

S | Name               | Summary                                          | Type
--+--------------------+--------------------------------------------------+-----------
  | libmosquitto1      | Shared C Library for mosquitto                   | package
  | libmosquittopp1    | Shared C++ Library for mosquitto                 | package
  | libpaho-mqtt-devel | Development files for MQTT C Client library      | package
  | libpaho-mqtt1      | Library implementing the MQTT client             | package
  | mosquitto          | A MQTT v3.1/v3.1.1 Broker                        | package
  | mosquitto          | A MQTT v3.1/v3.1.1 Broker                        | srcpackage
  | mosquitto-clients  | Client for Mosquitto                             | package
  | mosquitto-devel    | Development files for mosquitto                  | package
  | openSUSE-2020-726  | Recommended update for paho-mqtt-c               | patch
  | paho-mqtt-c        | MQTT C Client                                    | srcpackage
  | python2-paho-mqtt  | MQTT version 3.11 client class                   | package
  | python3-paho-mqtt  | MQTT version 3.11 client class                   | package
  | rabbitmq-server    | A message broker supporting AMQP, STOMP and MQTT | package

und mit

zypper in mosquitto

installieren.

Die Clients (mosquitto_pub mosquitto_rr mosquitto_sub) am besten gleich mit installieren.

Broker auf dem Server starten

systemctl status mosquitto
● mosquitto.service - Mosquitto MQTT v3.1/v3.1.1 Broker
   Loaded: loaded (/usr/lib/systemd/system/mosquitto.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:mosquitto.conf(5)
           man:mosquitto(8)

Das ist schon mal gut, dass im Paket eine passende .service-Datei mitgeliefert wurde, ansonsten hätte ich jetzt wieder mein Template anpassen müssen. Glück gehabt.

systemctl enable mosquitto
Created symlink /etc/systemd/system/multi-user.target.wants/mosquitto.service → /usr/lib/systemd/system/mosquitto.service.

Jetzt kann man den Broker starten. Den Blick in Configdateien spare ich mir mal solange alles so funktioniert wie ich es erwarte.

systemctl start mosquitto

Und mit status gleich mal nachschauen was der Server (Broker) so macht.

systemctl status mosquitto


● mosquitto.service - Mosquitto MQTT v3.1/v3.1.1 Broker
   Loaded: loaded (/usr/lib/systemd/system/mosquitto.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2021-01-15 18:54:04 CET; 7s ago
     Docs: man:mosquitto.conf(5)
           man:mosquitto(8)
 Main PID: 13312 (mosquitto)
    Tasks: 1
   CGroup: /system.slice/mosquitto.service
           └─13312 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

Jan 15 18:54:04 server systemd[1]: Started Mosquitto MQTT v3.1/v3.1.1 Broker.
Jan 15 18:54:04 server mosquitto[13312]: 1610733244: mosquitto version 1.5.7 starting
Jan 15 18:54:04 server mosquitto[13312]: 1610733244: Config loaded from /etc/mosquitto/mosquitto.conf.
Jan 15 18:54:04 server mosquitto[13312]: 1610733244: Opening ipv4 listen socket on port 1883.
Jan 15 18:54:04 server mosquitto[13312]: 1610733244: Opening ipv6 listen socket on port 1883.

Aha. Der Server läuft, Config liegt unter /etc/mosquitto und er ist auf Port 1883 über IPv4 und IPv6 erreichbar.

Auf meinem anderen Server lief's nicht so gut. Da bekam ich eine Fehlermeldung.

● mosquitto.service - Mosquitto MQTT v3.1/v3.1.1 Broker
   Loaded: loaded (/usr/lib/systemd/system/mosquitto.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Fri 2021-01-15 17:21:51 CET; 1h 37min ago
     Docs: man:mosquitto.conf(5)
           man:mosquitto(8)
  Process: 12886 ExecStart=/usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf (code=exited, status=1/FAILURE)
 Main PID: 12886 (code=exited, status=1/FAILURE)

Jan 15 17:21:51 fhem.clx.local systemd[1]: Started Mosquitto MQTT v3.1/v3.1.1 Broker.
Jan 15 17:21:51 fhem.clx.local mosquitto[12886]: 1610727711: Loading config file /etc/mosquitto/conf.d/default.conf
Jan 15 17:21:51 fhem.clx.local mosquitto[12886]: 1610727711: Loading config file /etc/mosquitto/conf.d/websockets.conf
Jan 15 17:21:51 fhem.clx.local mosquitto[12886]: 1610727711: mosquitto version 1.6.9 starting
Jan 15 17:21:51 fhem.clx.local mosquitto[12886]: 1610727711: Config loaded from /etc/mosquitto/mosquitto.conf.
Jan 15 17:21:51 fhem.clx.local mosquitto[12886]: 1610727711: Opening ipv4 listen socket on port 1883.
Jan 15 17:21:51 fhem.clx.local mosquitto[12886]: 1610727711: Error: Address already in use
Jan 15 17:21:51 fhem.clx.local systemd[1]: mosquitto.service: Main process exited, code=exited, status=1/FAILURE
Jan 15 17:21:51 fhem.clx.local systemd[1]: mosquitto.service: Unit entered failed state.
Jan 15 17:21:51 fhem.clx.local systemd[1]: mosquitto.service: Failed with result 'exit-code'.

Hier liegt eine Kollision auf dem Port 1883 vor. Mal schauen wer oder was da blockiert.

ss -nltpa |grep 1883
LISTEN   0        32                  0.0.0.0:1883              0.0.0.0:*        users:(("perl",pid=26203,fd=13))

Perl PID 26203 ist der Überltäter und das ist FHEM. Das ist dann das Überbleibsel meiner letzten Versuchsreihe.

grep MQTT /etc/fhem/fhem*
/etc/fhem/fhem.conf:define MQTT MQTT2_SERVER 1883 global

Ok. Da kann ich dann später bei der FHEM-Integratiopn weiter machen.

First Contact

Mal eine Nachricht vom Client (worker) an den Broker (server) senden.

mosquitto_pub -h 192.168.178.10 -p 1883 -t /haus/test -m "hallo welt"

Auf dem Client kommt schon mal keine Fehlermeldung. Gut.

Mal schauen, ob auf dem Server was passiert.

server:~ # tcpdump -i eth2 src 192.168.178.11 and port 1883
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 262144 bytes
19:14:41.201621 IP 192.168.178.11.48330 > 192.168.178.10.mqtt: Flags [S], seq 1113973064, win 64240, options [mss 1460,sackOK,TS val 298691237 ecr 0,nop,wscale 7], length 0
19:14:41.201980 IP 192.168.178.11.48330 > 192.168.178.10.mqtt: Flags [.], ack 3184443970, win 502, options [nop,nop,TS val 298691238 ecr 605516974], length 0
19:14:41.202232 IP 192.168.178.11.48330 > 192.168.178.10.mqtt: Flags [P.], seq 0:37, ack 1, win 502, options [nop,nop,TS val 298691238 ecr 605516974], length 37
19:14:41.202466 IP 192.168.178.11.48330 > 192.168.178.10.mqtt: Flags [.], ack 5, win 502, options [nop,nop,TS val 298691238 ecr 605516975], length 0
19:14:41.202588 IP 192.168.178.11.48330 > 192.168.178.10.mqtt: Flags [P.], seq 37:61, ack 5, win 502, options [nop,nop,TS val 298691238 ecr 605516975], length 24
19:14:41.202609 IP 192.168.178.11.48330 > 192.168.178.10.mqtt: Flags [FP.], seq 61:63, ack 5, win 502, options [nop,nop,TS val 298691238 ecr 605516975], length 2
19:14:41.202834 IP 192.168.178.11.48330 > 192.168.178.10.mqtt: Flags [.], ack 6, win 502, options [nop,nop,TS val 298691239 ecr 605516975], length 0