====== Маршрутизация звонков по DID ====== [[faq:|Обратно к инструкциям]] ===== Введение ===== При настройке входящей маршрутизации часто возникает ситуация, когда провайдер предоставляет учетную одну запись SIP для нескольких купленных номеров телефонов. К примеру у МИКО есть номера телефонов: * +7(495)229-30-42 * +7(499)638-25-84 В интерфейсе MikoPBX создана только одна учетная запись "[[:providers|Провайдер телефонии]]". Каждый номер телефона необходимо направить на свой маршрут, к примеру на различные IVR. Тут к приходит на помощь [[https://ru.wikipedia.org/wiki/DID | DID номер]], который провайдер может передавать при входящих звонках. Зная DID номер, можно для провайдера описать несколько входящие маршрутов, с различными DID, что позволит решить описанную выше задачу. ===== Как это работает ===== Для анализа звонков я обычно использую "[[faq:sngrep|приложение Sngrep]]". Вот пример запроса от провайдера при входящем: INVITE sip:84996382584@93.188.XX.XX SIP/2.0 Via: SIP/2.0/UDP 81.88.86.65:5060;branch=z9hG4bK1cf7.16247c44.0;cid=2 Max-Forwards: 67 Contact: To: From: "79260577653";tag=5e1a5a28 Call-ID: JUm-E_ISk4DPaL8Npv2Hlw.. CSeq: 1 INVITE Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, UPDATE, UPDATE, INFO, REFER, MESSAGE Content-Type: application/sdp Supported: replaces User-Agent: Softswitch3 Content-Length: 351 При получении такого пакета, MikoPBX проанализирует первую строку с ключевым словом "**INVITE**", значение "**84996382584**" и будет являться **DID** номером. ===== Возможные проблемы ===== ==== DID в заголовке To ==== На практике, не всегда все так просто. К примеру я встречал провайдера, который присылает следующий INVITE: INVITE sip:mikoteam@93.188.XX.XX SIP/2.0 Via: SIP/2.0/UDP 81.88.86.65:5060;branch=z9hG4bK1cf7.16247c44.0;cid=2 Max-Forwards: 67 Contact: To: From: "79260577653";tag=5e1a5a28 Call-ID: JUm-E_ISk4DPaL8Npv2Hlw.. CSeq: 1 INVITE Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, UPDATE, UPDATE, INFO, REFER, MESSAGE Content-Type: application/sdp Supported: replaces User-Agent: Softswitch3 Content-Length: 351 В этом случае в строке "INVITE" описывается логин учетной записи, в вот DID уже описывается в заголовке "To". Для корректной настройки достаточно в разделе [[:custom-files|Кастомизация системных файлов]] добавить в конец файла "extensions.conf" следующие строки: [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}"]?Gosub(${CUT(CONTEXT,,1-3)},${toNum},1)) same => n,return - функция "**PJSIP_HEADER**" считывает значение заголовка "**To**" - функция "**PJSIP_PARSE_URI**" получает из значения заголовка поле "**user**", которое соответствует значению DID - Gosub перемещает канал в начало, для повторной инициализации маршрута - **SIP-1622040384** - это ID учетной записи провайдера MikoPBX, можно подсмотреть в адресной строке браузера при редактировании учетки ==== DID произвольном заголовке ==== Такое встречается при использовании сервиса **roistat**. Сервис при входящем может прислать следующий запрос: INVITE sip:mikoteam@93.188.XX.XX SIP/2.0 Via: SIP/2.0/UDP 81.88.86.65:5060;branch=z9hG4bK1cf7.16247c44.0;cid=2 Max-Forwards: 67 Contact: To: From: "79260577653";tag=5e1a5a28 Call-ID: JUm-E_ISk4DPaL8Npv2Hlw.. CSeq: 1 INVITE Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, UPDATE, UPDATE, INFO, REFER, MESSAGE Content-Type: application/sdp Supported: replaces User-Agent: Softswitch3 x-roistat-phone: 84996382584 Content-Length: 351 Корректного DID нет ни в **INVITE**, ни в поле **To**, но при этом появился новый заголовок "x-roistat-phone". Для корректной настройки достаточно в разделе [[:custom-files|Кастомизация системных файлов]] добавить в конец файла "extensions.conf" следующие строки: [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}"]?Gosub(${CUT(CONTEXT,,1-3)},${toNum},1)) same => n,return - функция "**PJSIP_HEADER**" считывает значение заголовка "**x-roistat-phone**" - Gosub перемещает канал в начало, для повторной инициализации маршрута ==== Манго офис ==== Получение номера, на который позвонил клиент из поля "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}"]?Gosub(${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}"]?Gosub(${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}"]?Gosub(${CUT(CONTEXT,,1-3)},${toNum},1)) same => n,return [[faq:|Обратно к инструкциям]]