Страница 2 из 3

Re: PJSIP и match_header

Добавлено: 11 май 2018, 17:04
toOTOot
virus_net писал(а):
toOTOot писал(а):А вот в тестах они доверяли какому-то токену. Может я ошибаюсь, но ответа мне и там не дали пока что.
Вы ошибаетесь. В данном случае X-ASTERISK-TOKEN это просто строка добавленная функцией SIPAddHeader (как называете фун-ция для pjsip поищите сами).
Вы сами можете добавлять в SIP пакет такое. Например:

Код: Выделить всё

exten => s,n,SIPAddHeader(X-ASTERISK-TOKEN: ANYTHING_YOU_WANT_AND_ANYTHING_YOU_NEED)
exten => s,n,SIPAddHeader(X-orig-call-id: ${SIP_HEADER(Call-ID)})
exten => s,n,SIPAddHeader(X-unique-id: ${CHANNEL(uniqueid)})
Так же там нет скобок.
Я это прекрасно понимаю , но в случае с провайдером , я не могу на их стороне добавлять нужные мне заголовки. Провайдер тоже по моему запросу ничего добавлять не будет.
toOTOot писал(а):не в скобках проблема. конфиг то астериск парсит правильно
Парс конфига не в счет. Парсер одно, а сравнивание с reqexp другое.
Вы попробовали так как я предлагал выше ? Судя по всему нет...
Я пробовал еще до обращения на форум разные вариации и со скобочками , и без скобочек. Когда варианты уже кончились, тогда сюда пришел.

Я же говорю, если внимательно посмотреть на мою ошибку

Код: Выделить всё

[May  7 13:43:25] DEBUG[6124]: res_pjsip_endpoint_identifier_ip.c:174 header_identify_match_check: SIP message contains header 'To' but value '���▒�' does not match value ''<sip:123@ххх.ххх.ххх.ххх:5060>'' for endpoint 'toll_f_f-IN1'
'To' but value '���▒�' - это ровно то что астериск пытается прочитать из переменных заголовка. Пустое значение он там видит.
match value ''<sip:123@ххх.ххх.ххх.ххх:5060>'' - это то, что я указал в конфиге своем. Поставлю \ для якобы экранирования, впишет \. Уберу скобочки, пропадут скобочки. Оберну значение в кавычки , вообще получу match value ''"<sip:123@ххх.ххх.ххх.ххх:5060>''".

Re: PJSIP и match_header

Добавлено: 11 май 2018, 17:09
toOTOot
ded писал(а):PJSIP тоже получается дополнительной точкой отказа (как ни парадоксально), и его тоже надо изучать. Что и наблюдаем тут.
Имея хоть какой-то опыт с астериском pjsip изучить проще, чем камаильо с нуля. Особенно с его диалпланом на С и спецификой преобразования номеров. При желании и необходимости и его буду изучать, но пока pjsip более удобней мне применять.

Re: PJSIP и match_header

Добавлено: 11 май 2018, 17:21
virus_net
Попросил нашего разраба глянуть код со мной. Ну в выводе сообщения в лог 100% баг.
Вот этот кусок из кода atserisk 14-ой ветки:

Код: Выделить всё

        if (pj_strcmp(&pj_header_value, &header->hvalue)) {
                ast_debug(3, "SIP message contains header '%s' but value '%.*s' does not match value '%s' for endpoint '%s'\n",
                        c_header,
                        (int) pj_strlen(&header->hvalue), pj_strbuf(&header->hvalue),
                        c_value,
                        identify->endpoint_name); 
Преобразований указано 4-ре, а значений указано 5-ть. (int) pj_strlen(&header->hvalue) тут лишнее.
Вот в лог и попадает не совсем то что должно попадать.

Re: PJSIP и match_header

Добавлено: 11 май 2018, 17:38
ddkprog

Re: PJSIP и match_header

Добавлено: 11 май 2018, 17:46
toOTOot
Ну это в лог сообщения некорректно выдаются. Найти бы то место, где он заголовок звонка смотрит.
Если я брал из заголовка User-Agent: Cisco-SIPGateway/IOS-12.x
то все хорошо проходило. Если в этом же заголовке убирал последний символ , то тогда ошибка выглядела примерно так

Код: Выделить всё

[May  7 13:43:25] DEBUG[6124]: res_pjsip_endpoint_identifier_ip.c:174 header_identify_match_check: SIP message contains header 'User-Agent' but value 'Cisco-SIPGateway/IOS-12.x' does not match value ''Cisco-SIPGateway/IOS-12.'' for endpoint 'toll_f_f-IN1'
Вот тут получается как-то странно. Либо их парсер неправильно парсит строку с <> или еще какими-то спецсимволами. Либо у меня фантазия кончилась.

Re: PJSIP и match_header

Добавлено: 11 май 2018, 18:45
ddkprog

Код: Выделить всё

*c_value = '\0';
c_value++;
c_value = ast_strip(c_value);
/////////
const pjsip_hdr *hdr=&(rdata->msg_info.msg)->hdr.next, *end=&(rdata->msg_info.msg)->hdr;
for (; hdr!=end; hdr = hdr->next) {
ast_debug(3, "SIP message name '%*.s' : value '%*.s' \n", (int)pj_strlen(&hdr->name), pj_strbuf(&hdr->name), (int)pj_strlen(&hdr->hvalue), pj_strbuf(&hdr->hvalue));
}
///////

pj_header_name = pj_str(c_header);
вставьте этот код в header_identify_match_check
и покажите дебаг что там вообще в SIP прилетает

Re: PJSIP и match_header

Добавлено: 11 май 2018, 18:59
virus_net
ddkprog писал(а):все там верно
Виноват, каюсь.
Вот потому я и не лезу в PJSIP, т.к. для того чтобы играться с ним сейчас нужно понимать си код, чтобы разгребать баги.

Re: PJSIP и match_header

Добавлено: 14 май 2018, 15:05
toOTOot
ddkprog писал(а):

Код: Выделить всё

*c_value = '\0';
c_value++;
c_value = ast_strip(c_value);
/////////
const pjsip_hdr *hdr=&(rdata->msg_info.msg)->hdr.next, *end=&(rdata->msg_info.msg)->hdr;
for (; hdr!=end; hdr = hdr->next) {
ast_debug(3, "SIP message name '%*.s' : value '%*.s' \n", (int)pj_strlen(&hdr->name), pj_strbuf(&hdr->name), (int)pj_strlen(&hdr->hvalue), pj_strbuf(&hdr->hvalue));
}
///////

pj_header_name = pj_str(c_header);
вставьте этот код в header_identify_match_check
и покажите дебаг что там вообще в SIP прилетает
Это надо вписать в код и пересобрать астериск? то что между слешами?
Надо попробовать через пару дней. Сюда выложу результат.

Re: PJSIP и match_header

Добавлено: 14 май 2018, 19:44
ddkprog
еще можно попробовать логирование pjsip
https://blogs.asterisk.org/2016/02/24/d ... p-history/

pjsip set logger on
и скопируйте тот весь запрос который вам приходит

в это же время включите историю логирования
pjsip set history on
ловите входящий запрос(звонок)
и отключаете
pjsip set history off

после чего смотрите в истории ваш запрос
pjsip show history
и смотрите его подробно
pjsip show history entry 0
наверное это инвайт и будет первым номером тоесть entry 0

вывод инвайта в истории должен совпадать с выхлопом который должен показать и логер
можете оба пакета показать сюда

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

история же показывает уже декодированный SIP самими средствами pjsip библиотеки
и декодированный же пакет используется и в модуле идента в который у вас в поле To приходит мусором

есть мысли что у вас там utf какой нибудь в имени uri
но если оба будут нормальными
значит добавляйте мини патч и перекомпилируйте, возможно пакет портится уже где то по пути
либо сравним все три логирования патч+логер+историю в логе

Re: PJSIP и match_header

Добавлено: 19 май 2018, 00:43
ddkprog
окей гугл
удалите мой аккаунт с контентом