Telefon-Konferenzschaltungen mit Asterisk und Confbridge

25. Juni 2021 (ergänzt am 26. und 27. Juni 2021)

Mit der Telefon-Software Asterisk lassen sich auch Telefon-Konferenzen schalten. Mehrere Teilnehmer können sich dann in Konferenzräumen treffen und unterhalten. In meinem Beispiel habe ich die Teilnehmerzahl auf 10 begrenzt, obwohl noch mehr Teilnehmer möglich sind. Für die Einrichtung  ist die confbridge.inf zu konfigurieren und die extensions.conf zu ergänzen. Weiterhin sind noch zwei txt-Dateien anzulegen. Und schon ist Asterisk für Konferenzen fähig. Das erste Beispiel beschränkt sich auf die  Einrichtung eines Konferenzraums. Das zweite Bespiel zeigt die Erweiterung für 5 Konferenzräume.

Getestet auf: Raspberry Pi 3 B+, Asterisk 16.2.1, Raspbian Buster 2020-02-13

Meine Konfiguration: Sie ist eine Adaption von http://voip.nomblot.org/webconf. Meine Änderungen sind wie folgt: Die Sprache wurde von Französisch auf das vorinstallierte amerikanische Englisch umgestellt.  Ich gehe davon aus, dass alle meine Nutzer Englisch verstehen. Deshalb habe ich die deutsche Sprache nicht installiert. Die maximale Teilnehmerzahl begrenzte ich auf 10, damit die CPU meines Raspberry Pi 3 B+ keinesfalls überlastest werden kann. Bei 10 Teilnehmern wäre die CPU zu etwa 50% ausgelastet. Die Stummschaltung wurde deaktiviert, damit sich immer alle User und alle Admins hören können. Die Musik wurde abgeschaltet. Die Konfiguration wurde in einem zweiten Schritt auf 5 unabhängige Konferenzräume erweitert.

Bedienung: Leider geht es nicht mit den alten Wählscheibentelefonen. Die Telefone der Konferenzteilnehmer müssen das Mehrfrequenzwahlverfahren beherrschen.

Eine Konferenz wird von einem Admin geleitet. Der Admin startet und beendet die Konferenz. Wenn alle Admins die Konferenz verlassen haben, fliegen alle anderen raus. Die Konferenz kann erst starten, wenn der Admin oder einer der Admins anwesend ist.  Der Admin ruft die 8201 an und bestimmt nach der Stimmansage die dreistellige Pin-Nummer für den Admin. Dann ruft der Admin die 8101 an und bestimmt nach dem gleichen Schema die Pin-Nummer für die übrigen Teilnehmer (User). Mit den Pins können nur erwünschte Teilnehmer den Konferenzraum betreten.

Der Admin ruft dann zu einer vereinbarten Zeit die 8001 an und gibt seine Pin-Nummer ein. Es können sich auch mehrere Admins mit der gleichen Pin einloggen, was die einfachste Lösung wäre. Danach oder oder davor können sich die User über dieselbe 8001 mit ihrer Pin-Nummer anmelden. Die Pin-Nummern bleiben für weitere Konferenzen bestehen, wenn sie nicht geändert werden.

Die maximale Teilnehmerzahl wurde vorerst auf 10 begrenzt, da bei 7 Teilnehmern die CPU-Auslastung des Raspberry Pi 3 B+ bei etwa 42% liegt (gemessen mit dem Linux-Befehl „top“). Kein G.722-Audio-Codec verwenden, da sonst Gespräche bei meinem Aufbau nach 30 Sekunden abbrechen.

Folgende ursprüngliche Asterisk-Konfiguration wurde mit Confbridge erweitert: https://elektronikbasteln.pl7.de/eine-einfache-asterisk-konfiguration-fuer-einen-sip-server-als-telefonanlage

confbridge.inf:

; 24. Juni 2021 - janson@janson-soft.de
; Vollstaendige Confbridge.conf - muss nicht veraendert werden
; Sprache der Ansagen: US-Englisch
; Entsprechende Macros und Extensions befinden sich in der extensions.conf

; Adaptiert von:
; https://wiki.asterisk.org/wiki/display/AST/ConfBridge+Configuration
; https://sites.google.com/a/nomblot.org/voip/webconf
; http://voip.nomblot.org/webconf
;
; Konferenzschaltungen mit bis zu 10 Teilnehmern möglich. 
; Leider geht es nicht mit den alten Wählscheibentelefonen.
; Die Telefone müssen das Mehrfrequenzwahlverfahren beherrschen.
; Eine Konferenz wird von einem Admin geleitet. Der Admin startet
; und beendet die Konferenz.
;
; Der Admin ruft die 8201 an und bestimmt nach der Stimmansage die dreistellige Pin-Nummer für den Admin.
; Dann ruft der Admin die 8101 an und bestimmt nach dem gleichen Schema 
; die Pin-Nummer für die übrigen Teilnehmer (User).
;
; Der Admin ruft dann zu einer vereinbarten Zeit die 8001 an und gibt seine Pin-Nummer ein.
; Es koennen sich auch mehrere Admins mit der gleichen Pin einloggen, was die einfachste Loesung waere.
; Danach oder oder davor können sich die User über dieselbe 8001 mit ihrer Pin-Nummer anmelden.
; Die maximale Teilnehmerzahl wurde vorerst auf 10 begrenzt,
; da bei 7 Teilnehmern die CPU-Auslastung des Raspberry Pi 3 B+ bei 42% liegt.
; Kein G.722-Audio-Codec verwenden, da sonst Gespräche nach 30 Sekunden abbrechen.
;
; Getestet mit:
; Raspberry Pi 3 B+
; Asterisk 16.2.1
; Raspbian Buster 2020-02-13


[general]

[default_bridge]
type=bridge    
record_conference=no
max_members=10


[guest_user]
type=user
admin=no
marked=no
startmuted=no ; war auf yes, Stummschaltung ist verwirrend
quiet=no
announce_user_count=yes
announce_user_count_all=yes
announce_only_user=yes
announce_join_leave=no ; wenn auf yes, dann erfolgt Aufforderung seinen Namen zu sagen
wait_marked=yes
end_marked=yes
denoise=yes
jitterbuffer=yes
dtmf_passthrough=no
music_on_hold_when_empty=yes ; auf no gestellt, da mich die Musik stoerte

[admin_user]
type=user
admin=yes
marked=yes
startmuted=no
quiet=no
announce_user_count=yes
announce_user_count_all=yes
announce_only_user=yes
announce_join_leave=no
wait_marked=no
end_marked=no
denoise=yes
jitterbuffer=yes
;pin=1234
dtmf_passthrough=no
music_on_hold_when_empty=yes ; auf no gestellt, Musik nervte mich.



[guest_menu]
type=menu
*=playback_continue(silent-conf-menu)
*=increase_rx_volume
*2=decrease_rx_volume

[admin_menu]
type=menu  
*=playback_and_continue(press&digits/1&confbridge-dec-list-vol-out&press&digits/2&confbridge-inc-list-vol-out&press&digits/3&confbridge-mute-out&confbridge-menu-exit-in&press&digits/0)
*1=decrease_listening_volume
1=decrease_listening_volume  
*2=increase_listening_volume
2=increase_listening_volume  
*3=toggle_mute
3=toggle_mute  
*0=no_op

extensions.conf: Bitte die Kommentare lesen. Nachfolgend steht nur der  Anfang der extension.conf mit den notwendigen Ergänzungen. Danach sind die individuellen Wahlregeln einzutragen.

;
; extensions.conf vom 22.6.2021 mit Konferenzschaltung
;
;
[general]
autofallthrough=no
static=yes
writeprotect=no

[globals]
CONFDIR=>/var/spool/asterisk/confbridge ; legt den Pfad für die Pin-Nummern-Dateien fest.
; es sind zusaetzlich von Hand in Linux zwei txt-Dateien je Konferenzraum anzulegen.
; Fuer den Konferenzraum 1 lauten sie:
; /var/spool/asterisk/confbridge/conf-1-admin.txt fuer die Pin-Nummer der Admins
; /var/spool/asterisk/confbridge/conf-1-user.txt fuer die Pin-Nummer der User
; Es sind fuer diese Dateien Berechtigungen für Lesen und Schreiben zu setzen.
; In diesen beiden Dateien werden die PIN-Nummern für user und admin abgespeichert.

[macro-conference_config_file_join]
exten => s,1,NoOp("Start config")
same => n,Set(CONFNUM=${ARG1})
same => n,Set(CONFPINUSER=${FILTER(0-9,${FILE(${CONFDIR}/conf-${CONFNUM}-user.txt)})})
same => n,Set(CONFPINADMIN=${FILTER(0-9,${FILE(${CONFDIR}/conf-${CONFNUM}-admin.txt)})})
;
same => n,Read(CONFPIN,conf-getpin,,,3,5)
same => n,Set(CONFPIN=${FILTER(0-9,${CONFPIN})})
; load config values
; display values for debug
same => n,NoOp(${CONFNUM})
same => n,NoOp(${CONFPINADMIN})
same => n,NoOp(${CONFPINUSER})
;
; detect user/admin mode
same => n,Set(CONF_USER=${IF($["${CONFPIN}" = "${CONFPINUSER}"]?guest_user:${CONF_USER})})
same => n,Set(CONF_USER=${IF($["${CONFPIN}" = "${CONFPINADMIN}"]?admin_user:${CONF_USER})})
same => n,Set(MENU=${IF($["${CONF_USER}" = "admin_user"]?channel-secure:conf-placeintoconf)})
;
same => n,NoOp(${CONF_USER})
same => n,GotoIf($["${CONF_USER}" = ""]?pinerror)
same => n,Playback(${MENU})

; Tell the user which conference this is
;same => n,Playback(conf-youareinconfnum)  
;same => n,SayDigits(${CONFNUM})

same => n,ConfBridge(${CONFNUM},default_bridge,${CONF_USER})
;
same => n(hangup),NoOp()
same => n,Hangup()
;
same => n(pinerror),NoOp()
same => n,Playback(conf-invalidpin);
same => n,Hangup()



[macro-conference_config_file_set]
exten => s,1,NoOp("set config")
same => n,Set(CONFNUM=${ARG1})
same => n,Set(TYPE=${ARG2})
;same => n,Read(CONFNUM,conf-getconfno,,,3,5)
;same => n,Set(CONFNUM=${FILTER(0-9,${CONFNUM})})
same => n,SayDigits(${CONFNUM})
same => n,Read(CONFPIN,conf-getpin,,,3,5)
same => n,Set(CONFPIN=${FILTER(0-9,${CONFPIN})})
same => n,NoOp(tmp/${TYPE}-${CONFNUM}.txt)
same => n,Set(FILE(${CONFDIR}/conf-${CONFNUM}-${TYPE}.txt)=${CONFPIN})
same => n,Set(CONFPINUSER=${FILTER(0-9,${FILE(${CONFDIR}/conf-${CONFNUM}-${TYPE}.txt)})})
same => n,SayDigits(${CONFPINUSER})
same => n,Hangup()


[telefone] 

; Siehe entsprechenden Eintrag in der sip.conf, normalerweise steht statt
; telefone oft default. Hier stehen nachfolgend die Extensions der Telefonnummern.

exten => 8001,1,Macro(conference_config_file_join,1)      ; join conf num 1 as user or admin depending on PIN code    
exten => 8101,1,Macro(conference_config_file_set,1,user)  ; setup user  PIN code for conf num 1  
exten => 8201,1,Macro(conference_config_file_set,1,admin) ; setup admin PIN code for conf num 1 

; hier gehts dann weiter mit den anderen Extensions und all dem anderen Eintraegen
; für die Wahlregeln

Zwei Text-Dateien händisch anlegen: Für die Speicherung der User- und Admin-Pin-Nummern sind noch zwei Text-Dateien je Konferenzraum anzulegen und mit Zugriffsrechten zu versehen. Alles geschieht als „root“ angemeldet.

Für das Erzeugen neuer Dateien gehen wir auf der graphischen Benutzeroberfläche von Raspbian in den entsprechenden Ordner, dann rechte Maustaste, ein Popup-Fenster öffnet sich, „New File“ auswählen, Dateinamen vergeben.

/var/spool/asterisk/confbridge/conf-1-admin.txt

/var/spool/asterisk/confbridge/conf-1-user.txt

Die Erzeugung und Rechtevergabe der beiden Text-Dateien kann unter Raspbian auf der grafischen Benutzerebene erfolgen.

Konferenzschaltung in der Asterisk-CLI:  Was ist im unteren Bild zu sehen? Der Teilnehmer mit der Nummer 1088 meldet sich mit der Pin-Nummer 456 als User im Konferenzraum 1 an.

Konferenzschaltung im CLI von Asterisk.

Erfahrungen in der Praxis:  Die  Konferenzschaltung wurden mit externen Telefonnummern erfolgreich getestet. Leider musste auf den G.722-Audio-Codec verzichtet werden, da mit ihm nach 30 Sekunden die Gespräche abbrachen. Der Codec g722 sollte deshalb in der Audio-Codec-Liste der sip.conf zuletzt stehen. Mit den Codecs alaw, ulaw und gsm gibt es keine Probleme. Ansonsten funktionierte alles einwandfrei.

Am einfachsten ist es, wenn sich alle Konferenzteilnehmer zu einem vereinbarten Zeitpunkt treffen und sich alle als Administratoren anmelden. Dazu wäre dann der Konferenzraum von jedem Teilnehmer mit 8001 zu betreten, Beginn der Ansage abwarten, 123# eingeben. Die nachfolgende Ansage informiert über die Anzahl der vorhandenen Teilnehmer. Ist man noch alleine, ist eine Warteschleifen-Musik zu hören, wenn diese in der Konfiguration aktiviert ist. Deshalb sind Telefone mit Freisprecheinrichtungen zu empfehlen.

Übrigens kommt man auch vom öffentlichen Telefonnetz über CallThrough in einen Konferenzraum. Dazu ist aus dem deutschen Fest- oder Mobilfunknetz die öffentliche Nummer des Asterisk-Servers zu wählen, Ansage abwarten, 8001# eingeben, nächste Ansage zur Aufforderung der Pin-Nummer abwarten, Pin-Nummer 123# eingeben. Und schon ist man drin. Nach dem gleichen Muster kommt man auch von den geschlossenen Netzen OpenSips, AntiSip, Sip2Sip, Iptel und so weiter mit CallThrough in einen Konferenzraum, wenn der Asterisk-Server diese Providerzugänge anbietet. Das heißt, Teilnehmer aus verschiedenen Netzen können sich in einem Konferenzraum unterhalten. Sie müssen noch nicht einmal einen Account des Asterisk-Servers besitzen.

Mein Asterisk-Server hat als öffentlichen Zugang eine Nummer von Sipgate Basic. Über diese einzige Nummer konnten drei verschiedene Teilnehmer gleichzeitig in den Konferenzraum gelangen. Die Nummer von Sipgate Basic war also dreifach belegt. Ob 4 oder noch mehr Belegungen klappen, konnte ich nicht testen. Zusätzlich zu den drei Teilnehmern über Sipgate habe ich noch 4 Haustelefone zugeschaltet, was insgesamt 7 Teilnehmer ergab und immer noch einwandfrei funktionierte.

Die CPU-Auslastung des Raspberry Pi 3 B+ beträgt pro Konferenz-Teilnehmer ungefähr 5%. Bei 7 Konferenzteilnehmern war die CPU zu etwa 35% ausgelastet. Die Sprachqualität war dabei immer noch einwandfrei. Zur Sicherheit habe ich die maximale Teilnehmerzahl auf 10 begrenzt, was in der Praxis kaum vorkommen wird. Ein Raspberry Pi 4 mit seiner leistungsfähigen CPU könnt wesentlich mehr Konferenzteilnehmer bedienen.

Eine Teilnahme mit dem Android-Softphone Sipnetic über öffentliches WLAN oder dem mobilen Datenfunk gelang ebenfalls. Damit wären Teilnahmen an Konferenzen möglich, wenn man sich gerade mitten in der Natur befindet. Sipnetic war so konfiguriert, dass nur der Audio-Codec „gsm“ erlaubt ist.  Der Asterisk-Server konnte diesen Codec selbst in der Konferenzschaltung erfolgreich transkodieren.

Gesprächsweiterleitungen funktionieren auch. Während eines Zweier-Gesprächs lässt sich der Gesprächspartner am anderen Ende der Leitung mit #8001 in den Konferenzraum schicken. Danach folgt die Aufforderung die Pin-Nummer einzugeben. Auf diese Weise lassen sich die Teilnehmer per Telefon in eine Konferenz einladen.

Mit der Einrichtung der Konferenzräume bietet mein kleiner Asterisk-SIP-Server einen Zusatznutzen, den kommerzielle Anbieter in der Regel nicht anbieten. Die Einrichtung mehrerer Konferenzräume ist geplant. Leider sind Wählscheibentelefone von diesen Dienst ausgeschlossen. Versuche mit DTMF-Generator-Apps die Pin-Nummer einzugeben, scheiterten.

Der Raspberry hat den Absturztest durch Ziehen des Netzsteckers bestanden, um einen Stromausfall zu simulieren. Nach der Stromunterbrechung fuhr der  Raspberry wieder selbständig hoch und Asterisk war ebenfalls wieder hochgefahren.

Erweiterung auf 5 oder noch mehr Konferenzräume: Dazu muss  die extensions.conf wie folgt mit weiteren Telefonnummern erweitert werden. Nachfolgend die Nummernvergabe für 5 Konferenzräume.

[telefone] ; Siehe entsprechenden Eintrag in der sip.conf

exten => 8001,1,Macro(conference_config_file_join,1)      ; join conf num 1 as user or admin depending on PIN code    
exten => 8101,1,Macro(conference_config_file_set,1,user)  ; setup user  PIN code for conf num 1  
exten => 8201,1,Macro(conference_config_file_set,1,admin) ; setup admin PIN code for conf num 1 

exten => 8002,1,Macro(conference_config_file_join,2)      ; join conf num 2 as user or admin depending on PIN code    
exten => 8102,1,Macro(conference_config_file_set,2,user)  ; setup user  PIN code for conf num 2  
exten => 8202,1,Macro(conference_config_file_set,2,admin) ; setup admin PIN code for conf num 2

exten => 8003,1,Macro(conference_config_file_join,3)      ; join conf num 3 as user or admin depending on PIN code    
exten => 8103,1,Macro(conference_config_file_set,3,user)  ; setup user  PIN code for conf num 3  
exten => 8203,1,Macro(conference_config_file_set,3,admin) ; setup admin PIN code for conf num 3 

exten => 8004,1,Macro(conference_config_file_join,4)      ; join conf num 4 as user or admin depending on PIN code    
exten => 8104,1,Macro(conference_config_file_set,4,user)  ; setup user  PIN code for conf num 4  
exten => 8204,1,Macro(conference_config_file_set,4,admin) ; setup admin PIN code for conf num 4

exten => 8005,1,Macro(conference_config_file_join,5)      ; join conf num 5 as user or admin depending on PIN code    
exten => 8105,1,Macro(conference_config_file_set,5,user)  ; setup user  PIN code for conf num 5  
exten => 8205,1,Macro(conference_config_file_set,5,admin) ; setup admin PIN code for conf num 5

Entsprechend müssen nach dem gleichen Muster weitere Text-Dateien für die Speicherung der Pin-Nummern angelegt werden:

Text-Dateien für die Hinterlegung der Pin-Nummern für 5 verschiedene Konferenzräume.

Für den Konferenzraum 5 z.B. wären die Dateien
conf-5-admin.txt und
conf-5-user.txt
im Pfad /var/spool/asterisk/confbridge anzulegen. Die confbridge.conf muss nicht verändert werden.

Nach diesem Schema lassen sich beliebig viele Konferenzräume anlegen, die auch Geheimnummern für vertrauliche  Treffen erhalten können.

Vorteile verschiedener Konferenzräume: Vereine können sich in solchen Konferenzräumen virtuell treffen. Für jeden Arbeitskreis wäre ein eigener Konferenzraum möglich.

Leider fehlt in bestimmten Fällen noch die Bildübertragung. Wenn diese notwendig ist, können parallel zur Telefonkoferenz dazu Messenger-Dienste wie Skype zum Einsatz kommen. Der eigene Bildschirm lässt sich mit Skype oder AnyDesk teilen. Die Telefonkonferenzschaltung sorgt unabhängig davon immer für eine stabile Audioübertragung, wobei die komfortablen Freisprecheinrichtungen der modernen Telefone zum Tragen kommen können.

Auf einem Raspberry Pi lässt sich ein kompletter Telefonserver betreiben, der seinen Teilnehmern über Landesgrenzen hinweg kostenloses Telefonieren von unterwegs oder daheim ermöglicht.
Asterisk-Telefonserver auf einem Raspberry Pi – Installation, Konfiguration, Programmierung, SIP, IAX2, AGI-Skripte, Sicherheit und Tipps zum praktischen Betrieb – 2.11.2022: Diese Seite richtet sich an jene, welche einen Asterisk-Telefon-Server auf einem Raspberry Pi betreiben möchten und später ein kleines Netzwerk aus Asterisk-Servern planen, um ein eigenständiges Telefonnetz aufzubauen. Los geht es mit der Installation von Raspbian und Asterisk auf einem Raspberry Pi und dann nach Lust und Laune immer tiefer in die Programmierung von Asterisk. Die Themen werden laufend erweitert.

Selbstverständlich muss es nicht unbedingt ein Raspberry Pi sein. Andere Linux-Rechner gehen auch. – weiter