Jump to content

photron

Administrators
  • Gesamte Inhalte

    3.206
  • Benutzer seit

  • Letzter Besuch

  • Tagessiege

    56

Posts erstellt von photron

  1. Da das doch recht schnell von der Hand ging hier mal ein erster Prototyp der Shell Bindings. Sie basieren auf den Python Bindings und die Kommandozeilenbehandlung ist mit argparse gemacht. Dadurch wird mindestens Python 2.7 benötigt.

     

    Enumerate

     

    Ein Enumerate mit Standardausgabe:

     

    $ ./tinkerforge enumerate
    uid=68aT1f
    connected-uid=0
    position=b'0'
    hardware-version=1,0,0
    firmware-version=2,0,6
    device-identifier=13
    uid=SCT31
    connected-uid=68aT1f
    position=b'a'
    hardware-version=1,1,0
    firmware-version=2,0,0
    device-identifier=216

     

    Ein Enumerate mit --execute. Alle Parameter des Enumerate Callbacks werden durch Leerzeichen getrennt an die --execute Befehlszeile angehängt und dann das Ergebnis ausgeführt:

     

    $ ./tinkerforge enumerate --execute echo
    68aT1f 0 0 1,0,0 2,0,6 13 0
    SCT31 68aT1f a 1,1,0 2,0,0 216 0

     

    Ein Enumerate mit --execute und --replace. Das --replace Flag sorgt dafür, dass auf die --execute Befehlszeile die format Funktion aus Python angewandt wird:

     

    $ ./tinkerforge enumerate --execute "echo {uid} {device-identifier}" --replace
    68aT1f 13
    SCT31 216

     

    Funktionen

     

    Temperaturabfrage eines Temperature Bricklets mit UID SCT31:

     

    $ ./tinkerforge call temperature-bricklet --uid SCT31 get-temperature
    temperature=2325

     

    Auch hier funktionieren --execute und --replace:

     

    $ ./tinkerforge call temperature-bricklet --uid SCT31 get-temperature --execute 'echo "scale=2; {temperature} / 100" | bc | xargs printf "Die Temperatur beträgt: %s °C\n" ' --replace
    Die Temperatur beträgt: 23.18 °C

     

    Callbacks

     

    Aufruf der set-temperature-callback-period Funktion des Temperature Bricklets mit UID SCT31:

     

    $ ./tinkerforge call temperature-bricklet --uid SCT31 set-temperature-callback-period 500

     

    Auf Callbacks warten:

     

    $ python3 ./tinkerforge dispatch temperature-bricklet --uid SCT31 temperature
    temperature=2418
    temperature=2431

     

    Auch hier funktionieren --execute und --replace:

     

    ./tinkerforge dispatch temperature-bricklet --uid SCT31 temperature --execute 'echo "scale=2; {temperature} / 100" | bc | xargs printf "Die Temperatur beträgt: %s °C\n" ' --replace
    Die Temperatur beträgt: 23.18 °C
    Die Temperatur beträgt: 23.25 °C

     

    Was haltet ihr davon?

    tinkerforge

  2. Okay, jetzt weiss ich was da passiert.

     

    PC2 verlangt einen Response für den set_configuration, wartet aber nicht auf die Antwort sondern macht die Verbindung wieder zu, bevor die Antwort bei brickd angekommen ist.

     

    Kurzer brickd Interna Ausflug: Für eingehende Anfragen mit R Flag merkt sich brickd den Header des Pakets in einer Liste pro TCP/IP Verbindung. Dadurch kann er eingehende Antworten an die Verbindung weiterreicht, die auf diese Antwort wartet. Wenn eine Antwort ankommt, auf die keiner wartet dann wir sie an alle geschickt.

     

    Dann kommt die verlangte Antwort von set_configuration an. Da aber die anfragende Verbindung schon wieder zu ist wartet keiner mehr auf diese Antwort und brickd schickt sie an alle offenen TCP/IP Verbindungen. Und daher bekommt deine temperaturabfragende Verbindung die IO-4 Antworten.

     

    Da ist also by-Design wenn du so willst.

  3. Wie AuronX sagt, sind die Antworten vom IO-4, die du da sieht, die fürs Response Expected Flag. Unter der Annahme, dass du die Temperaturabfrage und das IO-4 Setzen nicht über die gleiche TCP/IP Verbindung machst solltest du diese IO-4 Antworten da nicht sehen.

     

    Spielt dir da vielleicht netcat einen Streich, oder machst du doch beides über eine TCP/IP Verbindung?

     

    Hast du mal ins brickd Log geschaut und dort nachverfolgt wann TCP/IP Verbindung auf und abgebaut werden und wo welche Antworten hingesandt werden? Wireshark kann auch sehr hilfreich sein.

     

    Dass da einer der IO-4 Nachrichten die letzten 2 Byte fehlen könnte an netcat liegen, dass dann eben nur die ersten n-2 von n Byte empfangen hat.

  4. Zu 1: Das ist dokumentiert im Packet Layout Abschnitt:

     

    For callbacks the sequence number is always 0 and this value is not allowed for other packets. Non-callback packets can only use 1 - 15 as sequence number. This allows to distinguish callback packets from other packets.

     

    Zu 2: Es reicht als Antwort ein Header.

     

    Schreibst du einen Brick-Emulator auf TCP/IP Protokolllevel?

     

    JavaLaurence hat einen Emulator auf dem Java-API-Level (begonnen?).

  5. # /usr/bin/python flash-brick-cli.py -p /dev/bus/usb/002/002 -f brick_master_firmware_2_0_6.bin
    (Error) Could not connect to Brick: No Brick in Bootloader found

     

    /dev/bus/usb/002/002 ist das USB Device an sich. Das ist hier nicht richtig. Du brauchst da den seriellen Port den der Bootloader des Bricks über USB anbietet. Typischerweise taucht der als /dev/ttyACM0 oder /dev/ttyUSB0 auf.

  6. In /usr/local/lib/python2.6/dist-packages/easy-install.pth sollte sowas wie

     

    import sys; sys.__plen = len(sys.path)
    ./tinkerforge.egg
    import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)

     

    stehen und easy_install -m tinkerforge sollte daraus die ./tinkerforge.egg Zeile entfernen.

  7. easy_install hat kein wirkliches Uninstall Kommando. Man kann ein mit easy_install installiertes egg aber wie folgt wieder sauber entfernen:

     

    sudo easy_install -m tinkerforge

     

    Dies trägt tinkerforge aus der Modulliste wieder aus. Dieser Befehlt gibt die dann auch was wo das entpackte egg liegt:

     

    $ sudo easy_install -m tinkerforge
    Searching for tinkerforge
    Best match: tinkerforge 2.0.5
    Processing tinkerforge.egg
    Removing tinkerforge 2.0.5 from easy-install.pth file
    
    Using /usr/local/lib/python2.7/dist-packages/tinkerforge.egg

     

    Dann noch dass entpackte egg manuell entfernen:

     

    sudo rm -rf /usr/local/lib/python2.7/dist-packages/tinkerforge.egg

  8. Was du da im WIFI Fall siehst sind Enumerate Callbacks mit ENUMERATION_TYPE_CONNECTED. Diese sendet der Stack von sich aus wenn eine neu Verbindung aufgebaut wurde. Dies erlaubt es neustartende Stacks zu erkennen.

     

    Im Fall von USB siehst du diese nicht, da die USB Verbindung zwischen brickd und Stack schon längst besteht und auch durchgehend besteht. Bei WIFI stellst du direkt die Verbindung her und siehst daher die Enumerate Callbacks.

     

    Soll heißen, du kannst dich nicht darauf verlassen, dass die Daten die nach Absenden eines Request auch direkt die Antwort darauf sind. Auch kann es sein, dass du mehrere unserer Pakete in einem TCP/IP Paket bekommst.

     

    "Shell Bindings" stehen schon eine Weile auf der TODO Liste.

  9. die von der TCP/IP Doku ist auf jeden falsch!!!!!

     

    Nein, das ist richtig. Auf TCP/IP Ebene sind uid und connected_uid des Enumerate Callbacks uint32, genauso wie die UID im Header jedes Packets auch uint32 ist. Die Bindings machen dann die Umwandlung zwischen Base58 und uint32, damit die UIDs auf Benutzerebene immer Base58 sind.

     

    Edit: Du hast recht, die Dokumentation passte nicht. Ich habe mich da an eine erste Version von Protokoll 2.0 erinnert, sorry.

     

    Dokumentation ist jetzt korrigiert.

  10. Wenn der IPConnection.Connect() Aufruf keine Exception wirft, dann konnte eine TCP/IP Verbindung aufgebaut werden. Dass heißt, dass da etwas auf dem Port lauscht. In dem Zuge wird auch der Connected Callback aufgerufen. Höchstwahrscheinlich lauscht dann da ein brickd. Dass heißt, aber noch nicht dass da auch ein Stack angeschlossen ist.

     

    Wenn du jetzt die UID eines der Stack Teilnehmer kennst, dann kannst du einfach für diesen einen Getter aufrufen. Zum Beispiel GetStackVoltage() oder GetIdentity(). Falls keine TimeoutException geworfen wird, dann hat der Teilnehmer geantwortet und ist somit da. Falls eine TimeoutException geworfen wird dann ist da entweder kein Brick(let) mit dieser UID, oder es ist gar kein Stack angeschlossen.

     

    Falls du keine UID kennst, dann bleibt dir nur der Enumerate Callback mit Timeout. Wenn es ein "TinkerPing" gäbe würde das genau so funktionieren.

  11. Die Libs an sich reichen zum Ausführen von brickd, aber nicht zum kompilieren. Dafür werden noch die Header Dateien benötigt, die aus *-devel Paketen kommen:

     

    sudo yum install libusb1-devel libudev-devel

     

    Außerdem fehlt dir GCC. Den kannst du mittels

     

    sudo yum groupinstall "Development Tools"

     

    installieren, dabei werden auch noch weitere nötige Pakete installiert.

     

    Jetzt sollte make alles finden und das Kompilieren funktionieren.

×
×
  • Neu erstellen...