Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Die Dinge im Internet der Dinge mit Python verbinden...

Die Dinge im Internet der Dinge mit Python verbinden...

PyCon.DE 2013, Cologne, Germany
https://2013.de.pycon.org/schedule/sessions/32/

Andreas Schreiber

October 17, 2013
Tweet

More Decks by Andreas Schreiber

Other Decks in Programming

Transcript

  1. Slide 3 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Warum? Was ist

    meine Motivation das Internet der Dinge? Quantified Self – mich selbst vermessen • Mit Sensoren • Mit Smartphone-Apps
  2. Slide 14 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Internet der Dinge

    / Internet of Things Milliarden an Geräten, Sensoren und Chips • Verbundene physikalische Objekte (oder deren virtuelle Repräsentation) • Verbunden über das Internet • Eindeutig identifiziert • Sie interagieren miteinander
  3. Slide 15 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Geräte Die „Dinge“

    sind • Embedded Systeme • Sensoren • Aktuatoren
  4. Slide 16 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Wachstum Die Anzahl

    der mit Internet verbundenen Geräte steigt täglich 50.000.000.000 „Dinge“ bis 2020
  5. Slide 18 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 MQTT MQ Telemetry

    Transport • Machine-to-machine (M2M) connectivity protocol • Publish/Subscribe-Messaging • Rechnet mit unzuverlässigen Netzwerken mit geringer Bandbreite und hoher Latenzzeit • Rechnet mit Clients mit geringer Rechenleistung • Erlaubt hohen Quality-of-Service, falls das Netzwerk es erlaubt • Einfach zu implementieren
  6. Slide 19 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Broker MQTT Broker

    MQTT Broker Client Client Client Client publish subscribe topic/subtopic (optional) Bridge Client
  7. Slide 20 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 MQTT-Protokoll • One-to-Many-Message-Verteilung

    über TCP/IP • Benachrichtigung, falls Clients unbeabsichtigt getrennt werden • Message-Format • Fester Header mit 2-Byte • Variabler Header für Message-Typen • Payload (z.B. der Topic oder kleine Mengen an Daten)
  8. Slide 21 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Topics • Messages

    in MQTT werden auf „Topics“ veröffentlicht • Keine Konfiguration notwendig, einfach auf dem Topic veröffentlichen • Topics sind hierarchisch mit „/“ als Trenner my/home/temperature/kitchen my/home/temperature/livingroom my/server/temperature
  9. Slide 22 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 MQTT Implementierungen Server/Broker

    • IBM Websphere MQ • RSMB • Mosquitto • Eclispe Paho • MQTT.js • Apache ActiveMQ • RabittMQ • HiveMQ Bibliotheken für • C/C++ • Java • Python • Perl • PHP • Ruby • … http://mqtt.org/wiki/software
  10. Slide 23 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Mosquitto Open Source

    MQTT Broker • http://mosquitto.org • Implementiert in C • Source Code bei bitbucket • Viele Binärpakete
  11. Slide 24 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Einen Broker starten…

    • Installieren • apt-get install mosquitto • Einfach mit einer Konfigurationsdatei starten • mosquitto –c mosquitto.conf
  12. Slide 25 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Broker-Status Der Mosquitto-Broker

    veröffentlicht Status-Messages $SYS/broker/messages/sent $SYS/broker/subscriptions/count $SYS/broker/uptime . . .
  13. Slide 27 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Mosquitto mit Python

    Python Client-Modul • Eine einzelne Datei, reine Python-Implementierung • Veröffentlichen und Empfangen von Messages • Callbacks • Connect • Disconnect • Publish • Message • Subscribe
  14. Slide 28 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Subscribe import mosquitto

    def on_message(mosq, obj, msg): print(msg.topic + ' ' + str(msg.payload)) mqtt_client = mosquitto.Mosquitto() mqtt_client.on_message = on_message mqtt_client.connect('test.mosquitto.org') mqtt_client.subscribe(‘#', 0) # all topics return_code = 0 while return_code == 0: return_code = mqtt_client.loop()
  15. Slide 29 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Publish import mosquitto

    mqtt_client = mosquitto.Mosquitto() mqtt_client.connect('test.mosquitto.org') mqtt_client.publish(‘pyconde/demo', 'hello world', 1)
  16. Slide 30 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Tools Tools zum

    Veröffentlichen und Abonnieren von MQTT-Topics • mqtt.io (Web) • Eclipse Paho (Java-Bibliothek und Eclipse View) • MQTT.app (Mac OS X) • . . . See http://mqtt.org/wiki/software
  17. Slide 33 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Mosquitto auf Android

    • Das Python-Modul funktioniert mit python-for-android • Einfach zu Benutzen mit Kivy-Clients kivy.org
  18. Slide 36 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Heimautomatisierung mit Raspberry

    Pi Messdaten mit Sensoren via 1-Wire holen • 1-Wire: Einkabel-Bussystem, niedrige Geschwindigkeit • Sensoren für Temperatur, Spannung, Licht, Feuchtigkeit, … • Verbunden via 1-Wire-USB-Adapter
  19. Slide 39 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Mosquitto auf dem

    Raspberry Pi Mosquitto funktioniert bestens auf Raspberry Pi • Einfach installieren • apt-get install mosquitto • Dann kann man den Broker starten oder Clients verwenden
  20. Slide 40 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Temperaturwerte holen Messwerte

    von 1-Wire-Sensoren unter Linux holen • Zwei Lösungen, die mit Python funktionieren • OWFS: One Wire File System (http://owfs.org) • DigiTemp und DigitemPy (http://www.digitemp.com)
  21. Slide 41 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Temperatur mit OWFS

    veröffentlichen import time import os import mosquitto file_name = os.path.join('/', 'mnt', '1wire', '10.67C6697351FF', 'temperature') mqtt_client = mosquitto.Mosquitto('home-temperature') mqtt_client.connect('test.mosquitto.org') while 1: file_object = open(file_name, 'r') temperature = '%sC' % file_object.read() mqtt_client.publish('home/demo/temperature', temperature, 1) mqtt_client.loop() time.sleep(5) file_object.close()
  22. Slide 43 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Android Push Notifications

    Daten von Quantified-Self-Gadgets zu Android schicken • Die Gadgets schicken Daten „irgendwohin“ in die Cloud • Withings, Fitbit, oder Nike stellen APIs zum Zugriff bereit • Registrieren für Benachrichtigungs-Callbacks • Wir benutzen eine Django-App, die sich als Callback-Listener registriert und MQTT-Messages schickt • Ein MQTT-Java-Client auf Android empfängt die Notifications
  23. Slide 44 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 MQTT Push Notification

    Architektur Django App MQTT Broker Gadget Hersteller (API) Gadget Android Phone publish notification measure- ments register phone register callback receives callbacks send messages
  24. Slide 45 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Implementierung & Deployment

    • Implementierung enthält viel OAuth-Zeug • Am meisten komplex war der Java-Code on Android (Fehlerbehandlung etc.) • Deployment auf Amazon Web Services Django/Mosquitt o EC2 instance User/Device registry Apps Withings Elastic IP Amazon CloudWatch Alarm SNS developer@med ando.de
  25. Slide 46 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Callback-Implementierung (Withings) def

    callback(request): """ Callback function for Withings notifications. """ . . . # request parameter handling devices = RegisteredWithingsUser.objects.filter(user_id=user_id) mqtt_client = MosquittoHandler(len(devices)) for device in devices: device_id = device.device_id mqtt_topic = 'medando/weightcompanion/weights/%s/%s' % (user_id, device_id) payload = simplejson.dumps({'startdate': startdate, 'enddate': enddate}) mqtt_client.publish(mqtt_topic, payload, 2, True) mqtt_client.wait()
  26. Slide 47 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 MQTT Messages medando/weightcompanion/weights/1883073/34bae8cbe8dd92f3

    0 {"startdate": "1371856646", "enddate": "1371856647"} medando/weightcompanion/weights/1791607/898efc38ac5d4211 0 {"startdate": "1372742400", "enddate": "1372742401"} medando/weightcompanion/weights/1527601/2ebcf034b8585668 0 {"startdate": "1368851117", "enddate": "1368851118"} medando/weightcompanion/weights/16121/f2a8ca66fd067954 0 {"startdate": "1372750563", "enddate": "1372750564"} medando/weightcompanion/weights/449599/4d701e076912648f 0 {"startdate": "1372751111", "enddate": "1372751112"} medando/weightcompanion/weights/642578/b33356881163a389 0 {"startdate": "1370585275", "enddate": "1370585276"} medando/weightcompanion/weights/2019258/33b1d416aeaec9ef 0 {"startdate": "1371377131", "enddate": "1371377132"} medando/weightcompanion/weights/2019258/61bdf242b37d8a29 0 {"startdate": "1371377131", "enddate": "1371377132"} medando/weightcompanion/weights/2019258/61bdf242b37d8a29 0 {"startdate": "1371377131", "enddate": "1371377132"}
  27. Slide 51 www.medando.de PyCon.DE 2013, Köln, 17.10.2013 Zusammenfassung • Es

    gibt viele andere Message Broker • Es gibt viele andere Push Notification Services • MQTT ist sehr leichtgewichtig • Mosquitto ist einfach mit Python nutzbar