{"id":401,"date":"2017-07-02T22:49:48","date_gmt":"2017-07-02T20:49:48","guid":{"rendered":"https:\/\/www.pingu-mobil.de\/iot\/?p=401"},"modified":"2021-05-14T10:07:49","modified_gmt":"2021-05-14T08:07:49","slug":"dingdong-3-blogeintrag-mqtt-einrichtung","status":"publish","type":"post","link":"http:\/\/www.iot-embedded.de\/iot-2017\/tuersteuerung\/dingdong-3-blogeintrag-mqtt-einrichtung\/","title":{"rendered":"DingDong 4. Blogeintrag: MQTT Einrichtung"},"content":{"rendered":"<p>Mit etwas Verz\u00f6gerung nun ein weiteres Update zu unserem Projektstatus:<\/p>\n<p>Dieses Update befasst sich mit der Einrichtung eines MQTT-Clients auf dem Raspberry PI.<\/p>\n<p>Der MQTT Broker l\u00e4uft schon eine Weile und der Client auf dem Raspberry PI jetzt auch.<\/p>\n<p>Dazu haben wir auf dem PI Python mit dem Python-paho-mqtt Package aktiviert und ein Script f\u00fcr die Bearbeitung der anfallenden Messages geschrieben.<\/p>\n<p>Was sich einfach anh\u00f6rt hat uns eine Menge Zeit und Nerven gekostet.<\/p>\n<p>Zum einen hatten wir keine richtigen Vorkenntnisse auf diesem Bereich, zum anderen entstanden unerwartete Probleme. Daher ergab sich folgende Vorgehensweise: zuerst einmal haben wir uns \u00fcber die verschiedenen Realisierungsm\u00f6glichkeiten eines MQTT Clients auf dem Raspberry PI informiert. Die Realisierung mittels Python stellte sich dabei als die passende Variante f\u00fcr unsere Zwecke da.<\/p>\n<p>Darauf folgte das eigentliche Problem: Unter Buildroot mussten wir f\u00fcr diese Realisierung sowohl Python (Aktivierung ging problemlos) als auch das (python-)paho-mqtt Package aktivieren. Dieses gab es allerdings unter dem Men\u00fc-Punkt Networking an dem wir es vermuteten nicht. Es folgte eine l\u00e4ngere Suche bei der vor allem L\u00f6sungsm\u00f6glichkeiten f\u00fcr andere Systeme wie beispielsweise der Einrichtung unter Rasbian gefunden wurden. Nachdem die ersten \u00dcberlegungen zur Verwendung anderer Realisierungsm\u00f6glichkeiten im Raum standen, haben wir das Package dann doch gefunden. Das Paket befindet sich im Python Package unter dem zus\u00e4tzlichen Men\u00fc-Punkt <em>External python modules<\/em>. Eine genauere Betrachtung des Pakets bzw. die richtige Verwendung von Google h\u00e4tte uns hier einige Zeit erspart.<\/p>\n<p>Nachdem das Package in Buildroot aktiviert war konnten wir auch das erforderliche Script zur Verwendung des MQTT Clients schreiben. Trotz fehlender Python Kenntnisse war die erste funktionierende Version innerhalb weniger Minuten angefertigt.<\/p>\n<p>Dabei stellten sich bei der Verwendung allerdings noch 2 Probleme dar:<\/p>\n<ul>\n<li>das Script Funktionierte nur beim ersten Aufruf Ordnungsgem\u00e4\u00df (&#8211;&gt; nach einem Abbruch des Scripts musste der PI neugestartet werden)<\/li>\n<li>Die Mac-Adresse des Raspberry PI, die als Topic angelegt werden soll, kann nicht als Variable \u00fcbergeben werden, sondern muss aktuell als fester Text mitgegeben werden<\/li>\n<\/ul>\n<blockquote><p>client.subscribe(&#8222;<em>Mac-Adresse<\/em>\/#&#8220;)<\/p><\/blockquote>\n<p>Das erstgenannte Problem hing mit der loop_forever() Funktion zusammen. bei einem Abbruch des Scripts wurde kein Disconnect() aufgerufen und somit die Verbindung nicht getrennt.<\/p>\n<p>Das zweite Problem befindet sich derzeit noch in Bearbeitung.<\/p>\n<p>Folgend das momentan eingesetzte Script:<\/p>\n<blockquote><p>#!\/usr\/bin\/python<br \/>\n# -*- coding: utf-8 -*-<\/p>\n<p>import paho.mqtt.client as mqtt<br \/>\nimport atexit<\/p>\n<p>def exit_handler():<br \/>\nclient.disconnect()<br \/>\nexit()<\/p>\n<p>def on_disconnect(client, userdata, rc):<br \/>\nprint(&#8222;Disconnect with result code &#8220; + str(rc))<\/p>\n<p>&nbsp;<\/p>\n<p># Read MAC from file<br \/>\nmyMAC = open(&#8218;\/sys\/class\/net\/wlan0\/address&#8216;).read()<br \/>\nprint(myMAC)<br \/>\n# The callback for when the client receives a CONNACK response from the server.<br \/>\ndef on_connect(client, userdata, rc):<br \/>\nprint(&#8222;Connected with result code &#8220; + str(rc))<br \/>\n# Subscribing in on_connect() means that if we lose the connection and reconnect then subscriptions will be renewed.<br \/>\n#client.subscribe(str(myMAC)+&#8220;\/#&#8220;)<br \/>\nclient.subscribe(&#8222;b8:27:eb:37:eb:80\/#&#8220;)<\/p>\n<p># The callback for when a PUBLISH message is received from the server.<br \/>\ndef on_message(client, userdata, msg):<br \/>\nprint(&#8222;Topic: &#8222;, msg.topic + &#8222;\\nMessage: &#8220; + str(msg.payload))<\/p>\n<p>&nbsp;<\/p>\n<p>if __name__ == &#8222;__main__&#8220;:<br \/>\nclient = mqtt.Client(clean_session=True)<br \/>\nclient.on_connect = on_connect<br \/>\nclient.on_message = on_message<br \/>\nclient.on_disconnect = on_disconnect<\/p>\n<p>atexit.register(exit_handler)<\/p>\n<p>print(&#8222;Now trying to connect&#8230;&#8220;)<br \/>\nclient.connect(&#8222;broker.mqttdashboard.com&#8220;, 1883)<br \/>\nprint(&#8222;conn&#8220;)<br \/>\n# Blocking call that processes network traffic, dispatches callbacks and handles reconnecting.<br \/>\n# Other loop*() functions are available that give a threaded interface and a manual interface.<br \/>\nclient.loop_forever()<\/p><\/blockquote>\n<p>die wichtigen Teile des Scriptes:<\/p>\n<ul>\n<li>Zuerst wird paho-mqtt importiert und damit nutzbar gemacht.<\/li>\n<li>darauf folgt der Ablauf beim Schlie\u00dfen oder Abbruch des Scriptes (<em>exit_handler()<\/em>). hier wird daf\u00fcr gesorgt die Verbindung zum Broker abzubrechen (<em>disconnect()<\/em>)<\/li>\n<li>in der Funktion <em>on_connect()<\/em> wird die Verbindung zum Broker hergestellt und die Topic (benannt nach der Mac-Adresse des PI), auf die die Mobilger\u00e4te eingeschrieben werden sollen, gesetzt.<\/li>\n<li>Darauf folgt im vorliegenden Script die on_message() Funktion, welche das Verhalten beim Callback regelt.<\/li>\n<li>abschlie\u00dfend folgen die jeweiligen Einstellung f\u00fcr die ben\u00f6tigten Funktionsweisen.<\/li>\n<\/ul>\n<blockquote><p>client.connect(&#8222;broker.mqttdashboard.com&#8220;, 1883)<\/p><\/blockquote>\n<p>gibt den Zielserver, also den Broker an. Dieser muss noch auf unseren eigenen eingestellt werden.<\/p>\n<p>&nbsp;<\/p>\n<p>Das war auch schon alles zum momentanen Stand, im n\u00e4chsten Schritt werden die GPIO Pins des Raspberry PI aktiviert und per Script angesteuert. In Verbindung mit MQTT sollen die ausgetauschten Nachrichten dann sowohl das Klingeln der T\u00fcr als auch das \u00d6ffnen der T\u00fcr repr\u00e4sentieren bzw. steuern.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit etwas Verz\u00f6gerung nun ein weiteres Update zu unserem Projektstatus: Dieses Update befasst sich mit der Einrichtung eines MQTT-Clients auf dem Raspberry PI. Der MQTT Broker l\u00e4uft schon eine Weile und der Client auf dem Raspberry PI jetzt auch. Dazu<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[7,9],"_links":{"self":[{"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/posts\/401"}],"collection":[{"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/comments?post=401"}],"version-history":[{"count":1,"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/posts\/401\/revisions"}],"predecessor-version":[{"id":568,"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/posts\/401\/revisions\/568"}],"wp:attachment":[{"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/media?parent=401"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/categories?post=401"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/tags?post=401"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}