Mit etwas Verzögerung 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äuft schon eine Weile und der Client auf dem Raspberry PI jetzt auch.

Dazu haben wir auf dem PI Python mit dem Python-paho-mqtt Package aktiviert und ein Script für die Bearbeitung der anfallenden Messages geschrieben.

Was sich einfach anhört hat uns eine Menge Zeit und Nerven gekostet.

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 über die verschiedenen Realisierungsmöglichkeiten eines MQTT Clients auf dem Raspberry PI informiert. Die Realisierung mittels Python stellte sich dabei als die passende Variante für unsere Zwecke da.

Darauf folgte das eigentliche Problem: Unter Buildroot mussten wir für diese Realisierung sowohl Python (Aktivierung ging problemlos) als auch das (python-)paho-mqtt Package aktivieren. Dieses gab es allerdings unter dem Menü-Punkt Networking an dem wir es vermuteten nicht. Es folgte eine längere Suche bei der vor allem Lösungsmöglichkeiten für andere Systeme wie beispielsweise der Einrichtung unter Rasbian gefunden wurden. Nachdem die ersten Überlegungen zur Verwendung anderer Realisierungsmöglichkeiten im Raum standen, haben wir das Package dann doch gefunden. Das Paket befindet sich im Python Package unter dem zusätzlichen Menü-Punkt External python modules. Eine genauere Betrachtung des Pakets bzw. die richtige Verwendung von Google hätte uns hier einige Zeit erspart.

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.

Dabei stellten sich bei der Verwendung allerdings noch 2 Probleme dar:

  • das Script Funktionierte nur beim ersten Aufruf Ordnungsgemäß (–> nach einem Abbruch des Scripts musste der PI neugestartet werden)
  • Die Mac-Adresse des Raspberry PI, die als Topic angelegt werden soll, kann nicht als Variable übergeben werden, sondern muss aktuell als fester Text mitgegeben werden

client.subscribe(„Mac-Adresse/#“)

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.

Das zweite Problem befindet sich derzeit noch in Bearbeitung.

Folgend das momentan eingesetzte Script:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import paho.mqtt.client as mqtt
import atexit

def exit_handler():
client.disconnect()
exit()

def on_disconnect(client, userdata, rc):
print(„Disconnect with result code “ + str(rc))

 

# Read MAC from file
myMAC = open(‚/sys/class/net/wlan0/address‘).read()
print(myMAC)
# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, rc):
print(„Connected with result code “ + str(rc))
# Subscribing in on_connect() means that if we lose the connection and reconnect then subscriptions will be renewed.
#client.subscribe(str(myMAC)+“/#“)
client.subscribe(„b8:27:eb:37:eb:80/#“)

# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
print(„Topic: „, msg.topic + „\nMessage: “ + str(msg.payload))

 

if __name__ == „__main__“:
client = mqtt.Client(clean_session=True)
client.on_connect = on_connect
client.on_message = on_message
client.on_disconnect = on_disconnect

atexit.register(exit_handler)

print(„Now trying to connect…“)
client.connect(„broker.mqttdashboard.com“, 1883)
print(„conn“)
# Blocking call that processes network traffic, dispatches callbacks and handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a manual interface.
client.loop_forever()

die wichtigen Teile des Scriptes:

  • Zuerst wird paho-mqtt importiert und damit nutzbar gemacht.
  • darauf folgt der Ablauf beim Schließen oder Abbruch des Scriptes (exit_handler()). hier wird dafür gesorgt die Verbindung zum Broker abzubrechen (disconnect())
  • in der Funktion on_connect() wird die Verbindung zum Broker hergestellt und die Topic (benannt nach der Mac-Adresse des PI), auf die die Mobilgeräte eingeschrieben werden sollen, gesetzt.
  • Darauf folgt im vorliegenden Script die on_message() Funktion, welche das Verhalten beim Callback regelt.
  • abschließend folgen die jeweiligen Einstellung für die benötigten Funktionsweisen.

client.connect(„broker.mqttdashboard.com“, 1883)

gibt den Zielserver, also den Broker an. Dieser muss noch auf unseren eigenen eingestellt werden.

 

Das war auch schon alles zum momentanen Stand, im nächsten 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ür als auch das Öffnen der Tür repräsentieren bzw. steuern.

 

DingDong 4. Blogeintrag: MQTT Einrichtung
Markiert in:     

2 Gedanken zu „DingDong 4. Blogeintrag: MQTT Einrichtung

  • 3. Juli 2017 um 23:57
    Permalink

    Klassr. Python ist mit Abstand meiner Lieblingssprache. 😎

    Warum klappt die Version mit der dynamisch gesetzten MAC nicht?

    • 4. Juli 2017 um 16:50
      Permalink

      Das konnten wir bis jetzt nicht herausfinden.
      Vermutlich wird der Inhalt der Variable myMAC beim subscribe() noch einmal geändert. der Teil myMAC = open(‚/sys/class/net/wlan0/address‘).read() funktionierte bei Tests wie erwartet. Allerdings wurde der Client beim Broker nicht richtig registriert.

Kommentare sind geschlossen.