راهنمای جامع و تعاملی Asterisk

بخش اول: نصب و راه‌اندازی اولیه

در این بخش، سرور اوبونتو را آماده کرده و استریسک را از سورس‌کد نصب و سرویس اولیه را راه‌اندازی می‌کنیم.

۱.۱: به‌روزرسانی و نصب پیش‌نیازها

sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential git curl subversion wget libncurses5-dev libssl-dev libxml2-dev libsqlite3-dev libjansson-dev libuuid1 uuid-dev

۱.۲: دانلود و کامپایل استریسک

cd /usr/src/
sudo curl -O http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-21-current.tar.gz
sudo tar xvf asterisk-21-current.tar.gz
cd asterisk-21.*/
sudo contrib/scripts/install_prereq install
sudo ./configure
sudo make menuselect
sudo make
sudo make install
sudo make samples
sudo make config
sudo ldconfig

۱.۳: ایجاد کاربر و تنظیم دسترسی‌ها

sudo groupadd asterisk
sudo useradd -r -d /var/lib/asterisk -g asterisk asterisk
sudo usermod -aG audio,dialout asterisk
sudo chown -R asterisk:asterisk /etc/asterisk /var/{lib,log,spool}/asterisk /usr/lib/asterisk

۱.۴: راه‌اندازی سرویس

در فایل /etc/default/asterisk خطوط AST_USER و AST_GROUP را از حالت کامنت خارج کنید.

sudo systemctl restart asterisk
sudo systemctl enable asterisk
sudo systemctl status asterisk

بخش دوم: پیکربندی داخلی‌ها

در این بخش، دو داخلی SIP برای فروش (6001) و پشتیبانی (6002) ایجاد می‌کنیم.

۲.۱: ویرایش فایل pjsip.conf

محتویات زیر را در فایل /etc/asterisk/pjsip.conf کپی کنید.

[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0

[6001]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
auth=auth6001
aors=6001

[auth6001]
type=auth
auth_type=userpass
password=StrongPassword1!
username=6001

[6001]
type=aor
max_contacts=1

[6002]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
auth=auth6002
aors=6002

[auth6002]
type=auth
auth_type=userpass
password=StrongPassword2@
username=6002

[6002]
type=aor
max_contacts=1

۲.۲: ایجاد دایل‌پلن اولیه در extensions.conf

در این مرحله فقط تماس مستقیم بین داخلی‌ها را فعال می‌کنیم. این کد در مراحل بعد کامل‌تر خواهد شد.

[from-internal]
exten => 6001,1,Dial(PJSIP/6001,20)
exten => 6002,1,Dial(PJSIP/6002,20)
exten => 100,1,Answer() & Echo() & Hangup()

بخش سوم: ضبط مکالمات

با افزودن دستور MixMonitor، تماس‌های بین داخلی‌ها را به صورت خودکار ضبط می‌کنیم.

۳.۱: ویرایش extensions.conf

کانتکست [from-internal] را با کد زیر جایگزین کنید تا ضبط مکالمه فعال شود.

[from-internal]
exten => 6001,1,MixMonitor(${STRFTIME(${EPOCH},,%Y-%m-%d-%H-%M-%S)}_${UNIQUEID}.wav)
   same => n,Dial(PJSIP/6001,20)

exten => 6002,1,MixMonitor(${STRFTIME(${EPOCH},,%Y-%m-%d-%H-%M-%S)}_${UNIQUEID}.wav)
   same => n,Dial(PJSIP/6002,20)

exten => 100,1,Answer() & Echo() & Hangup()

۳.۲: بررسی فایل‌های ضبط شده

پس از برقراری تماس، فایل‌ها در مسیر /var/spool/asterisk/monitor/ ذخیره می‌شوند.

بخش چهارم: انتقال تماس (دایورت)

یک سیستم دایورت هوشمند با کدهای ویژه *72 (فعال‌سازی) و *73 (غیرفعال‌سازی) پیاده‌سازی می‌کنیم.

۴.۱: افزودن ماکرو و کدهای ویژه به extensions.conf

کدهای زیر را به انتهای فایل extensions.conf اضافه کنید.

[macro-dial-ext]
exten => s,1,Set(FWD_STATUS=${DB(CF/${ARG1})})
   same => n,GotoIf($["${FWD_STATUS}" = ""]?dial:forward)
   same => n(forward),Dial(Local/${FWD_STATUS}@from-internal,20)
   same => n,Hangup()
   same => n(dial),Dial(PJSIP/${ARG1},20)
   same => n,Hangup()

[feature-forward]
exten => *72,1,Answer()
   same => n,Read(FWD_TO_NUM,vm-enter-num-to-callfwd,10)
   same => n,Set(DB(CF/${CALLERID(num)})=${FWD_TO_NUM})
   same => n,Playback(saved) & Hangup()
exten => *73,1,Answer()
   same => n,DBdel(CF/${CALLERID(num)})
   same => n,Playback(call-fwd-deactivated) & Hangup()

بخش پنجم: استفاده از کالر آیدی

ماکروی dial-ext را کامل‌تر می‌کنیم تا قبل از اتصال، شماره تماس‌گیرنده را بخواند و قابلیت ضبط مکالمه را نیز در خود داشته باشد.

۵.۱: جایگزینی ماکروی dial-ext

ماکروی قبلی را پیدا کرده و آن را با نسخه کامل زیر جایگزین کنید.

[macro-dial-ext]
exten => s,1,Set(FWD_STATUS=${DB(CF/${ARG1})})
   same => n,GotoIf($["${FWD_STATUS}" = ""]?dial:forward)
   same => n(forward),Dial(Local/${FWD_STATUS}@from-internal,20)
   same => n,Hangup()
   same => n(dial),Answer()
   same => n,Playback(a-call-from)
   same => n,SayDigits(${CALLERID(num)})
   same => n,MixMonitor(${STRFTIME(${EPOCH},,%Y-%m-%d-%H-%M-%S)}_${UNIQUEID}.wav)
   same => n,Dial(PJSIP/${ARG1},20)
   same => n,Hangup()

بخش ششم: منوی تلفنی گویا (IVR)

یک منوی تلفنی با داخلی 700 می‌سازیم تا تماس‌گیرندگان بتوانند بین بخش فروش و پشتیبانی انتخاب کنند.

۶.۱: افزودن کانتکست IVR

کد زیر را به انتهای فایل extensions.conf اضافه کنید.

[ivr-menu]
exten => s,1,Answer()
   same => n(start),Background(custom/welcome-menu)
exten => 1,1,Goto(from-internal,6001,1)
exten => 2,1,Goto(from-internal,6002,1)
exten => i,1,Playback(pbx-invalid) & Goto(s,start)
exten => t,1,Playback(vm-goodbye) & Hangup()

۶.۲: ویرایش نهایی [from-internal]

در نهایت، کانتکست [from-internal] را با نسخه کامل زیر جایگزین کنید تا تمام قابلیت‌ها (ماکرو، کدهای ویژه و IVR) را شامل شود.

[from-internal]
include => feature-forward

exten => 6001,1,Macro(dial-ext,6001)
exten => 6002,1,Macro(dial-ext,6002)
exten => 700,1,Goto(ivr-menu,s,1)
exten => 100,1,Answer() & Echo() & Hangup()

بخش هفتم: اتصال به Zoiper

پس از اعمال تمام تغییرات در استریسک و بارگذاری مجدد دایل‌پلن (dialplan reload)، می‌توانید با Zoiper به سرور متصل شوید.

  1. Username / Login: 6001@YOUR_SERVER_IP
  2. Password: StrongPassword1!
  3. پس از اتصال، می‌توانید با شماره‌گیری 700 منوی تلفنی را تست کنید.

بخش هشتم: عیب‌یابی

این مشکل معمولاً به دلیل فایروال (در ویندوز یا سرور) یا تنظیمات اشتباه شبکه ماشین مجازی (باید Bridged Adapter باشد) رخ می‌دهد. ابتدا فایروال ویندوز/آنتی‌ویروس را موقتاً غیرفعال کنید.

مطمئن شوید که خط include => feature-forward در ابتدای کانتکست [from-internal] قرار دارد و کانتکست [feature-forward] به درستی در انتهای فایل کپی شده است.

مسیر فایل صوتی را بررسی کنید. فایل welcome-menu.wav باید دقیقاً در مسیر /var/lib/asterisk/sounds/custom/ قرار داشته باشد و دسترسی خواندن برای کاربر asterisk را داشته باشد.