[asterisk]Implementierung einer Ansage bei besetzt

michel12345

Neuer User
Mitglied seit
9 Dez 2006
Beiträge
41
Punkte für Reaktionen
0
Punkte
0
Folgende Situation

Mein asterisk :

SPA3102ATA -> ASTERISK > HFC KARTE > NTBA

Nun wenn mich jemand Anruft kann kein zweiter mehr Anrufen da
ich das Anklopfen abgeschaltet habe und derjenige bekommt
einfach ein Besetztzeichen.
Das möchte ich ändern.
Er soll eine Ansage bekommen "Teilnehmer im gespräch blablabla!!"
dann Musik
und wenn ich aufgelegt habe soll der Asterisk den anrufer mit mir verbinden
"Teilnehmer nun bereit sie werden verbunden blabla"

Nun Asterik hat ja die MOH funktion sowie den Queue sprich Warteschlange
aber ich denke er damit kann ich es nicht da dann jeder Anrufer in der
Warteschlange landet.

extensions.conf

[SPA]

exten => X.,1,Dial(SIP/SPA/33)
exten => X.,2,HangUp

nun da der 2 Besetzt bekommt müsste es ja die Priorität + 101 der Ansatzpunkt sein.

[SPA]

exten => X.,1,Dial(SIP/SPA/33)
exten => X.,2,HangUp
exten => X.,102,MP3Player(ansage.mp3)
exten => X.,103,NoOP(Random = "zufall zwischen 1-9")
exten => X.,104,Mp3player(musik(Random).mp3)
exten => X.,105,"IF BETSETZT GOTO 103"
exten => X.,106,mp3player(verfügbar)
exten => X.,107,dial(SIP/SPA/33)
exten => X.,108,hangup

Nun wie ich betzt abfrage oder Random eine zahl zwischen 1-9
generiere weis ich nicht aber es sollte doch so in etwa gehen oder??

Bin noch neuling daher nicht meckern falls die eine dämliche lösung ist

MFG michel
 
Das mit dem priority-jumping solltest Du besser gleich wieder vergessen. Das ist old-fashion ;)

Was Du machen willst, sollte sich über eine Queue lösen lassen. Diese Queue wird nur aus einem einzigen Teilnehmer bestehen.

Du solltest Dich also mal mit dem Thema "queue" in der Asterisk Doumentation befassen. Wahrscheinlich wirst Du hier im Forum etwas dazu finden, aber mit Sicherheit auf www.voip-info.org
 
Der Ansatz ist nicht verkehrt, etwas schöner wird es wie folgt:

Code:
[SPA]
exten => _X.,1,Dial(SIP/SPA/33)
exten => _X.,2,GotoIf($["${DIALSTATUS}"="BUSY"]?4,3)
exten => _X.,3,Hangup()

exten => _X.,4,Set(asong=${RAND(1|9)})
exten => _X.,5,Answer()
exten => _X.,6,MP3Player(ansage.mp3)
exten => _X.,7,Mp3player(musik${asong}.mp3)
exten => _X.,8,Goto(1)

Random ermittelt hier einen Wert zwischen 1 und 9 und übergibt ihn an asong, diese Variable wird in Priority 7 wieder benutzt.
Die Eigenschaft "Besetzt" erhaelst Du am einfachsten über DIALSTATUS.
Die Feststellung, ob der Channel wieder verfügbar ist, lässt sich auch erreichen, allerdings hab' ich die jetzt mal weggelassen, nach Abspielen des mp3-Files wird hier einfach die Gesamtprozedur von vorne begonnen.

Dia Aussage von betateilchen hinsichtlich der Queue ist natürlich korrekt und führt auch zum Ziel (Du willst ja jemanden warten lassen :)), die hier von mir dargestellte nLösung ist eine Alternative ohne Queue.
 
So hab das ganze
mal implementiert
leider tritt ein fehler auf der aber nicht auf die Programmierung
sondern auf ein altes Problem mit dem SPA3102 zurückzuführen
ist.
Folgendes Problem trat auf :
Bei jedem 2 oder dritten anruf "FEHLTE ein RTP AUDIOKANAL"
sprich man konnte hören aber nicht sprechen oder umgekehrt.
Gelöst habe ich dieses Problem indem ich die RTP Ports
beim Asterisk und bei Spa auf 2 beschränkte.

so hier die Fehlermeldung
Code:
    -- Accepting voice call from '' to '222222' on channel 0/2, span 1
    -- Executing Dial("Zap/2-1", "SIP/spa|30|r") in new stack
Jul 18 22:48:10 ERROR[4268]: rtp.c:1003 ast_rtp_new_with_bindaddr: No RTP ports remaining. Can't setup media stream for this call.
Jul 18 22:48:10 WARNING[4268]: chan_sip.c:3116 sip_alloc: Unable to create RTP audio  session: Address already in use
Jul 18 22:48:10 ERROR[4268]: chan_sip.c:12178 sip_request_call: Unable to build sip pvt data for 'spa' (Out of memory)
Jul 18 22:48:10 NOTICE[4268]: app_dial.c:1076 dial_exec_full: Unable to create channel of type 'SIP' (cause 42 - Switching equipment congestion)
  == Everyone is busy/congested at this time (1:0/0/1)
    -- Executing GotoIf("Zap/2-1", "0?4|3") in new stack
    -- Executing Hangup("Zap/2-1", "") in new stack
  == Spawn extension (isdn-eingehend, 222222, 3) exited non-zero on 'Zap/2-1'
    -- Hungup 'Zap/2-1'


und hier der Auzug aus der extensions .conf

Code:
[isdn-eingehend]

exten => 222222,1,Dial(SIP/spa,30,r)
exten => 222222,2,GotoIf($["${DIALSTATUS}"="BUSY"]?4,3)
exten => 222222,3,HangUp()

exten => 222222,4,answer()
exten => 222222,5,MP3Player(/var/lib/asterisk/mohmp3/ansage.mp3)
exten => 222222,6,Set(asong=${RAND(1|5)})
exten => 222222,7,MP3Player(/var/lib/asterisk/mohmp3/musik${asong}.mp3)
exten => 222222,8,GotoIf($["${DIALSTATUS}"="BUSY"]?6,9)
exten => 222222,9,MP3Player(/var/lib/asterisk/mohmp3/verbinden.mp3)
exten => 222222,10,Dial(SIP/spa,30,r)
exten => 222222,11,HangUp()
 
Habe es gelöst

die Funktion sippeer(spa:curcalls) tut auch das was ich brauche um den
Leitungsstatus abzufragen.
 
Kostenlos!

Statistik des Forums

Themen
248,916
Beiträge
2,304,999
Mitglieder
378,631
Neuestes Mitglied
realprogrammer