Übersetzungen dieser Seite:

CoAP mit Python verwenden

aioCoAP - txThings asyncio Port

Dank Christian Amsüss gibt es inzwischen eine Python3 lib die asyncio verwendet und ohne (harte) Abhängigkeiten auskommt.
(LinkHeader ist optional um .well-known/core automatisch zu erzeugen)

Beispiele

txThings

Es ist empfehlenswert neue Projekte mit Python3 und aiocoap zu erstellen

  • basiert auf twisted
  • Server und Client
  • kann komfortabel CoAP Ressourcen erstellen
  • (noch) nicht Python3 kompatibel
  1. txThings per pip installieren oder git clonen txThings
  2. twisted installieren

Server

Vorbereitung

Um zB über einen Schalter einen Befehl an einen PC zu schicken benötigen wir einen CoAP-Server der Resourcen bereitstellt.

txThings liefert schon einen Beispielserver mit, am besten eine Kopie von server.py zum Experimentieren anlegen.

In der aktuellen Version horcht server.py von txThings nur auf IPv4, was für unsere Zwecke aber nicht brauchbar ist. Abhilfe schafft man indem man die vorletzte Zeile anpasst:

reactor.listenUDP(coap.COAP_PORT, coap.Coap(endpoint), '::')

Nun kann server.py direkt gestartet werden.

Mit ipconfig bzw. ip addr können wir unsere IP-Addressen anzeigen lassen. Wenn der PC im selben Netz hängt wie der Edge-Router sollte neben der lokalen fe80:: Addresse eine zweite IPv6 Addresse auftauchen (beginnend mit unseren Präfix zB. abbb::) Diese können wir gleich mit Copper testen.

Kurzerklärung

class TestResource (resource.CoAPResource):
    def __init__(self):
        # init stuff
        resource.CoAPResource.__init__(self)
        self.visible = True
        self.addParam(resource.LinkParam("title", "Test resource"))
        
    def render_GET(self, request):
        # Antwort bauen
        response = coap.Message(code=coap.CONTENT, payload='response msg')
        # und zurück senden
        return defer.succeed(response)
        
    def render_POST(self, request):
        # im Grunde wie in GET
        # Anfrage rausfischen
        req = request.payload
        # .. iwas damit tun, oder auch nicht
        # mal der Einfachheit halber echo zurueck
        response = coap.Message(code=coap.CONTENT, payload=req)
        return defer.succeed(response)
# die Wurzel allen Uebels
root = resource.CoAPResource()
well_known = resource.CoAPResource()
root.putChild('.well-known', well_known)
# CoreResource in server.py, bleibt mal unkommentiert
core = CoreResource(root)
well_known.putChild('core', core)

# Erstellen von /other/
other = resource.CoAPResource()
root.putChild('other', other)

# und /other/test fuer unsere Echoressource
test = TestResource()
other.putChild('echo', test)

# server starten
endpoint = resource.Endpoint(root)
reactor.listenUDP(coap.COAP_PORT, coap.Coap(endpoint), '::')
reactor.run()

Beispiele

  • teilweise schnelle Hacks
  • keine Anspruch auf Schönheit, Geschwindigkeit, Stabilität oder Sicherheit ;)

WakeOnLan

from subprocess import Popen

class WOLResource(resource.CoAPResource):
    def __init__(self):
        resource.CoAPResource.__init__(self)
        self.visible = True

    def render_POST(self, request):
        query = request.payload
        Popen(('wol', query))
        response = coap.Message(code=coap.CONTENT)
        return defer.succeed(response)

Wetterbericht

import requests

class WeatherResource (resource.CoAPResource):
    def __init__(self):
        resource.CoAPResource.__init__(self)
        self.visible = True
        self.addParam(resource.LinkParam("title", "Weather resource"))

    def render_GET(self, request):
        # Ortname als payload von request erwartet
        query = request.payload
        response = coap.Message(code=coap.CONTENT)
        # Wetterbericht von openweatherservice holen
        r = requests.get('http://api.openweathermap.org/data/2.5/weather?q=%s' % query)
        # Temperatur aus der response holen und von Kelvin in Celsius umrechnen
        response.payload = str(float(r.json()['main']['temp'])-273.15)
        return defer.succeed(response)

de/tutorials/coap_with_python.txt · Zuletzt geändert: 2016/11/12 15:33 von kelvan