Построение сообщения SDP?
Вопрос
Мне было интересно, может ли кто-нибудь указать мне на хороший учебник о том, как создать SDP-сообщение.
Я прочитал основы и могу сконструировать и понять параметры, но, похоже, я просто не могу заставить это работать.
Я либо получаю неприемлемый здесь ответ, либо вообще не получаю ответа, это после того, как я получу 100 попыток и 180 ответных звонков.
Итак, мой SIP работает, но ему не нравятся данные SDP.
В настоящее время он сконструирован следующим образом:
String sdpData = "v=0\r\n"
+ "o=- 019078020 0"
+ " IN IP4 sip.ciceronetworks.com\r\n" + "s=MySession\r\n"
+ "c=IN IP4 sip.ciceronetworks.com\r\n"
+ "t=0 0\r\n" + "m=audio 6002 RTP/AVP 0\r\n"
+ "a=sendrecv\r\n" + "a=rtpmap:0 PCMU/8000\r\n" + "a=ptime:20\r\n"+ "a=fmtp:97 mode=20\r\n";
byte[] contents = sdpData.getBytes();
request.setContent(contents, contentTypeHeader);
И пока я получаю 100 попыток, затем 180 звонков, но когда я принимаю вызов на другом конце, я вообще ничего не получаю в ответ, кажется, это просто сбой, я также получаю "Ошибку аудиоустройства" на клиенте ПК, которому я пытаюсь позвонить.
У кого-нибудь есть идеи?
Решение
Проблема мог быть очень простым:Кажется, вы забыли перевод строки после «a=sendrecv».:-)
В любом случае, вот совет:В целях тестирования вам, вероятно, лучше использовать какой-либо инструмент, а не сразу приступать к написанию частей протокола.Вы можете использовать глоток для этой цели он является отличным инструментом для тестирования SIP-сетей.Кроме этого, вы, конечно, можете просто прослушать сетевой трафик между двумя работающими SIP-устройствами и посмотреть, чем он отличается от вашего трафика.
РЕДАКТИРОВАТЬ:
Я пропустил это раньше:Вы должны опустить a=fmtp:97 mode=20
, так как описание сеанса недействительно:Вы можете использовать атрибут параметра формата только для кодеков, упомянутых в строке мультимедиа.Кодеки идентифицируются по номеру типа полезной нагрузки (0=PCMU, 8=PCMA, 18=G723, ...).Некоторые кодеки не имеют официально присвоенных номеров, для них следует использовать динамический диапазон 96–127:пользовательские агенты могут свободно назначать номера в этом диапазоне через rtpmap
атрибут.Таким образом, если вы не укажете, какой кодек вы подразумеваете под 97, другой пользовательский агент не сможет узнать, к какому кодеку следует применять параметры формата.
Другие советы
Паприка - это правильно:параметр a = fmtp: 97 mode= 20 просто неверен (и выглядит так, как будто это часть предложения кодека iLBC).Вы предложили не кодек 97, а кодек 0 (PCMU).
Обратите внимание, что a = fmtp: 97 не должно причинить вам вреда, это просто ложь.
Наиболее вероятная проблема заключается в том, что вы не являетесь sip.ciceronetworks.com - т. е.в ваших строках c = (и m = line) сказано "отправьте мой носитель на порт 6002 по адресу sip.ciceronetworks.com".Я подозреваю, что IP-адрес вашего компьютера не совпадает с sip.ciceronetworks.com, и / или между вами и другим концом есть брандмауэр / NAT.
Вероятно, это не ваша проблема, но строка o = неверна в соответствии со спецификацией От RFC 4566:
o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
Заставить VoIP работать не так просто, как следует из RFC или объяснений в кулинарной книге....
Я нашел хорошую статью, посвященную SDP (протокол описания сеанса).Он также связан с SDK, который называется Ozeki VoIP SIP SDK.Если вы объедините эти вещи, вы сможете создать, например, программный телефон.
Также есть краткое описание СДП.
Работа с SDP в VoIP SIP-вызовах — интересная тема для тех, кто хочет разработать собственное приложение для программного телефона или веб-телефона или что-то еще по вашему желанию.
SDP описывает сеанс мультимедийной связи с целью объявления сеанса, приглашения на сеанс и согласования параметров.
Использование SDK может снять с плеч много бремени, поскольку обеспечивается гибкость и высокая совместимость.
Для получения дополнительной информации о SDP в связи с SDK для создания собственных приложений вы можете просмотреть упомянутую статью, если ищете в Google:«Работа с SDP при VoIP SIP вызовах»