๋คํธ์ํฌ์๋ IP-PBX Asterisk์ CRM Bitrix24๋ฅผ ํตํฉํ๋ ๋ค์ํ ์ต์
์ด ์์ง๋ง ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ฐ๋ฆฌ๋ ์ง์ ์์ฑํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๊ธฐ๋ฅ์ ์ผ๋ก ๋ชจ๋ ๊ฒ์ด ํ์ค์ ๋๋ค.
- Asterisk๋ Bitrix24์์ ๊ณ ๊ฐ์ ์ ํ๋ฒํธ๊ฐ ์๋ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ์ด ํด๋ฆญ์ ๋์ ํ ์ฌ์ฉ์์ ๋ด๋ถ ๋ฒํธ๋ฅผ ๊ณ ๊ฐ์ ์ ํ๋ฒํธ์ ์ฐ๊ฒฐํฉ๋๋ค. Bitrix24์๋ ํตํ ๊ธฐ๋ก์ด ๊ธฐ๋ก๋์ด ์์ผ๋ฉฐ ํตํ๊ฐ ๋๋๋ฉด ๋ํ ๊ธฐ๋ก์ด ํ์ ๋ฉ๋๋ค.
- ์ธ๋ถ์์ Asterisk์ ์ ํ๊ฐ ๋์ฐฉํฉ๋๋ค. Bitrix24 ์ธํฐํ์ด์ค์์ ์ด ์ ํ๊ฐ ๋์ฐฉํ ์ง์์๊ฒ ํด๋ผ์ด์ธํธ ์นด๋๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๊ทธ๋ฌํ ํด๋ผ์ด์ธํธ๊ฐ ์์ผ๋ฉด ์ ๋ฆฌ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด ์นด๋๋ฅผ ์ฝ๋๋ค.
ํตํ๊ฐ ์๋ฃ๋๋ ์ฆ์ ์ด๋ฅผ ์นด๋์ ๋ฐ์ํ๊ณ ๋ํ๋ น์์ ๋์ด์ฌ๋ฆฝ๋๋ค.
์ปท ์๋์์ ๋ชจ๋ ๊ฒ์ ์ง์ ์ค์ ํ๊ณ github์ ๋ํ ๋งํฌ๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ์๋ ค ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์, ์, ๊ฐ์ ธ ์์ ์ฌ์ฉํ์ญ์์ค!
์ผ๋ฐ์ ์ธ ์ค๋ช
์ฐ๋ฆฌ๋ ํตํฉ CallMe๋ฅผ ํธ์ถํ์ต๋๋ค. CallMe๋ PHP๋ก ์์ฑ๋ ์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค.
์ฌ์ฉ๋ ๊ธฐ์ ๋ฐ ์๋น์ค
- PHP 5.6
PHP AMI ๋ผ์ด๋ธ๋ฌ๋ฆฌ - ์๊ณก๊ฐ
- nginx + php fpm
- ๊ฐ๋ ์
- AMI(๋ณํ ๊ด๋ฆฌ์ ์ธํฐํ์ด์ค)
- Bitrix ์นํํฌ(๋จ์ํ๋ REST API ๊ตฌํ)
์ฌ์ ์ค์
Asterisk๊ฐ ์๋ ์๋ฒ์๋ ์น ์๋ฒ(nginx + php-fpm์ด ์์), ๊ด๋ฆฌ์ ๋ฐ git์ ์ค์นํด์ผ ํฉ๋๋ค.
์ค์น ๋ช ๋ น(CentOS):
yum install nginx php-fpm supervisor git
์น ์๋ฒ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋๋ ํ ๋ฆฌ๋ฅผ ์ ๋ฌํ๊ณ git์์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ์ ธ์ค๊ณ ํด๋์ ํ์ํ ๊ถํ์ ์ค์ ํฉ๋๋ค.
cd /var/www
git clone https://github.com/ViStepRU/callme.git
chown nginx. -R callme/
๋ค์์ผ๋ก nginx๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ๊ตฌ์ฑ์ ๋ค์ ์์น์ ์์ต๋๋ค.
/etc/nginx/conf.d/pbx.vistep.ru.conf
server {
server_name www.pbx.vistep.ru pbx.vistep.ru;
listen *:80;
rewrite ^ https://pbx.vistep.ru$request_uri? permanent;
}
server {
# listen *:80;
# server_name pbx.vistep.ru;
access_log /var/log/nginx/pbx.vistep.ru.access.log main;
error_log /var/log/nginx/pbx.vistep.ru.error.log;
listen 443 ssl http2;
server_name pbx.vistep.ru;
resolver 8.8.8.8;
ssl_stapling on;
ssl on;
ssl_certificate /etc/letsencrypt/live/pbx.vistep.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pbx.vistep.ru/privkey.pem;
ssl_dhparam /etc/nginx/certs/dhparam.pem;
ssl_session_timeout 24h;
ssl_session_cache shared:SSL:2m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000;";
add_header Content-Security-Policy-Report-Only "default-src https:; script-src https: 'unsafe-eval' 'unsafe-inline'; style-src https: 'unsafe-inline'; img-src https: data:; font-src https: data:; report-uri /csp-report";
root /var/www/callme;
index index.php;
location ~ /. {
deny all; # ะทะฐะฟัะตั ะดะปั ัะบััััั
ัะฐะนะปะพะฒ
}
location ~* /(?:uploads|files)/.*.php$ {
deny all; # ะทะฐะฟัะตั ะดะปั ะทะฐะณััะถะตะฝะฝัั
ัะบัะธะฟัะพะฒ
}
location ~* ^.+.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
access_log off;
log_not_found off;
expires max; # ะบะตัะธัะพะฒะฐะฝะธะต ััะฐัะธะบะธ
}
location ~ .php {
root /var/www/callme;
index index.php;
fastcgi_pass unix:/run/php/php5.6-fpm.sock;
# fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
๊ตฌ์ฑ ๋ถ์, ๋ณด์ ๋ฌธ์ , ์ธ์ฆ์ ํ๋, ๊ธฐ์ฌ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์น ์๋ฒ ์ ํ๊น์ง ๋จ๊ฒจ ๋ ๊ฒ์ ๋๋ค. ์ด์ ๋ํด ๋ง์ด ์์ฑ๋์์ต๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ์๋ ์ ํ์ด ์์ผ๋ฉฐ http์ https ๋ชจ๋์์ ์๋ํฉ๋๋ค.
์ฐ๋ฆฌ๋ https๊ฐ ์์ต๋๋ค. ์ธ์ฆ์๋ฅผ ์ํธํํฉ์๋ค.
๋ชจ๋ ์์ ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ํํ ๊ฒฝ์ฐ ๋งํฌ๋ฅผ ํด๋ฆญํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ด ํ์๋ฉ๋๋ค.
Bitrix24 ์ค์
๋ ๊ฐ์ ์นํํฌ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
๋ค์ด์ค๋ ์นํ .
๊ด๋ฆฌ์ ๊ณ์ (ID 1)์์ ๋ค์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์ด๋ํฉ๋๋ค. Applications -> Webhook -> Add webhook -> Incoming webhook
์คํฌ๋ฆฐ์ท๊ณผ ๊ฐ์ด ๋ค์ด์ค๋ Webhook์ ๋งค๊ฐ๋ณ์๋ฅผ ์
๋ ฅํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ์ฅ์ ํด๋ฆญํฉ๋๋ค.
์ ์ฅ ํ Bitrix24๋ ๋ค์ด์ค๋ ์นํํฌ์ URL์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํํ /profile/ ์์ด URL ๋ฒ์ ์ ์ ์ฅํฉ๋๋ค. ์ด URL์ ์ ํ๋ฆฌ์ผ์ด์
์์ ์์ ์ ํ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ๊ฐ์ง๊ณ ์๋ค https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/
๋ฐ์ ์นํ .
์ ํ๋ฆฌ์ผ์ด์ -> Webhook -> Webhook ์ถ๊ฐ -> ๋๊ฐ๋ Webhook
์์ธํ ๋ด์ฉ์ ์คํฌ๋ฆฐ์ท์ ์์ต๋๋ค.
์ธ์ฆ ์ฝ๋ ์ ์ฅ ๋ฐ ๋ฐ๊ธฐ
๋๋ ๊ทธ๊ฒ์ ๊ฐ์ง๊ณ ์๋ค xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6
. ๋ํ ์์ ์๊ฒ ๋ณต์ฌํด์ผ ํ๋ฉฐ ๋ฐ์ ์ ํ๋ฅผ ๊ฑฐ๋ ๋ฐ ํ์ํฉ๋๋ค.
์ค์!
Bitrix24 ์๋ฒ์์ SSL ์ธ์ฆ์๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค(letsencrypt๋ฅผ ์ฌ์ฉํ ์ ์์). ๊ทธ๋ ์ง ์์ผ๋ฉด BitrixXNUMX API๊ฐ ์๋ํ์ง ์์ต๋๋ค. ํด๋ผ์ฐ๋ ๋ฒ์ ์ด ์๋ ๊ฒฝ์ฐ ๊ฑฑ์ ํ์ง ๋ง์ญ์์ค. ssl์ ์ด๋ฏธ ์์ต๋๋ค.
์ค์!
"ํ๋ก์ธ์ ์ฃผ์" ํ๋์๋ ์ธํฐ๋ท์์ ์ก์ธ์คํ ์ ์๋ ์ฃผ์๋ฅผ ํ์ํด์ผ ํฉ๋๋ค!
๋ง์ง๋ง์ผ๋ก CallMeOut์ ์ ํ ๊ฑธ๊ธฐ์ฉ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ค์นํด ๋ณด๊ฒ ์ต๋๋ค(PBX์์ ๋ฒํธ๋ฅผ ํด๋ฆญํ๋ฉด ์ ํ๋ฅผ ๊ฑธ๊ธฐ ์ํ ๋ช ๋ น์ด ๋ ์๊ฐ๋๋ค).
๋ฉ๋ด์์ ์ถ๊ฐ -> ์ ํ ํต์ -> ์ถ๊ฐ -> ์ค์ ์ ์ ํํ๊ณ "๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ ์ ํ ๋ฒํธ"๋ก ์ค์ ํฉ๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ: CallMeOut์ ํด๋ฆญํ๊ณ "์ ์ฅ"์ ํด๋ฆญํฉ๋๋ค.
๋ณํ ์ค์
Asterisk์ Bitrix24 ๊ฐ์ ์ฑ๊ณต์ ์ธ ์ํธ ์์ฉ์ ์ํด callme AMI ์ฌ์ฉ์๋ฅผ manager.conf์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
[callme]
secret = JD3clEB8_f23r-3ry84gJ
deny = 0.0.0.0/0.0.0.0
permit = 127.0.0.1/255.255.255.0
permit= 10.100.111.249/255.255.255.255
permit = 192.168.254.0/255.255.255.0
read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan
write = system,call,agent,log,verbose,user,config,command,reporting,originate
๋ค์์ผ๋ก ๋ค์ด์ผํ๋(extensions.ael์ด ์์)์ ์ฌ์ฉํ์ฌ ๊ตฌํํด์ผ ํ๋ ๋ช ๊ฐ์ง ํธ๋ฆญ์ด ์์ต๋๋ค.
์ ์ฒด ํ์ผ์ ์ธ์ฉํ ๋ค์ ์ค๋ช ์ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
globals {
WAV=/var/www/pbx.vistep.ru/callme/records/wav; //ะัะตะผะตะฝะฝัะน ะบะฐัะฐะปะพะณ ั WAV
MP3=/var/www/pbx.vistep.ru/callme/records/mp3; //ะัะดะฐ ะฒัะณััะถะฐัั mp3 ัะฐะนะปั
URLRECORDS=https://pbx.vistep.ru/callme/records/mp3;
RECORDING=1; // ะะฐะฟะธัั, 1 - ะฒะบะปััะตะฝะฐ.
};
macro recording(calling,called) {
if ("${RECORDING}" = "1"){
Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called});
Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)});
System(mkdir -p ${MP3}/${datedir});
System(mkdir -p ${WAV}/${datedir});
Set(monopt=nice -n 19 /usr/bin/lame -b 32 --silent "${WAV}/${datedir}/${fname}.wav" "${MP3}/${datedir}/${fname}.mp3" && rm -f "${WAV}/${fname}.wav" && chmod o+r "${MP3}/${datedir}/${fname}.mp3");
Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);
Set(CDR(filename)=${fname}.mp3);
Set(CDR(recordingfile)=${fname}.wav);
Set(CDR(realdst)=${called});
MixMonitor(${WAV}/${datedir}/${fname}.wav,b,${monopt});
};
};
context incoming {
888999 => {
&recording(${CALLERID(number)},${EXTEN});
Answer();
ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp()); // ะฒัััะฐะฒะปัะตะผ CallerID ะตัะปะธ ัะทะฝะฐะปะธ ะตะณะพ ั ะะธััะธะบั24
Set(CallStart=${STRFTIME(epoch,,%s)});
Queue(Q1,tT);
Set(CallMeDISPOSITION=${CDR(disposition)});
Hangup();
}
h => {
Set(CDR_PROP(disable)=true);
Set(CallStop=${STRFTIME(epoch,,%s)});
Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)});
ExecIF(${ISNULL(${CallMeDISPOSITION})}?Set(CallMeDISPOSITION=${CDR(disposition)}):NoOP(=== CallMeDISPOSITION already was set ===));
}
}
context default {
_X. => {
Hangup();
}
};
context dial_out {
_[1237]XX => {
&recording(${CALLERID(number)},${EXTEN});
Set(__CallIntNum=${CALLERID(num)})
Set(CallStart=${STRFTIME(epoch,,%s)});
Dial(SIP/${EXTEN},,tTr);
Hangup();
}
_11XXX => {
&recording(${CALLERID(number)},${EXTEN});
Set(CallStart=${STRFTIME(epoch,,%s)});
Set(__CallIntNum=${CALLERID(num)});
Dial(SIP/${EXTEN:2}@toOurAster,,t);
Hangup();
}
_. => {
&recording(${CALLERID(number)},${EXTEN});
Set(__CallIntNum=${CALLERID(num)})
Set(CallStart=${STRFTIME(epoch,,%s)});
Dial(SIP/${EXTEN}@toOurAster,,t);
Hangup();
}
h => {
Set(CDR_PROP(disable)=true);
Set(CallStop=${STRFTIME(epoch,,%s)});
Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)});
if(${ISNULL(${CallMeDISPOSITION})}) {
Set(CallMeDISPOSITION=${CDR(disposition)});
}
System(curl -s http://pbx.vistep.ru/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION});
}
};
์ฒ์๋ถํฐ ์์ํ์: ๋๋ ํฐ๋ธ ์ ์ญ.
๋ณ์ URL๋ ์ฝ๋ Bitrix24๊ฐ ์ฐ๋ฝ์ฒ ์นด๋๋ก ๊ฐ์ ธ์ค๋ ๋ํ ๋ น์ ํ์ผ์ URL์ ์ ์ฅํฉ๋๋ค.
๋ค์์ผ๋ก ์ฐ๋ฆฌ๋ ๋งคํฌ๋ก ๋งคํฌ๋ก์ ๊ด์ฌ์ด ์์ต๋๋ค ๋ฐฉ์ก.
์ฌ๊ธฐ์์๋ ๋ํ๋ฅผ ๋ น์ํ๋ ๊ฒ ์ธ์๋ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค. ์ ์ฒด ์ด๋ฆ.
Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);
ํน์ ํ์ผ์ ๋ํ ์ ์ฒด URL์ ์ ์ฅํฉ๋๋ค(๋งคํฌ๋ก๋ ๋ชจ๋ ๊ณณ์์ ํธ์ถ๋จ).
๋ฐ์ ์ ํ๋ฅผ ๋ถ์ํด ๋ณด๊ฒ ์ต๋๋ค.
_. => {
&recording(${CALLERID(number)},${EXTEN});
Set(__CallIntNum=${CALLERID(num)})
Set(CallStart=${STRFTIME(epoch,,%s)});
Dial(SIP/${EXTEN}@toOurAster,,t);
Hangup();
}
h => {
Set(CDR_PROP(disable)=true);
Set(CallStop=${STRFTIME(epoch,,%s)});
Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)});
if(${ISNULL(${CallMeDISPOSITION})}) {
Set(CallMeDISPOSITION=${CDR(disposition)});
}
System(curl -s http://pbx.vistep.ru/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION});
}
89991234567์ ์ ํ๋ฅผ ๊ฑธ๋ฉด ๊ฐ์ฅ ๋จผ์ ์ฌ๊ธฐ์ ๋์ฐฉํฉ๋๋ค.
&recording(${CALLERID(number)},${EXTEN});
์ ๊ฒ๋ค. ํตํ ๋ น์ ๋งคํฌ๋ก๊ฐ ํธ์ถ๋๊ณ ํ์ํ ๋ณ์๊ฐ ์ค์ ๋ฉ๋๋ค.
๋ค์
Set(__CallIntNum=${CALLERID(num)})
Set(CallStart=${STRFTIME(epoch,,%s)});
ํตํ๋ฅผ ์์ํ ์ฌ๋์ ๊ธฐ๋กํ๊ณ ํตํ ์์ ์๊ฐ์ ๊ธฐ๋กํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ฃ๋๋ฉด ํน๋ณํ ๋งฅ๋ฝ์์ h
h => {
Set(CDR_PROP(disable)=true);
Set(CallStop=${STRFTIME(epoch,,%s)});
Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)});
if(${ISNULL(${CallMeDISPOSITION})}) {
Set(CallMeDISPOSITION=${CDR(disposition)});
}
System(curl -s http://pbx.vistep.ru/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION});
}
์ด ํ์ฅ์ ๋ํ CDR ํ ์ด๋ธ์ ํญ๋ชฉ์ ๋๊ณ (ํ์ํ์ง ์์) ํตํ ์ข ๋ฃ ์๊ฐ์ ์ค์ ํ๊ณ ํตํ ๊ฒฐ๊ณผ๋ฅผ ์ ์ ์๋ ๊ฒฝ์ฐ ์ง์ ์๊ฐ์ ๊ณ์ฐํฉ๋๋ค. ์ ํ์ฃผ์ธ์ ์ฒ๋ถ) ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง ๋จ๊ณ์์ ์์คํ ์ปฌ์ ํตํด ๋ชจ๋ ๊ฒ์ Bitrix๋ก ๋ณด๋ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์กฐ๊ธ ๋ ๋ง์ - ์์ ์ ํ:
888999 => {
&recording(${CALLERID(number)},${EXTEN});
Answer();
ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp()); // ะฒัััะฐะฒะปัะตะผ CallerID ะตัะปะธ ัะทะฝะฐะปะธ ะตะณะพ ั ะะธััะธะบั24
Set(CallStart=${STRFTIME(epoch,,%s)}); // ะฝะฐัะธะฝะฐะตะผ ะพัััะตั ะฒัะตะผะตะฝะธ ะทะฒะพะฝะบะฐ
Queue(Q1,tT);
Set(CallMeDISPOSITION=${CDR(disposition)});
Hangup();
}
์ฌ๊ธฐ์๋ ํ ์ค์๋ง ๊ด์ฌ์ด ์์ต๋๋ค.
ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp());
๊ทธ๋ ๋ PBX ์ค์น๋ผ๊ณ ๋งํฉ๋๋ค. ๋ฐ์ ๋ฒํธ(์ด๋ฆ) ๋ณํ๊ธฐ ์ฌ์ด CallMe๋ฐ์ ์ ID์ด๋ฆ.
CallMeCallerIDName ๋ณ์ ์์ฒด๋ CallMe ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ์ค์ ๋ฉ๋๋ค(Bitrix24์ ๋ฐ์ ์ ๋ฒํธ์ ์ ์ฒด ์ด๋ฆ์ด ์๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํฉ๋๋ค). ๋ฐ์ ๋ฒํธ(์ด๋ฆ), ์๋์ค - ์ฐ๋ฆฌ๋ ์๋ฌด๊ฒ๋ํ์ง ์์ ๊ฒ์ ๋๋ค).
์ ํ๋ฆฌ์ผ์ด์ ์ค์
์ ํ๋ฆฌ์ผ์ด์ ์ค์ ํ์ผ - /var/www/pbx.vistep.ru/config.php
์ ํ๋ฆฌ์ผ์ด์ ๋งค๊ฐ๋ณ์ ์ค๋ช :
- ๋ํํ ์ ํํด๋๋ฒ๊ทธ - 1์ด๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฒ๋ฆฌํ ๋ชจ๋ ์ด๋ฒคํธ๊ฐ ๋ก๊ทธ ํ์ผ์ ๊ธฐ๋ก๋๊ณ , 0์ด๋ฉด ์๋ฌด ๊ฒ๋ ๊ธฐ๋กํ์ง ์์ต๋๋ค.
- ๊ธฐ์ SIP/PJSIP/IAX/๊ธฐํ
- ์ธ์ฆํ ํฐ โ Bitrix24 ์ธ์ฆ ํ ํฐ, ๋ฐ์ ์นํ ์ธ์ฆ ์ฝ๋
- bitrixApiUrl โ ์์ ์นํํฌ์ URL(profile/ ์์)
- ํ์ฅ โ ์ธ๋ถ ๋ฒํธ ๋ชฉ๋ก
- ๋ฌธ๋งฅ โ ํธ์ถ ๋ฐ์ ์ ๋ํ ์ปจํ ์คํธ
- ๋ฆฌ์ค๋_์๊ฐ ์ด๊ณผ - ๋ณํ์์ ์ด๋ฒคํธ ์ฒ๋ฆฌ ์๋
- ๋ณํ - ๋ณํ์ ๋ํ ์ฐ๊ฒฐ ์ค์ ์ด ์๋ ๋ฐฐ์ด:
- ์ฃผ์ธ - ๋ณํ ์๋ฒ์ IP ๋๋ ํธ์คํธ ์ด๋ฆ
- ๊ณํ โ ์ฐ๊ฒฐ ๋ค์ด์ด๊ทธ๋จ(tcp://, tls://)
- ํฌํธ - ํฌํธ
- ์ฌ์ฉ์ ์ด๋ฆ - ์ฌ์ฉ์ ์ด๋ฆ
- ๋น๋ฐ - ๋น๋ฐ๋ฒํธ
- ์ฐ๊ฒฐ_์๊ฐ ์ด๊ณผ - ์ ์ ์๊ฐ ์ด๊ณผ
- ์ฝ๊ธฐ ์๊ฐ ์ด๊ณผ - ์ฝ๊ธฐ ์ ํ ์๊ฐ
์์ ์ค์ ํ์ผ:
<?php
return array(
'CallMeDEBUG' => 1, // ะดะตะฑะฐะณ ัะพะพะฑัะตะฝะธั ะฒ ะปะพะณะต: 1 - ะฟะธัะตะผ, 0 - ะฝะต ะฟะธัะตะผ
'tech' => 'SIP',
'authToken' => 'xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6', //ัะพะบะตะฝ ะฐะฒัะพัะธะทะฐัะธะธ ะฑะธััะธะบัะฐ
'bitrixApiUrl' => 'https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/', //url ะบ api ะฑะธััะธะบัะฐ (ะฒั
ะพะดััะธะน ะฒะตะฑั
ัะบ)
'extentions' => array('888999'), // ัะฟะธัะพะบ ะฒะฝะตัะฝะธั
ะฝะพะผะตัะพะฒ, ัะตัะตะท ะทะฐะฟัััั
'context' => 'dial_out', //ะธัั
ะพะดััะธะน ะบะพะฝัะตะบัั ะดะปั ะพัะธะณะธะฝะฐัะธะธ ะทะฒะพะฝะบะฐ
'asterisk' => array( // ะฝะฐัััะพะนะบะธ ะดะปั ะฟะพะดะบะปััะตะฝะธั ะบ ะฐััะตัะธัะบั
'host' => '10.100.111.249',
'scheme' => 'tcp://',
'port' => 5038,
'username' => 'callme',
'secret' => 'JD3clEB8_f23r-3ry84gJ',
'connect_timeout' => 10000,
'read_timeout' => 10000
),
'listener_timeout' => 300, //ัะบะพัะพััั ะพะฑัะฐะฑะพัะบะธ ัะพะฑััะธะน ะพั asterisk
);
๊ฐ๋ ์ ์ค์
๊ฐ๋ ์๋ ๋ค์ด์ค๋ ํธ์ถ์ ๋ชจ๋ํฐ๋งํ๊ณ Bitrix24์ ์ํธ ์์ฉ(์นด๋ ํ์, ์นด๋ ์จ๊ธฐ๊ธฐ ๋ฑ)ํ๋ Asterisk CallMeIn.php ์ด๋ฒคํธ ํธ๋ค๋ฌ ํ๋ก์ธ์ค๋ฅผ ์์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋ง๋ค ์ค์ ํ์ผ:
/etc/supervisord.d/callme.conf
[program:callme]
command=/usr/bin/php CallMeIn.php
directory=/var/www/pbx.vistep.ru
autostart=true
autorestart=true
startretries=5
stderr_logfile=/var/www/pbx.vistep.ru/logs/daemon.log
stdout_logfile=/var/www/pbx.vistep.ru/logs/daemon.log
์์ฉ ํ๋ก๊ทธ๋จ ์์ ๋ฐ ๋ค์ ์์:
supervisorctl start callme
supervisorctl restart callme
์ ์ฒญ ์ํ ๋ณด๊ธฐ:
supervisorctl status callme
callme RUNNING pid 11729, uptime 17 days, 16:58:07
๊ฒฐ๋ก
์๋นํ ์ด๋ ค์ ์ง๋ง ์๋ จ ๋ ๊ด๋ฆฌ์๊ฐ ์ฌ์ฉ์๋ฅผ ๊ตฌํํ๊ณ ๊ธฐ์๊ฒ ํ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค.
์ฝ์๋๋ก
์ง๋ฌธ, ์ ์ - ์๊ฒฌ์ ๋ณด๋ด์ฃผ์ญ์์ค. ๋ํ์ด ํตํฉ ๊ฐ๋ฐ์ด ์ด๋ป๊ฒ ์งํ๋์๋์ง์ ๊ด์ฌ์ด ์์ผ์๋ฉด ๋ค์ ๊ธฐ์ฌ์์ ๋ชจ๋ ๊ฒ์ ๋ ์์ธํ ๊ณต๊ฐํ๋ ค๊ณ ๋
ธ๋ ฅํ ๊ฒ์
๋๋ค.
์ถ์ฒ : habr.com