[Gelöst] Mehrere interne Telefone anrufen

samtux

Neuer User
Mitglied seit
13 Sep 2014
Beiträge
23
Punkte für Reaktionen
0
Punkte
1
Hallo!
Ich habe bei mir auf einem Ubuntu einen Asterisk aufgesetzt. Über diesen Asterisk telefonieren nur interne Telefone im LAN. Es gibt keine Schnittstelle ins Festnetz.
Das 2 Telefone untereinander telefonieren können, funktioniert auch schon.

Ich möchte jetzt aber, dass 1 Telefon (was immer das selbe ist) mehrere andere Telefone anrufen kann.
Also eigentlich eine Konferenz jedoch mit dem Unterschied, dass alles intern ist, keine Sicherheitsbestätigung per PIN erwünscht ist und das 1 Telefon den Anruf absetzt und die gewählten Telefone klingeln.

Eine Idee von mir, von der ich nicht weiß, ob und wie sie umsetzbar ist, wäre:
Über eine Weboberfläche (die eh schon für andere Aufgaben existiert) wird ausgewählt, welche Telefone angerufen werden sollen. Auf dem Server mit Asterisk werden dann Dateien (wie Call Files) angelegt und somit eine neue Telefonnummer erstellt.
Das Telefon, von dem die Konferenz ausgeht, ruft diese erstellte Nummer an und die anderen Telefone klingeln.

Ist sowas möglich? Wenn ja, wie? Bitte beachtet, dass ich absoluter Asterisk-Neuling bin.
Schonmal vielen Dank für eure Antworten.

samtux
 
Zuletzt bearbeitet:
Na da hast Du Dir gleich mal was Interessantes vorgenommen ;-)

Für die Konferenz bietet sich ConfBridge an. Der Ablauf, den Du beschreibst, ist auch soweit ganz sinnvoll, es gibt verschiedene Wege um das umzusetzen. Einer davon, was Deiner Vorgehensweise nahe kommt, wäre ein Realtime Dialplan, davon würde ich allerdings absehen. Ich würde die anzurufende Nummer, um die Konferenz zu starten, im Dialplan fest einbauen. Dort würde ich ein externes Skript aufrufen, das für die vorher im Web-Interface ausgewählten Ziele die notwendigen Call-Files erzeugt, und anschließend die Konferenz starten.
 
Erstmal Danke für deine Antwort. Ich hatte leider in der letzten Zeit nicht so viel Zeit...

Habe ich es richtig verstanden, dass es folgende Lösung wäre:
- Es gibt eine Konferenz, die fest angelegt ist.
- Per Skript werden dieser Konferenz die gewünschten Telefone hinzugefügt
- Das "Haupttelefon" ruft die Nummer der Konferenz an und tritt dieser damit bei
- Alle telefonieren miteinander

Ist es dann auch so, dass die Telefone erst klingeln, wenn das Haupttelefon beigetreten ist?
Könnt ihr mir vlt. noch ein paar mehr Anstöße zur Umsetzung geben, da es meine erste Arbeit mit Asterisk ist?

samtux
 
Als Beispiel sagen wir, die Nummer 123 wäre die Einwahlnummer. Du legst also vorher über Dein GUI die gewünschten Teilnehmer fest und speicherst diese Auswahl in einer Datenbank. Ruft nun jemand die 123 an, wird (zB. per TrySystem) ein externes Skript ausgeführt, dass die Teilnehmer aus der Datenbank abfrägt und entsprechend Call-Files erzeugt. Nach dem TrySystem gehts für den Anrufer direkt in die ConfBridge. So jedenfalls würde ich es machen.

Das schöne an ConfBridge ist, dass man Konferenzen nicht zwangsläufig vorher konfiguriert haben muss, sondern on the fly erzeugen kann. Dafür gilt dann das Profil default_bridge. Statt conf1 kannst Du nehmen was Du magst, zB. die CallerId des Auslösers, und damit das gleiche mehrfach parallel laufen lassen.

Weil heute der schönste Montag dieser Woche, ist kriegst Du etwas Code mitgeliefert ;-)
Code:
[Auslöser]
exten => 123,1,Ringing()
 same => n,TrySystem(call-files-erzeugen.php)
 same => n,ConfBridge(conf1,,admin)
 same => n,HangUp()

[Teilnehmer]
exten => s,1,ConfBridge(conf1)
 same => n,HangUp()

Die Call-Files beinhalten als Channel den jeweiligen Teilnehmer. Entweder kannst Du ConfBridge dann gleich als App+Data übergeben, oder Du machst einen kleinen Dialplan, wo es für die Teilnehmer in die Konferenz geht, und rufst diesen als Context+Exten+Priority auf.

Code:
Channel: SIP/1001
Context: Teilnehmer
Extension: s
Priority: 1

oder ohne [Teilnehmer] direkt

Code:
Channel: SIP/1001
Application: ConfBridge
Data: conf1
 
Danke für den Code!
Ich habe das jetzt gemacht, jedoch funktioniert es noch nicht...

extensions.conf:
Code:
[globals]

[general]


[internal]
exten => _XXXX,1,Dial(SIP/${EXTEN})


[phones]
include => internal


; 1234 ist Einwählnummer
[Ausloeser]
exten => 1234,1,Ringing()
 same => n,TrySystem(/var/www/html/sprechserver/call-files-erzeugen.py)
 same => n,ConfBridge(conf1,,admin)
 same => n,HangUp()


[Teilnehmer]
exten => s,1,ConfBridge(conf1)
 same => n,HangUp()

Über die Website erzeuge ich aus den gewählten Checkboxen eine Datei, in der die Telefonnummern mit Komma getrennt sind.

call-files-erzeugen.py:
Code:
#!/usr/bin/python# -*- coding: utf-8 -*-


import os


f = open("/tmp/sprechanlageToCall.csv","r")
csv = f.read()
f.close()


csv = csv.split(",") #in einzelne Nummern trennen


for nummer in csv:
    #Für jede Nummer Call-File erzeugen
    content = '''Channel: SIP/'''+nummer+'''
Context: Teilnehmer
Extension: s
Priority: 1'''
    f = open("/tmp/Conf-"+nummer+".call","w")
    f.write(content)
    f.close()
    os.system("mv /tmp/Conf-"+nummer+".call /var/spool/asterisk/outgoing/Conf-"+nummer+".call")


print "....OK...."

Die Telefone können einzeln untereinander telefonieren.
Wenn jetzt in der CSV 0002,0003 steht und ich vom Telefon 1000 die Nummer 1234 anrufe, erhält die 1000 den Fehler "503 / Service Unavailable".
Die 0002 und 0003 klingeln nicht.

asterisk -vvvr gibt folgendes aus:
Code:
  == Using SIP VIDEO CoS mark 6  == Using SIP RTP CoS mark 5
    -- Executing [1234@phones:1] Dial("SIP/1000-0000000c", "SIP/1234") in new stack
[Jun  8 16:24:46] WARNING[3367][C-00000009]: chan_sip.c:6160 create_addr: Purely numeric hostname (1234), and not a peer--rejecting!
[Jun  8 16:24:46] WARNING[3367][C-00000009]: app_dial.c:2437 dial_exec_full: Unable to create channel of type 'SIP' (cause 20 - Subscriber absent)
  == Everyone is busy/congested at this time (1:0/0/1)
    -- Auto fallthrough, channel 'SIP/1000-0000000c' status is 'CHANUNAVAIL'


ls -l call-files-erzeugen.py:
Code:
-rwxrwxr-x 1 administrator administrator 774 Jun  8 16:09 call-files-erzeugen.py

Was habe ich falsch gemacht?
 
Executing [1234@phones:1] Dial("SIP/1000-0000000c", "SIP/1234") in new stack

Du hast Ausloeser nicht im Context des Telefons eingebunden, deshalb wird die passende exten in [internal] ausgeführt.

In [phones] muss gleich als erste Zeile, also vor dem include=>internal, ein include=>Ausloeser rein.
 
Ok. Jetzt klingeln alle Telefone, die ich ausgewählt habe. Allerdings wird das Gespräch bei dem Telefon, das die 1234 anruft, sofort beendet. Es nützt auch nichts, wenn ich die Nummer des Telefons, das die 1234 anruft, mit in die Liste für die Konferenz schreibe...
 
Was sagt das CLI Log dazu? Hast Du einen User namens "admin" in der confbridge.conf angelegt?
 
Ohne CLI Log wirds wohl schwierig... :rolleyes:
Code:
[Jun 13 16:12:54] NOTICE[1359]: chan_sip.c:27783 handle_request_subscribe: Received SIP subscribe for peer without mailbox: 1000  == Using SIP VIDEO CoS mark 6
  == Using SIP RTP CoS mark 5
  == Using SIP VIDEO CoS mark 6
  == Using SIP RTP CoS mark 5
  == Spawn extension (phones, 0002, 1) exited non-zero on 'SIP/1000-00000000'
  == Using SIP VIDEO CoS mark 6
  == Using SIP RTP CoS mark 5
  == Using SIP VIDEO CoS mark 6
  == Using SIP RTP CoS mark 5
  == Spawn extension (phones, 1234, 3) exited non-zero on 'SIP/1000-00000002'
[Jun 13 16:14:07] NOTICE[2436]: pbx_spool.c:402 attempt_thread: Call completed to SIP/0002

An der confbridge.conf habe ich nichts geändert... Der admin wäre wohl der Nutzer, der die Konferenz startet und müsste noch angelegt werden?:confused:
 
OK, da sieht man nur leider gar nichts von dem Rufaufbau. Hast Du in der logger.conf Verbose und Debug für die Console an?

admin muss erst als User angelegt werden, sonst gibts den ja nicht. Zum Testen kannst Du auch einfach mal das ,,admin weg lassen, dann kommt der Verursacher auch als normaler Nutzer in die Konferenz.
 
Ok. Wenn ich den admin raus nehme geht es.

Was bewirkt der Nutzer admin bzw. was hat dieser für einen Einfluss auf die Konferenz? Würde der bewirken, dass die gesamte Konferenz beendet wird, wenn er auflegt? Das wäre wichtig...
 
Soweit ich die Doku verstehe kann man das erreichen, indem im default_user endmarked=yes gesetzt ist und der admin marked=yes hat. Dazu ist es aber eben nötig, einen eigenen Benutzer mit dieser Einstellung anzulegen, der kann auch anders als admin heißen, der Name in der confbridge.conf muss halt mit dem im Dialplan übereinstimmen. Was genau das admin=yes in der confbridge.conf eigentlich bewirkt weiß ich leider auch nicht, ich nutze ConfBridge selbst nicht.
 
Ok. Ich habe den Nutzer angelegt und es funktioniert auch. Allerdings wird jetzt noch die Ansage "The leader has leaved the conference. You'll be now kicked..." abgespielt. Wie bekommt man die noch weg?
 
Das kann ich Dir leider nicht beantworten. Die Brechstangenmethode wäre, nachschauen welche Sound-Dateien das sind und diese durch Dateien mit 1 Sekunde Stille ersetzen :keule:
 
Ich habe jetzt alles hinbekommen. Vielen Dank für deine Hilfe!

Zwechs der abgespielten Ansagen (sollte jemand das gleiche vorhaben): Die Ansagen werden in der confbridge.conf festgelegt. Bei mir waren standardmäßig alle Ansagen deaktiviert und wurden trotzdem angesagt (aber nur einige).
Ich habe also bei den nicht gewünschten eine .wav mit Stille in /usr/share/asterisk/sound gespeichert und als stille in der .conf angegeben.
 
Immer gerne. Dann ändere das Titel-Prefix bitte noch in "gelöst", dazu den 1. Beitrag bearbeiten und auf Erweitert.
 
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.