{"id":452,"date":"2021-06-21T15:53:47","date_gmt":"2021-06-21T13:53:47","guid":{"rendered":"https:\/\/www.iot-embedded.de\/iot-2021\/?p=452"},"modified":"2021-06-22T15:27:42","modified_gmt":"2021-06-22T13:27:42","slug":"mqtt-in-python-und-die-probleme-mit-der-verschluesselung","status":"publish","type":"post","link":"https:\/\/www.iot-embedded.de\/iot-2021\/air-quality\/mqtt-in-python-und-die-probleme-mit-der-verschluesselung\/","title":{"rendered":"MQTT in Python und die Probleme mit der Verschl\u00fcsselung"},"content":{"rendered":"\n<p>Zum Versenden der eingelesenen Sensordaten zu Temperatur, Luftfeuchtigkeit und Co2-Wert wird ein MQTT-Client verwendet. In unserem Projekt wird dies durch die Python Bibliothek Paho-Python umgesetzt. Dazu k\u00f6nnen gro\u00dfe Teile des Beispielcodes von Herrn Schulmeister \u00fcbernommen werden. Lediglich die Adresse des Brokers, die Namen der zu verwendenden Topics, sowie ein Benutzername und ein Kennwort f\u00fcr den Zugriff auf den Broker m\u00fcssen ge\u00e4ndert, bzw. gesetzt werden.<\/p>\n\n\n\n<p>Da der Broker von HiveMQ unter der Adresse broker.hivemq.com zwar einfach aufzurufen ist, aber auch \u00f6ffentlich zug\u00e4nglich haben wir uns dazu entschieden einen privaten Broker zu nutzen. Dabei sind wir auf das BASIC Paket der <a href=\"https:\/\/console.hivemq.cloud\/\">HiveMQ Cloud<\/a> aufmerksam geworden, welches einen kostenlosen, privaten Broker zur Verf\u00fcgung stellt. Die mit der kostenlosen Version einhergehenden Einschr\u00e4nkungen sind dabei f\u00fcr unser Projekt kaum ein Hindernis.<\/p>\n\n\n\n<p>Meldet man sich bei dem Broker an, bietet sich die M\u00f6glichkeit, ein neues Cluster mit einer eigenen URL zu erstellen und dieses zu verwalten. Es k\u00f6nnen unterschiedliche Nutzernamen und zugeh\u00f6rige Kennw\u00f6rter erstellt werden.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"998\" height=\"530\" src=\"https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/06\/grafik-1.png\" alt=\"\" class=\"wp-image-448\" srcset=\"https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/06\/grafik-1.png 998w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/06\/grafik-1-300x159.png 300w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/06\/grafik-1-768x408.png 768w\" sizes=\"(max-width: 998px) 100vw, 998px\" \/><\/figure>\n\n\n\n<p>Beim erstellen eines Clusters kann auch gew\u00e4hlt werden, ob es durch Amazon Webservices oder durch die Microsoft Azure Cloud gehostet werden soll. Au\u00dferdem bietet HiveMQ im Cluster einen leicht verst\u00e4ndlichen Getting-Started Guide an, dem man bei der Einbindung folgen kann.<\/p>\n\n\n\n<p>Ein einfaches Testprogramm welches an eine Topic des Brokers sendet, sowie das Gegenst\u00fcck, welches die Daten empf\u00e4ngt waren mit Hilfe des Guides schnell aufgesetzt: <br>sowohl der Sender:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import paho.mqtt.client as mqtt\nimport time\n\n# The callback for when the client receives a CONNACK response from the server.\ndef on_connect(client, userdata, flags, rc):\n    if rc == 0:\n        print(\"Connected successfully\")\n    else:\n        print(\"Connect returned result code: \" + str(rc))\n\n# create the client\nclient = mqtt.Client()\nclient.on_connect = on_connect\nclient.on_message = on_message\n\n# enable TLS\nclient.tls_set(tls_version=mqtt.ssl.PROTOCOL_TLS)\n\n# set username and password\nclient.username_pw_set(\"XXXXXXX\", \"XXXXXXXX\")\n\n# connect to HiveMQ Cloud on port 8883\nclient.connect(\"XXXXXXXXXXXXXXXXXXX.s1.eu.hivemq.cloud\", 8883)\n\ncount = 0\nwhile 1:\n    count= count+1\n    client.publish(\"XXXX\/XXXX\/XXX\", \"\" + str(count) + \"te Nachricht\")\n    time.sleep(2)\n\n# Blocking call that processes network traffic, dispatches callbacks and handles reconnecting.\nclient.loop_forever()<\/code><\/pre>\n\n\n\n<p>Als auch der Empf\u00e4nger:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import paho.mqtt.client as mqtt\n\n# The callback for when the client receives a CONNACK response from the server.\ndef on_connect(client, userdata, flags, rc):\n    if rc == 0:\n        print(\"Connected successfully\")\n    else:\n        print(\"Connect returned result code: \" + str(rc))\n\n# The callback for when a PUBLISH message is received from the server.\ndef on_message(client, userdata, msg):\n    print(\"Received message: \" + msg.payload.decode(\"utf-8\"))\n\n# create the client\nclient = mqtt.Client()\nclient.on_connect = on_connect\nclient.on_message = on_message\n\n# enable TLS\nclient.tls_set(tls_version=mqtt.ssl.PROTOCOL_TLS)\n\n# set username and password\nclient.username_pw_set(\"XXXXXXXXXX\", \"XXXXXXXXXXXXX\")\n\n#connect to the broker and subscribe to a topic \nclient.connect(\"XXXXXXXXXXXXXXXXXXXXX.s1.eu.hivemq.cloud\", 8883)\nclient.subscribe(\"XXXX\/XXXX\/XXX\")\n\nclient.loop_forever()<\/code><\/pre>\n\n\n\n<p>Bei der Einbindung in den Programmcode auf dem Pi kam es jedoch zu kurzzeitigen Schwierigkeiten: Es konnte keine Verbindung zum Broker hergestellt werden.<br>Wie sich dann herausgestellt hat, ist es notwendig den MQTT-Client so zu konfigurieren, dass er eine verschl\u00fcsselt Verbindung zul\u00e4sst. Dies ist \u00fcber folgenden Befehl m\u00f6glich, welcher im Testcode bereits verwendet wurde, in der Vorlage zu diesem Zeitpunkt jedoch noch nicht eingebunden war:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>self._mqtt.tls_set(tls_version=mqtt.ssl.PROTOCOL_TLS)<\/code><\/pre>\n\n\n\n<p>Weitere Informationen dazu sind auch im <a href=\"https:\/\/www.iot-embedded.de\/iot-2021\/wichtige-hinweise\/hivemq-cloud-ein-eigener-mqtt-server-in-wenigen-sekunden\/\">Blogbeitrag von Herrn Schulmeister<\/a> nachzulesen. Der dort ver\u00f6ffentlichte Commit, welcher eine Abfrage, ob TLS verwendet werden soll mitbringt, konnte jedoch zum aktuellen Zeitpunkt noch nicht erfolgreich in unseren Code eingebunden werden. So ist die Verbindung mit TLS bei uns hardcodiert aktiviert.<br>Sollte es noch gelingen den Code so anzupassen, dass es funktioniert, wird hier im Blog (als Edit oder Comment) ein Update erfolgen.<\/p>\n\n\n\n<p>Aber auch so, wie es aktuell ist, ist es m\u00f6glich Daten per MQTT zu senden und auch wieder zu empfangen. Im Folgenden ein Beispiel eines von unserem Raspberry Pi versendeten, und von oben genanntem Testempf\u00e4nger empfangenen Datensatzes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Received message: &#091;{\"_id\": \"1624283334375-0\", \"_device_uuid\": \"\u25ae\u25ae\u25ae\u25ae\u25ae\u25ae\u25ae\u25ae\u25ae\u25ae\u25ae\u25ae\u25ae\", \"_device_type\": \"raspberrypi4-64\", \"_app_id\": \"1\", \"_app_name\": \"localapp\", \"temperatur\": \"27\", \"feuchtigkeit\": \"53\", \"co2_wert\": \"728\"}]<\/code><\/pre>\n\n\n\n<p><strong>Update:<\/strong><\/p>\n\n\n\n<p>Durch eine \u00c4nderung der Reihenfolge der Aufrufe konnte der Code von Herrn Schulmeister f\u00fcr unser Projekt lauff\u00e4hig gemacht werden:<\/p>\n\n\n\n<p>vorher:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>self._mqtt = mqtt.Client()\n        self._mqtt.on_connect = self._on_mqtt_connect\n        self._mqtt.on_disconnect = self._on_mqtt_disconnect\n\n        self._mqtt.connect(host=self._mqtt_config&#091;\"host\"], port=self._mqtt_config&#091;\"port\"], keepalive=self._mqtt_config&#091;\"keepalive\"])\n\n        if self._mqtt_config&#091;\"tls_ca_certs\"] or self._mqtt_config&#091;\"tls_certfile\"] or self._mqtt_config&#091;\"tls_keyfile\"]:\n            self._logger.info(\n                \"Setze TLS-Parameter f\u00fcr die MQTT-Verbindung: \"\n                \"tls_ca_certs=%(tls_ca_certs)s, tls_certfile=%(tls_certfile)s, tls_keyfile=%(tls_keyfile)s\" % self._mqtt_config\n            )\n\n            self._mqtt.tls_set(tls_version=ssl.PROTOCOL_TLS, ca_certs=self._mqtt_config&#091;\"tls_ca_certs\"], certfile=self._mqtt_config&#091;\"tls_certfile\"], keyfile=self._mqtt_config&#091;\"tls_keyfile\"])\n        elif self._mqtt_config&#091;\"tls_enable\"]:\n            self._logger.info(\"Aktiviere TLS\/SSL-Verschl\u00fcsselung\")\n            self._mqtt.tls_set(tls_version=ssl.PROTOCOL_TLS)\n\n        if self._mqtt_config&#091;\"tls_insecure\"]:\n            self._logger.info(\"Erlaube unsichere TLS-Zertifikate f\u00fcr die Verbindung zum MQTT-Broker\")\n            self._mqtt.tls_insecure_set(True)\n\n        if self._mqtt_config&#091;\"username\"] or self._mqtt_config&#091;\"password\"]:\n            self._logger.info(\"Setze Benutzername und Passwort f\u00fcr den MQTT-Broker\")\n            self._mqtt.username_pw_set(username=self._mqtt_config&#091;\"username\"], password=self._mqtt_config&#091;\"password\"])<\/code><\/pre>\n\n\n\n<p>nachher:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        self._mqtt = mqtt.Client()\n        self._mqtt.on_connect = self._on_mqtt_connect\n        self._mqtt.on_disconnect = self._on_mqtt_disconnect\n\n\n        if self._mqtt_config&#091;\"username\"] or self._mqtt_config&#091;\"password\"]:\n            self._logger.info(\"Setze Benutzername und Passwort f\u00fcr den MQTT-Broker\")\n            self._mqtt.username_pw_set(username=self._mqtt_config&#091;\"username\"], password=self._mqtt_config&#091;\"password\"])\n\n        if self._mqtt_config&#091;\"tls_insecure\"]:\n            self._logger.info(\"Erlaube unsichere TLS-Zertifikate f\u00fcr die Verbindung zum MQTT-Broker\")\n            self._mqtt.tls_insecure_set(True)\n\n        if self._mqtt_config&#091;\"tls_ca_certs\"] or self._mqtt_config&#091;\"tls_certfile\"] or self._mqtt_config&#091;\"tls_keyfile\"]:\n            self._logger.info(\n                \"Setze TLS-Parameter f\u00fcr die MQTT-Verbindung: \"\n                \"tls_ca_certs=%(tls_ca_certs)s, tls_certfile=%(tls_certfile)s, tls_keyfile=%(tls_keyfile)s\" % self._mqtt_config\n            )\n\n            self._mqtt.tls_set(tls_version=ssl.PROTOCOL_TLS, ca_certs=self._mqtt_config&#091;\"tls_ca_certs\"], certfile=self._mqtt_config&#091;\"tls_certfile\"], keyfile=self._mqtt_config&#091;\"tls_keyfile\"])\n\n        elif self._mqtt_config&#091;\"tls_enable\"]:\n            self._logger.info(\"Aktiviere TLS\/SSL-Verschl\u00fcsselung\")\n            self._mqtt.tls_set(tls_version=ssl.PROTOCOL_TLS)\n\n        self._mqtt.connect(host=self._mqtt_config&#091;\"host\"], port=self._mqtt_config&#091;\"port\"], keepalive=self._mqtt_config&#091;\"keepalive\"])<\/code><\/pre>\n\n\n\n<p>au\u00dferdem musste in den Imports der Import &#8222;ssl&#8220; hinzugef\u00fcgt werden, oder statt ssl.PROTOCOL_TLS die version mqtt.ssl.PROTOCOL_TLS verwendet werden.<br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zum Versenden der eingelesenen Sensordaten zu Temperatur, Luftfeuchtigkeit und Co2-Wert wird ein MQTT-Client verwendet. In unserem Projekt wird dies durch die Python Bibliothek Paho-Python umgesetzt. Dazu k\u00f6nnen gro\u00dfe Teile des Beispielcodes von Herrn Schulmeister \u00fcbernommen werden. Lediglich die Adresse des<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[7],"tags":[],"_links":{"self":[{"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts\/452"}],"collection":[{"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/comments?post=452"}],"version-history":[{"count":7,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts\/452\/revisions"}],"predecessor-version":[{"id":462,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts\/452\/revisions\/462"}],"wp:attachment":[{"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/media?parent=452"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/categories?post=452"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/tags?post=452"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}