Anrufverdrängung – Notruffunktion

JanNiklas

Neuer User
Mitglied seit
15 Apr 2008
Beiträge
11
Punkte für Reaktionen
0
Punkte
1
Hallo zusammen,

für ein Simulationslabor ich bin auf der Suche nach einer Lösung, um laufende Anrufe durch Anrufe mit höherer Priorität (z.B. gespielte Notrufe) verdrängen zu können. Es sind ein Asterisk-Server und etwa 20x Snom 300 und 2x Snom 320 vorhanden.

Zum Dialplan:
Es gibt einen "notruf"-Context, in dem gewisse SIP-Header gesetzt werden (eigener Klingelton für Snoms, automatische Anrufannahme nach 5 Sekunden und "Notruf" als Caller-Name). Das funktioniert auch alles. Lediglich wenn die Gegenstelle besetzt ist, wird der Anruf auch als besetzt abgewiesen. Dies soll im Notruf-Context nicht passieren und ein laufendes Gespräch (nur) zu der gewählten Gegenstelle beendet und das Notrufgespräch aufgebaut werden.

Gibt es in Asterisk eine Funktion zur Anrufpriorisierung bzw. -verdrängung? Da man bei den Suchbegriffen "Asterisk Anrufpriorisierung" nur mit Ergebnissen zu Extensions-Prioritäten überschüttet wird, beschleicht mich das ungute Gefühl, dass es eine solche Funktionalität wohl nicht gibt …

Meine alternative Herangehensweise sieht vor, den Status der angerufenen Gegenstelle zu überprüfen, bei einem laufenden Gespräch dieses über ein Skript zu beenden und das Notrufgespräch zu verbinden.

Das Auflegen eines laufenden Gesprächs funktioniert über folgendes Skript ganz gut:
Code:
NUMBER=$1
CHANNEL=$(/usr/sbin/asterisk -rx "core show channels concise" | grep "SIP/$NUMBER-" | cut -d'!' -f1)
if [ -n "$CHANNEL" ]
then
    /usr/sbin/asterisk -rx "channel request hangup $CHANNEL"
fi

Wie bekomme ich aber im Dialplan den Status der angerufenen Endstelle heraus und beende das Gespräch vor dem neuen Verbindungsaufbau? Dazu benötige ich aktuell auch die Identität, mit der die Gegenstelle eingeloggt ist.
Für Hinweise wäre ich sehr dankbar!

Anmerkung: Es handelt sich bei den angesprochenen Notrufen nur um gespielte Notrufe im Rahmen eines Seminars!

LG
JanNiklas

EDIT: Code in Code-Tags gesetzt
 
Zuletzt bearbeitet:
Moin

Richtig suchen...
asterisk+emergency+priority
...zum Beispiel.

PS: Code in Code-Tags und bitte keine "linken" Hochkommata verwenden, die werden leicht übersehen.
Code:
CHANNEL=$(/usr/sbin/asterisk -x "core show channels concise" | grep "SIP/$NUMBER-" | cut -d'!' -f1)
...so ists auf jeden Fall lesbarer.
 
Hallo,

danke für die schnelle Antwort. Ich habe die Code-Tags oben ergänzt. In der Editier-Oberfläche hatte ich erst keine Code-Funktion gefunden und das war mein erster Beitrag seit der Designumstellung …

Eine solche Suchanfrage habe ich natürlich auch schon probiert. Man findet zumindest mal etwas in der Richtung. Allerdings wird dort nur nach freien (Amts-/SIP-/Zap-)Leitungen gesucht und solche frei gemacht. Ich benötige eine rein interne Anrufverdrängung. Von den Telefonen kann nicht raustelefoniert werden.

In dem verlinkten Beitrag wird ChanIsAvail verwendet, um das Freisein einer Leitung festzustellen. In der Dokumentation dazu wird aber auch darauf hingewiesen, dass dies nicht für Gegenstellen gilt:
ChanIsAvail is not a solution to tell you conclusively whether the channel is busy or not, it is primarily to tell you whether it would be possible to send a call there.
bzw.
Chanisavail is not intended to detect if a phone is in use or not at all, it's only intended to check if asterisk could send the call there.

Gibt es eine andere Möglichkeit, um herauszufinden, ob die interne Gegenstelle besetzt ist und wie der aktive Channel heißt? Nur dann kann ich ihn auch über das Skript beenden. Das Problem dabei ist, dass ich im Dialplan an der erforderlichen Stelle nicht sagen kann, an wen das Notrufgespräch geht. Das passiert erst nach einem GoTo in einem anderen Context.
 
Laufende Verbindungen kannst du mit...
Code:
ACTIVE=$(asterisk -x 'sip show inuse' | grep "[1][/]" | grep -o -E "^[a-zA-Z0-9]{1,255}[ ]")
ACTIVE=$(echo -ne ${ACTIVE})
echo ${ACTIVE}
...rauskriegen.

Dann alle beenden, ausser der die das Beenden ausführt.
Also vor dem Hangup() auf CALLERID(num) prüfen und wenn nicht dann beenden.

Das kann durchaus in deinem Skript passieren.
Also ändere/erweitere es.
1. Skriptaufruf nur mit ${CALLERID(num)}
2. Prüfung auf active Calls (inuse)
3. Beenden aller Calls (for;do;done), ausser ${CALLERID(num)}
 
Zuletzt bearbeitet:
Da ich die Vorgehensweisen des neuen Forum-Betreibers nicht gut heiße, stehen meine Beiträge hier nicht weiter zur Verfügung.
 
Zuletzt bearbeitet von einem Moderator:
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.