Описание правил Asterisk на примере

[from-external]
exten => h,1,Set(foo=${CURL(https://example.com/call/,state=idle&phone=${CALLERID(num)})})
exten => h,n,Hangup()
exten => _.,1,NoOp(${STRFTIME(${EPOCH},,%Y-%m-%d %H:%I:%S)})
exten => _.,n,NoOp(${DEVICE_STATE(SIP/${EXTEN})})
exten => _.,n,Set(fname=${STRFTIME(${EPOCH},,%Y-%m-%d %H:%I:%S)}-from-${CALLERID(number)})
exten => _.,n,MixMonitor(/var/log/asterisk/records/${fname}.wav)
exten => _.,n,Set(foo=${CURL(https://example.com/call/,state=ringing&phone=${CALLERID(num)})})
exten => _.,n(label0),GotoIf($[${DEVICE_STATE(SIP/${EXTEN})}=INUSE]?label2:label1)
exten => _.,n(label1),Dial(SIP/1001&SIP/1002,30,tTU(from-external-answer-script,${CALLERID(num)}))
exten => _.,n(label2),Dial(SIP/1004,20,tT)
exten => _.,n,Goto(label0)

[from-external-answer-script]
exten => s,1,Set(foo=${CURL(https://example.com/call/,state=offhook&phone=${ARG1})})
same => n,Return

В данном примере когда звонок поступает:

  1. отображается в логах дата в формате 2019-11-19 21:37:44
  2. отображается в логах статус абонента на которого ссылается звонок (${EXTEN} — в данной переменной передается номер абонента на который происходит вызов)
  3. создается переменная «fname» которой присваевается строковое значение: «дата и время»-«from»-«номер абонента который звонит»
  4. задается путь для записи звонка: «/var/log/asterisk/records/${fname}.wav» (${fname} — переменная на строку выше созданная)
  5. отправляется POST запрос на адрес «https://example.com/call/» с вложением «state=ringing&phone=${CALLERID(num)}» и ответ запроса присваивается переменной «foo»
  6. происходит условие если статус абонента на которого звонят равняется «INUSE» тогда перенаправляется на строку с именем «label2» иначе «label1»
  7. если строка «label1» тогда запускается функция, у пользователей 1001 и 1002 звонок  и ожидает подъема трубки. Если 30 секунд не подымается трубка происходит переход в строке «label2» и у пользователя 1004 звонит. Если 20 сек не подымается трубка происходит переход далее перенаправляется на строку «label0» и происходит условие в п.7
    1. при подъеме трубки в строке «label1» происходит вызов контекста «[from-external-answer-script]» (U() — данная функция указывает в третьем параметре Dial) и передается ему одна переменная с номером входящего абонента (${CALLERID(num)} — номер входящего абонента). Контекст «[from-external-answer-script]» отправляет запрос на адрес «https://example.com/call/» с вложением «state=offhook&phone=${ARG1}» (${ARG1} — первая переменная в которой номер вход., если больше одной переменной пишется: ${ARG2}, ${ARG3} и т.д.) и происходит возврат назад в контекст «[from-external]». «t» и «T» в третьем параметре Dial указывают на то, что абонент поднявший трубку может перевести звонок на другого пользователя.
  8. если строка «label2» и у пользователя 1004 звонит. Если 20 сек не подымается трубка происходит переход далее перенаправляется на строку «label0» и происходит условие в п.7
  9. после завершения разговора сработает первая строка контекста «[from-external]», отправит запрос на адрес «https://example.com/call/» с вложением «state=ringing&phone=${CALLERID(num)}» и ответ запроса присваивается переменной «foo» и затем завершается контекст.

 

Описание строки:

exten => _.,n,NoOp(${DEVICE_STATE(SIP/${EXTEN})})

_. — любой входящий номер

n — номер строки автоматически пронумеровываеться по порядку (в данном случае будет номер 2)

NoOp() — функция производит принт в логах (в данном случае статус который вызывают)

DEVICE_STATE() — функция которая возвращает статус пользователя в системе

${EXTEN} — вызываемый абонент

 

exten => h,1,Set(foo=${CURL(https://example.com/call/,state=idle&phone=${CALLERID(num)})})

h — срабатывает после того как положена трубка с одной из сторон. указывается в начале контекста, но срабатывает после завершения разговора.

1 — номер строки в порядке обработки

Set() — Функция в которой можно присваивать переменные

foo — создается переменная. в данном случае ей присваивается результат запроса

CURL() — функция которая производит http/https запросы; первый параметр: адрес страницы, если задан второй параметр передается методом POST

${CALLERID(num)} — номер входящего абонента