Как я могу отправить пакет SSDP / UPNP и получить ответ?

#vb.net #sockets #tcp #upnp #ssdp

#vb.net #сокеты #tcp #upnp #ssdp

Вопрос:

Привет, ребята, я работаю над проектом.

В принципе, мне нужно иметь возможность извлекать результат пакета SSDP, чтобы найти IP-адрес моего Pioneer VSX AVR. Он отвечает на SSDP, который будет использоваться с официальными приложениями, и я работаю над приложением Windows, чтобы выполнить ту же сортировку.

Источник: http://github.com/cyanlabs/vsxremote

Что я знаю на данный момент…

  1. пакет необходимо отправить на ip 239.255.255.250

  2. Порт равен 1900, и AVR отвечает на Telnet / TCP 23/8102

  3. The description.xml находится по адресу 192.168.0.111:8080/description.xml

  4. Я пытался разобраться в этом коде, но, похоже, это не сработало. http://social.msdn.microsoft.com/Forums/vstudio/en-US/d7f53b79-80dc-46f7-96dd-fc3b7a28f8d4

  5. Запрос, который мне нужно отправить, это

     M-SEARCH * HTTP/1.1
    HOST: 239.255.255.250:1900
    ST:urn:schemas-upnp-org:device:MediaRenderer:1
    MAN: "ssdp:discover"
    MX: 1
      

Любая помощь была бы отличной. Спасибо.

Комментарии:

1. Вероятно, мне следует упомянуть, что у меня уже есть отсортированный фактический код telnet, мне просто нужно отсортировать запрос / ответ SSDP.

2. Итак … должен ли там быть вопрос? Если вам нужна помощь с пунктом # 4, вам нужно включить гораздо больше деталей, чем «похоже, не сработало».

3. Очевидно, что вопрос заключается в том, «Как я могу отправить пакет SSDP / UPNP и получить ответ?», как и заголовок.

4. Я исследовал в течение нескольких часов и не могу найти никакой информации, которая помогла бы мне с этой проблемой, этот код просто не работает … он ничего не возвращает.

5. «ничего не возвращает» — полезная информация, вы должны включить ее в вопрос. Я также предлагаю вам проверить с помощью wireshark, что А) ваш многоадресный пакет действительно отправлен и Б) ответ действительно приходит. Хорошим тоном было бы включить минимальный пример в фактическое сообщение: я не знаю, на какую из трех разных версий (в двух разных ссылках, которые у вас были) вы ссылаетесь. Единственное замечание, которое у меня есть, это то, что ответы могут быть короткими: ReceiveFrom() может блокировать ожидание дополнительных данных.

Ответ №1:

На основе выходных данных wireshark и связанного кода (оба из которых действительно должны быть в post):

Заголовок ДЛИНОЙ с содержимое не должен быть частью сообщения M-SEARCH. В конце также отсутствует пустая строка (vbCrLf) — и это в дополнение к CrLf, который отсутствует в конце строки CONTENT-LENGTH. Другими словами, каждая строка, включая последнюю, должна заканчиваться на «r n», а затем в конце должно быть дополнительное «r n». Пропуск пустой строки обычно приводит к тому, что устройства игнорируют ваше сообщение (поскольку они не могут точно знать, что оно завершено).

Фактическую спецификацию SSDP смотрите в архитектуре устройства UPnP, часть 1.

Комментарии:

1. Спасибо за ваш ответ, но, во-первых, «ДЛИНА содержимого» не является частью моего сообщения, это просто то, что показывает wireshark. То же самое касается отсутствующего CrLf. Я добавлю пустую строку и посмотрю, что произойдет.

2. Было бы действительно полезно, если бы вы опубликовали код, который вы на самом деле используете, чтобы не было никаких догадок: код, на который вы ссылаетесь, явно содержит «CONTENT-LENGTH: 0».

3. Спасибо, у меня все заработало :), Какой самый простой способ проанализировать эти данные? puu.sh/a2GOE/f046bb0380.png HTTP/1.1 200 OK CACHE-CONTROL: max-age= 1800 EXT: LOCATION: 192.168.0.111:8080/description.xml СЕРВЕР: KnOS / 3.2 UPnP /1.0 DMP / 3.5 ST: urn: schemas-upnp-org: service: AVTransport: 1 USN: uuid: 5F9EC1B3-ED59-79BB-4530-745e1c3206eb::urn: schemas-upnp-org:service: AVTransport: 1 Мне просто нужно извлечь IP-адрес из местоположения.