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

tomster

Mitglied
Mitglied seit
6 Dez 2004
Beiträge
238
Punkte für Reaktionen
0
Punkte
0
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--
 
Zuletzt bearbeitet:

tomster

Mitglied
Mitglied seit
6 Dez 2004
Beiträge
238
Punkte für Reaktionen
0
Punkte
0
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.
 

tomster

Mitglied
Mitglied seit
6 Dez 2004
Beiträge
238
Punkte für Reaktionen
0
Punkte
0
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

PsychoMantis

Aktives Mitglied
Mitglied seit
18 Dez 2005
Beiträge
2,525
Punkte für Reaktionen
5
Punkte
38
Probiert es aus, und gebt hier evtl. Feed-Back.
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#
 
Zuletzt bearbeitet: