Sprachkanäle beschränken

baschdieh

Mitglied
Mitglied seit
15 Sep 2005
Beiträge
416
Punkte für Reaktionen
0
Punkte
0
Hi,

gibt es die Moeglichkeit mittels Asterisk die einzenel Sprachkanaele innerhalb des contexts zu limitieren? Sprich User X im Context X darf nur 2 Verbindungen gleichzeitig nutzen, waehrend User Y im context Y 4 nutzen darf.
 
Hi,

vielen Dank fuer Deine Antwort. So was in der Art. Allerdings nicht SIP Account faehig - sondern context faehig. Sprich ich habe ein Context mit 10 SIP-Accounts. Diese 10 SIP-Accounts sollen sich innerhalb des context allerdings nur 4 Kanaele teilen.
 
Notfalls kannst Du Dir so einen counter auch selbst bauen, erzeuge unter der Linux Shell einen Key für die Asterisk interne Datenbank:

asterisk -rx "database put ContextX Value 4"

Die extensions.conf kann dann z.B. so aussehen, dass bei jedem laufenden Anruf Value um 1 reduziert wird und nach dem Hangup wieder eins hochgezählt wird. Wenn Value = 0 (4 Kanäle belegt) wird irgendeine andere Aktion ausgeführt (hier "Playback"):

Code:
exten => _X.,1,DBGet(ANZAHL=ContextX/Value) 
exten => _X.,2,GotoIf($[${ANZAHL} > 0]?3:7) 
exten => _X.,3,SetVar(SCHALTER=1) 
exten => _X.,4,SetVar(ANZAHLNEU=$[${ANZAHL} - 1]) 
exten => _X.,5,DBPut(ContextX/Value=${ANZAHLNEU}) 
exten => _X.,6,Dial(SIP/....) 
exten => _X.,7,SetVar(SCHALTER=0) 
exten => _X.,8,Playback(NoLineAvailable) 
exten => _X.,9,Congestion 
exten => _X.,102,Busy 

exten => h,1,GotoIf($[${SCHALTER} = 1]?2:6) 
exten => h,2,DBGet(ANZAHL=ContextX/Value) 
exten => h,3,SetVar(ANZAHLNEU=$[${ANZAHL} + 1])
exten => h,4,DBPut(ContextX/Value=${ANZAHLNEU})
exten => h,5,SetVar(SCHALTER=0) 
exten => h,6,Hangup


hth,
Tin
 
Hi,

vielen Dank fuer Deine Antwort, TinTin. Leider bin ich neu in Asterisk und dieses Script - sagt mir garnichts. Passt das, wenn ich es global unter ContextX schreibe? Oder muss ich fuer jeden Benutzer innerhalb dieser Beschraenkung diese Befehle umschreiben?

Sprich ich habe einen Benutzer angelgt wie z.B.

Code:
exten => 21,1,SetLanguage(de)
exten => 21,2,Dial(SIP/basty,20)
exten => 21,3,VoiceMail2(u21)
exten => 21,4,PlayBack(vm-goodbye)
exten => 21,5,Wait(2)
exten => 21,6,HangUp()

Aus diesem wuerde dann :
Code:
exten => _X.,1,DBGet(ANZAHL=ContextX/Value)
exten => _X.,2,GotoIf($[${ANZAHL} > 0]?3:7)
exten => _X.,3,SetVar(SCHALTER=1)
exten => _X.,4,SetVar(ANZAHLNEU=$[${ANZAHL} - 1])
exten => _X.,5,DBPut(ContextX/Value=${ANZAHLNEU})
exten => _X.,6,Dial(SIP/basty,20)
exten => _X.,7,SetVar(SCHALTER=0)
exten => _X.,8,Playback(NoLineAvailable)
exten => _X.,9,Congestion
exten => _X.,102,Busy

Ich bin etwas konfuz! :)
 
Hallo baschdieh,

was Du da geändert hast ist Teil der eingehenden Gespräche, ich dachte Du wolltest die =ausgehenden= zur Verfügung stehenden Leitungen Contextwise beschränken !?

Poste am besten mal Deine komplette sip.conf und extensions.conf (Passwörter rausnehmen).

Gruß,
Tin
 
Doh - stimmt. Aber nichts desto trotz, habe ich ein paar Probleme mit dem Script.

voipster*CLI> database show
/KundeEins/Value : 4

extension.conf
Code:
[Kunde1]
exten => _0.,1,DBGet(ANZAHL=KundeEins/Value)
exten => _0.,2,GotoIf($[${ANZAHL} > 0]?3:7)
exten => _0.,3,SetVar(SCHALTER=1)
exten => _0.,4,SetVar(ANZAHLNEU=$[${ANZAHL} - 1])
exten => _0.,5,DBPut(KundeEins/Value=${ANZAHLNEU})
exten => _0.,6,Dial(SIP//${EXTEN:1}@sip.mk-netzdienste.de,60)
exten => _0.,7,SetVar(SCHALTER=0)
exten => _0.,8,Playback(NoLineAvailable)
exten => _0.,9,Congestion
exten => _0.,102,Busy
;
exten => h,1,GotoIf($[${SCHALTER} = 1]?2:6)
exten => h,2,DBGet(ANZAHL=KundeEins/Value)
exten => h,3,SetVar(ANZAHLNEU=$[${ANZAHL} + 1])
exten => h,4,DBPut(KundeEins/Value=${ANZAHLNEU})
exten => h,5,SetVar(SCHALTER=0)
exten => h,6,Hangup
;
; Interne Rufnummern
exten => 21,1,SetCIDNum(21)
exten => 21,2,SetLanguage(de)
exten => 21,3,Dial(SIP/basty,20)
exten => 21,4,VoiceMail2(u21)
exten => 21,5,PlayBack(vm-goodbye)
exten => 21,6,Wait(2)
exten => 21,7,HangUp()
;
exten => 6666,1,SetCIDNum(21)
exten => 6666,2,SetLanguage(de)
exten => 6666,3,Dial(SIP/test,20)
exten => 6666,4,VoiceMail2(u21)
exten => 6666,5,PlayBack(vm-goodbye)
exten => 6666,6,Wait(2)
exten => 6666,7,HangUp()
So war/ist es doch angedacht? Interne Telefonie zu 6666 <-> 21 ohne Probleme. Ein externer Anruf meldet "busy" und folgende Fehlermeldungen :
Code:
Oct 13 15:03:11 WARNING[11680]: file.c:475 ast_openstream: File NoLineAvailable does not exist in any format
Oct 13 15:03:11 WARNING[11680]: file.c:787 ast_streamfile: Unable to open NoLineAvailable (format alaw): No such file or directory
Oct 13 15:03:11 WARNING[11680]: app_playback.c:83 playback_exec: ast_streamfile failed on SIP/basty-6f9f for NoLineAvailable

Die Benutzer in der SIP.conf befinden sich im context "KundeEins".
 
Okay - alles klar - habs gefunden. Problem liegt wohl am doppel Slash ;-) Sorry und danke!
 
baschdieh schrieb:
Okay - alles klar - habs gefunden. Problem liegt wohl am doppel Slash ;-) Sorry und danke!

Dass das Dial... nicht ging, ja, das liegt wohl am doppelslash - dass er NoLineAvailable mit PlayBack nicht abspielen kann ist auch klar, denn das war ja nur ein Beispiel, die NoLineAvailable.wav Datei gibt es nicht, mußt Du selbst erstmal etwas adäquates erzeugen und in /var/lib/asterisk/sounds abspeichern.

Gruß,
Tin
 
HRM - sorry, aber ich scheine nun doch ein anderes Problem zu haben. Das Script funktioniert wunderbar. Bin sehr dankbar fuer diese Hilfe. Das naechste Problem ergibt sich nun leider mit der Abrechnungs-Datenbank. Nachdem das kl. Script eingesetzt wird sind meine Auszuege in /var/log/asterisk/cdr-csv in Bezug auf die Zielrufnummer durch ein "h" ersetzt. Siehe :
Code:
"","21","h","KundeEins","""Test"" <21>","SIP/test-ff59","SIP/basty-ffe9","Hangup","","2005-10-13 16:10:05",,"2005-10-13 16:10:06",1,0,"NO ANSWER","DOCUMENTATION"

Wieso ? ;-)

greets
basty
 
Tja, das ist wirklich ein Problem... Mein Tipp funktioniert nur mittels h,...
(jedenfalls ist mir keine andere Methode bekannt, nach Beedingung des Gesprächs noch etwas auszuführen) und eine Limitierung von CDR scheint es zu sein, dass wenn h,... benutzt wird diese eben als destination eingetragen wird in das CDR.

Ich habe zwar eine Funktion CDR() gefunden (erst ab Asterisk 1.2 ?) mit der man vielleicht die destination wieder korrekt überschreiben könnte!? Aber leider ist die Doku da ziemlich einsilbig:

http://www.voip-info.org/tiki-index.php?page=Functions

Spontan fällt mir nur ein, die tatsächlich angerufene Nummer anderweitig wegzuschreiben oder ins Userfield http://www.voip-info.org/wiki/view/Asterisk+cmd+SetCDRUserField . Aber ob dann die Auswertungssoftware die Du benutzt damit funktioniert? Oder hast da selbst was geschrieben?

Vielleicht fällt ja jemand anderem noch etwas zu dieser Problematik ein.

Gruß,
Tin
 
HRM - Blick da nicht so ganz durch - koenntest du mir nen Beispiel liefern? 1000 Dank im Vorfeld.

P.s.: Das Billing Tool ist selbst geschrieben, daher koennte man das ohne weiteres Anpassen.
 
Du mußt zunächst das Userfield enablen im source (Auskommentierung aufheben), suche nach cdr_csv.c , normalerweise in /usr/src/asterisk/cdr

In cdr_csv.c suchst Du nach der Zeile:
/* define CSV_LOGUSERFIELD 1 */

Entferne das "/*" am Anfang der Zeile und das "*/ am Ende, dann Asterisk neu kompilieren.

Die extensions.conf dann folgendermaßen ändern/erweitern (achte auch auf die geänderten Sprungadressen):

Code:
[Kunde1] 
exten => _0.,1,SetVar(ANSCHLUSS=${EXTEN:1})
exten => _0.,2,DBGet(ANZAHL=KundeEins/Value) 
exten => _0.,3,GotoIf($[${ANZAHL} > 0]?4:8) 
exten => _0.,4,SetVar(SCHALTER=1) 
exten => _0.,5,SetVar(ANZAHLNEU=$[${ANZAHL} - 1]) 
exten => _0.,6,DBPut(KundeEins/Value=${ANZAHLNEU}) 
exten => _0.,7,Dial(SIP//${EXTEN:1}@sip.mk-netzdienste.de,60) 
exten => _0.,8,SetVar(SCHALTER=0) 
exten => _0.,9,Playback(NoLineAvailable) 
exten => _0.,10,Congestion 
exten => _0.,102,Busy 
 

exten => h,1,SetCDRUserfield(${ANSCHLUSS})
exten => h,2,GotoIf($[${SCHALTER} = 1]?3:7) 
exten => h,3,DBGet(ANZAHL=KundeEins/Value) 
exten => h,4,SetVar(ANZAHLNEU=$[${ANZAHL} + 1]) 
exten => h,5,DBPut(KundeEins/Value=${ANZAHLNEU}) 
exten => h,6,SetVar(SCHALTER=0) 
exten => h,7,Hangup

Habe das Ganze nicht getestet - also laß mal hören, ob es funktioniert - in der CSV Datei sollte dann ein weiteres Feld mit der gewählten Nummer auftauchen.

Gruß,
Tin
 
Oops, sorry, hatte sich ein kleiner Fehler eingeschlichen, es muß natürlich:

exten => h,1,SetCDRUserfield(${ANSCHLUSS})

heißen, nicht

exten => h,1,SetCDRUserfield(ANSCHLUSS)

Habe es auch in meinem vorherigen Beitrag geändert.
 
Super! Funktioniert! Nummer wird angehaengt! Vielen Dank! ;-)
 
Moin Moin,

ich hoffe ich kann diesen Thread wiederbeleben da er ja schon ziemlich alt ist.
Folgendes Problem:

Wird eine Rufnummer X angerufen so sollen 3 Telefone gleichzeitig klingeln. Nun ist eins der Telefone im Gespräch und ein weiterer Anruf geht ein sodass nun zwei von drei Telefone klingelt. Nun ist auch das zweite von drei Telefone besetzt und wenn ein dritte Anruf rein kommt klingelt natürlich das dritte Telefon.

Nun würde ich es gerne so einrichten, dass wenn zwei Telefone (egal welche) mit einem Anruf belegt sind, ein dritter Anruf abgewiesen werden soll bzw. ein Besetztton hört. Das dritte Telefon soll erst gar nicht klingeln wenn beide Telefone mit einem Anruf belegt sind.


Nun bin ich auf diesen wunderbaren Thread gestoßen und habe versucht dies in meiner Anlage umzusetzen wobei das Limit bei max. zwei "Kanälen" liegt. Natürlich weicht meine Asterisk und Debian Version mit der obigen extrem ab, nichts desto trotz sollte das Ergebnis mit kleinen Anpassungen umsetzbar sein.

Ich nutze Asterisk 16.3.0 (und höher)
Auf: Debian 9.12 (Stretch) (und höher)

Hier die Quellen die mir etwas geholfen haben zu verstehen: AsteriskDocs, Voip-Info, Voip-Info/functions

Nun zur Praxis:

Ich habe die Datenbank in der CLI angelegt -> debian*CLI>: database put ContextX Value 2

So sieht nun mein Context in der extensions.conf aus:

Code:
[eingehend]

exten => _X.,1,NoOp(Anruf fuer Gruppe Zentrale)
same => n,Set(ANZAHL=${DB(ContextX/Value)})
same => n,GotoIf($[${ANZAHL} > 0]?5:9)
same => n,Set(SCHALTER=1)
same => n,Set(ANZAHLNEU=$[${ANZAHL} - 1])
same => n,Set(DB(ContextX/Value)=${ANZAHLNEU})
same => n,Set(CALLERID(num)=0${CALLERID(num)})    
same => n,Verbose(Eingehender Anruf von Rufnummer ${CALLERID(num)}.)
same => n,Dial(SIP/50&SIP/60&SIP/70,20)
same => n,Set(SCHALTER=0)
same => n,Playback(busy-signal)
same => n,Congestion
same => 102,Busy

exten => h,1,GotoIf($[${SCHALTER} = 1]?4:8)
exten => h,2,Set(ANZAHL=${DB(ContextX/Value)})
exten => h,3,Set(ANZAHLNEU=$[${ANZAHL} + 1])
exten => h,4,Set(DB(ContextX/Value)=${ANZAHLNEU})
exten => h,5,Set(SCHALTER=0)
exten => h,6,Hangup

Nun gibt die CLI foglendes aus:
Asterisk_CLI.jpg
[Edit Novize: Riesenbild gemäß der Forumsregeln auf Vorschau verkleinert]

Bei jedem laufenden Anruf wird die Value um 1 reduziert aber nach dem Hangup nicht wieder eins hochgezählt.
Außerdem wirft Asterisk einen Syntax-Error wegen dem '=' zeichen.

Ich hoffe genügend Infos mitgeteilt zu haben und bin über jeglichen Lösungsvorschlag sehr dankbar!
 
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.