{"id":167,"date":"2021-01-22T11:00:41","date_gmt":"2021-01-22T10:00:41","guid":{"rendered":"https:\/\/informatik.htwk-leipzig.de\/seminar\/?p=167"},"modified":"2021-03-01T13:53:28","modified_gmt":"2021-03-01T12:53:28","slug":"mqtt-standard","status":"publish","type":"post","link":"https:\/\/informatik.htwk-leipzig.de\/seminar\/lehrveranstaltungen\/betriebliche-informationssysteme\/2021\/mqtt-standard\/","title":{"rendered":"\u00dcbersicht \u00fcber den MQTT Standard"},"content":{"rendered":"<h1>Was ist MQTT?<\/h1>\n<ul>\n<li>MQTT ist ein OASIS-Standard-Messaging-Protokoll f\u00fcr das Internet der Dinge (IoT).<\/li>\n<li>L\u00e4uft \u00fcber TCP<\/li>\n<li>extrem leichter Publish- \/ Subscribe-Messaging-Transport<\/li>\n<li>Verbinden von Remote-Ger\u00e4ten mit geringem Code-Footprint und minimaler Netzwerkbandbreite<\/li>\n<li>MQTT wird in vielen Branchen eingesetzt (Automobilindustrie, Fertigung, Telekommunikation, \u00d6l und Gas usw.)<\/li>\n<\/ul>\n<h1>Client\/Server<\/h1>\n<ul>\n<li>Es gibt einen Server (genannt Broker)\n<ul>\n<li>Da MQTT nur ein Standard ist gibt es viele verschiedenen Implementierungen f\u00fcr Broker<\/li>\n<\/ul>\n<\/li>\n<li>Alles andere sind Clients\n<ul>\n<li>Clients k\u00f6nnen entweder publishen<\/li>\n<li>Oder auf einer Topic subscriben<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<figure id=\"attachment_188\" aria-describedby=\"caption-attachment-188\" style=\"width: 589px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.informatik-aktuell.de\/betrieb\/netzwerke\/mqtt-leitfaden-zum-protokoll-fuer-das-internet-der-dinge.html\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-188\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2021\/01\/mqtt-image6.png\" alt=\"\" width=\"589\" height=\"341\" \/><\/a><figcaption id=\"caption-attachment-188\" class=\"wp-caption-text\">Client\/Server Aufbau<\/figcaption><\/figure>\n<h1>Protokoll<\/h1>\n<h2>Features<\/h2>\n<h3>Topics<\/h3>\n<ul>\n<li>String, welcher vom Broker benutzt wird, um Nachrichten an die Clients zu filtern<\/li>\n<li>kann mit Slash ( \/ ) in Unter-Topics (Levels) separiert werden, bspw. SmartHome\/Erdgeschoss\/Wohnzimmer\/Temperatur<\/li>\n<li>Wildcards:\n<ul>\n<li>einzelnes Level mit +, bspw. SmartHome\/Erdgeschoss\/+\/Temperatur &gt; Temperatur aus allen R\u00e4umen im Erdgeschoss<\/li>\n<li>mehrere Level mit #, bspw. SmartHome\/Erdgeschoss\/# &gt; alle Nachrichten vom Erdgeschoss<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Persistent Sessions<\/h3>\n<ul>\n<li>automatischer Neuaufbau der Verbindung bei Abbruch<\/li>\n<\/ul>\n<h3>\u201clast will and testament\u201d<\/h3>\n<ul>\n<li>Nachricht, welche gesendet wird wenn ein Client unerwartet die Verbindung trennt (um mit dieser Information andere Clients dar\u00fcber zu informieren)<\/li>\n<\/ul>\n<h2>Verschiedene Qualit\u00e4ts-Levels<\/h2>\n<p>Vorteil von MQTT: Nachrichten werden garantiert gesendet, auch, wenn die verwendete Verbindung unzuverl\u00e4ssig ist sog. Quality of service levels (von oben nach unten: sicherer, aber langsamer)<\/p>\n<ul>\n<li><i>At most once<\/i> (0)<\/li>\n<li><i>At least once<\/i> (1)<\/li>\n<li><i>Exactly once<\/i> (2).<\/li>\n<\/ul>\n<p>Levels k\u00f6nnen von den Clients selbst ausgew\u00e4hlt werden<\/p>\n<h3>QoS 0 (at most once)<\/h3>\n<figure id=\"attachment_187\" aria-describedby=\"caption-attachment-187\" style=\"width: 410px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.hivemq.com\/blog\/mqtt-essentials-part-6-mqtt-quality-of-service-levels\/\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-187\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2021\/01\/mqtt-image5.png\" alt=\"\" width=\"410\" height=\"133\" \/><\/a><figcaption id=\"caption-attachment-187\" class=\"wp-caption-text\">QoS 0 (at most once)<\/figcaption><\/figure>\n<ul>\n<li>keine Garantie, dass die Nachricht empfangen wurde<\/li>\n<li>der Sender speichert die Nachricht nicht und kann sie somit auch nicht nochmal senden<\/li>\n<li>der Empf\u00e4nger sendet keine Empfangsbest\u00e4tigung<\/li>\n<\/ul>\n<h3>QoS 1 (at least once)<\/h3>\n<figure id=\"attachment_186\" aria-describedby=\"caption-attachment-186\" style=\"width: 406px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.hivemq.com\/blog\/mqtt-essentials-part-6-mqtt-quality-of-service-levels\/\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-186\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2021\/01\/mqtt-image4.png\" alt=\"\" width=\"406\" height=\"138\" \/><\/a><figcaption id=\"caption-attachment-186\" class=\"wp-caption-text\">QoS 1 (at least once)<\/figcaption><\/figure>\n<ul>\n<li>Garantie, dass Nachricht mindestens einmal empfangen wurde<\/li>\n<li>Sender speichert Nachricht solange, bis PUBACK vom Empf\u00e4nger zur\u00fcckkommt<\/li>\n<li>bis dahin wird die Nachricht periodisch versendet<\/li>\n<\/ul>\n<h3>QoS 2 (exactly once)<\/h3>\n<figure id=\"attachment_182\" aria-describedby=\"caption-attachment-182\" style=\"width: 398px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.hivemq.com\/blog\/mqtt-essentials-part-6-mqtt-quality-of-service-levels\/\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-182\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2021\/01\/mqtt-image7.png\" alt=\"\" width=\"398\" height=\"134\" \/><\/a><figcaption id=\"caption-attachment-182\" class=\"wp-caption-text\">QoS 2 (exactly once)<\/figcaption><\/figure>\n<ul>\n<li>Garantie, dass Nachricht genau einmal empfangen wurde<\/li>\n<li>Client sendet solange, bis vom Broker eine Antwort kommt<\/li>\n<li>Broker wartet mit Weiterverarbeitung, bis Sendung abgeschlossen ist<\/li>\n<li>weitere zwei Packages, um den Empfang zu quittieren<\/li>\n<\/ul>\n<h3>Bedeutung der einzelnen Pakete<\/h3>\n<ul>\n<li>PUBLISH = Nachricht wird gesendet<\/li>\n<li>PUBREC = publish received (Nachricht wurde empfangen, keine Nachrichten weitersenden)<\/li>\n<li>PUBREL = message release (Nachricht wird nicht weiter gesendet Nachricht kann aus Queue des Brokers entfernt und an Subscriber weitergesendet werden)<\/li>\n<li>PUBCOMP = publish complete (Nachricht wird nicht erneut vom Client gesendet)<\/li>\n<\/ul>\n<h1>Demo: Publish\/Subscribe \u00fcber einen lokalen Broker<\/h1>\n<ul>\n<li>In der Demo nutzen wir Mosquitto als Broker\n<ul>\n<li><b>Broker starten :<\/b> \u201ddocker run -it -p 1883:1883 eclipse-mosquitto\u201d<\/li>\n<li><b>IP des Broker\/Server herausfinden: <\/b><b><br \/>\n<\/b><b>\u201c<\/b>docker inspect -f &#8218;{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}&#8216; {containerId}\u201d<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li><b>Subscriben von Nachrichten: <\/b>\u201cmosquitto_sub &#8211;host {ip-address} &#8211;topic &#8218;SmartHome\/EG\/+\/Temp&#8216; -v -d\u201d<\/li>\n<\/ul>\n<ul>\n<li><b>Publishen von K\u00fcche und Gang: <\/b>\u201cmosquitto_pub &#8211;host {ip-address} &#8211;topic &#8218;SmartHome\/EG\/Gang\/Temp&#8216; -m &#8217;23\u00b0C\u201d\n<ul>\n<li>Man sieht Publisher verbindet sich mit Broker<\/li>\n<li>Man sieht anhand Packages: QOS 0 (default)<\/li>\n<\/ul>\n<\/li>\n<li style=\"list-style-type: none\"><\/li>\n<li>Wechsel zu QOS 2 via \u201d-q 2\u201d bei beiden<\/li>\n<\/ul>\n<h1>Skalierbarkeit und Effizienz<\/h1>\n<p>MQTT kann skaliert werden, um eine Verbindung mit Millionen von IoT-Ger\u00e4ten herzustellen. Je nach Anzahl von Publishern und Subscribern ist st\u00e4rkere Hardware notwendig (Vertikale Skalierung). Horizontale Skalierbarkeit ist auch m\u00f6glich, allerdings nicht mit jeder Broker-Implementierung.<\/p>\n<h2>HTTP VS MQTT<\/h2>\n<ul>\n<li>10% weniger Traffic mit MQTT<\/li>\n<li>22% Energie effizienter als HTTP<\/li>\n<li>15% Ressourcen effizienter als HTTP<\/li>\n<\/ul>\n<figure id=\"attachment_185\" aria-describedby=\"caption-attachment-185\" style=\"width: 532px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/cloud.google.com\/blog\/products\/iot-devices\/http-vs-mqtt-a-tale-of-two-iot-protocols\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-185\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2021\/01\/mqtt-image3.png\" alt=\"\" width=\"532\" height=\"329\" \/><\/a><figcaption id=\"caption-attachment-185\" class=\"wp-caption-text\">Durchschnittliche Datenmenge, die pro Nachricht f\u00fcr unterschiedliche Anzahlen von Nachrichten \u00fcbertragen wird<\/figcaption><\/figure>\n<ul>\n<li>mehr als 90% des Traffics ist f\u00fcr den Aufbau und Beenden einer Verbindung<\/li>\n<li>vorteil gegen\u00fcber HTTP bei wiederverwendung von bestehender Verbindung<\/li>\n<\/ul>\n<figure id=\"attachment_184\" aria-describedby=\"caption-attachment-184\" style=\"width: 555px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/cloud.google.com\/blog\/products\/iot-devices\/http-vs-mqtt-a-tale-of-two-iot-protocols\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-184\" src=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2021\/01\/mqtt-image2.png\" alt=\"\" width=\"555\" height=\"343\" \/><\/a><figcaption id=\"caption-attachment-184\" class=\"wp-caption-text\">\u00dcbertragungszeit f\u00fcr verschiedene Nachrichtengr\u00f6\u00dfen<\/figcaption><\/figure>\n<ul>\n<li>h\u00f6chste Effizienz m\u00f6glich bei hoher dichte der payload message<\/li>\n<\/ul>\n<h1>Sicherheit<\/h1>\n<h2>M\u00f6glichkeiten zur sicheren Kommunikation<\/h2>\n<ul>\n<li>eigener Broker ist Sicherste weg<\/li>\n<li>initialen Verbindungsaufbau zu einem MQTT-Broker Authentifizieren\n<ul>\n<li>mit Benutzernamen und Passwort<\/li>\n<li>komplexere Authentifizierungsmethoden wie OAuth 2.0<\/li>\n<\/ul>\n<\/li>\n<li>Authorisierung\n<ul>\n<li>b\u00f6sartiger Client Nachrichten von allen Topics abonnieren und damit unberechtigterweise Daten mitlesen<\/li>\n<li>Broker entscheidet\n<ul>\n<li>Darf ein Client auf einem bestimmten Topic eine Retained Message versenden?<\/li>\n<li>Welches QoS-Level darf der Client senden oder abonnieren?<\/li>\n<li>Welche Topics darf der Client benutzen?<\/li>\n<li>Darf der Client auf einem bestimmten Topic abonnieren, senden oder gar beides?<\/li>\n<\/ul>\n<\/li>\n<li>Einschr\u00e4nkungen konfigurieren (maximale Nachrichtengr\u00f6\u00dfe der Clients und die maximale Bandbreite MQTT-Sender)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Verschl\u00fcsselung<\/h2>\n<ul>\n<li>Client initialisiert selbst verbindung mit Broker\n<ul>\n<li>kein \u00d6ffnen der Verbindungen von au\u00dfen m\u00f6glich<\/li>\n<li>Brute-Force- und Denial-of-Service-Attacken auf einzelne Ger\u00e4te sind schwierig durchzuf\u00fchren<\/li>\n<\/ul>\n<\/li>\n<li>TLS einsetzten\n<ul>\n<li>Man-In-The-Middle-Attacken weitgehend vermeiden<\/li>\n<li>Verschl\u00fcsselte Verbindung<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h1>Use Cases<\/h1>\n<h2>Matternet<\/h2>\n<ul>\n<li>Vernetzung von Drohnen und Landestationen \u00fcber HiveMQ-Broker<\/li>\n<li>Bereitstellung von Telemetrieinformationen (Flugstatus) in Echtzeit<\/li>\n<li>Kommunikation \u00fcber ggf. unzuverl\u00e4ssiges LTE Netzwerk wird durch Protokoll verbessert<\/li>\n<li>Bediener k\u00f6nnen dadurch auch mit Drohnen interagieren (obwohl sie nicht darin fliegen)<\/li>\n<\/ul>\n<h2>BMW Mobility Services<\/h2>\n<ul>\n<li>Carsharing-Anwendung<\/li>\n<li>Benutzt als alternative Messaging L\u00f6sung (anstatt SMS und HTTP)<\/li>\n<li>Nutzen: Geringere Kosten durch weniger Daten\u00fcbertragung, h\u00f6here Zuverl\u00e4ssigkeit durch QoS Levels<\/li>\n<\/ul>\n<h1>Der Blogpost ist auch als Foliensatz verf\u00fcgbar<\/h1>\n<p>Download: <a href=\"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-content\/uploads\/2021\/01\/MQTT-Folien.pdf\">\u00dcbersicht \u00fcber den MQTT Standard<\/a><\/p>\n<h1>Quellen<\/h1>\n<ul>\n<li><a href=\"https:\/\/www.informatik-aktuell.de\/betrieb\/netzwerke\/mqtt-leitfaden-zum-protokoll-fuer-das-internet-der-dinge.html\">https:\/\/www.informatik-aktuell.de\/betrieb\/netzwerke\/mqtt-leitfaden-zum-protokoll-fuer-das-internet-der-dinge.html<\/a><\/li>\n<li><a href=\"https:\/\/www.hivemq.com\/blog\/mqtt-essentials-part-5-mqtt-topics-best-practices\/\">https:\/\/www.hivemq.com\/blog\/mqtt-essentials-part-5-mqtt-topics-best-practices\/<\/a><\/li>\n<li><a href=\"https:\/\/www.hivemq.com\/blog\/mqtt-essentials-part-6-mqtt-quality-of-service-levels\/\">https:\/\/www.hivemq.com\/blog\/mqtt-essentials-part-6-mqtt-quality-of-service-levels\/<\/a><\/li>\n<li><a href=\"https:\/\/flespi.com\/blog\/http-vs-mqtt-performance-tests\">https:\/\/flespi.com\/blog\/http-vs-mqtt-performance-tests<\/a><\/li>\n<li><a href=\"https:\/\/cloud.google.com\/blog\/products\/iot-devices\/http-vs-mqtt-a-tale-of-two-iot-protocols\">https:\/\/cloud.google.com\/blog\/products\/iot-devices\/http-vs-mqtt-a-tale-of-two-iot-protocols<\/a><\/li>\n<li><a href=\"https:\/\/m.heise.de\/developer\/artikel\/Sichere-IoT-Kommunikation-mit-MQTT-Teil-1-Grundlagen-3645209.html\">https:\/\/m.heise.de\/developer\/artikel\/Sichere-IoT-Kommunikation-mit-MQTT-Teil-1-Grundlagen-3645209.html<\/a><\/li>\n<\/ul>\n<h1>Bildquellen<\/h1>\n<ul>\n<li><a href=\"https:\/\/www.hivemq.com\/img\/blog\/qos-levels_qos0.svg\">https:\/\/www.hivemq.com\/img\/blog\/qos-levels_qos0.svg<\/a><\/li>\n<li><a href=\"https:\/\/www.hivemq.com\/img\/blog\/qos-levels_qos1.svg\">https:\/\/www.hivemq.com\/img\/blog\/qos-levels_qos1.svg<\/a><\/li>\n<li><a href=\"https:\/\/www.hivemq.com\/img\/blog\/qos-levels_qos2.svg\">https:\/\/www.hivemq.com\/img\/blog\/qos-levels_qos2.svg<\/a><\/li>\n<li><a href=\"https:\/\/storage.googleapis.com\/gweb-cloudblog-publish\/images\/diagram.max-1400x1400.png\">https:\/\/storage.googleapis.com\/gweb-cloudblog-publish\/images\/diagram.max-1400&#215;1400.png<\/a><\/li>\n<li><a href=\"https:\/\/storage.googleapis.com\/gweb-cloudblog-publish\/images\/Transmission.max-1400x1400.png\">https:\/\/storage.googleapis.com\/gweb-cloudblog-publish\/images\/Transmission.max-1400&#215;1400.png<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Was ist MQTT? MQTT ist ein OASIS-Standard-Messaging-Protokoll f\u00fcr das Internet der Dinge (IoT). L\u00e4uft \u00fcber TCP extrem leichter Publish- \/<\/p>\n","protected":false},"author":19,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[13,12],"class_list":["post-167","post","type-post","status-publish","format-standard","hentry","category-betriebliche-informationssysteme","tag-iot","tag-mqtt"],"_links":{"self":[{"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/posts\/167","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/users\/19"}],"replies":[{"embeddable":true,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/comments?post=167"}],"version-history":[{"count":22,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/posts\/167\/revisions"}],"predecessor-version":[{"id":1158,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/posts\/167\/revisions\/1158"}],"wp:attachment":[{"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/media?parent=167"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/categories?post=167"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/informatik.htwk-leipzig.de\/seminar\/wp-json\/wp\/v2\/tags?post=167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}