737 просмотров
от (510 баллов) в категории Тонкая настройка
Подскажите, как добавить SIP заголовок только для внутренних номеров? Понятно, что нужно копать в extensions, но у меня не получается добавить именно к внутренним номерам.

[dial_create_chan]

Если сюда добавить same => n,Set(PJSIP_HEADER(add,XXXXXXXX-MyHeader)=XXXXXXXXXXXXXXXXXXX)

То заголовок добавляется ко всем номерам.

Задача в том, что бы установить нужный SIP заголовок в INVITE для внутренних номеров. Буду благодарен в решении вопроса.

1 Ответ

от (122 тыс. баллов)

Что то вроде:

same => n,ExecIf($[ ${LEN(${CHANNEL(peername)})} == 3 && "${CHANNEL(channeltype)}" == "PJSIP" ]?Set(PJSIP_HEADER(add,X-Header)=XXXXXXX))

  • ${LEN(${CHANNEL(peername)})} == 3 - трехзначные номера
  • "${CHANNEL(channeltype)}" == "PJSIP" - проверка типа канала
от (510 баллов)
[2022-01-14 15:35:27] VERBOSE[823][C-00000255] pbx.c: Executing [s@dial_create_chan:6] ExecIf("PJSIP/404-0000049e", "0?Set(PJSIP_HEADER(add,X-Header)=XXXXXXX)") in new stack

но по факту, в инвайте через sngrep его нет

Как уже подсказали, в логе 0?, значит условие не было выполнено. Непонятно только по какой причине
от (122 тыс. баллов)

проверяйте каждое условие по отдельности:

same => n,NoOp( peername : ${CHANNEL(peername)})

same => n,NoOp(LEN: ${LEN(${CHANNEL(peername)})})

same => n,NoOp(channeltype: ${CHANNEL(channeltype)})

от (510 баллов)
[2022-01-14 15:52:02] VERBOSE[10715][C-00000279] pbx.c: Executing [s@dial_create_chan:3] NoOp("PJSIP/404-000004e5", " peername : ") in new stack

[2022-01-14 15:52:02] VERBOSE[10715][C-00000279] pbx.c: Executing [s@dial_create_chan:4] NoOp("PJSIP/404-000004e5", "LEN: 0") in new stack

[2022-01-14 15:52:02] VERBOSE[10715][C-00000279] pbx.c: Executing [s@dial_create_chan:5] NoOp("PJSIP/404-000004e5", "channeltype: PJSIP") in new stack
от (122 тыс. баллов)

мб попробовать вместо "CHANNEL(peername)" переменную "CALLERID(num)"

от (510 баллов)
Не совсем понятно, почему LEN = 0

??
от (122 тыс. баллов)

потому что "peername" не удалось получить

от (510 баллов)

CALLERID(num)" при таком раскладе, всегда получаю LEN = 13, вне зависимости от внутреннего или внешнего номера

от (122 тыс. баллов)

добавьте для отладки:

same => n,NoOp( CDR(src): ${CDR(src)} CHANNEL(peername): ${CHANNEL(peername)} CALERID(num): ${CALLERID(num)})

и выберите подходящую переменную. 

в моем случае нормально работает с "${CALLERID(num)}" и "${CDR(src)}"

от (510 баллов)

Да, ошибся в коде, поэтому выдавало некорректно. Но теперь другая проблема. Всегда определяется только внутренний номер. Т.е., если позвонить на городской к примеру с мобильного, ввести добавочный, то в {CALLERID(num) я получаю не номер с которого звонят, а вижу свой внутренний номер, который ввели в IVR. А должно быть наоборот.

от (510 баллов)

Если всё это запихать в [internal-users] , то номер определяется корректно, но в таком случае не отправляется SIP заголовок. И как я понимаю, он может быть отправлен только с  [dial_create_chan]

от (122 тыс. баллов)

через консоль asterisk подключите модуль:

module load app_dumpchan.so

добавьте в dialplan:

same => n,DumpChan()

анализируйте вывод на каждый случай отдельно. 

так можно определить наиболее подходящие переменные 

выше описанной информации достаточно для решения задачи

от (510 баллов)
Нашёл то, что нужно, но не могу понять как задействовать в качестве переменной. Пример вывода

Info:

Name=               PJSIP/404-000005f3

Type=               PJSIP

UniqueID=           mikopbx-1642161159.2173

LinkedID=           mikopbx-1642161150.2170

CallerIDNum=        404

CallerIDName=       ФИО

ConnectedLineIDNum= 9231234567

Как задействовать ConnectedLineIDNum в качестве переменной? Нифига не получается(
от (510 баллов)
В общем, разобрался. Привёл к такому виду:

[dial_create_chan]

exten => s,1,Gosub(lua_${ISTRANSFER}dial_create_chan,${EXTEN},1)

same => n,NoOp( peername : ${FROM_PEER}

same => n,NoOp(LEN: ${LEN(${FROM_PEER})})

same => n,NoOp(channeltype: ${CHANNEL(channeltype)})

same => n,ExecIf($[ ${LEN(${FROM_PEER})} != 3 && "${CHANNEL(channeltype)}" == "PJSIP" ]?Set(PJSIP_HEADER(add,X-Header)=XXXXXXX))

same => n,Set(pt1c_is_dst=1)

same => n,ExecIf($["${PT1C_SIP_HEADER}x" != "x"]?Set(PJSIP_HEADER(add,${CUT(PT1C_SIP_HEADER,:,1)})=${CUT(PT1C_SIP_HEADER,:,2)}))

same => n,Set(__PT1C_SIP_HEADER=${UNDEFINED})

same => n,Set(CHANNEL(hangup_handler_wipe)=hangup_handler,s,1)

same => n,return

Всё заработало как надо. Однако есть вопрос. Можно как-то не заменять файл полностью а добавить это в конец? Суть в том, что бы при изменении в учётках каждый раз не обновлять файл вручную.
от (122 тыс. баллов)

Возможность есть, но это уже задача со звездочкой. 

Через кастомизацию системных файлов можно попробовать переопределять extensions.lua

lua_dial_create_chan

lua_transfer_dial_create_chan

Вот пример переопределения:

extensions["lua_transfer_dial_create_chan"] = {

    ["lua_dial_create_chan"] = function event_transfer_dial_create_chan()

    local data = {}

    data['transfer_UNIQUEID'] = get_variable("transfer_UNIQUEID");

    data['dst_chan']  = get_variable("CHANNEL");

    data['action']    = "transfer_dial_create_chan";

    data['linkedid']    = get_variable("CHANNEL(linkedid)");

    local is_pjsip = string.lower(data['dst_chan']):find("pjsip/") ~= nil

    if(is_pjsip) then

        data['dst_call_id']       = get_variable("CHANNEL(pjsip,call-id)");

    end

    set_variable("CHANNEL(hangup_handler_wipe)", 'hangup_handler,s,1');

    userevent_return(data)

    return data;

end;

 -- Forbidden to describe contexts defined in extensions.conf. This will cause a crash asterisk.

};

важно, оставить код типовых наших функций, иначе сломаете логирование истории звонков

от (122 тыс. баллов)
на Lua можно повторить ваш dialplan
от (510 баллов)
Если вас не затруднит, можно более детально? Ну а если скините готовое решение, будет вообще супер)
от (122 тыс. баллов)
в рамках форуме нет, тут уже не так просто, сейчас нет на это свободного времени пример выше привел, его можно использовать как основу
На этом сайте можно бесплатно задать вопрос разработчикам MikoPBX и другим членам сообщества. Время ответа не регламентированно, но мы стараемся несколько раз в день заглядывать сюда. Для срочного решения проблем обращайтесь на платную линию поддержки

Популярные теги

askozia входящие-вызовы настройка исходящие маршрутизация провайдер запись-разговоров входящие ivr исходящие-звонки обновление ошибка очередь провайдеры битрикс24 очередь-вызовов переадресация запись установка маршрут история-звонков mikopbx транк панель-телефонии-1с перевод-вызова перевод askozia7 askozia6 битрикс callerid интеграция голосовая-почта логи перехват-вызова ростелеком нерабочее-время факс модуль nat docker запись-разговора веб-интерфейс bitrix24 goip настройка-провайдер история диалплан почта журнал-звонков релиз gsm вызовы звонок внешние-номера web-интерфейс zabbix маршруты cdr sip панель pjsip переадресация-мобильный voicemail ascozia телефонная-книга аон мобильный звонков лицензирование вызовов редактор номер asterisk лицензия ami регистрация оповещения провайдеров время голосовая fax trunk разговоров группы-пользователей #mikopbx пропущенные-звонки донабор beeline monitoring тишина smtp cisco мобильные мультифон мегафон шлюз не-работает электронная-почта не-слышно-звук

2.8 тыс. вопросов

2.4 тыс. ответов

6.7 тыс. комментариев

465 тыс. пользователей

...