У меня такой сценарий:
2 UAC пытается разговаривать через удаленный SIP-сервер (openSER / Kamailio 3.1.3) = клиентская инфраструктура. Программное обеспечение UAC было разработано в локальной тестовой инфраструктуре с использованием Asterisk, где можно было установить нормальный вызов.
Проблема в том, что при тестировании клиентской инфраструктуры нет звука.
Я не знаю полной клиентской инфраструктуры, но из журналов / ответов сервера (поля Routing Header) можно сделать вывод, что есть прокси-сервер авторизации и CiscoSystem SIP GW, а также PSTN. И что немаловажно, мы за NAT, а клиент также за NAT. AFAIK там не используется STUN-сервер.
Основное различие в потоке вызовов заключается в том, что в тестовой инфраструктуре мы всегда получали 180 сообщений (звонков), а в клиентской инфраструктуре мы получали 183 Session in Progress. В логах видно, что оба устройства начинают отправлять потоки rtp, но звука по-прежнему нет.
Еще у меня есть коммерческое ПО, с которым мы тестировали клиентскую инфраструктуру, и оно работает. Мы сравнили сообщения, отправляемые коммерческим программным обеспечением и нашим клиентом, и почти никакой разницы.
Единственное отличие, которое мне удалось найти, это то, что в сообщениях после цикла inv / 407 / ack:
коммерческий софт:
начать новую новую ветку номер x
отправляет inv + auth string - branch / trans num x
получает ответ - ветвь / перевод x
отправить сообщение с подтверждением - ветка / номер транзакции x
наш клиент:
начать новую ветку с номером y
отправляет inv + auth string - branch / trans num y
получает ответ - ветвь / перевод
отправить сообщение с подтверждением - СВЕЖЕЕ новое отделение / транзакция - z
Может ли это быть причиной потери звука? Этот же сценарий нормально работает в Asterisk.
(Я предположил, что вовлеченные объекты являются устройствами RFC 3261 SIP, и проигнорировал взаимодействие с устройствами RFC 2543.)
Если задействованы NAT, самое первое, что вы должны проверить:
c=
заголовки в полезных данных SDPContact
заголовкиВ частности, все эти IP-адреса должны быть доступны другой стороне.
В ваших сценариях «после inv / 407 / ack» ACK для ответа, отличного от 2xx, должен иметь такой же branch
мне бы. Однако ответ 2xx прекращается транзакции INVITE, поэтому ACK на ответ 2xx будет иметь разные branch
к ПРИГЛАШЕНИЮ.
(Хотя конечно RFC 3261 это исчерпывающий ресурс по основам SIP, я считаю RFC 3665 чрезвычайно полезно, чтобы увидеть, как все работает.)