Daten via UDP in den VDR bringen

  • Hallo,
    louis hatte mich auf die Idee gebracht, Meßwerte meiner Selbstbau Arduino Wetterstation im VDR anzuzeigen.


    Auf der Arduino Seite ist das recht einfach die Daten via UDP zur Linux Kiste zu schicken.


    Auf der Linux Maschine braucht es einen UdP Socket der die Daten dann ausliest, diese könnte ich dann wie louis vorgschlagen hat via svdrp in den VDR bringen. (skindesigner customtokens)
    Einen UDP Socket zu erstellen ist auch nicht das Problem, habe da schon was was funktioniert.


    Zum Problem:

    Code
    if ((recv_len = recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)) == -1)


    Die Funktion recvfrom (aus socket.h) blockiert aber den Thread, wäre auch nicht weiter schlimm, wenn das kleine Programm als Dienst gestartet wird. Dann wird gewartet bis was kommt und z.b. eine Datei akutalisiert.


    Doch auch meine Ansprüche sind inzwischen auch höher geworden, ich möchte dies nicht via svdrp machen sondern ein VDR Plugin bauen.


    Um einen ersten Überblick zu bekommen habe ich mir den Quellcode von dem Plugin Hello angesehen.
    recvfrom wartet quasi bis Daten kommen, dieser Thread ist blockiert.
    Ich sehe die VDR Housekeeping als möglichen Einhängepunkt, nur dieser Thread darf mit Sicherheit nicht blockiert werden.


    Der richtige Stelle wäre wohl, nur hier gilt wohl auch, das man dort nichts blockieren darf...
    virtual void MainThreadHook(void);



    Bin schon neugierig auf die Vorschläge, und ob ich das verstehe und umsetzen kann.
    Habe den Verdacht das eine eigene Threadclass nötig ist. :ausheck

    VDR 1 (SD) : ASRock A330 GC, 1 GB RAM, TT- FF Karte rev. 2.3, 7'' TFT, Lirc X10 - Selbstbau Gehäuse - Suse 11.3 (64) vdr-1.7.10 diverse Plugins
    VDR 2 (HD) : MSI G41M-P25, 2 GB RAM, E6700 2x3.20GHz, Gainward GT220, 2TB HD, Lirc X10, TT S2-3600 USB, TT S2-1600, - Suse 11.3 (64) NvidiaTreiber 260.19 vdr-1.7.18 - xineliboutplugin 1.0.90 cvs, xine-lib 1.1.90 , s2-liplianin DVB Treiber

    Einmal editiert, zuletzt von rudirabbit ()

  • Also das ganze in einen Thread zu packen ist kein Hexenwerk.


    Mit pthread.h kann man leicht eine Funktion einhängen die darauf wartet das Daten kommen.
    Und die main loop läuft weiter - sehr geil. :]
    Mit ist schon klar, das es unter umständen Probleme gibt, wenn ich von außen auf die Daten des Thread zugreife. Stichwort mutex, muss erst alles verstehen wie der mechanismus funktioniert.


    Jetzt muss ich dies nur noch in ein Plugin einbauen, beginne mal mit dem Hello Plugin und als Hilfe die HTML Hilfe Datei die beim VDR dabei ist.

    VDR 1 (SD) : ASRock A330 GC, 1 GB RAM, TT- FF Karte rev. 2.3, 7'' TFT, Lirc X10 - Selbstbau Gehäuse - Suse 11.3 (64) vdr-1.7.10 diverse Plugins
    VDR 2 (HD) : MSI G41M-P25, 2 GB RAM, E6700 2x3.20GHz, Gainward GT220, 2TB HD, Lirc X10, TT S2-3600 USB, TT S2-1600, - Suse 11.3 (64) NvidiaTreiber 260.19 vdr-1.7.18 - xineliboutplugin 1.0.90 cvs, xine-lib 1.1.90 , s2-liplianin DVB Treiber

  • ... ich würde lieber die Klasse cThread vom VDR nehmen und die zugehörigen Semaphoren als das ganze neu mit pthread zu entwickeln ....
    Da gibts auch genug Beispiele mit Sourcecode, schau Dir z.B. mal mein Systeminfo-Plugin an, da lese ich ja auch externe Werte (des Skripts) in einem Thread ein.


    Falls Du nicht einfach eine Zeile für Deine Ausgabe in das Skript vom Systeminfo-Plugin einbauen willst, evtl. langt ja schon ein nc (netcat) :D

  • Falls Du nicht einfach eine Zeile für Deine Ausgabe in das Skript vom Systeminfo-Plugin einbauen willst, evtl. langt ja schon ein nc (netcat) :D

    Danke für den Hinweiß, aber will was lernen.


    Das mit der VDR Klasse cThread ist mit Sicherheit besser als das ganze neu aufzubauen, das ist ja der Sinn von Klassen - THX

    VDR 1 (SD) : ASRock A330 GC, 1 GB RAM, TT- FF Karte rev. 2.3, 7'' TFT, Lirc X10 - Selbstbau Gehäuse - Suse 11.3 (64) vdr-1.7.10 diverse Plugins
    VDR 2 (HD) : MSI G41M-P25, 2 GB RAM, E6700 2x3.20GHz, Gainward GT220, 2TB HD, Lirc X10, TT S2-3600 USB, TT S2-1600, - Suse 11.3 (64) NvidiaTreiber 260.19 vdr-1.7.18 - xineliboutplugin 1.0.90 cvs, xine-lib 1.1.90 , s2-liplianin DVB Treiber

  • Hallo rudirabbit,
    kannst du mehr über deine Wetterstation mit Arduino sagen? Welche Sensoren hast du verwendet?
    Das Thema hier finde ich sehr interresant. :)


    Viele Grüße, Uwe

  • Wenn du schon beim Lesen bist, schaue dir poll an, am besten mit Timeout, damit dein Thread beim Beenden des vdr auch gestoppt werden kann. Wenn er sonst im recv festhängt und gekillt werden muss, kannst du hinterher ja nicht vernünftig aufräumen.


    Lars

  • Hallo Lars,
    Ich habe mich gerade in poll() ein wenig eingelesen.


    Verstehe ich das so richtig:
    poll liefert eine 1 wenn Daten empfangen werden und eine 0 wenn keine kommen oder der timeout abgelaufen ist.
    Bei einer 1 kann ich mit recvfrom die Daten auslesen und dann in einen Puffer schreiben.
    Hier blockt recvfrom ja nicht, weil die funktion nicht auf Daten warten muss



    @Uwe Die Sensoren sind nichts besonderes:
    Ein Anemometer welche Impulse ausgibt, für die Windrichtung eine Windfahne mit 360 Grad Poti (ist nicht optimal da ein kleiner blinder Bereich)
    Temperaturmessung außen erfolgt über DS1820B Sensoren. Das befindet sich alles unterm bzw über dem Dach.
    Als Gimmick habe ich noch eine Reflexlichtschranke auf meinen Uralt Stromzähler geklebt, so kann ich meinen Stromverbrauch über ein ganzes Jahr mit Stundenauflöung loggen
    Ein Atmega328P funkt die Daten via 433mhz in die Wohnung.


    Empfänger ist ein ATmega2560 mit einem BMP085 Drucksensor der auch die Temperatur mit ausgibt.
    Für die Luftfeuchte einen DHT11.
    Ein W5100 Modul um uns Internet zu kommen, Website dazustellen, NTP Uhrzeit.
    Außerdem werden die Umweltdaten und Engergieverbrauch noch mit einem Zeitstempel in externen EEproms gespeichert.


    Das ganze war mein erstes größeres Projekt mit den Atmels unter C. (Vorher hatte ich alles in pascal gemacht, deswegen bin ich in C auch so schlecht - seit ich dies angefangen habe wird es besser)
    Ist nun 3 Jahre her, heute würde ich das ganze in eine SQL Datenbank schreiben, und auch die Website nicht auf Atmel laufen lassen.
    Deshalb ging mir damals auch das S-Ram aus, darum habe ich noch eine Ramext dran.
    Die Website läuft erstaunlich flüssig, trotzdem ist der ATmega2560 die falsche Plattform dafür.
    Nimm einen ARM, Raspberry pi oder ähnliches.

    VDR 1 (SD) : ASRock A330 GC, 1 GB RAM, TT- FF Karte rev. 2.3, 7'' TFT, Lirc X10 - Selbstbau Gehäuse - Suse 11.3 (64) vdr-1.7.10 diverse Plugins
    VDR 2 (HD) : MSI G41M-P25, 2 GB RAM, E6700 2x3.20GHz, Gainward GT220, 2TB HD, Lirc X10, TT S2-3600 USB, TT S2-1600, - Suse 11.3 (64) NvidiaTreiber 260.19 vdr-1.7.18 - xineliboutplugin 1.0.90 cvs, xine-lib 1.1.90 , s2-liplianin DVB Treiber

  • poll liefert eine 1 wenn Daten empfangen werden und eine 0 wenn keine kommen oder der timeout abgelaufen ist.
    Bei einer 1 kann ich mit recvfrom die Daten auslesen und dann in einen Puffer schreiben.
    Hier blockt recvfrom ja nicht, weil die funktion nicht auf Daten warten muss


    Ja, sowas in der Art, genau hab ich das auch nicht im Kopf, müsste ich nachlesen und ausprobieren.


    Man kann ja auf mehrere file descriptors warten, d.h. zum einen auf den für den recvfrom, und dann könnte man noch einen anderen einsetzen, den man dann triggert, wenn der Thread enden soll. Nach dem poll testest du dann, welcher fd der Auslöser war und steigst dann aus dem Thread in sauberer Art aus oder liest eben die Daten vom socket.
    Probiere einfach, dann bekommst du schon ein Gefühl dafür.


    Lars.

  • Zum Thema sauber beenden noch eine Verständnisfrage:


    Jede Klasse hat einen destructor, der immer dann aufgerufen wird wenn die Klasse zerstört wird, oder die Anwendung beendet wird.


    Ich könnte doch dort also im destructor, einen laufenden Thread "suspendieren"
    Offensichtlich funktioniert das so nicht.

    VDR 1 (SD) : ASRock A330 GC, 1 GB RAM, TT- FF Karte rev. 2.3, 7'' TFT, Lirc X10 - Selbstbau Gehäuse - Suse 11.3 (64) vdr-1.7.10 diverse Plugins
    VDR 2 (HD) : MSI G41M-P25, 2 GB RAM, E6700 2x3.20GHz, Gainward GT220, 2TB HD, Lirc X10, TT S2-3600 USB, TT S2-1600, - Suse 11.3 (64) NvidiaTreiber 260.19 vdr-1.7.18 - xineliboutplugin 1.0.90 cvs, xine-lib 1.1.90 , s2-liplianin DVB Treiber

  • Nicht wirklich. Aber das findest du schon noch raus. In kurzen Worten kann ich das auch nicht erklären, ohne es selbst zu programmieren.


    Lars

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!