При настройке входящей маршрутизации часто возникает ситуация, когда провайдер предоставляет учетную одну запись SIP для нескольких купленных номеров телефонов.
К примеру у МИКО есть номера телефонов:
+7(495)229-30-42
+7(499)638-25-84
В интерфейсе MikoPBX создана только одна учетная запись «». Каждый номер телефона необходимо направить на свой маршрут, к примеру на различные IVR.
Тут к приходит на помощь , который провайдер может передавать при входящих звонках. Зная DID номер, можно для провайдера описать несколько входящие маршрутов, с различными DID, что позволит решить описанную выше задачу.
Как это работает
Для анализа звонков я обычно использую «». Вот пример запроса от провайдера при входящем:
[SIP-1622040384-incoming-custom]
exten => _[0-9*#+a-zA-Z][0-9*#+a-zA-Z]!,1,NoOp(------)
same => n,Set(toNum=${PJSIP_PARSE_URI(${PJSIP_HEADER(read,To)},user)})
same => n,ExecIf($["${toNum}" != "${EXTEN}"]?Goto(${CUT(CONTEXT,,1-3)},${toNum},1))
same => n,return
функция «PJSIP_HEADER» считывает значение заголовка «To»
функция «PJSIP_PARSE_URI» получает из значения заголовка поле «user», которое соответствует значению DID
Goto перемещает канал в начало, для повторной инициализации маршрута
"1-3" - означает, что нужно взять первые три слова из "SIP-1622040384-incoming-custom", по сути, нужно из этой строки получить все до "-custom", в старых версиях АТС может потребоваться скорректировать это правило
SIP-1622040384 - это ID учетной записи провайдера MikoPBX, можно подсмотреть в адресной строке браузера при редактировании учетной записи
Замена DID на произвольный
Следующий пример удобно применять, когда провайдер не предоставляет информации по номеру, на который пришел вызов, поступает информация только о логине. При этом, важно, чтобы одному логину соответствовал один DID.
Корректного DID нет ни в INVITE, ни в поле To, но при этом появился новый заголовок «x-roistat-phone».
[SIP-1622040384-incoming-custom]
exten => _[0-9*#+a-zA-Z][0-9*#+a-zA-Z]!,1,NoOp(------)
same => n,Set(toNum=${PJSIP_HEADER(read,x-roistat-phone)})
same => n,ExecIf($["${toNum}x" != "x" && "${toNum}" != "${EXTEN}"]?Goto(${CUT(CONTEXT,,1-3)},${toNum},1))
same => n,return
функция «PJSIP_HEADER» считывает значение заголовка «x-roistat-phone»
Goto перемещает канал в начало, для повторной инициализации маршрута
Манго офис
Получение номера, на который позвонил клиент из поля «Diversion»:
[SIP-1622040384-incoming-custom]
exten => _[0-9*#+a-zA-Z][0-9*#+a-zA-Z]!,1,NoOp(------)
same => n,Set(tmpDiversion=${PJSIP_HEADER(read,Diversion)})
same => n,ExecIf($["x${tmpDiversion}" != "x"]?Set(toNum=${CUT(CUT(tmpDiversion,>,1),:,2)}))
same => n,ExecIf($["${toNum}x" != "x" && "${toNum}" != "${EXTEN}"]?Goto(${CUT(CONTEXT,,1-3)},${toNum},1))
same => n,return
Более универсальный вариант:
[add-trim-prefix-clid-custom]
exten => _[0-9*#+a-zA-Z][0-9*#+a-zA-Z]!,1,NoOp(------)
same => n,Set(tmpDiversion=${PJSIP_HEADER(read,Diversion)})
same => n,ExecIf($["x${tmpDiversion}" != "x"]?Set(toNum=${CUT(CUT(tmpDiversion,@,1),:,2)}))
same => n,ExecIf($["${toNum}x" != "x" && "${toNum}" != "${EXTEN}"]?Goto(${contextID},${toNum},1))
same => n,return
Novafon (zadarma)
Получение номера, на который позвонил клиент из заголовка «CALLED_DID»:
[SIP-1622040384-incoming-custom]
exten => _[0-9*#+a-zA-Z][0-9*#+a-zA-Z]!,1,NoOp(------)
same => n,Set(toNum=${PJSIP_HEADER(read,CALLED_DID)})
same => n,ExecIf($["${toNum}x" != "x" && "${toNum}" != "${EXTEN}"]?Goto(${CUT(CONTEXT,,1-3)},${toNum},1))
same => n,return
В этом случае в строке «INVITE» описывается логин учетной записи, в вот DID уже описывается в заголовке «». Для корректной настройки достаточно в разделе добавить в конец файла «extensions.conf» следующие строки:
Для корректной настройки достаточно в разделе добавить в конец файла «extensions.conf» следующие строки: