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 server -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

Intermezzo

Gleich mal, weil so schön ist, ein wenig die Kommunikation beleuchtet. (-d schalten den Debug-Modus an)

worker:~ # mosquitto_pub -h server -p 1883 -t /haus/test -m "hallo welt" -d
Client mosq-zXegtgLVTedJw16YN0 sending CONNECT
Client mosq-zXegtgLVTedJw16YN0 received CONNACK (0)
Client mosq-zXegtgLVTedJw16YN0 sending PUBLISH (d0, q0, r0, m1, '/haus/test', ... (10 bytes))
Client mosq-zXegtgLVTedJw16YN0 sending DISCONNECT

Das ergibt auf dem Server folgende Reaktion.

server:~ # tcpdump -tttt -n -A  -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
2021-01-15 19:22:22.156924 IP 192.168.178.11.49086 > 192.168.178.10.1883: Flags [S], seq 2229763113, win 64240, options [mss 1460,sackOK,TS val 299152192 ecr 0,nop,wscale 7], length 0
E..<z
@.@..J.......
...[..|).........h.........
...@........
2021-01-15 19:22:22.157272 IP 192.168.178.11.49086 > 192.168.178.10.1883: Flags [.], ack 932540963, win 502, options [nop,nop,TS val 299152193 ecr 605977897], length 0
E..4z.@.@..Q.......
...[..|*7.r#...........
...A$.})
2021-01-15 19:22:22.157375 IP 192.168.178.11.49086 > 192.168.178.10.1883: Flags [P.], seq 0:37, ack 1, win 502, options [nop,nop,TS val 299152193 ecr 605977897], length 37
E..Yz.@.@..+.......
...[..|*7.r#....
......
...A$.}).#..MQTT...<..mosq-zXegtgLVTedJw16YN0
2021-01-15 19:22:22.157712 IP 192.168.178.11.49086 > 192.168.178.10.1883: Flags [.], ack 5, win 502, options [nop,nop,TS val 299152193 ecr 605977898], length 0
E..4z.@.@..O.......
...[..|O7.r'...........
...A$.}*
2021-01-15 19:22:22.157824 IP 192.168.178.11.49086 > 192.168.178.10.1883: Flags [P.], seq 37:61, ack 5, win 502, options [nop,nop,TS val 299152193 ecr 605977898], length 24
E..Lz.@.@..6.......
...[..|O7.r'....s......
...A$.}*0..
/haus/testhallo welt
2021-01-15 19:22:22.157887 IP 192.168.178.11.49086 > 192.168.178.10.1883: Flags [FP.], seq 61:63, ack 5, win 502, options [nop,nop,TS val 299152193 ecr 605977898], length 2
E..6z.@.@..K.......
...[..|g7.r'...........
...A$.}*..
2021-01-15 19:22:22.158255 IP 192.168.178.11.49086 > 192.168.178.10.1883: Flags [.], ack 6, win 502, options [nop,nop,TS val 299152194 ecr 605977898], length 0
E..4..@.@.U].......
...[..|j7.r(...........
...B$.}*

Server/Broker Reaktion

Dass die Nachrichten zum Publizieren beim Server ankommen hat man im vorangegangenen Anschnitt gesehen. Jetzt geht es darum die ordnungsgemäße Verarbeitung durch den Borker nachzuvollziehen.

1. Idee: Ich lasse den Broker auf der Konsole seinen Aktivitäten ausgegeben.

2. Idee: Ich lasse den Broker seine Aktivitäten in einem File mitloggen.

3. Idee: Ich nutzte einen Client um Debug-Informationen vom Broker abzurufen.


Stdout Ausgabe

server:~ # mosquitto -h
 1 mosquitto version 1.5.7
 2 
 3 mosquitto is an MQTT v3.1.1 broker.
 4 
 5 Usage: mosquitto [-c config_file] [-d] [-h] [-p port]
 6 
 7  -c : specify the broker config file.
 8  -d : put the broker into the background after starting.
 9  -h : display this help.
10  -p : start the broker listening on the specified port.
11       Not recommended in conjunction with the -c option.
12  -v : verbose mode - enable all logging types. This overrides
13       any logging options given in the config file.
14 
15 See http://mosquitto.org/ for more information.

Allerdings entfaltet die Option -v nur ohne die Option -d ihre Wirkung. Also mosquitto-Service stoppen und in der Konsole starten.

 server:~ # mosquitto -v -c /etc/mosquitto/mosquitto.conf 
1610778217: mosquitto version 1.5.7 starting
1610778217: Config loaded from /etc/mosquitto/mosquitto.conf.
1610778217: Opening ipv4 listen socket on port 1883.
1610778217: Opening ipv6 listen socket on port 1883.
1610778233: New connection from 192.168.178.11 on port 1883.
1610778233: New client connected from 192.168.178.11 as mosq-FufTGTa6x2qexVTprf (c1, k60).
1610778233: No will message specified.
1610778233: Sending CONNACK to mosq-FufTGTa6x2qexVTprf (0, 0)
1610778233: Received PUBLISH from mosq-FufTGTa6x2qexVTprf (d0, q0, r0, m0, '/haus/test', ... (10 bytes))
1610778233: Received DISCONNECT from mosq-FufTGTa6x2qexVTprf
1610778233: Client mosq-FufTGTa6x2qexVTprf disconnected.

Nach der Startmeldung kommt die Reaktion auf diesen Publish-Befehl:

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

Beim Client wird dieser Vorgang so kommentiert:

Client mosq-FufTGTa6x2qexVTprf sending CONNECT
Client mosq-FufTGTa6x2qexVTprf received CONNACK (0)
Client mosq-FufTGTa6x2qexVTprf sending PUBLISH (d0, q0, r0, m1, '/haus/test', ... (10 bytes))
Client mosq-FufTGTa6x2qexVTprf sending DISCONNECT
Receiver Sketch

Request for Comments


Kommentar hinzufügen
TippvomTibb freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, registriere dich bitte oder melde dich an.