[Frage] Asterisk automatischer Anruf warten auf AB-Ansagenende...

JL3

Aktives Mitglied
Mitglied seit
4 Dez 2010
Beiträge
1,995
Punkte für Reaktionen
8
Punkte
38
Mit Asterisk und dem automatischen Anrufen klappt es wunderbar. Asterisk führt automatisch einen Anruf aus und spielt bei Annahme des Gesprächs eine Wav-Datei mit Textinhalt ab. Das Problem ist, wenn anstelle des Angerufenen nun dessen Anrufbeantworter das Gespräch annimmt. Gibt es eine Möglichkeit, eine extensions zu benutzen, die den Ansagetext des ABs des Angerufenen abwartet, bevor die Wav-Datei abgespielt wird, sodass diese auf dem AB des Angerufenen landet. Im Augenblick wartet asterisk nicht und spielt bereits während des AB-Ansagetextes die Wav-Datei ab und nichts oder nur die letzten Bruchstücke landen auf dem AB des Angerufenen.
 
Zuletzt bearbeitet:
Spontan:
Check die Länge der AB Ansage und gib der Extension ein entsprechendes Wait () nach Answer (), oder gib der WAV Datei einen entsprechend entbehrlichen Vorlauf.
 
Das Problem ist, dass die Länge der AB-Ansage des Angerufenen unbekannter Länge ist und sich ggf. auch mal ändern kann... :gruebel:

Nachtrag und Lösung:
Code:
[saskiatalk]
exten => s,1(start),NoOp(${CHANNEL} ${CALLERID(all)} ruft ${EXTEN})
 same => n,Answer()
 same => n,Wait(2)
[B][COLOR=#008000] same => n,WaitForSilence(2000)[/COLOR][/B]
 same => n,Playback(play)
 same => n,Wait(1)
 same => n(exit),Hangup()

PS: So langsam macht asterisk-Programmierung Spaß. Ist wie das gute, alte BASIC. ;)
 
Zuletzt bearbeitet:
Nice, kannst du bei dieser Gelegenheit mal checken, ob dies das vorherige Wait (2) überflüssig macht?
Kommentieren kannst du die Zeile einfach mit einem Semikolon.

Und gewöhn dir bitte an den DIALSTATUS nach Hangup Dial() abzufangen/auszuwerten.
...eine der wichtigsten Grundlagen, um Fehler abzufangen.
Das NoOp () als Informationsquelle hast du ja auch fein übernommen.
...und das ist auch gut so. ;)

Obwohl :gruebel: geht ja garnicht.
DIALSTATUS wird von/nach Dial () gesetzt.
Das benutzt du ja garnicht.
 
Zuletzt bearbeitet:
Ich fürchte, ich habe da eine ganz dumme Frage, wie mache ich das mit dem DIALSTATUS auswerten? Wo landet die Information und in welcher Form?
 
In der s Extension.
Die wird übrigens, egal welche Nummer im Kontext landet, immer ausgeführt.

Wenn eine Nummernextension im Kontext definiert wurde, die ein Dial () enthält, dann direkt darunter mit...
same => n, Goto (s, ${DIALSTATUS} )
...springt nach s ins Label welches DIALSTATUS entspricht.

Was/Wie ist/macht ein Label ?
Für DIALSTATUS ist ein mögliches...
same => n (BUSY), ...

Codebeispiel hab ich im anderen SaS Asterisk an Fritz!Box Thread gepostet (Post #4).
Die gehen alle an einen Anrufbeantworter.
 
Zuletzt bearbeitet:
Ja, danle, ich schau es mir an. :)
 
Wenn ich die s exten benutze, bekomme ich nicht die Nummer angezeigt, die ich aus asterisk heraus extern anrufe. Da wird nur s angezeigt. Wie kann ich da die gewählte Nummer im CLI dennoch anzeigen lassen? Irgendwie muss das funktionieren, da ich sie ja mit dem Call-File übergebe.

Zu den Beispielen: Das ist die falsche Richtung. Mich interessieren ausgehende nicht eingehende Calls. ;)

Kann man in der sip.conf die secret=kennwort nicht verschlüsseln? So ist das in der Textdatei im Klartext nicht gerade schön...
 
Zuletzt bearbeitet:
Dazu musst du begreifen wie die...
Asteriskbuch: 6.3. Besondere Extensions
...ticken.

Also: h , i , o , t und s werden als Extensionname ${EXTEN} auch genauso zurückgeliefert.
Erst wenn du ein Muster anwendest wird die Entsprechung dieser von ${EXTEN} wie gewünscht geliefert.

Ergo: Benutze statt s ...
exten => _X., 1, ...
...denn diese Extension gilt für jegliche gewählte Nummer, welche sich mit ${EXTEN} auch verarbeiten lässt.


Zu den Klartextpasswörtern

Nein, mir fällt da kein anderer Weg ein.

Wir befinden uns aber auf einem Linuxsystem.
Schau dir mal die Rechte von der sip.conf an...
ls -la sip.conf
-rw-r----- 1 asterisk asterisk 93890 Feb 11 00:31 sip.conf
...und wenn es keinen Hacker mit root Rechten gibt, reicht das auch aus.
 
Zuletzt bearbeitet:
Mit den Passworten ist komisch, dass bei register => ein md5hash akzeptiert wird. Bei secrets jedoch nicht. Muss man wohl nicht verstehen. :)

Bei den exten funktioniert dies mit _X. definitiv nicht.

Es geht um ausgehend nicht ankommend.

Nachtrag: Nach etlichen Versuchen funktioniert nur exten s. Irgendwas mache ich wohl falsch.
 
Zuletzt bearbeitet:
Was muss in die call-Datei unter "Extensions: " ?
Bei "s" steht da ja "Extensions: s". Was käme bei "_X." da rein, denn "Extensions: _X." funktioniert nicht.
Auch "Extensions: _." bei "_." klappt nicht. Wo liegt da mein Denkfehler? :gruebel:
 
https://www.google.de/search?q=asterisk+detect+answering+machine [*scnr*]

Wir hatten hier auch schon mal einen Thread zum Thema Alarmierung, da wurde beschrieben, wie ein Alarmanruf durch eine DTMF Eingabe quittiert werden muss, um als erledigt zu gelten. Das geht über das Flag U im Dial.

Und gewöhn dir bitte an den DIALSTATUS nach Dial() abzufangen/auszuwerten.
...eine der wichtigsten Grundlagen, um Fehler abzufangen.

Warum? Wenn man nicht gezielt auf einen bestimmten Status reagieren will ist das unnötig.

In der s Extension.
Die wird übrigens, egal welche Nummer im Kontext landet, immer ausgeführt.

Das stimmt so nicht, die s-extension ist ein Fallback und wird ausgeführt, wenn es keine andere passende exten gibt, oder der Context gänzlich ohne gerufene Nummer angesprungen wird. Für die Behandlung des Dialstatus ist das eine denkbar schlechte Wahl, das macht man besser über eigene extens, oder Sprungmarken innerhalb der exten.

Kann man in der sip.conf die secret=kennwort nicht verschlüsseln?

http://www.voip-info.org/wiki/view/Asterisk+sip+md5secret

Was käme bei "_X." da rein, denn "Extensions: _X." funktioniert nicht.

Zunächst, der Parameter heißt Extension ohne s.

_X. bedeutet übersetzt:
_ ist ein Steuerzeichen und weißt Asterisk an, den folgenden String als Suchmuster zu interpretieren
X eine beliebige Ziffer
. mindestens ein beliebiges Zeichen

Das gesamte Suchmuster gilt also für alle Zeichenketten, die aus mindestens zwei Zeichen bestehen wovon das erste eine Ziffer sein muss. Alle solchen Zeichenketten kannst Du im Call File als Extention verwenden, also zB. 0815 würde passen, und so bekommst Du es dann auch in der Variable EXTEN zurück geliefert.

Wenn Du weitere Informationen aus dem Call File übergeben möchtest, kannst Du Set benutzen.
 
Moins


@rentier-s: Da eben die s Extension als Fallback zu sehen ist, die bei nicht im Kontext definierte Nummern angesprungen wird, kann sie meiner Meinung nach sehr wohl in die Fehlerbehandlung einbezogen werden.

Code:
exten => s,1(nomatch),NoOp([COLOR=#ff0000]Nummer unbekannt oder nicht abgefangener Fehler[/COLOR])
same  => n,Goto(exit)
same  => n(NOANSWER),NoOp(NOANSWER or TIMEOUT reached)
same  => n,Goto(exit)
same  => n(BUSY),NoOp(Is BUSY or has CANCELED)
same  => n,Goto(exit)
same  => n(CHANUNAVAIL),NoOp(CHANUNAVAIL or PEER NOT REGISTERED)
same  => n(exit),Hangup()

@JL3: Dein Denkfehler: _X. steht für so gut wie Alles, also kannst du auch jede beliebige Nummer unter Extension: (im Callfile) angeben.
Die wird dann sowieso in _X. landen und kann mittels ${EXTEN} erkannt/weiterbehandelt werden.
Dass, wie du schon erkannt hast, mit der s Extension so nicht funktioniert.
 
_X. funktioniert schlichtweg bei mir nicht. $Ich belasse es jetzt bei s.

Zum Thema Verschlüsselung:
@rentier-s: Die Webseite kenne ich, aber der md5secret wird ignoriert.

Ich denke, ich belasse es jetzt wie es ist. Trotzdem danke an Euch für die vielen Infos zu asterisk. Es funktioniert soweit es soll und das reicht mir erst einmal. :)
 
Wie jetzt?


Hast du sie denn so...
Code:
[saskiatalk]
exten => _X.,1(start),NoOp(${CHANNEL} ${CALLERID(all)} ruft ${EXTEN})
same => n,Answer()
same => n,Wait(2)
same => n,WaitForSilence(2000)
same => n,Playback(play) 
same => n,Wait(1)
same => n(exit),Hangup()
...definiert und mit dialplan reload...
Code:
[Feb 23 22:30:41]     -- Registered extension context 'saskiatalk'; registrar: pbx_config
[Feb 23 22:30:41]     -- Added extension '_X.' priority 1 to saskiatalk
[Feb 23 22:30:41]     -- Added extension '_X.' priority 2 to saskiatalk
[Feb 23 22:30:41]     -- Added extension '_X.' priority 3 to saskiatalk
[Feb 23 22:30:41]     -- Added extension '_X.' priority 4 to saskiatalk
[Feb 23 22:30:41]     -- Added extension '_X.' priority 5 to saskiatalk
[Feb 23 22:30:41]     -- Added extension '_X.' priority 6 to saskiatalk
[Feb 23 22:30:41]     -- Added extension '_X.' priority 7 to saskiatalk
...bekanntgemacht, um sie zum Beispiel mit so einem Callfile...
Code:
Channel: SIP/1005
Callerid: SAS-Info<200>
MaxRetries: 3
RetryTime: 60
WaitTime: 10
Context: saskiatalk
Extension: 200
Archive: no
...getestet?

Bei mir gehts, Ausgabe von Asterisk@CLI...
Code:
[Feb 23 22:34:00]     -- Attempting call on SIP/1005 for 200@saskiatalk:1 (Retry 1)
[Feb 23 22:34:00]   == Using SIP RTP CoS mark 5
[Feb 23 22:34:04]        > Channel SIP/1005-0000006d was answered
[Feb 23 22:34:04]     -- Executing [200@saskiatalk:1] NoOp("SIP/1005-0000006d", "SIP/1005-0000006d "SAS-Info" <200> ruft 200") in new stack
[Feb 23 22:34:04]     -- Executing [200@saskiatalk:2] Answer("SIP/1005-0000006d", "") in new stack
[Feb 23 22:34:04]     -- Executing [200@saskiatalk:3] Wait("SIP/1005-0000006d", "2") in new stack
[Feb 23 22:34:04]        > 0xb6610888 -- Probation passed - setting RTP source address to 192.168.178.6:59552
[Feb 23 22:34:06]     -- Executing [200@saskiatalk:4] WaitForSilence("SIP/1005-0000006d", "2000") in new stack
[Feb 23 22:34:06]     -- Waiting 1 time(s) for 2000 ms silence with 0 timeout
[Feb 23 22:34:08]     -- Exiting with 2000ms silence >= 2000ms required
[Feb 23 22:34:08]     -- Executing [200@saskiatalk:5] Playback("SIP/1005-0000006d", "play") in new stack
[Feb 23 22:34:08]     -- Executing [200@saskiatalk:6] Wait("SIP/1005-0000006d", "1") in new stack
[Feb 23 22:34:09]     -- Executing [200@saskiatalk:7] Hangup("SIP/1005-0000006d", "") in new stack
[Feb 23 22:34:09]   == Spawn extension (saskiatalk, 200, 7) exited non-zero on 'SIP/1005-0000006d'
 
Noch eine Verständnisfrage. Die
Extension: 200 bezieht sich worauf? Auf die Nummer, die von Asterisk nach außen angerufen wird? Die Nummer des virtuellen Telefons, das mittels Asterisk raustelefoniert scheint im Beispiel oben die 1005 zu sein?

Bei mir sieht die Call-Datei so aus:
Code:
Channel: SIP/0049987654321@fbgateway
Callerid: SaS
Context: saskiatalk
Extension: s
Archive: no
die müsste demzufolge so aussehen? :gruebel:
Code:
Channel: SIP/0049987654321@fbgateway
Callerid: SaS<621>
Context: saskiatalk
Extension: 0049987654321
Archive: no
Liege ich da richtig?

oder eher so?
Code:
Channel: SIP/0049987654321@fbgateway
Callerid: SaS
Context: saskiatalk
Extension: 621
Archive: no

621 ist die Nummer vom virtuellen Asterisk-Telefon (ist so an der FB angemeldet)
0049987654321 ist die externe Nummer des Anzurufenden

oder doch eher so?
Code:
Channel: SIP/621@fbgateway
Callerid: SaS<621>
Context: saskiatalk
Extension: 0049987654321
Archive: no

wenns nach dem asterisk-Handbuch geht eher so:
Code:
Channel: SIP/621@fbgateway
Callerid: SaS
Context: saskiatalk
Extension: 0049987654321
Archive: no

Ganz simpel gefragt: Wo kommt die eigene Nummer und wo die Nummer hin, die ich automatisch anrufen will? Und woher kommt die 1005 bei dir? :confused:
 
Zuletzt bearbeitet:
Das Ziel, das zuerst angerufen werden soll, kommt in den Channel.

In Deinem Fall, da Du sowieso nur eine Ansage abspielen möchtest, ist auch Extension: s zusammen mit exten=>s vollkommen in Ordnung. Das Paradebeispiel wo man mit richtigen Nummern arbeitet sind CTI Wählhilfen, da wird mit Channel das eigene Telefon angerufen und beim Abheben die als Extension übergebene Nummer gewählt.

@koy, für das was Du im Label nomatch vor hast ist die i (=invalid) extension vorgesehen. Die s extension dient für Dialpläne, die aufgerufen werden, bevor das Ziel feststeht, oder wenn vor vorn herein klar ist, dass es keine gewählte Nummer gibt. Früher war das bei manchen ISDN Schnittstellen notwendig, die im Call Setup keine gerufene Nummer hatten, oder POT FXO wo erst nach dem Abheben Ziffernweise nachgewählt wird. Heut zu Tage braucht man das bei manchen SIP Trunking Anbietern.
Die Auswertung des Dialstatus ist da deshalb schlecht aufgehoben, weil Asterisk in bestimmten Fällen "versehentlich" auf späteren Prioritäten in die s extension springen könnte. So lange da nur Noops drin stehen ist das nicht so wild, aber im echten Leben könnten verwirrende Nebenwirkungen auftreten.
 
Moinsen


@JL3: Das hier ist ein interner Anruf: Channel: SIP/**621@fbfgateway
( Bei mir: fbfgateway0 bis fbfgateway9 )

Der Channel: SIP/1005 ist ein SNOM 320 direkt am Asterisk.

Die 200 kann auch 300 oder 400 oder 123 oder sonstwas sein.
Das Muster _X. fängt die alle auf.

@rentier-s: Ok, verstanden und akzeptiert.
Werde das in Zukunft nicht mehr empfehlen und auf die i Extension verweisen.
...oder zum Anlegen einer eigenen Extension für die Fehlerbehandlung raten.
 
Nochmals Danke für die Erläuterungen. Ich denke, ich habe es jetzt soweit verstanden. Die anzurufende Nummer gehört in die Channel-Angabe. Mit s klappt alles soweit gut. _X. funktioniert auch, ruft aber noch h auf (hangup). s macht dies nicht.

Bleibt noch das md5secret-Problem. Hier akzeptiert wohl die Fritzbox das Kennwort nicht. :gruebel:
 
md5secret

Habs mal probiert, und was soll ich schreiben? Klappt.
Sofern realm (sip.conf) nicht gesetzt ist macht du das mit echo und Pipe und md5sum so...
Code:
echo -n "[COLOR=#008000]Username[/COLOR]:[COLOR=#0000ff]asterisk[/COLOR]:[COLOR=#ff0000]Passwort[/COLOR]" | md5sum
...für obiges Beispiel kommt...
Code:
23b782370e49aba2c4a44eb97c64450c
...und ab in die sip.conf...
Code:
md5secret=23b782370e49aba2c4a44eb97c64450c
...und nach core reload werden mit sip show users die secrets auch nicht mehr angezeigt.

:gruebel: ...und was ist mit den registry= Einträgen?
Aber natürlich lass ich es jetzt so. :mrgreen:
Deswegen sollte die sip.conf immer noch nicht "world read/writeable" sein.
 
Zuletzt bearbeitet:
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.