Tag 4: UDP und JSON

Hinter dem vierten Türchen des Adventskalenders finden Sie einen Satz Kabel, die für die kommenden Hardwareaufbauten nützlich sind. Im heutigen Projekt wollen wir uns aber anschauen, was das JSONFormat ist und wie es uns hilft, mit dem Board zu kommunizieren.

Zuerst aktivieren Sie wie gewohnt das Programm des heutigen Tages. Außerdem werden Sie das PacketSender-Programm mit den gleichen Einstellungen wie gestern benötigen. Heute erscheint erst dann eine Nachricht, wenn Sie kurz auf den Boot-Button auf dem Board gedrückt haben. Diese Nachricht sieht so aus:

{"cmd":"boot_pressed"}

Die Nachricht im Packet-Sender-Programm

Die Nachricht im Packet-Sender-Programm

Das liegt daran, dass diese Nachricht der JSON (JavaScript Object Notation) folgt. Dabei handelt es sich um ein schlankes Datenaustauschformat für Maschinen, das aber auch für Menschen sehr gut lesbar ist. Im Grunde besteht im JSON-Format alles aus Namen und Werten. Zuerst kommt der Name des Werts (auch Key genannt), hier cmd (kurz für Command, Kommando), und anschließend der Wert, hier boot_pressed. Beide sind durch einen Doppelpunkt voneinander getrennt und, da es sich hier um Text handelt, von Anführungszeichen umschlossen. Ein komplettes JSON-Objekt ist zusätzlich von geschweiften Klammern umgeben.

Das Board kann nicht nur Nachrichten senden, sondern auch Nachrichten empfangen. Dazu müssen Sie im Packet-Sender-Programm ein paar Einstellungen vornehmen. Im oberen Bereich finden Sie ein Textfeld, das mit Address beschriftet ist. Hier sollten Sie wieder die Broadcast-Adresse eingeben, die Sie auch auf dem Board verwendet haben. Alternativ können Sie die Board-IP oder sogar nur den mDNS-Namen (einfach nodeesp) nutzen. In das Feld Port rechts daneben fügen Sie wieder den Port 55056 ein. Als letzte Einstellung wählen Sie im Drop-down-Menü weiter rechts UDP aus. Nun können Sie etwas weiter oben im Feld ASCII eine Nachricht eingeben und mit dem Send-Button übertragen. Senden Sie zunächst einen willkürlichen Text, etwa Hallo. Da das Packet-Sender-Programm unter dem gleichen Port auch lauscht und Sie die Broadcast-IP-Adresse verwenden, werden Sie einige der gesendeten Nachrichten auch selbst empfangen. Zusätzlich empfangen Sie vom Board die Nachricht {"cmd":"ack"}. ack ist die Kurzform von acknowledged (bestätigt). Damit bestätigt das Board also den Empfang einer Nachricht, auch wenn es wahrscheinlich mit der Nachricht selbst nichts anfangen konnte.

So senden Sie einen Text an das Board

So senden Sie einen Text an das Board

Wenn Sie nun aber einen vordefinierten Befehl im JSON-Format abschicken, sieht die Sache schon anders aus. Senden Sie zum Beispiel den Text {"cmd":"ping"}, kommt nach kurzer Zeit ein

{"cmd":"pong"} als Antwort vom Board zurück. Es gibt noch weitere Kommandos, die Sie ausprobieren können. Mit {"cmd":"get_wifi_status"} bekommen Sie beispielsweise den Verbindungsstatus des Boards zurück. Mit {"cmd":"get_wifi_scan"} werden alle WLAN-Netzwerke in Reichweite erfasst und in einer Liste übermittelt.

Es gibt eine ganze Reihe von allgemeingültigen Kommandos, die Sie auf der Boardseite oder auf der Projektseite einsehen können. Aber Vorsicht: Ein paar Kommandos aus der Kategorie Settings können die Einstellungen des Boards so verändern, dass nichts mehr geht. Wenn das passiert, können Sie zu den Standardeinstellungen zurückkehren, indem Sie den Boot-Button über zehn Sekunden lang gedrückt halten. Dies ist in allen Programmen möglich, bei denen WPS in Klammern hinter dem Programmnamen steht. Die gleiche Funktion ist auch auf der Konfigurationsseite unter Advanced Settings zu finden (Restore Default Configuration). Als dritte Möglichkeit können Sie Pin 13 beim Boardstart auf LOW setzen. Vergessen Sie aber nicht, die Verbindung an Pin 13 nach dem Reset wieder zu trennen.

28 Kommentare

  1. Rsoldie

    Obwohl ich schon einiges probiert habe bekomme ich immer die meldung die ich gesendet habe zurück und dazu
    Error:network is unreachable
    Sehr seltwürdig, denn boot_pressed funktioniert. Hmm
    Etwas ratlos, weis einer abhilfe?
    Ich probier weiter
    Mfg

    Antworten
    1. rsoldie

      …und nachdem ich mir einen familiären mini-pc vom zwerg lieh sind die ansichten nicht nur größer und besser geworden,…
      sind die meldungen alle fast so wie es soll… außer die error-meldung "could not connect" .
      also falls jemand vor mir ne idee haben sollte… mit bestem dank dann hier
      mfg rsoldie

      Antworten
  2. atidya

    Hi, bei mir kommt jede Sekunde die Meldung boot_pressed obwohl ich nicht drauf drücke und bei {"cmd":"get_button_state"} kommt die Antwort ack und weiter jede Sekunde boot_pressed. Woran kann das liegen?

    Antworten
  3. Herbert

    hallo zusammen,

    der Tip von Hans-Joachim funktioniert bei mir leider nicht. Nachdem ich den Haken gesetzt haben gab es keine Antwort mehr vom Board. Ich arbeite unter Win10.

    Hat hier noch jemand eine Idee?

    Antworten
    1. Hans-Joachim

      Hallo Herbert,
      kann es sein, dass Deine Stomversorung über Batterien erfolgt. Ich war erstaunt wie schnell die Kapazität auf 80% fiel – kein Wunder bei der anfänglichen Spielerei mit dem WLAN (es werden lt. Internetrecherche bei WLAN-Betrieb bis zu 170 mA gezogen) – und deswegenfunktionierte mein Board nicht mehr. Für die Tests habe ich nunmehr ein 5-V-Netzteil, das bis zu 2 A bereitstellt. Seit dem habe ich keine Boardausfälle.
      Obwohl der Port 55056 keine Probleme erzeugte habe ich in meinem Router vorsichtshalber eine Freigabe für das Board erzeugt (s. Bild). Irgendwie habe ich seitdem ein besseres Gefühl beim Betrieb des Node ESP.
      Prüfe bei win10 unter Einstellungen>>Update und Sicherheit>>Windows-Sicherheit>>Firewall und Netzwerkschutz ob "Privates Netzwerk" aktiviert ist. Auch das hat mich einen Schritt weitergebracht

      Antworten
      1. thymjan

        Das würde ich eher nicht machen. Du öffnest den Port für deine öffentliche Internetadresse für die ganze Welt/das ganze Internet. Schickt dir jetzt jemand Nachrichten an den Port 55056 an deine Internetadresse wird diese Nachricht vom Router/der Fritzbox an den NodeESP weitergeleitet.

        Antworten
        1. Hans-Joachim

          Danke für den Hinweis

          Antworten
  4. Anonymous

    Hier ist ein kleine Python3 Skript, das einmal (fast) alle get Kommandos testet. Die meisten funktionieren noch nicht, werden es aber vermutlich dann in den nächsten Tagen.

    #!/usr/bin/env python3
    import socket
    import json

    """
    Commands
    Source: https://iot.fkainka.de/nodeesp-command-reference
    """

    NODE_IP = "192.168.188.34"
    NODE_PORT = 55056
    GET_COMMANDS = ["get_button_config","get_button_state","get_touch_config","get_touch_state","get_led_config","get_led_config","get_led_state","get_pwm_config","get_pwm_state","get_adc_config","get_adc_state","get_hum_state", "get_wifi_status", "get_wifi_scan"]

    def receive_message():
    global sock
    data = sock.recv(1024)
    print(data.decode("ascii", errors=’ignore'))

    def send_command(command):
    global sock
    message_dict = {"cmd" : command}
    message_string = json.dumps(message_dict)
    sock.sendto(message_string.encode(), (NODE_IP, NODE_PORT))

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    for cmd in GET_COMMANDS:
    print(cmd)
    send_command(cmd)
    receive_message()

    Antworten
    1. Anonymous

      Entschuldigt die Formatierung, sah bei mir noch alles ganz gut aus…

      Antworten
  5. Heinz

    Bei mir funktionieren die Befehle wie get_wifi_status, get_wifi_scan aber die weiteren befehle gemäss Kommandoreferenz gehen nicht.

    z.B. get_button_state oder get_button_config bringen bei mir als Antword nur {"cmd":"ack"}
    Ist das Normal? Oder gehen diese Befehle nur, wenn ein speziellen Programm geladen ist?

    Antworten
    1. Abu Kali

      Ist hier auch so. Aber: mal ein Programm aus den Example Apps geladen ([LED Example]) u. dann {"cmd":"get_led_config"} oder {"cmd":"get_led_config"} ausprobiert u. da erscheint dann als Antwort:

      {"cmd":"get_led_config","len":2,"pin_names":["LED1″,"LED2″],"value":[{"pin_name":"LED1″,"pin_id":1,"pin_nr":22,"pin_state":false,"pin_value":0},{"pin_name":"LED2″,"pin_id":2,"pin_nr":15,"pin_state":false,"pin_value":0}]}

      bzw.
      {"cmd":"get_led_state","value":[{"pin_name":"LED1″,"pin_id":1,"pin_nr":22,"pin_state":false,"pin_value":0},{"pin_name":"LED2″,"pin_id":2,"pin_nr":15,"pin_state":false,"pin_value":0}]}
      usw. Scheint also tatsächlich (auch) vom geladenen Programm abzuhängen.

      Antworten
    2. Abu Kali

      Oder Tag 5 ;) mal mit {"cmd":"get_button_state"} probieren.

      Antworten
  6. Clemens

    Wenn es nicht klappt, dann mal bei den UDP-Settings unter Port(send) und Port(receive) 55056 eintragen und bei Acknowledge Messages einen Haken setzten. Hat bei mir geholfen ;)

    Antworten
  7. AR

    Hat erst auch nicht geklappt – den Tag noch einmal geladen. Dann hat es geklappt!

    Antworten
    1. thymjan

      Danke! Guter Tipp! Hat bei mir auch geholfen.

      Antworten
  8. Patrick

    Leider funktioniert der heutige Tag nicht so toll.
    Wenn ich den Boot button drücke bekomme iich mindestens zwei mal die Info {"cmd":"boot_pressed"}. Wenn ich etwas länger drücke (ca. 3-4 sekunden) gibt es viele dieser Nachrichten und das board beginnt grün zu blinken, um dann rot zuz leuchten (abgestürzt?)
    wenn ich {"cmd":"ping"} sende, bekomme ich {"cmd":"ping"} und nicht {"cmd":"pong"} zurück. Das gleiche mit {"cmd":"get_wifi_status"} (antwort {"cmd":"get_wifi_status"})
    Vielleicht weiss ja jemand von Euch Rat.
    LG
    Patrick

    Antworten
    1. Clemens

      Solange der Button gedrückt wird, wird die Info gesendet, allerdings sollten nicht mehrere Nachrichten bei einem kurzen drücken kommen. Bei längerem drücken, aktiviert sich die WPS-Funktion des Boardes. Das Board leuchtet nach dem "Suchvorgang (grün blinken)" rot, weil es keinen Datenaustausch mit dem Router gab.

      Zum zweiten Teil:
      Bist du sicher, dass die Antwort von dem Board kommt?
      Also steht bei "From IP (im Log)" die Ip des Boardes, oder vllt. eine andere, weil du bei "Adresse" die Broadcast-Adresse eingegeben hast?

      Falls die Antwort tatsächlich vom Board kommt, dann würde ich die Firmware flashen: https://iot.fkainka.de/nodeesp-firmware-reinstallieren
      (weiss aber nicht ob das notwendig ist, vllt. gibt es eine bessere Lösung).

      Kommt die Nachricht garnicht vom Board / empfängst du garkeine Nachrichten vom Board, dann würde ich mal die anderen Kommentare durchstöbern. Das Problem lässt sich sicher beheben.

      Antworten
      1. Patrick

        Hallo Clemens,
        Danke für Deine Antwort.
        Laut Tag 1 würde die LED für WPS ja eigentlich gelb blinke… Aber die Erklärung von Dir ist schon sehr wahrscheinlich.
        Ja, die Antworten kommen von der IP des boards. Ich werde dann heute mal das board neu flashen.
        LG
        Patrick

        Antworten
        1. Clemens

          Hallo Patrick,
          Stimmt, die LED müsste gelb blinken, daher ist es wahrscheinlich tatsächlich am besten einaml zu flashen.

          Das flashen ist echt einfach (hab es selbst schon gemacht) und auch wenn man wieder von vorne anfangen muss, sind zumindest bei mir dann keine Schwierigkeiten mehr aufgetreten.

          Freut mich , dass ich wenigstens ein bisschen helfen konnte und viel Erfolg :)

          LG Clemens

          Antworten
          1. luidd

            Wie "flasht" man ?

          2. Clemens

            Hi luidd,

            Hier der Link zur Anleitung. Kann eigentlich nichts schief gehen.

            LG Clemens

          3. Clemens

            Hi luidd,

            Hier der Link zum flashen: https://iot.fkainka.de/nodeesp-firmware-reinstallieren

            Ist alles sehr gut erklärt und hat bei mir problemlos funktioniert.

            LG Clemens

    2. Hans-Joachim

      Ich hatte genau das gleiche Problem, genau das gleiche Erscheinungsbild. Bei mir hat folgendes geholfen: Packet Sender" File>Settings aufrufen. Im dann sich öffnenden Fenster rechts 500 ms delay after connect (slow devices) Haken setzen.

      Antworten
  9. Test

    Für diejenigen die es nicht zum Laufen bekommen:
    Im Packetsender unten auf den UDP Reiter klicken um den Server zu disablen, dann noch mal um ihn wieder zu aktivieren.
    Danach sollten Pingbefehle, Boot-Button und Co auch funktionieren..
    Hat zumindest bei mir (nach anfänglichen Problemen) geholfen.

    P.S.: Wo sich der Bootbutton befindet seht ihr auf dem Pinout (.local Website)

    Antworten
    1. Hans-Joachim

      Hat bei mir leider nicht geholfen. Nunmehr habe ich alle Firewalls abgestellt, kein Erfolg. Dann habe ich den seriellen Monitor der Arduino-IDE eingebunden. Dort wird festgestellt, dass ich mit einem unbekannten json-Format arbeite :-((
      Bild 1 zeigt die Eingaben des Paketsenders, Bild 2 den seriellen Monitor

      Antworten
      1. Tobi

        Du hast die geschweiften Klammern vergessen -> {"cmd":"get_wifi_status"}

        Antworten
        1. Hans-Joachim

          Danke Tobi,
          die Fehlermeldung unbekanntes json Format ist weg. Aber ich erhalte immer noch keine Antwort auf meine Aufforderungen, obwohl ich die Programme per wlan oder auch usb einspielen kann (grüne LED auf dem Board blinkt kurz). Die Versuche Tag 2,3 und 5 funktionieren auch. Obwohl ich etwas ratlos bin, werde ich morgen wieder weiter suchen.

          Antworten
          1. Hans-Joachim

            Endlich die Lösung: in der app "Packet Sender" File>Settings aufrufen. Im dann sich öffnenden Fenster rechts 500 ms delay after connect (slow devices) Haken setzen.
            Jetzt funktioniert auch das Türchen Nr. 4

Schreiben Sie einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.