.titleBar { margin-bottom: 5px!important; }

[gelöst] app_conference - MeetMe-Ersatz? Wie geht's richtig?

Dieses Thema im Forum "Asterisk Rufnummernplan" wurde erstellt von tomster, 8 Dez. 2006.

  1. tomster

    tomster Mitglied

    Registriert seit:
    6 Dez. 2004
    Beiträge:
    238
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    bavaria superior
    #1 tomster, 8 Dez. 2006
    Zuletzt bearbeitet: 29 Okt. 2007
    Nachdem ich meinen Asterisk mit chan_misdn fahre, aber dennoch einen Konferenzraum haben möchte (ausdrücklich nicht muss! Ist nur das Wissen-wollen wie's geht), habe ich mir einmal app_conference angeschaut. Gefällt mir auf den ersten Blick ganz gut, da ich nicht diese Dummy-Zaptel-Treiber dazu brauche.

    Und noch eins vorausgeschickt:
    Ich kenne den Ablauf von meetme gar nicht, da ich es noch nie laufen hören hab (bin ja mISDN'ler). Ausserdem muss ich gestehen, dass ich es mit dem wirklichen "Verstehen" der Dialplan-Syntax nicht so habe. Ich bin eher ein Trial&Error'er...

    Dennoch habe ich mich an diese Thema gewagt... /me der Dare-devil ;-)

    In der einfachsten Variante klappt eigentlich auch alles (funktionell). Man kommt in die Konferenz und kann miteinander konferieren. Allerdings ist die ganze Sache meines Erachtens noch nicht ganz rund. Es gibt keinerlei Meldungen wann jemand die Konferenz betritt, bzw. verlässt und die einzige Audiomeldung die kommt (You are curently the only...) ist in Englisch.
    Drum möchte ich (zusammen mit Euch) versuchen die notwendige Syntax/ den überhaupt möglichen Funktionsumfang zu erarbeiten um daraus ggfls. ein HowTo zu erstellen.

    Der gewünschte Funktionsumfang wäre:

    - Abfrage der (Konferenznummer)/ PIN bei Einwahl von extern
    - KEINE Abfrage wenn man von intern in den Konferenzraum geht
    - Entsprechende Audioausgaben bei Eintritt/ Verlassen der Konferenz
    - app_conference soll Deutsch lernen
    - ...

    Zunächst meine bisherigen Schritte :

    Ich setze voraus, dass man app_conference + die deutschen Sounds funktionsfähig in Asterisk kompiliert hat. In meinem Beispiel hat meine Konferenz hat die Nummer 1 (PIN 1234) und wird über die Extension 33 von intern und über [MSN] von ausserhalb angewählt.

    Damit dem Konferenzraum "1" auch eine PIN zugeordnet wird habe ich dies im CLI mit dem Befehl: "database put conferences 1 1234" in die Ast-DB geschrieben. Wählt man nun die [MSN], dann wird (auf Deutsch!) nach der Konferenzraumnummer gefragt. Leider hat das Deutsche Soundfile "Bitte geben Sie die Konferenznummer ein.." noch den Zusatz "..und drücken Sie die Raute-Taste". Drückt man aber die Raute-Taste, dann wird der gesamte Kontext natürlich sofort beendet. Blöd.

    Hierfür habe ich noch keine Lösung, ausser eben die Raute-Taste nicht zu drücken. Bin für Vorschläge dankbar!

    Nach erfolgreicher Eingabe der Konferenznummer (hier eben einfach "#" weglassen) wird man dann nach der PIN gefragt. Gibt man eines der beiden falsch ein, wird man eben nochmal danach gefragt. Bislang hab ich aber auch noch nicht herausgefunden, wie man so eine Abfrage (elegant!, nicht holzhackermäßig) z.B. nur 2 Mal macht und dann einen Hangup erzwingt. Man soll ja nicht endlos Probieren können um auf die PIN zu kommen.

    Hat man beides aber korrekt eingegeben, dann landet man im Koferenzraum "1". Leider wird man dort (als erster) mit der Englischen Ansage "You are currently the only person in this room" begrüsst. Dieses Audio-File würde ich gerne in das Deutsche "Sie sind momentan der einzige Teilnehmer in dieser Konferenz" ändern. Tritt nun Teilnehmer 2,3,n in die Konferenz, erhalten allerdings weder die sich bereits darin Befindlichen, noch der Neu-Beitretende eine Audioausgabe á la "(Ein) weiterer Teilnehmer in dieser Konferenz". Genau das ist wohl in app_conference auch gar nicht vorgesehen.
    Der wohl bislang einzige Weg, zumindest laut http://www.voip-info.org/wiki/view/Asterisk+cmd+Conference läuft wohl über das dort beschriebene Perl-Script. Leider habe ich keinerlei Erfahrung mit Perl-Scripten und kann mir nur in etwa zusammenreimen was es macht. Wenn ich es aber richtig verstanden habe, dann kann man die verscheidenen Stati der Konferenz nur über die in app_conference implementierten Ausgaben an das Manager-API auswerten. Und das macht wohl das Script um von dort aus wieder an die definierten Stellen der extensions.conf zu verweisen. Aber das geht bei mir (noch) nicht...

    Hier also meine extensions.conf:
    Code:
    ...
    [incoming]
    exten => [MSN],1,Goto(conferences,333,1)
    ..
    [conferences]
    
    ;Konferenzraum 1 von intern ohne Abfrage
    
    exten => 33,1,Conference(1,M)
    
    ;Konferenzraum 1 von extern mit Abfrage
    
    exten => 333,1,Wait,1
    exten => 333,2,DigitTimeout,5
    exten => 333,3,ResponseTimeout,8
    exten => 333,4,BackGround(conf-getconfno)
    exten => 333,5,Waitexten(20)
    exten => 333,6,Goto(33,4)
    
    exten => _1,1,DBget(pass=conferences/1) ; Gibt's die Konferenz nicht, springe nach 102
    exten => _1,2,GotoIf($["xxx${pass}" = "xxxNONE"]?30) ; Gibt's kein Passwort, springe direkt in die Konferenz
    exten => _1,3,Read(secret,conf-getpin,10)
    exten => _1,4,GotoIf($["${pass}" != "${secret}"]?40:30)
    
    exten => _1,30,Conference(1,STV)
    exten => _1,31,Hangup
    
    exten => _1,40,Playback(conf-invalidpin)
    exten => _1,41,Wait(1)
    exten => _1,42,Goto(_1,3)
    exten => _1,41,Hangup
    
    exten => _1,102,Playback(conf-invalid)
    exten => _1,103,Wait(1)
    exten => _1,104,Goto(33,4)
    exten => _1,105,Hangup
    ...
    [default]
    include => incoming
    include => conferences
    Ich gebe zu, es steht noch nicht viel anderes in meinem Dialplan, als man auch von voip-info hätte copy&pasten hätte können. Aber vielleicht stösst mein Posting ja auch bei dem Einen oder Anderen auf fruchtbaren Boden und man kann gemeinsam in eine weitere dunkle Ecke von Asterisk etwas Licht bringen.

    Danke schon Mal für's Lesen dieses Monster-Postings!
    Bis neulich

    TOM

    --edit--
    OK, ich hab mich die letzten 2 Stunden Mal mit dem Perl-Script gespielt. Jetzt werden teilweise (noch Englische) Sounds abgespielt bei Beitritt/ Verlassen. Leider haut dies aber nur ungefähr 1 Mal von 20 Versuchen hin. Bei den restlichen 19 stürzt Asterisk gnadenlos ab.
    --edit--
     
  2. tomster

    tomster Mitglied

    Registriert seit:
    6 Dez. 2004
    Beiträge:
    238
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    bavaria superior
    Dann hol ich den Thread mal selber wieder hoch. Hab seit damals nicht mehr weiter probiert, weil ich eine Konferenz eigentlich nie gebraucht hatte. Nun steht aber dummerweise so etwas für kommenden Montag (in 2 Tagen) an...

    Nachdem ich ja wie schon oben geschrieben oft mit Abstürzen des Asterisks zu kämpfen hatte, hab ich gestern mal den Google angeschmissen und bin auf folgenden Blog-Eintrag gestossen:
    http://www.moythreads.com/wordpress/2007/09/02/mixing-audio-overflow-in-appconference-and-asterisk-smoothers/

    Ich kenn mich zwar mit C/C++ nicht aus, meine aber zu verstehen, dass darin die Ursache für die Abstürze des Asterisk zu suchen sein könnte. Seht es mir nach, dass meine Erkenntnisse lediglich auf Trial'n'Error beruhen, und keinerlei Anspruch auf fundiertes Grundwissen erheben.

    Moises Silva, der Blog-Verfasser hat mir freundlicherweise seinen Ansatz, abgestimmt auf 1.2.12.1, mittels Download-Link:
    http://www.moythreads.com/app-conference-ast-1.2.12.1-nov-6-2006.tar.bz2
    zur Verfügung gestellt.
    Leider funktionierte diese Variante bei mir (1.2.17) nicht richtig. Ich hatte zwar keinerlei Abstürze mehr zu beklagen, dafür aber auch kein Audio innerhalb des Konferenzraumes. Plöd.

    Drum hab ich einfach die frame.c von Moises und meinem http://www.eflo.net/files/VD_app_conference_0.6.zip gedifft. Bislang hatte ich damit noch keinen Absturz- egal ob die Teilnehmer SIP oder mISDN waren. Und das Beste: Ich hab wieder Audio. Allerdings demassen gejittered, dass eine normale Konferenz etwas anstrengend für das Ohr ist.

    Dennoch glaube ich, dass man damit auf dem richtigen Weg ist. Das Jitter-Thema sollte man noch wegbekommen können. Ich werde versuchen, mit Moises Hilfe, eine funktionsfähige Lösung (zumindest für 1.2.17) hinzubekommen.
     
  3. tomster

    tomster Mitglied

    Registriert seit:
    6 Dez. 2004
    Beiträge:
    238
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    bavaria superior
    Und schon wieder ich...

    Nachdem ich mir zusammen mit Moises das halbe Wochenende um die Ohren gehauen habe, kann ich nun Vollzug melden.
    app_conference läuft einwandfrei, hängt sich nicht mehr auf und auch die Jitters Seitens mISDN sind weg.

    Kurz beschrieben:
    Das Problem mit den Jitters lag an den unterschiedlichen Sample Rates der jeweiligen codecs. Moises hatte zwar ast_smoother bemüht, aber das hat wohl ein Problem bei bestimmten (unterschiedlichen) Sample Rates. Besonders meine Einstellung in der misdn-init.cong hat die Probleme verursacht, da die dort eingetragenen poll=128 nicht richtig umgewandelt werden konnten. Von daher haben wir diesen Wert auf poll=256 gesetzt. Ich selbst konnte keine negative Auswirkung auf andere Funktionen beobachten, aber ich bitte Euch das ausgiebig zu testen.

    Im Anhang hab ich Euch auch einmal die modifizierte VD_app_conference_0.6 angehängt. Diese compiled bei mir (asterisk 1.2.17) einwandfrei.

    In einzelnen betreffen unsere Änderungen lediglich die frame.c und die member.c. Ihr könnt also mittels "diff" die Änderungen im Bezug auf die Original-Files leicht nachvollziehen. Das hab ich noch nicht gemacht, weil ich froh bin, dass wir das noch rechtzeitig hinbekommen haben.

    Probiert es aus, und gebt hier evtl. Feed-Back.

    Gruß,
    TOM
     

    Anhänge:

  4. PsychoMantis

    PsychoMantis Aktives Mitglied

    Registriert seit:
    18 Dez. 2005
    Beiträge:
    2,494
    Zustimmungen:
    1
    Punkte für Erfolge:
    38
    Beruf:
    geht niemanden was an
    Ort:
    Ingolstadt
    #4 PsychoMantis, 20 Apr. 2008
    Zuletzt bearbeitet: 13 Mai 2008
    OK. Habe es ausprobiert:
    Code:
    vs007:/usr/src/app_conference# make
    gcc -pipe -fPIC -Wall -Wmissing-prototypes -Wmissing-declarations -g  -I/usr/src/asterisk-1.4.18.1/include  -D_REENTRANT -D_GNU_SOURCE -O3 -ffast-math -funroll-all-loops -fprefetch-loop-arrays -fsingle-precision-constant -march=pentium3 -msse -mfpmath=sse,387  -DCRYPTO -DAPP_CONFERENCE_DEBUG -Ilibspeex -DSILDET=2   -c -o app_conference.o app_conference.c
    app_conference.c:51: warning: data definition has no type or storage class
    app_conference.c:51: warning: type defaults to 'int' in declaration of 'STANDARD_LOCAL_USER'
    app_conference.c:52: warning: data definition has no type or storage class
    app_conference.c:52: warning: type defaults to 'int' in declaration of 'LOCAL_USER_DECL'
    app_conference.c:55: warning: no previous prototype for 'unload_module'
    app_conference.c: In function 'unload_module':
    app_conference.c:58: error: 'STANDARD_HANGUP_LOCALUSERS' undeclared (first use in this function)
    app_conference.c:58: error: (Each undeclared identifier is reported only once
    app_conference.c:58: error: for each function it appears in.)
    app_conference.c: At top level:
    app_conference.c:67: warning: no previous prototype for 'load_module'
    app_conference.c:80: warning: no previous prototype for 'description'
    app_conference.c:85: warning: no previous prototype for 'usecount'
    app_conference.c: In function 'usecount':
    app_conference.c:87: warning: implicit declaration of function 'STANDARD_USECOUNT'
    app_conference.c: At top level:
    app_conference.c:92: warning: no previous prototype for 'key'
    app_conference.c: In function 'app_conference_main':
    app_conference.c:106: warning: implicit declaration of function 'LOCAL_USER_ADD'
    app_conference.c:112: warning: implicit declaration of function 'LOCAL_USER_REMOVE'
    make: *** [app_conference.o] Fehler 1
    vs007:/usr/src/app_conference#
    Nachtrag: OK, das war, als ich das mit Asterisk 1.4 ausprobiert habe.
    Mit 1.2.17 scheint`s zu gehen:
    Code:
    vs007:/usr/src/app_conference# make
    make: Für das Ziel »all« ist nichts zu tun.
    vs007:/usr/src/app_conference# make install
    for x in app_conference.so; do install -m 755 $x /usr/lib/asterisk/modules ; done
    cp -f *.gsm /var/lib/asterisk/sounds
    cp -f *.wav /var/lib/asterisk/sounds
    vs007:/usr/src/app_conference#