Day 4: UDP and JSON

Behind the fourth door of the Advent calendar is a set of cables that is very useful for the upcoming hardware setup. But today in our project we are going to look at the JSON format; what is it and how does it help us communicating with the board.

As usual, first you need to activate today’s program. You will also need the Packet Sender program with the same settings that we were using yesterday. Today, a message appears only after you briefly press on the board’s boot button. This message looks like this:

{"cmd":"boot_pressed"}

Die Nachricht im Packet-Sender-Programm

The message in Packet Sender

This is a JSON (JavaScript Object Notation) message. JSON is a slim data exchange format for machines that is also very readable for humans. Basically, everything in the JSON format consists of names and values. First, we have the name of the value (which is also called key), in our case this is cmd (short for command), and then the value itself, here boot_pressed. Both texts are separated by a colon and, because this is text, it is also enclosed in quotation marks. A complete JSON object is also surrounded by curly brackets.

The board not only sends messages, it can also receive messages. To make this happen, you need to fix a few settings in the Packet Sender program. In the upper part there is a text field labelled Address. Here again you need to enter the broadcast address which is also used by the board. Alternatively, enter the board IP or just the mDNS name (simply nodeesp). In the Port field on the right, enter again the port 55056. Last but not least, select UDP from the drop-down menu further on the right. Now you can enter a message into the field ASCII located a little higher up and Send it. Start with sending a trial text such as Hello. Since the Packet Sender listens on the same port and you are also using the broadcast IP address, you will also receive some of the messages sent. In addition, you will receive the message {"cmd":"ack"} from the board.  ack is the short of acknowledged. The board thus has confirmed the receipt of a message, although most likely it couldn’t do anything with the message itself.

So senden Sie einen Text an das Board

sending a text

If you send a predefined command in JSON, things will look a bit different. If you send the text {"cmd":"ping"}, for example, you will get {"cmd": "pong"} as a reply from the board after a short while. You could also try other commands. For example, {"cmd": "get_wifi_status"} will return the connection status of the board. {"cmd": "get_wifi_scan"} will detect and list all Wi-Fi networks in range.

You can find a couple of universal commands on the board page or on the project page. But be careful: there are a few commands in the category Settings that will make changes to the settings of the board and then nothing will work anymore. If this happens, go to the default settings by holding down the boot button for more than 10 seconds. You can use this method for all programs that have WPS in brackets after the program name. You have the same function on the configuration page under Advanced Settings and then (Restore Default Configuration).

As a third option move pin 13 to LOW during the startup of the board. Don’t forget to disconnect pin 13 after the reset.

.

28 Comments

  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

    Reply
    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

      Reply
  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?

    Reply
  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?

    Reply
    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

      Reply
      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.

        Reply
        1. Hans-Joachim

          Danke für den Hinweis

          Reply
  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()

    Reply
    1. Anonymous

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

      Reply
  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?

    Reply
    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.

      Reply
    2. Abu Kali

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

      Reply
  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 ;)

    Reply
  7. AR

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

    Reply
    1. thymjan

      Danke! Guter Tipp! Hat bei mir auch geholfen.

      Reply
  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

    Reply
    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.

      Reply
      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

        Reply
        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

          Reply
          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.

      Reply
  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)

    Reply
    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

      Reply
      1. Tobi

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

        Reply
        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.

          Reply
          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

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.