Anrufidentifizierung mit Gammu (Probleme mit Event)

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo Leute,

    hier noch mal ein Problem an dem ich momentan nicht so richtig weiter komme.

    Ich versuche ja eine Torsteuerung zu schreiben, die wenn ein Anruf auf einem Huawei e173 Stick eingeht, in einer Datenbank nachschaut ob der Anrufende berechtigt ist und dann auf einen PiFace 2 Modul ein Relais schaltet dass letztlich das Tor öffnet.

    Ich bin das auch schon soweit wie in meinem anderen Beitrag geschrieben, das ich SMS bekommen kann, die ich aber eher zur Steuerung des Programms verwende, also zum Beispiel wenn ich neue Benutzer anlegen möchte, Benutzer sperren möchte das Tor auf offen setze oder die Steuerung aussetze, so das keiner das Tor öffnen kann.

    Zum Öffnen des Tores möchte ich einen Anruf interpretieren (Mit Prüfung der Telefonnummer um herauszufinden, ob der Anrufende überhaupt berechtigt ist das Tor zu öffnen)

    Dazu habe ich einen Beispielcode gefunden:

    Der funktioniert auch ohne Probleme, will sagen: Er gibt in der Shell die aus der while Schleife kommenden Meldungen aus:

    Press Ctrl+C to interrupt
    Signal is at 21%
    Signal is at 18%
    Signal is at 15%
    Signal is at 15%
    Signal is at 18%

    Aber wenn ein Anruf kommt passiert bis auf ein kurzes Zucken am Bildschirm (In der Shell ruckt es kurz) nix. Ich habe aber ein Freizeichen, und der Stick blinkt, der Anruf liegt also an. Was ich absolut nicht verstehe ist:

    Wo in diesem Code wird denn das Event "gemeldet"? Denn in der while Schleife am Ende wird ja nur das Signal gemeldet..

    Anscheinend ist dafür ja die Funktion "Callback" zuständig. Aber wie rufe ich die Funktion Callback auf und bekomme mein Event "Anruf" identifiziert?

    Wäre da für Hilfe sehr dankbar.

    Liebe Grüße
    Ralf

    Einmal editiert, zuletzt von nonickatall (13. November 2016 um 11:09)

  • Anrufidentifizierung mit Gammu (Probleme mit Event)? Schau mal ob du hier fündig wirst!

  • Keiner einen Ansatz einer Idee, oder einen Tip, was ich mir anschauen kann?

    Irgendwie stehe ich auf dem Schlauch.

    Ich möchte mithilfe von phyton-gammu das eingehende Event "Anruf" bekommen, so das ich darauf reagieren kann. Dieser Beispielcode schient das ja herzugeben, leider gibt es dazu keinerlei Erläuterung.

    Das ist dann für einen Anfänger der sich gerade durch den Raspberry, respektive Debian/Python/Gammu Dschungel schlägt echt schwierig.

    Ich habe soviel verstanden, das man mit Callback Funktionen innerhalb von Programmen Events auslösen kann um auf Ereignisse zu reagieren GPIO Events oder eben andere Events wie diese aus gammu stammenden.

    Das Script verstehe ich auch weitestgehend, nur verstehe ich nicht wie und wo mir so ein Event ins Programm rasselt und wie ich es abfange?

    Hat da jemand einen Hinweis?

    LG
    Ralf

  • Ich kenne mich mit Gammu nicht aus. Der Callback Mechanismus ist aber ein uebliches Muster. Ein Callback ist der Weg, wie man in seinem Code von einem asynchronen (also irgendwann auftretenden) Ereignis Wind bekommt. Und dein Code liest sich da doch recht klar:

    - setze gammu auf.
    - konfiguriere.
    - registriere den Callback
    - melde Interesse an diversen Ereignissen an, wie zB SMS
    - treibe den Gammu Eventloop durch permanentes Abfragen der Signalstaerke - das hat den Nebeneffekt, das aufgelaufene Ereignisse an den Callback dispatcht werden.

    Sollte eigentlich alles so laufen. Was passiert denn bei SMS?


  • Ich kenne mich mit Gammu nicht aus. Der Callback Mechanismus ist aber ein uebliches Muster. Ein Callback ist der Weg, wie man in seinem Code von einem asynchronen (also irgendwann auftretenden) Ereignis Wind bekommt. Und dein Code liest sich da doch recht klar:

    - setze gammu auf.
    - konfiguriere.
    - registriere den Callback
    - melde Interesse an diversen Ereignissen an, wie zB SMS
    - treibe den Gammu Eventloop durch permanentes Abfragen der Signalstaerke - das hat den Nebeneffekt, das aufgelaufene Ereignisse an den Callback dispatcht werden.

    Sollte eigentlich alles so laufen. Was passiert denn bei SMS?

    Habe, weiter experimentiert und geforscht. Dabei rausgefunden, dass an meinen UMTS Stick Voice abgeschaltet war. Da kann es natürlich auch keine Meldungen für eingehende Anrufe geben. Das habe ich jetzt eingeschaltet.

    Aber Meldungen kommen immer noch nicht.

    Wobei...

    Vielleicht basiert das auf einem Verständnisproblem meinerseits.

    Wenn so ein Callback initiiert wird, kann der doch nicht in irgend einer Zeile oder Ausgabe des Programms einfach reinhauen. Irgendwie muss ich den doch definiert serviert bekommen, damit mein Programm adäquat auf den Event reagieren kann. Wie soll das denn gehen, das verstehe ich noch nicht....

    Oder anders gefragt. Was und wo müsste den kommen?

    Aber auf Deine Frage..

    Weder bei eingehendem Anruf, noch bei SMS passiert was. Das Skript läuft und läuft und läuft.. Bis ich es abbreche.

    Ich kann irgendwie nicht glauben das es nicht möglich ist, einen eingehenden Anruf auf einem GSM Modem zu identifizieren!?! Ich habe mich schon tot gegoogelt und komme einfach nicht weiter. Muss ja nicht mit Gammu sein.

    Jede andere Idee ist mir recht..

    LG
    Ralf

  • Ich kenne mich der SMS/Surfstick/GSM/whatever Nummer nicht aus, darum kann ich konkret keinerlei Hilfestellung geben. Weil ich so etwas auch nicht habe.

    Dein Verstaendnisproblem kann ich vielleicht beseitigen. Es stimmt, das ein Callback so ohne weiteres nicht "irgendwo" reinhauen kann. Man brauch dazu immer eine Ereignisschleife, in der periodisch geprueft wird, ob etwas interessantes passiert ist, und dann werden die dazu registrierten Callbacks aufgerufen.

    Deine Ereignisschleife ist (laut Doku)

    Code
    while 1:
       q = sm.GetSignalQuality()

    Das ist in diesem Fall eher unschoen geloest, weil das API das dadurch nicht klar kommuniziert. Aber es ist trotzdem so. Andere machen das etwas klarer, wie zB Tkinter mit seiner Methode "mainloop()".

    Doch das grundlegende Vorgehen ist immer gleich:

    - registriere Callback fuer Event
    - treibe eventloop

    Man kann natuerlich auch anders, sprich ohne Callbacks, arbeiten, wenn die Library so entworfen wurde. zB pygame. Da sagt man selbst:

    Code
    while True:
         events = pygame.pump_events() # so oder so aehnlich
         for event in events:
               if event == "mein tolles event":
                      tu_was_tolles()

    Das ist ein bisschen Geschmackssache, wie man das umsetzt. Aber Gammu macht halt Nummer 1.

    Zu deinem Problem: ich wuerde zum einen mal die eine Sekunde die du wartest verkuerzen. Das ist sehr viel Zeit, und in der verlierst du ggf. Ereignisse. Mach mal .1 Sekunden draus.

    Und ansonsten wuerde ich versuchen andere Software zu installieren & konfigurieren, die selbst mit deinem Surfstick was macht. dann kannst du in deren Verhalten oder Logfiles sehen, ob das klappt oder nicht. Wenn ja, dann ist Gammu oder deine Nutzung schuld. Wenn nein, dann fehlt noch etwas anderes.

  • Hallo Deets,

    vielen Dank für Deine umfangreiche Antwort allerdings wirft das leider neue Fragen auf.. :daumendreh2:

    Du schreibst:

    Man brauch dazu immer eine Ereignisschleife, in der periodisch geprueft wird, ob etwas interessantes passiert ist, und dann werden die dazu registrierten Callbacks aufgerufen.

    Ich dachte das sei gerade der Vorteil, dass man nicht eine Ereignisschleife laufen lassen muss um so ein Event abzufangen. Denn dann kann ich doch gleich in der Ereignisschleife periodisch nachschauen ob mein Event "True" ist. Das heiß dann doch auch, dass mein Programm nicht parallel weiter laufen kann und ich ganz andere Sachen machen kann, bis eben das Event eintritt und ich darauf reagiere, außer eben nur innerhalb der While schleife? Dann ist der einzige Vorteil des Callback, dass ich nicht das Event periodisch in der While Schleife abfrage? Aber das muss ich doch, damit reagieren kann?! So wie Du in dem unteren Beispiel ja auch zeigst.

    Des weiteren schreibst Du:

    Deine Ereignisschleife ist (laut Doku)

    Du schreibst laut Doku, was für eine Doku? Da wo ich das Beispiel runtergeladen habe, habe ich keine Doku gefunden oder meinst die die Kommentare im Beispiel?

    Was ich auch nicht verstehe:

    Das Callback scheint ja so definiert, dass man verschiedene Events (Anruf, SMS, USSD) abfangen oder sich melden lassen kann. Dazu hat der Callback ja die Parameter "sm, type, data". Aber die werden doch hier nirgendwo angegeben.

    Ich habe ein Beispiel an anderer Stelle gefunden das wohl eine überarbeitete Kopie des ersten ist. Da allerdings: Um SMS Eingang abzufragen.

    Und SMS Eingang funktioniert bereits mit Gammu und ich verschicke auch SMS mit meinen erstellten Programm. Das funktioniert beides sauber und zuverlässig. Also kann es hier zumindest mal nicht an der UMTS Karte oder deren Konfiguration liegen.

    Aber auch hier passiert nix obwohl der Callback ja umfangreicher definiert ist, das Skript soll ja dann per SMS an den Absender reagieren. Aber weder kommt eine SMS, noch wird die Ausgabe am Bildschirm unterbrochen.

    Hier der Code:

    Vielleicht hast du noch eine Idee? :thumbs1: :danke_ATDE:

    LG
    Ralf

    Einmal editiert, zuletzt von nonickatall (17. November 2016 um 13:07)

  • Ich habe ja gesagt, das man verschiedene Designs fuer eine solches System waehlen kann. pygame geht genau den von dir beschriebenen, dass du events explizit abfragst. Gammu macht es aber nicht so. Es ist doch nun völlig Müßig darüber zu diskutieren, ob das nun gut oder schlecht ist - ist halt so.

    Und natürlich kannst du auch mit dieser Schleife parallel andere Dinge machen - du kannst ja im Wechsel zB den Gammu-loop treiben, und dann einen GPIO checken. Du darfst nur nicht zu viel Zeit vergehen lassen zwischen den Gammu-Aufrufen, sonst verlierst du events.

    Doku von Gammu ist auch nicht wirklich schwierig zu finden: https://wammu.eu/docs/manual/

    Und dein Verständnis des Callbacks ist immer noch nicht komplett. Dessen Argumente müssen doch nirgendwo definiert werden, die bekommst du reingereicht von der gammu-bibliothek wenn eben etwas passiert ist.

    Wie gesagt, *warum* Gammu bei dir nix macht (oder nicht alles, oder was auch immer) kann ich nicht beantworten, ich kann nur deren prinzipielles aus der Doku ableitbares Konzept erläutern.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!