Wir pumpen das VoIP GSM Gateway Yeastar TG100 zu einer TK-Anlage

Die überwiegende Mehrheit der vorgefertigten IP-PBX-Anlagen ist für Unternehmen mit zehn oder mehr Mitarbeitern konzipiert. Tatsächlich gibt es in Russland viele Unternehmen mit zwei bis fünf Mitarbeitern, und sie müssen auch irgendwie die Telefonkommunikation organisieren. Die Funktionalität von vorgefertigten IP-PBX-Anlagen ist für sie redundant und die Kosten zu hoch. Sie können Ihre eigene Telefonzentrale mit einem normalen Computer und Asterisk aufbauen. Sie können eine Verbindung zu einem VoIP-Dienstanbieter herstellen und den Dienst "Cloud PBX" verwenden. Und Sie können auch in die andere Richtung gehen: Nehmen Sie ein kostengünstiges Gerät mit bereits vorinstalliertem Asterisk wie das Yeastar TG100 und pumpen Sie dessen Funktionalität ein wenig auf. Für diejenigen, die nicht nach einfachen Wegen suchen, willkommen bei cat.



Yeastar TG100 ist ein VoIP-GSM-Gateway für eine SIM-Karte und wird in der Regel verwendet, um eine Mobilfunkleitung über das SIP-Protokoll mit einer IP-PBX zu verbinden. Wir werden versuchen, den Yeastar TG100 nicht mit der IP-PBX zu verwenden, sondern stattdessen. Warum haben wir das GSM-Gateway als Testperson ausgewählt? Es ist kein Geheimnis, dass viele Unternehmen zu Beginn ihrer Aktivitäten eine reguläre Handynummer verwenden, um mit der Welt zu kommunizieren. Während des Wachstumsprozesses steigt der Kommunikationsbedarf, aber ich möchte auch die alte Nummer beibehalten - in diesem Sinne sieht die Option, ein VoIP-GSM-Gateway zu verwenden, besser aus als Asterisk auf einem Computer oder einer virtuellen IP-PBX.

Warum genau Yeastar? Erstens sind dies unserer Meinung nach die hochwertigsten VoIP-GSM-Gateways auf unserem Markt. Zweitens bieten diese Gateways die Möglichkeit, auf den darauf installierten Asterisk zuzugreifen und die Konfigurationsdateien zu ändern (für die sich die Ingenieure ganz besonders bedanken sollten). Drittens behauptet der Hersteller selbst, dass Yeastar VoIP GSM-Gateways den „SIP-Server zur Registrierung von IP-Telefonen“ unterstützen, was für Endbenutzer, die glauben, das Gateway als vollwertige IP-PBX nutzen zu können, häufig irreführend ist. Dieser Artikel kann nur für solche Benutzer von Interesse sein.

Warum haben wir uns für den jüngsten Yeastar TG100 entschieden? Hier ist alles einfach - da es sich um eine automatische Telefonvermittlung für die Kleinsten handelt, haben wir das kostengünstigste Gateway ausgewählt. Falls gewünscht, können Sie anstelle des TG100 den TG200 (für zwei SIM-Karten), den TG400 (für vier) und sogar den TG800 (für acht) verwenden - die Einstellungen werden nicht grundlegend geändert.

Was wollen wir bekommen?


Zunächst legen wir fest, welche Mindestfunktionen unsere zukünftige IP-PBX haben soll.
  1. Gegensprechanlage. IP-Telefone oder Softphones von Benutzern, die am Gateway registriert sind, sollten Anrufe tätigen und Anrufe weiterleiten können
  2. Eingehende Anrufe. Der eingehende Anruf sollte über das interaktive Sprachmenü erfolgen, das dem Anrufer verschiedene Optionen für die Verbindung mit Mitarbeitern des Unternehmens bietet
  3. SIP-. GSM- – , , , VoIP-
  4. . – SIP GSM, , . – GSM-, – SIP

?


Wir werden versuchen, die Konfiguration des Gateways durch die Konfigurationsdateien unter Verwendung der Standardkonfigurationstools auf das Maximum, dh die Webschnittstelle, zu minimieren. Damit können wir beispielsweise die Anzahl der SIP-Konten erstellen, die wir benötigen, um Benutzer mit dem IP-Telefon-Gateway zu verbinden. Gehen Sie zum Abschnitt Gateway - VoIP-Leitungen und klicken Sie auf VoIP-Leitung hinzufügen .



Leitungstyp: VoIP-Konto
Typ: SIP
Name: Beliebiger Name
Konto: interne Telefonnummer
Passwort: komplexes Passwort

Wir wiederholen diesen Vorgang so oft wir brauchen, um Telefone zu bekommen. Leider funktioniert die interne Kommunikation auch nach dem Erstellen aller SIP-Konten nicht. Um sie zu aktivieren, müssen wir mit Konfigurationsdateien arbeiten.

Wir werden unseren Yeastar TG100 mit einem VoIP-Dienstanbieter verbinden, da die Weboberfläche alle Möglichkeiten dafür bietet. Im selben Abschnitt Gateway - - VoIP - Leitungen erneut auf VoIP - Leitung hinzufügen und in der Zeile Typen wählen «VoIP - Leitung„. Jeder Telekommunikationsbetreiber hat seine eigenen Registrierungsanforderungen. Die verfügbaren Felder reichen jedoch aus, um eine erfolgreiche Verbindung zu den meisten von ihnen herzustellen.



Line Reifentyp: VoIP - Leitung
Typ: der SIP -
Name: beliebigen Name
Host / IP:Die IP-Adresse oder der Domänenname des SIP-Servers sowie dessen Port.
Domäne: IP-Adresse oder Domänenname des SIP-Servers
Benutzer : Vom Betreiber ausgegebene SIP-ID
Identifikationsname: Vom Betreiber ausgegebene SIP-ID
Passwort:
Vom Betreiber bereitgestelltes Passwort Von Von (Registerkarte Erweitert): Vom Betreiber ausgegebene SIP-ID

Erstellen Sie ein interaktives Sprachmenü über das Web- Die Schnittstelle wird natürlich nicht funktionieren. Für ihn benötigen Sie jedoch auf jeden Fall eine Sprachansage zum Herunterladen, die wir über die Weboberfläche nutzen können. Klicken Sie im Abschnitt System - Audiodateien auf Datei herunterladen. Die Datei muss im WAV-Format vorliegen und darf 1,8 MB nicht überschreiten. Die folgende Codierung ist zulässig:

gsm 6,10 8 kHz, Mono, 1 kb / s
alaw / ulaw 8 kHz, Mono, 1 kb / s pcm 8 kHz, Mono, 16 kb / s
Hier endet

die Weboberfläche. Wir werden das interne, ausgehende und eingehende Routing selbst konfigurieren.

Anschließen an den Yeastar TG100


Um eine Verbindung herzustellen, verwenden wir das SSH-Protokoll, das zuerst auf dem Gateway aktiviert werden muss. Aktivieren Sie im Abschnitt System - Netzwerkeinstellungen - LAN-Einstellungen die Option SSH aktivieren , speichern Sie die Änderungen und übernehmen Sie sie.



Verwenden Sie Ihren bevorzugten SSH-Client, um eine Verbindung zum Gateway herzustellen. Standardmäßig ist der Verbindungsport 8022, die Anmeldung ist root, das Passwort ist ys123456. Durch das Verbinden fallen Sie in die Umgebung des Linux-Betriebssystems.

Asterisk-Konfigurationsdateien befinden sich an der üblichen Stelle - / etc / asterisk. Sie können jedoch nichts direkt daran ändern. Andernfalls gehen nach jeder Anwendung der Einstellungen in der Weboberfläche alle Einstellungen in den Konfigurationsdateien verloren. Zum Hinzufügen oder Ändern der Einstellungen der Asterisk-Konfigurationsdateien wird ein spezielles Verzeichnis bereitgestellt - / persistent / custom-cfg. Es enthält die Datei gncustom.conf mit den Namen aller Sternchen-Konfigurationsdateien, die Sie ändern oder etwas Neues hinzufügen können.

cat /persistent/custom-cfg/gncustom.conf :
[modifyfile]
/etc/asterisk/extensions.conf
/etc/asterisk/sip.conf
/etc/asterisk/users.conf
/etc/asterisk/iax.conf
/etc/asterisk/queues.conf
/etc/asterisk/features.conf
/etc/asterisk/voicemail.conf
/etc/asterisk/meetme.conf
/etc/asterisk/rc_org.conf
/etc/asterisk/rtp.conf
/etc/asterisk/http.conf
/etc/asterisk/musiconhold.conf
/etc/asterisk/followme.conf
/etc/asterisk/logger.conf
/etc/asterisk/manager.conf
/etc/asterisk/chan_dahdi.conf
/etc/asterisk/digital-channel.conf
[replacefile]
/etc/asterisk/dahdi-channels.conf

Dementsprechend sind die Dateien im Abschnitt [Änderungsdatei] Dateien, in denen Änderungen oder Ergänzungen an vorhandenen Einstellungen zulässig sind. Dateien im Abschnitt [Ersetzungsdatei] - Dateien, die vollständig durch Ihre Einstellungen ersetzt werden.
Um Einstellungen in der Sternchen-Konfigurationsdatei zu ändern, müssen Sie drei Parameter kennen:
  1. Der Name der Asterisk-Konfigurationsdatei im Ordner / etc / asterisk
  2. Abschnittsname in eckigen Klammern [Abschnitt] angegeben, in denen die entsprechende Option geändert wird
  3. Name der Option selbst

Als Nächstes wird im Verzeichnis / persistent / custom-cfg eine Datei mit dem Namen <format> _custom.conf erstellt. Dabei ist <Name> der Name der Konfigurationsdatei im Verzeichnis / etc / asterisk ohne das Ende von ".conf". Wenn Sie beispielsweise Änderungen an der Datei /etc/asterisk/users.conf vornehmen möchten, wird die Datei mit den Änderungen als users_custom.conf bezeichnet. In der Datei mit den Änderungen wird der Abschnitt in eckigen Klammern sowie in der Originaldatei angezeigt, in der Sie eine Änderung vornehmen möchten, und in der folgenden Zeile wird die Option mit einem neuen Wert nach dem Gleichheitszeichen geändert. Ein Beispiel:
[new-context]
parameter1=value1
parameter2=value2

Wenn in der Einstellungsänderungsdatei ein Abschnitt angegeben ist, der nicht in der ursprünglichen Konfigurationsdatei enthalten ist, wird er einfach hinzugefügt. Nachdem Sie Änderungen an den Konfigurationsdateien vorgenommen haben, müssen Sie diese anwenden. Der einfachste Weg, dies zu tun, ist in der Weboberfläche. Klicken Sie in einem beliebigen Einstellungsabschnitt auf Speichern und dann auf Übernehmen .

Interne Anrufe


Zuvor haben wir über die webbasierte Oberfläche SIP-Konten erstellt (401, 402 und 403). Die Konfiguration dieser SIP-Geräte befindet sich in der Datei /etc/asterisk/users.conf. Jedes Gerät verwendet seinen eigenen Wählplankontext - den Kontextparameter. Für 401 ist es Voip-Account-401, für 402 ist es Voip-Account-402, für 403 ist es Voip-Account-403.
In der Set-Plan-Datei /etc/asterisk/extensions.conf sehen wir den folgenden Eintrag:
[Voip-Account-401] 
[Voip-Account-402] 
[Voip-Account-403] 

Im Wesentlichen bedeutet dies, dass sich jedes von uns erstellte Gerät in einem eigenen und vollständig leeren Wählplankontext befindet. Dies erklärt die Tatsache, dass die internen Aufrufe im Gateway standardmäßig nicht funktionieren und dies behoben werden muss.

  1. Erstellen wir einen speziellen Kontext für den Wählplan, in dem wir ausgehende Anrufe von unseren SIP-Telefonen verarbeiten. Die ursprüngliche Wählplandatei heißt extensions.conf. Erstellen Sie dementsprechend eine Datei mit dem Namen extensions_custom.conf im Verzeichnis / persistent / custom-cfg mit den folgenden Inhalten:
    [from-internal]
    ;internal routes
    exten => _4XX,1,NoOp(Internal Call)
    exten => _4XX,n,Dial(${trunk-${EXTEN}},30,Ttr)
    exten => _4XX,n,Hangup()
    

    Der Kern dieses Eintrags besteht darin, dass bei jedem Anruf einer dreistelligen Nummer, die mit der Nummer 4 beginnt, das Gerät mit der entsprechenden Nummer angerufen wird, die zuvor in der Weboberfläche des Gateways erstellt wurde.
  2. Wir müssen unseren Telefonen auch erlauben, diesen Wählplankontext beim Telefonieren zu verwenden. Fügen Sie dazu die folgenden Zeilen in dieselbe Datei extensions_custom.conf ein:
    [Voip-Account-401]	
    include => from-internal
    
    [Voip-Account-402]
    include => from-internal
    
    [Voip-Account-403]
    include => from-internal
    

  3. Übernehmen Sie die Änderungen über die Weboberfläche
  4. Wir sehen uns die Datei /etc/asterisk/extensions.conf an und stellen sicher, dass die darin vorgenommenen Änderungen angezeigt werden
  5. Wir prüfen in der Praxis - wir versuchen, einen Anruf von einem internen Telefon zum anderen zu tätigen

Eingehende Anrufe


Alle eingehenden Anrufe, die sowohl über die GSM-Leitung als auch über die SIP-Amtsleitung eingingen, werden an das interaktive Sprachmenü mit der folgenden Struktur gesendet:
  1. Eine zuvor heruntergeladene Audiodatei mit einer Sprachansage wird abgespielt. Die von uns hochgeladene Datei befindet sich im Ordner / var / lib / asterisk / sound / record
  2. Wir warten vom Teilnehmer auf das Wählen der Nummer. Wenn Sie die Nummer „1“ eingeben, wird der Teilnehmer mit der Nummer 401 angerufen. Wenn Sie die Nummer „2“ eingeben, wird der Anruf an die Wählgruppe gesendet, in der die Telefone 401, 402, 403 nacheinander klingeln
  3. Wenn der Teilnehmer nichts wählt, wird der Anruf auch an dieselbe Wählgruppe weitergeleitet, aber die darin enthaltenen Telefone klingeln nicht nacheinander, sondern gleichzeitig

Fügen Sie der Datei extensions_custom.conf Folgendes hinzu, um diese Funktionalität zu implementieren:

[arttel-ivr]                                                             
exten => _.,1,NoOp(Custom IVR by ArtTel)                                 
exten => _.,n,Set(CDR(userfield)=SIP_TRUNK->IP)                          
exten => _.,n,Answer()                                                   
exten => _.,n,Set(TIMEOUT(digit)=2)                                                 
exten => _.,n,Background(record/arttel_ivr_alaw) ;                                   
exten => _.,n,WaitExten(3) ; 3                                                             
                                                                                    
exten => t,1,NoOp(Goto by Timeout) ;   ,                                                   
exten => t,n,Macro(arttel-ringgroup,ringall,402-403-401,15,2) ;                              
exten => t,n,Hangup()                                                               
                                                                                    
exten => 1,1,NoOp(Goto by pressed 1)                                                
exten => 1,n,Dial(${trunk-401},30,T) ;  «1»,   401                                                
exten => 1,n,Hangup()                                                               
                                                                                    
exten => 2,1,NoOp(Goto by pressed 2)                                                
exten => 2,n,Macro(arttel-ringgroup,linear,402-403-401,15,2) ;  «2»,  402, 403  404                               
exten => 2,n,Hangup()

[macro-arttel-ringgroup]                                                            
;ARG1 - Type: linear, ringall                                                                                
;ARG2 - Numbers separated dash: 401-402-403                                         
;ARG3 - Time Dial for Dial app                                                      
;ARG4 - Repeat Count for linear                                                     
                                                                                    
exten => s,1,Set(RG_Type=${ARG1})                                                            
exten => s,n,Set(RG_Nums=${ARG2})                                                   
exten => s,n,NoOp(Macro RingGroup type: ${RG_Type} for numbers: $RG_Nums)           
exten => s,n,GotoIf($[ "${RG_Type}" = "linear" ]?linear,1:ringall,1)               
exten => s,n,Hangup()                                                               
                                                                                    
exten => ringall,1,Set(COUNT=1)                                                     
exten => ringall,n,Set(REPEAT_COUNT=1)                                               
exten => ringall,n,Set(Repeat=${ARG4})                                               
exten => ringall,n,Set(TimeDial=${ARG3})                                             
exten => ringall,n(loop),Set(RG_Dial=${RG_Dial}&${trunk-${CUT(RG_Nums,-,${COUNT})}})
exten => ringall,n,NoOp(RG_Dial=${RG_Dial})                                         
exten => ringall,n,Set(COUNT=$[${COUNT} + 1])                                       
exten => ringall,n,GotoIf(${CUT(RG_Nums,-,${COUNT})}?loop)                          
exten => ringall,n(repeat),Dial(${RG_Dial:1},${TimeDial},T)                                
exten => ringall,n,Set(REPEAT_COUNT=$[${REPEAT_COUNT} + 1])                          
exten => ringall,n,GotoIf($[ ${REPEAT_COUNT} <= ${Repeat} ]?repeat)                    
exten => ringall,n,Hangup()                                                         
                                                                                    
exten => linear,1,Set(COUNT=1)                                                      
exten => linear,n,Set(REPEAT_COUNT=1)                                               
exten => linear,n,Set(Repeat=${ARG4})                                               
exten => linear,n,Set(TimeDial=${ARG3})                                             
exten => linear,n(loop),Dial(${trunk-${CUT(RG_Nums,-,${COUNT})}},${TimeDial},T)    
exten => linear,n,Set(COUNT=$[${COUNT} + 1])                                        
exten => linear,n,GotoIf(${CUT(RG_Nums,-,${COUNT})}?loop)                           
exten => linear,n,Set(COUNT=1)                                                      
exten => linear,n,Set(REPEAT_COUNT=$[${REPEAT_COUNT} + 1])                          
exten => linear,n,GotoIf($[ ${REPEAT_COUNT} <= ${Repeat} ]?loop)                    
exten => linear,n,Hangup()

Unser Sprachgrußkontext wurde erstellt. Jetzt müssen alle eingehenden Anrufe sowohl vom GSM-Kanal als auch von der SIP-Amtsleitung an ihn gesendet werden. Erstellen Sie dazu die Datei users_custom.conf im Ordner / persistent / custom-cfg mit den folgenden Inhalten:

[gsm_1]
context=arttel-ivr

[trunk-arttel_telecom]
context=arttel-ivr

Wir speichern und akzeptieren die über die Weboberfläche vorgenommenen Änderungen.

Ausgehende Anrufe


Als letztes müssen wir die Logik ausgehender Anrufe konfigurieren. Sie wird die nächste sein:
  1. Anrufe an alle Mobiltelefonnummern ab 89 ... werden über den GSM-Kanal getätigt
  2. Anrufe in Russland, deren Nummern aus 10 Zeichen bestehen und mit 83 ..., 84 ... oder 88 ... beginnen, werden über den SIP-Anbieter ausgegeben
  3. Anrufe zu internationalen Nummern ab 810 ... werden wir auch über den GSM-Kanal ausstellen

Fügen Sie dazu dem Abschnitt [from-internal] in der bereits erstellten Datei extensions_custom.conf Folgendes hinzu:

;outbound routes
;STRATEGY: 0 - default(first free), 1 - linear(linear with memories), 2- balance
exten => _89XX.,1,NoOp(Outbound dial to Mobile)
exten => _89XX.,n,Set(CDR(userfield)=IP->MOBILE)
exten => _89XX.,n,Set(STRATEGY=0)                                                                                                  
exten => _89XX.,n,Macro(trunkdial-failover-0.4,1,,${EXTEN:0},trunk-GSM1,)
exten => _89XX.,n,Hangup()
                                                                                             
exten => _8[348]XXXXXXXXX,1,NoOp(Outbound dial to Russia)
exten => _8[348]XXXXXXXXX,n,Set(CDR(userfield)=IP->SIP_TRUNK)
exten => _8[348]XXXXXXXXX,n,Set(STRATEGY=0)
exten => _8[348]XXXXXXXXX,n,Macro(trunkdial-failover-0.4,1,,${EXTEN:0},trunk-arttel_telecom,)
exten => _8[348]XXXXXXXXX,n,Hangup()
                                                                                    
exten => _810XX.,1,NoOp(Outbound dial to International)
exten => _810XX.,n,Set(CDR(userfield)=IP->MOBILE)
exten => _810XX.,n,Set(STRATEGY=0)
exten => _810XX.,n,Macro(trunkdial-failover-0.4,1,,${EXTEN:0},trunk-GSM1,) ; 1 trunk
exten => _810XX.,n,Hangup()

Welche Regeln für welche Richtung verantwortlich sind, ist anhand des Nebenstellennummernmusters nicht schwer zu verstehen: _89XX. - Handynummern, _8 [348] XXXXXXXXX - Anrufe innerhalb Russlands, _810XX. - Anrufe zu internationalen Zielen. Das Trunkdial-Failover-0.4-Makro ist für das Senden von Anrufen über eine bestimmte Amtsleitung verantwortlich. Das erste Argument gibt die Anzahl der Leitungen an, die für ausgehende Anrufe verwendet werden. Das letzte Argument listet die Amtsleitungen auf, über die ein ausgehender Anruf getätigt werden kann. Wenn wir beispielsweise mit einem 4-Port-Gateway Yeastar TG400 anstelle eines Yeastar TG100 mit einem Port arbeiten, lautet die Zeile:
exten => _89XX.,n,Macro(trunkdial-failover-0.4,1,,${EXTEN:0},trunk-GSM1,)  

sollte ersetzt werden durch:
exten => _89XX.,n,Macro(trunkdial-failover-0.4,4,,${EXTEN:0},trunk-GSM1,trunk-GSM2,trunk-GSM3,trunk-GSM4,)

Wir speichern und übernehmen die vorgenommenen Änderungen.

Fazit


Als Ergebnis der Änderungen haben wir eine voll funktionsfähige Lösung erhalten, die bereit ist, das Büro von 2-10 Personen völlig ruhig zu bedienen. Ja, es werden keine zusätzlichen Funktionen wie Aufzeichnen und Abhören von Gesprächen, Parken von Anrufen, Telefonkonferenzen, Voicemail und andere unterstützt. In Wahrheit sind für die kleinsten Unternehmen all diese Funktionen nicht gefragt. Diese Lösung ist jedoch kompakt, verbraucht wenig Strom und unterstützt GSM-Leitungen. Und wenn Sie Zeit, Lust und Fantasie haben, kann das VoIP-GSM-Gateway Yeastar TG100 mit vielen weiteren interessanten Funktionen ergänzt werden.

Source: https://habr.com/ru/post/de396481/


All Articles