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

Sprachkanäle beschränken

Dieses Thema im Forum "Asterisk Allgemein" wurde erstellt von baschdieh, 12 Okt. 2005.

  1. baschdieh

    baschdieh Mitglied

    Registriert seit:
    15 Sep. 2005
    Beiträge:
    416
    Zustimmungen:
    0
    Punkte für Erfolge:
    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.
     
  2. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
  3. baschdieh

    baschdieh Mitglied

    Registriert seit:
    15 Sep. 2005
    Beiträge:
    416
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  4. TinTin

    TinTin Aktives Mitglied

    Registriert seit:
    6 Mai 2004
    Beiträge:
    1,864
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  5. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    Das geht natürlich auch einfach auf der CLI :wink:
     
  6. baschdieh

    baschdieh Mitglied

    Registriert seit:
    15 Sep. 2005
    Beiträge:
    416
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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! :)
     
  7. TinTin

    TinTin Aktives Mitglied

    Registriert seit:
    6 Mai 2004
    Beiträge:
    1,864
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  8. baschdieh

    baschdieh Mitglied

    Registriert seit:
    15 Sep. 2005
    Beiträge:
    416
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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".
     
  9. baschdieh

    baschdieh Mitglied

    Registriert seit:
    15 Sep. 2005
    Beiträge:
    416
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Okay - alles klar - habs gefunden. Problem liegt wohl am doppel Slash ;-) Sorry und danke!
     
  10. TinTin

    TinTin Aktives Mitglied

    Registriert seit:
    6 Mai 2004
    Beiträge:
    1,864
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  11. baschdieh

    baschdieh Mitglied

    Registriert seit:
    15 Sep. 2005
    Beiträge:
    416
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  12. TinTin

    TinTin Aktives Mitglied

    Registriert seit:
    6 Mai 2004
    Beiträge:
    1,864
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  13. baschdieh

    baschdieh Mitglied

    Registriert seit:
    15 Sep. 2005
    Beiträge:
    416
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  14. TinTin

    TinTin Aktives Mitglied

    Registriert seit:
    6 Mai 2004
    Beiträge:
    1,864
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  15. TinTin

    TinTin Aktives Mitglied

    Registriert seit:
    6 Mai 2004
    Beiträge:
    1,864
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  16. baschdieh

    baschdieh Mitglied

    Registriert seit:
    15 Sep. 2005
    Beiträge:
    416
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Super! Funktioniert! Nummer wird angehaengt! Vielen Dank! ;-)