Найдите IP-адреса локальных устройств на C # с помощью mDNS

У меня есть 3 камеры, MAC и IP-адреса которых мне неизвестны, и я хочу к ним подключиться.

Я подключил их к своему компьютеру с помощью кабеля UTP. Теперь мне нужно найти их IP-адреса, чтобы установить соединение. В API камеры указано, что вы можете использовать TCP / IP для получения видеопотока с камеры и использовать mDNS для поиска их IP-адресов.

Как я могу найти IP-адреса в C #?

(ПРИМЕЧАНИЕ: маршрутизатор не нужен и команда "arp -a" не работает)


person Community    schedule 29.04.2012    source источник
comment
Похоже, вам нужен учебник по mDNS на C #. Я не слишком знаком с этой технологией, но stackoverflow.com/a/210520/58074 выглядит многообещающим.   -  person dsolimano    schedule 29.04.2012
comment
Какие это камеры? Как подключить их все к компьютеру через кабель UTP без роутера?   -  person Ove    schedule 29.04.2012
comment
привет Уве, спасибо за помощь. они использовали вид службы, использующий mdns, чтобы найти ip, я прикрепляю интерфейс камеры к моему приложению, и мне тоже нужно подключиться к камере. маршрутизатор не требуется, когда вы просто подключаете камеру Zeroconf service discovery find camera.   -  person    schedule 29.04.2012


Ответы (2)


Отправка этого пакета mDNS, похоже, работает для моего приложения, в котором есть Raspberry Pi. Я думаю, что IP / порты специфичны для ZeroConf / Bonjour, который, кажется, широко используется, поэтому может работать с этими камерами.

public void sendDiscoveryQuery(string local_dhcp_ip_address)
{
    // multicast UDP-based mDNS-packet for discovering IP addresses

    System.Net.Sockets.Socket socket = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp);

    socket.Bind(new IPEndPoint(IPAddress.Parse(local_dhcp_ip_address), 52634));
    IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("224.0.0.251"), 5353);

    List<byte> bytes = new List<byte>();

    bytes.AddRange(new byte[] { 0x0, 0x0 });  // transaction id (ignored)
    bytes.AddRange(new byte[] { 0x1, 0x0 });  // standard query
    bytes.AddRange(new byte[] { 0x0, 0x1 });  // questions
    bytes.AddRange(new byte[] { 0x0, 0x0 });  // answer RRs
    bytes.AddRange(new byte[] { 0x0, 0x0 });  // authority RRs
    bytes.AddRange(new byte[] { 0x0, 0x0 });  // additional RRs
    bytes.AddRange(new byte[] { 0x05, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01 });  // _http._tcp.local: type PTR, class IN, "QM" question

    socket.SendTo(bytes.ToArray(), endpoint);
}

«Local_dhcp_ip_address» - это IP-адрес вашего компьютера. Ниже приведена трассировка wirehark для этого взаимодействия. Устройство реагирует напрямую на ваш компьютер.

введите описание изображения здесь

На этом этапе ARP -a должен работать. Вы также можете использовать GetIpNetTable.

person DAG    schedule 15.07.2019

На некоторых устройствах MAC-адрес напечатан на этикетке, возможно, на обратной стороне. Насколько я понимаю, они должны быть в кеше arp хотя бы один раз. Но этот кеш хранит только 5 (?) Записей, поэтому вам, возможно, придется обновить его или очистить перед подключением устройств или запуском инструмента настройки.

person sschrass    schedule 29.04.2012