Worum geht es eigentlich?
Wenn Sie in einem großen Unternehmen und in einem mittelständischen Unternehmen mit einer kleinen Anzahl von Niederlassungen arbeiten, denken Sie immer häufiger daran, Ressourcen zu optimieren, die Verwaltung zu vereinfachen und alles und jeden zu standardisieren.
Wir haben zum Beispiel mehrere (naja, nicht wenige) Zweigstellen derselben Art für 10-100 Mitarbeiter. Telefonie kann auf verschiedene Arten organisiert werden:
Nehmen Sie eine fertige Lösung in der Cloud des Anbieters
Installieren Sie Ihren eigenen Mini-Server und Sternchen in jedem Zweig
Machen Sie ein einzelnes Sternchen in der Mitte
Die ersten beiden Optionen finden natürlich statt, aber sie haben genug Nachteile. Dies ist nicht die Bequemlichkeit, mehrere kleine Instanzen zu verwalten, sondern auch ein finanzielles Problem und einige andere Punkte.
, , , , . , , . , , 3 , 6 . - 6 ("6 ! !"), 6 .
, - SIP . , -, .
, . , - , -. . ? , - , , - .
18.1 PJSIP .
? , . - . , " ".
(Numbers), . , ?
, (Number)
- ? (Secret)
- , , (domain)
CID -
: , DTMF, -
Flags - -, . , , .
, . ? , , . - , , VIEW. , , . 3 :
Endpoints (ps_endpoints)
(ps_auths)
Aors (ps_aors)
, , "" PJSIP. SQL:
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
CREATE ALGORITHM=UNDEFINED SQL SECURITY DEFINER VIEW `ps_aors` AS select concat(`Numbers`.`Number`,if(`Numbers`.`domain` is not null,concat('@',`Numbers`.`domain`),'')) AS `id`,180 AS `default_expiration`,2 AS `max_contacts`,30 AS `minimum_expiration`,'yes' AS `remove_existing`,'' AS `contact` from `Numbers`;
CREATE ALGORITHM=UNDEFINED SQL SECURITY DEFINER VIEW `ps_auths` AS select concat(`Numbers`.`Number`,if(`Numbers`.`domain` is not null,concat('@',`Numbers`.`domain`),'')) AS `id`,'userpass' AS `auth_type`,3600 AS `nonce_lifetime`,`Numbers`.`Secret` AS `password`,`Numbers`.`Number` AS `username`,`Numbers`.`domain` AS `realm` from `Numbers` where `Numbers`.`Secret` <> '';
CREATE ALGORITHM=UNDEFINED SQL SECURITY DEFINER VIEW `ps_endpoints` AS select concat(`Numbers`.`Number`,if(`Numbers`.`domain` is not null,concat('@',`Numbers`.`domain`),'')) AS `id`,concat('transport-',lcase(`Numbers`.`Protocol`)) AS `transport`,concat(`Numbers`.`Number`,if(`Numbers`.`domain` is not null,concat('@',`Numbers`.`domain`),'')) AS `aors`,if(`Numbers`.`Secret` <> '',concat(`Numbers`.`Number`,if(`Numbers`.`domain` is not null,concat('@',`Numbers`.`domain`),'')),NULL) AS `auth`,'SIP' AS `context`,'all' AS `disallow`,concat('ulaw,alaw,opus',if(find_in_set('Video',`Numbers`.`Flags`),',h263,h261,h263p,h264','')) AS `allow`,concat(`Numbers`.`Number`,if(`Numbers`.`domain` is not null,concat('@',`Numbers`.`domain`),'')) AS `outbound_auth`,concat(`Numbers`.`CID`,' <',`Numbers`.`Number`,'>') AS `callerid`,if(`Numbers`.`Protocol` = 'TLS','sdes','no') AS `media_encryption`,`Numbers`.`PickupGroup` AS `named_pickup_group`,2 AS `device_state_busy_at`,concat('vRecord=',if(find_in_set('Record',`Numbers`.`Flags`) > 0,'yes','no'),';','vRussia=',if(find_in_set('Russia',`Numbers`.`Flags`) > 0,'yes','no'),';','vAbroad=',if(find_in_set('Abroad',`Numbers`.`Flags`) > 0,'yes','no'),';','vVoicemail=',if(find_in_set('Voicemail',`Numbers`.`Flags`) > 0,'yes','no'),';','vFilterCID=no') AS `set_var`,`Numbers`.`NumberID` AS `callerid_tag`,'username,auth_username,ip' AS `identify_by` from `Numbers`;
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
. - - "" "":
, 5 . , . , .
, 3 , , , , , 101, 102, "" 007 ..
, Numbers .
Numbers:
, " " , , .
ps_endpoints
, - Numbers.
ps_auth
ps_aors
, . , Numbers, .
, . - id. 5 , - . 3 @ . , , - .
. , . AOR endpointa , .. @, . , (id) , AOR . . - AOR , . , .
, , .
pjsip.conf
, .
disable multi domain
, no. , . - . , , yes. 2 . .
endpoint identifier order
, , . = ip,username. , , .. IP . , username, endpoint .
, .
res config mysql.conf
, - :
extconfig.conf
, .
ps_contacts , astdb.
Spoiler
sorcery.conf
. , , .
.
, ?
, endpoint :
, . " " . " " .
, . .., 5 :
Dial(PJSIP/19960)
3
Dial(PJSIP/123@test3)
, , .
?
Microsip, :
101 . ?
PS:
- .
- , , . , .
domains:
domain (VARCHAR) | code (VARCHAR)
Wir füllen zum Beispiel so:
test2 | 01
test3 | 02
Natürlich können Sie jeden Verzweigungscode verwenden - sogar 1 Zeichen. Wir sind entschlossen, Zugang zu Filialen zu haben. Zum Beispiel habe ich nach 9 Zugang zur "Stadt" und ich werde 8 zu den Filialen bringen. Sie nehmen, was für Sie bequem ist. Mindestens * (Sternchen).
Verknüpfen Sie die Domänen - Tabelle mit den Domänen - Identifier in extconfig.conf . Wir schreiben einen Wählplan:
exten => _8XXXXX,1,NoOp(Call from ${CALLERID(all)} to filial ${EXTEN:1:2})
same => n, Set(domain=${REALTIME_FIELD(domains,code,${EXTEN:1:2},domain)})
same => n, GotoIF($[ "${domain}" = "" ]?GotoError) ;
same => n, Dial(PJSIP/${EXTEN:3}@${domain})
same => n, Hangip
Insgesamt wählen wir 801123 am Telefon und gelangen um 123 in die Test2-Filiale.
Um die Verwaltung zu vereinfachen, können Sie eine weitere wichtige Einschränkung hinzufügen:
Nummern .domain - AUSLÄNDISCHER SCHLÜSSEL -> Domains .domain
Dies verhindert, dass Sie während der Bearbeitung Domänen verlieren.