Прослушивание ответа UDP от средства визуализации DLNA с помощью BASH на WSL

Я пытаюсь написать скрипт для подключения к аудиорендереру DLNA.

В Интернете есть несколько статей, в которых содержится информация о том, как это сделать с помощью UDP и curl, однако в моем конкретном случае у меня возникают некоторые трудности.

Первым шагом является отправка многоадресного объявления UDP по сети для обнаружения устройств DLNA в сети.

Сообщение, отправляемое для обнаружения устройств:

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

Все строки в этом сообщении, отправленном через UDP, должны заканчиваться crlf строками, а последняя строка должна иметь дополнительные crlf в соответствии с этим статья

Кажется, все в порядке. И если сообщение выше находится в файле devicediscovery.txt предположительно можно использовать netcat для отправки этого сообщения:

cat devicediscovery.txt | nc -u -4 239.255.255.250 1900

239.255.255.250:1900 – это многоадресный адрес и порт, по которым обмениваются данными DLNA устройств.

Все это тоже выглядит нормально, однако, как указано в связанной статье, netcat игнорирует ответ от средства визуализации мультимедиа dlna, поскольку существует несоответствие IP-адресов, сообщение отправляется по многоадресному адресу dlna, хотя ответ приходит от маршрутизатор. В статье предлагается использовать tcpdump для захвата ответа, однако я работаю в Windows и использую Bash on Windows WSL, поэтому tcpdump недоступен, и такая техника может быть сложной при разработке скрипта для автоматизации соединения dlna.

Можно ли использовать два отдельных экземпляра netcat? Один экземпляр отправляет сообщение по многоадресному адресу dlna, а другой прослушивает ответ от маршрутизатора?

Я пытался заставить это работать, однако я не уверен, какой порт netcat должен слушать, чтобы услышать входящий ответ. Есть ли стандартный порт, который netcat должен прослушивать?

Я пробовал такие команды, как: nc -luv 192.168.0.1, однако получаю сообщение об ошибке Servname not supported for ai_socktype. Я пытался исправить это, играя с /etc/services, но безуспешно.

Какую команду я могу использовать и как я должен настроить систему для прослушивания ответа от поиска устройств dlna? Я хотел бы проанализировать ответ в сценарии, чтобы можно было автоматизировать соединение dlna.


person Duncan Gravill    schedule 25.09.2019    source источник
comment
Привет, просто наткнулся на это, когда искал что-то еще. Ответ отправляется как HTTP (через UDP, как вы говорите) на IP-адрес и порт, с которого было отправлено многоадресное обнаружение. Например, мой телевизор отправляет данные с порта 50050, поэтому ответ должен вернуться на этот порт.   -  person starfry    schedule 13.12.2019


Ответы (1)


Хотя вы упоминаете проблемы с DLNA, похоже, вы действительно спрашиваете, как лучше всего устранить эту проблему.

Сетевые карты не разрешают доступ к входящему трафику, если они не установлены в неразборчивом режиме. Из-за этого Netcat не сможет делать то, что вам нужно. Но вы можете использовать Wireshark для чтения трафика на интерфейсе. TCPdump и Wireshark тесно связаны и почти взаимозаменяемы.

https://www.wireshark.org/

Я бы порекомендовал использовать его для дальнейшего устранения неполадок. Выложите захват (не просто картинку) и покажите, где он не удался.

person frog2000    schedule 25.09.2019