Ответы пользователя по тегу Asterisk
  • Как в очереди отслеживать не отвеченные звонки?

    @dronmaxman
    VoIP Administrator
    может быть NO ANSWER да же, если кто-то ответил на звонок.

    Логично, допустим в очереди 3 агента, один ответил на звонок а остальные естественно нет, а проверку ты делаеш в hangup, а для 3х агентов будет 3 хенгапа)

    Надо делать через handler. Надо переписать начало звонка и перед вызовом queue вставить handler такого вида.

    ;; Это надо вставить перед вызовом очереди 
    same => n,Set(CHANNEL(hangup_handler_push)=hdlr-queue-miss-call,s,1(${CALLERID(num)})
    
    [hdlr-queue-miss-call]
    exten => s,1,Noop(---==== Handler queue miss call ===---)
    same => n,Set(CLIENT_NUMBER=${ARG1})
    same => n,GotoIf($[${ABANDONED}]?:end_call)
    same => n,AGI(tg-noanswer.php, ${CLIENT_NUMBER}, ${STRFTIME(${EPOCH},,%Y.%m.%d--H:%M:%S)})
    same => n(end_call),Hangup()
    Ответ написан
    7 комментариев
  • Как сделать звонки на внутренние 3 и 4-х значные?

    @dronmaxman
    VoIP Administrator
    На самом деле лучше писать как можно более четкие правила, а не универсальные.

    [local]
    exten => _0[1-9]XXX,1,Noop
     same => n,Set(CALLEID(num)=08${CALLRID(num)})
     same => n,Dial(SIP/SecretLine/${EXTEN},15,Tt)
     same => n,HangUp()
    
    exten => _0[1-9]XXXX,1,Noop
     same => n,Set(CALLEID(num)=08${CALLRID(num)})
     same => n,Dial(SIP/SecretLine/${EXTEN},15,Tt) same => n,HangUp()
    Ответ написан
    Комментировать
  • Как организовать запись входящих/исходящих звонков определенных абонентов?

    @dronmaxman
    VoIP Administrator
    Мой пример.

    [internal]
     same => _XXX.,Dial(SIP/${EXTEN},60,WwtTrU(sub-mixmonitor,${CALLERID(num)},${EXTEN},${UNIQUEID}))
     same => n,HangUp() 
    
    [sub-mixmonitor]
    exten => s,1,Noop(------------MixMonitor---------------)
    ; same => n,DumpChan()
    ; same => n,NoCDR()
     same => n,Noop(DIALEDPEERNUMBER ${DIALEDPEERNUMBER} )
     same => n,Set(FILE_UNIQUEID=${ARG3})
     same => n,Noop(UNIQUEID = ${FILE_UNIQUEID})
     same => n,GotoIf($[${DB_EXISTS(RECORD/${ARG1})}]?go-record)
     same => n,GotoIf($[${DB_EXISTS(RECORD/${ARG2})}]?go-record)
     same => n,Goto(end_sub)
     same => n(go-record),Set(WAV=/var/spool/asterisk/monitor/${FILE_UNIQUEID})
     same => n,Set(filedate=${STRFTIME(${EPOCH},,%Y%m%d_%H-%M-%S)})
     same => n,Set(foldername=${STRFTIME(${EPOCH},,%Y/%m)})
     same => n,Set(filename=${filedate}_${ARG1:-10}_${ARG2:-10}_${FILE_UNIQUEID})
     same => n,Set(MP3=/var/spool/asterisk/monitor/mp3/${foldername}/${filename})
     same => n,System(mkdir -p /var/spool/asterisk/monitor/mp3/${foldername})
     same => n,Set(monopt=nice -n 19 /usr/bin/lame -b 32  --silent "${WAV}.wav"  "${MP3}.mp3" && rm -rf "${WAV}.wav" && chmod o+r "${MP3}.mp3")
     same => n,Noop(${CDR(record)})
     same => n,Noop(CHANNEL ${CHANNEL(exten)})
     same => n,Set(CDR(realdst)=${ARG2});
     same => n,Set(CDR(record)=${FILE_UNIQUEID})
     same => n,Set(CDR(recordingfile)=${filename}.mp3)
     same => n,MixMonitor(${WAV}.wav,b,${monopt})
     same => n(end_sub),return
    Ответ написан
    Комментировать
  • Астериск, как звонить с нужного транка?

    @dronmaxman
    VoIP Administrator
    exten => _0[1-3]XXX,1,Noop(---- call to AST A1 ----)
     same => n,Set(CALLEID(num)=02${CALLRID(num)}) ;; Подменяем номер звонящего, что бы работал обратный звонок
     same => n,Dial(SIP/trunkA1/${EXTEN:3},15,Tt)
     same => n,HangUp() ;; Обрываем звонок по окончании или если произошла ошибка что бы не звонить в пожарную службу
    Ответ написан
    4 комментария
  • Как различить двух операторов на одном телефоне?

    @dronmaxman
    VoIP Administrator
    Необходимо их различать.

    Что бы различать в cdr, можно задействовать доп поле userfield

    1500 - допустим внутренний номер оператора
    *220 - номер по которому операторы меняют свое имя каждое утро, можно добавить проверку что бы они не забывали это делать.
    
    [app-register-operator]
    exten => _*220,1,Answer
     same => n,Noop(-------app-register-operator----)
     same => n,Set(MYPIN=NOPIN)
     same => n,Read(${MYPIN},enterPin,,,4,15)
     same => n,Goto(go-${MYPIN})
     same => n(go-2232,Noop(------register-ping-${MYPIN}------)
     same => n,Set(DB(AOPERATOR/1500)="Operator1")
     same => n,HangUP()
     same => n(go-3321),Noop(------register-ping-${MYPIN}------)
     same => n,Set(DB(AOPERATOR/1500)="Operator2")
     same => n,HangUP()
     same => n(go-NOPIN),Noop(------register-ping-${MYPIN}------)
     same => n,Set(DB(AOPERATOR/1500)="NotSet")
     same => n,HangUP()
    
    
    [dial]
    exten => _X.,1,Noop(----Internal-Call----)
     same => n,GotoIf($[${DB(AOPERATOR/${CALLERID(num)})}= NotSet]?:go-notset)
     same => n,Set(CDR(userfield)=${DB(AOPERATOR/${CALLERID(num)})}) ;; добавляем в CDR имя в специальное поле в DB cdr, или любое другое поле
     same => n,Dial(SIP/${EXTEN})
     same => n,HangUp()
     same => n(go-notset),PlayBack(phoneNotRegister_PleaseRegisterBeforeCall)
      same => n,HangUp()
    
    Добавить задание в крон которое будет скидывать значение после работы
    asterisk -rx "database put AOPERATOR 1500 NotSet"


    Через SIP можно заставить телефон перезагрузиться, соответственно написать app который будет по короткому номеру генерить новый конфиг для телефона и отправлять ему команду reboot.
    /etc/asterisk/sip_notify.conf
    Ответ написан
    Комментировать
  • Как перенести АТС на базе Asterisk в виртуальную среду?

    @dronmaxman
    VoIP Administrator
    Ответ написан
    Комментировать
  • Проверка на занятость линии и как лучше это сделать?

    @dronmaxman
    VoIP Administrator
    exten = s-BUSY,1,Playback(${CallisBusy})

    Не делай так, это устаревшая конструкция ломающая CDR. Не надо менять EXTEN.

    Для решения твоей проблемы, попробуй вот так. Я не тестировал этот код, написал из головы.

    Через MOH
    - создаешь папку с новым MOH, например тут /usr/share/asterisk/moh_busy
    - кладешь в эту папку два файла, 01_busy.slm и 02_ring.slm.
    - правишь musiconhold.conf, добавляешь

    [busy]
    mode=files
    directory=moh_busy

    не забудь сделать moh reload

    В результате Dial будет проигрывать файлы из этой директории (moh_busy) во время звонка по очереди.

    exten => _X.,1,NoOp(-------MAIN-DIALPLAN---------)
     same => n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "UNKNOWN"]?unknown)
     same => n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "INVALID"]?invalid)
     same => n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "UNAVAILABLE"]?unavailable)
     same => n,ExecIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "INUSE"]?SET(MOH_FILE=busy))
     same => n,ExecIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "BUSY"]?SET(MOH_FILE=busy))
     same => n,Dial(PJSIP/${EXTEN},60,m(${MOH_FILE}))
    ;; Unavailable
     same => n(unavailable),Noop(---Unavailable---)
     same => n,PlayBack(unavailable)
     same => n,HangUp()
    ;; Unknown
     same => n(unknown),Noop(----Unknown----)
     same => n,PlayBack(unknown)
     same => n,HangUp()
    ;; Invalid
     same => n(invalid),Noop(----Invalid----)
     same => n,PlayBack(invalid)
     same => n,HangUp()


    или так

    exten => _X.,1,NoOp(-------MAIN-DIALPLAN---------)
     same => n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "UNKNOWN"]?unknown)
     same => n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "INVALID"]?invalid)
     same => n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "UNAVAILABLE"]?unavailable)
     same => n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "INUSE"]?busy)
     same => n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "BUSY"]?busy)
     same => n,Dial(PJSIP/${EXTEN},60)
     same => n,HangUp()
     same => n(busy),Dial(PJSIP/${EXTEN},60,m(busy))
     same => n,HangUp()
    ;; Unavailable
     same => n(unavailable),Noop(---Unavailable---)
     same => n,PlayBack(unavailable)
     same => n,HangUp()
    ;; Unknown
     same => n(unknown),Noop(----Unknown----)
     same => n,PlayBack(unknown)
     same => n,HangUp()
    ;; Invalid
     same => n(invalid),Noop(----Invalid----)
     same => n,PlayBack(invalid)
     same => n,HangUp()
    Ответ написан
    7 комментариев
  • Asterisk strftime %B почему не пишет имя месяца на русском?

    @dronmaxman
    VoIP Administrator
    https://www.voip-info.org/asterisk-func-strftime/
    Все так, не умеет он по русски, хочешь ru - получай дату через внешний обработчик. Ставь русскую локаль, определяй переменную окружения bash export LC_TIME=ru_RU.UTF-8 и через data формируй нужную дату.

    Но имя месяца почему-то пишется на английском (%B)

    Русский язык признали международным?
    Ответ написан
  • Как использовать в качестве АТС Android с SIM картой?

    @dronmaxman
    VoIP Administrator
    https://itgala.xyz/uk/mobile-phone-as-gsm-gateway-...

    Можно через Bluetooth захватить звук, ссылка как пример, не обязательно использовать asterisk.
    Ответ написан
    6 комментариев
  • Blacklist в asterisk?

    @dronmaxman
    VoIP Administrator
    https://wiki.asterisk.org/wiki/display/AST/Hangup+...

    [sip]
    exten => _X.,1,NoOp(Checking CallerID against blacklist)
    same => n,Set(CHANNEL(hangup_handler_push)=hdlr-blacklist,s,1())
    same => n,GotoIf($[${DB_EXISTS(blacklist/${CALLERID(num)})}]?go-endcall)
    same => n,Set(records=/etc/asterisk/rec/${STRFTIME(${EPOCH},,%H_%M_%d-%m-%Y)}-${CALLERID(number)}-${EXTEN}.wav)
    same => n,MixMonitor(${records})
    same => n,Dial(SIP/1002,15)
    same => n(go-endcall),HangUp() 
    
    [hdlr-blacklist]
    exten => s,1,Verbose(0, -----hdlr-blacklist-----)
     same => n,Verbose(0, CDR BILLSEC is ${CDR(billsec)})
     same => n,Verbose(0, CDR disposition is ${CDR(disposition)})
     same => n,Set(CALLSTATUS="${CDR(disposition)}")
     ;same => n,ExecIf($[${CDR(billsec)}>5]?Set(CALLSTATUS="ANSWERED"):Set(CALLSTATUS="NO ANSWERED") ;; можно к времени звонка привязаться
     same => n,GotoIf($[${CALLSTATUS}="ANSWERED"]?:go-endcall)
     same => n,Verbose(0, CALLSTATUS is ${CALLSTATUS})
     same => n,Set(DB(blacklist/${CALLERID(num)})=1)
     same => n(go-endcall),Return()
    Ответ написан
  • Asterisk входящий вызов на несколько внутренних номеров?

    @dronmaxman
    VoIP Administrator
    указать внешний дублирующий номер - "внешний номер"

    В настройках exten можно укзать "Мобильный номер". Он никак не участвует во входящих звонках.

    Есть ещё идея создать outbound route для определенного внутреннего номера что бы станция звонила на этот же номер и на дополнительный- это возможно?

    Что такое станция? Перефразируй вопрос, не понятно что имеется в виду.

    Общий подход такой.
    Для входящих
    - делаем очередь, в нее добавляем внутриние номера
    - inbound router заворачиваем входящие звонки в эту очередь

    Для исходящих
    - создаем outbound route
    - в нем создаем шаблон номера (городского, мобильного)
    - в него же добавляем транки
    - так же в нем можно ограничить какие внутренние номера могут пользоваться этим маршрутом (outbound route)
    Ответ написан
    8 комментариев
  • Где chan_sip (Asterisk)?

    @dronmaxman
    VoIP Administrator
    Начиная с FreePBX 16 кажеться.
    Not recommended, but if you need to enable it, you can do so in Settings, Advanced Settings:
    Ответ написан
    Комментировать
  • Как изменить правило формирования имени файла аудиозаписи разговоров?

    @dronmaxman
    VoIP Administrator
    Ответ кроется в названии "override". Береш полность нужный контекст из extensions_additional.conf и копируешь и его в extensions_override_freepbx.conf потом вносишь нужные правки уже в extensions_override_freepbx.conf.
    Ответ написан
  • Можно ли в FreePBX позвонить использую заданный транк через Custom Destinations?

    @dronmaxman
    VoIP Administrator
    Там же все написано
    > This is the Custom Destination to be published. It should be formatted exactly as you would put it in a goto statement, with context, exten, priority all included. An example might look like:
    mycustom-app,s,1

    Заходим в /etc/asterisk/extensions_custom.conf и пишем свой контекст
    [custom-dial-trunk]
    exten => s,1,Noop(----Custom-Dial-Trunk---)
    same => n,Set(MY_EXTEN=77777777)
    same => n,Set(MY_TRUNK=77777777)
    same => n,Dial(SIP/${MY_EXTEN}@${MY_TRUNK},60,rTt)
    same => n,HangUP()

    Потом в Custom Destination
    Description = 123
    Target = custom-dial-trunk,s,1
    Ответ написан
  • Как настроить внешний звонок в Астериск с помощью call файла?

    @dronmaxman
    VoIP Administrator
    Делаешь контекст с playback
    [context-playback]
    exten => s,1,Noop(----PlayBack---)
     same => n,Answer()
     same => n,PlayBack(file)
     same => n,HangUp()

    и такой callfile, где 777777777 - номер телефона клиента.
    Channel: Local/7777777777@from-internal
    MaxRetries: 0
    WaitTime: 60
    Context: context-playback
    Extension: s
    Priority: 1
    Ответ написан
    5 комментариев
  • Как в FreePBX настроить голосовое приветствие для конкретного транка?

    @dronmaxman
    VoIP Administrator
    > Хочу сделать так, чтобы при входящем звонке на этот транк АТС поднимала трубку и проигрывала голосовое приветствие.
    В чем проблема сделать это штатными средствами?

    Создаешь группу или очередь, добавляешь в нее запись приветствия, переводишь звонки на эту группу.
    Ответ написан
  • Есть ли готовое решение для связи Asterisk и Битрикс24 (коробка)?

    @dronmaxman
    VoIP Administrator
    Есть пара бесплатный, но их надо дорабатывать под себя чуть-чуть.
    https://habr.com/ru/post/349316/
    https://habr.com/ru/post/518450/

    Конечно есть платные
    https://voxlink.ru/kb/integraciya-s-crm/integraciy...
    https://freepbx.bitrix24.site/

    > Интересует реализация именно со стороны Asterisk
    Есть два подхода которые я встречал.
    1) Через AMI, демон мониторит все события в AMI и дергает API битрикса (https://habr.com/ru/post/349316/).
    2) Через AGI, набор разных скриптов которые необходимо вставить в нужные места в диалплане, которые будут в нужный момент дергать API битрикса.

    По моему личному мнению, AGI проще в реализации, стабильнее, кушает меньше ресурсов и проще в обновлении при необходимости.
    Ответ написан
    Комментировать
  • Насколько прожорлив Asterisk?

    @dronmaxman
    VoIP Administrator
    Объем ресурсов asterisk всегда пропорцеонален количеству одновременных звонков с учетом кодека. Просто регистрация ничего не весет, а 200 одновременных звонов с транскодингом (конвертация из одного кодека в другой) - это уже нагрузка.

    В твоем случае, я бы расчитывал на 30 одновременных звонков максимум, без транскодинга + 1GB на web интерфейс.
    И ТОГО
    2 CPU
    min 3 GB RAM
    120 GB HDD

    У asterisk очень большое комьюнити, ты всегда сможешь найти ответ на любой вопрос.
    Ответ написан
    Комментировать
  • Как добавить SIPAddHeader для АОНа провайдера?

    @dronmaxman
    VoIP Administrator
    В настройках маршрута указать в поле Route CID номер линии и добавить в /etc/asterisk/extensions_custom.conf
    [macro-dialout-trunk-predial-hook]
    exten => s,1,SIPAddHeader(P-Asserted-Identity:${CALLERID(num)}@111.222.333.444:1234)
    exten => s,n,MacroExit()
    Ответ написан
  • Как сделать подстановку внутреннего номера?

    @dronmaxman
    VoIP Administrator
    [local_calls-p1]
    exten => _[1-9],1,NoOp(Call on local subscriber)
    same => n,Dial(PJSIP/10${EXTEN},30)
    same => n,Playback(kv-number&vm-isunavail)
    same => n,Hangup()
    
    exten => _[1-5][0,1-7],1,NoOp(Call on local subscriber)
    same => n,Dial(PJSIP/1${EXTEN},30)
    same => n,Playback(kv-number&vm-isunavail)
    same => n,Hangup()
    Ответ написан
    1 комментарий