Pregunta

Estoy desarrollando una aplicación de seguridad para el hogar. Una cosa que me gustaría hacer es girar automáticamente apagado y en función de si o no estoy en casa. Tengo un teléfono con WiFi que se conecta automáticamente a la red de mi cuando estoy en casa.

El teléfono se conecta y obtiene su dirección a través de DHCP. Aunque podría configurarlo para utilizar una dirección IP estática, preferiría no hacerlo. ¿Hay algún tipo de 'ping' o su equivalente en C # / .NET que puede tomar la dirección MAC de un dispositivo y dime si es o no es actualmente activo en la red?

Editar:. de software Para aclarar, estoy corriendo en un PC que me gustaría tener poder detectar el teléfono en la misma LAN

Editar Este es el código que se me ocurrió, gracias a la ayuda de spoulson. Se detecta con seguridad si o no cualquiera de los teléfonos que estoy interesado están en la casa.

private bool PhonesInHouse()
{

    Ping p = new Ping();
    // My home network is 10.0.23.x, and the DHCP 
    // pool runs from 10.0.23.2 through 10.0.23.127.

    int baseaddr = 10;
    baseaddr <<= 8;
    baseaddr += 0;
    baseaddr <<= 8;
    baseaddr += 23;
    baseaddr <<= 8;

    // baseaddr is now the equivalent of 10.0.23.0 as an int.

    for(int i = 2; i<128; i++) {
        // ping every address in the DHCP pool, in a separate thread so 
        // that we can do them all at once
        IPAddress ip = new IPAddress(IPAddress.HostToNetworkOrder(baseaddr + i));
        Thread t = new Thread(() => 
             { try { Ping p = new Ping(); p.Send(ip, 1000); } catch { } });
        t.Start();
    }

    // Give all of the ping threads time to exit

    Thread.Sleep(1000);

    // We're going to parse the output of arp.exe to find out 
    // if any of the MACs we're interested in are online

    ProcessStartInfo psi = new ProcessStartInfo();
    psi.Arguments = "-a";
    psi.FileName = "arp.exe";
    psi.RedirectStandardOutput = true;
    psi.UseShellExecute = false;
    psi.CreateNoWindow = true;

    bool foundone = false;
    using (Process pro = Process.Start(psi))
    {
        using (StreamReader sr = pro.StandardOutput)
        {
            string s = sr.ReadLine();

            while (s != null)
            {
                if (s.Contains("Interface") || 
                    s.Trim() == "" || 
                    s.Contains("Address"))
                {
                    s = sr.ReadLine();
                    continue;
                }
                string[] parts = s.Split(new char[] { ' ' }, 
                    StringSplitOptions.RemoveEmptyEntries);

                // config.Phones is an array of strings, each with a MAC 
                // address in it.
                // It's up to you to format them in the same format as 
                // arp.exe
                foreach (string mac in config.Phones)
                {
                    if (mac.ToLower().Trim() == parts[1].Trim().ToLower())
                    {
                        try
                        {
                            Ping ping = new Ping();
                            PingReply pingrep = ping.Send(parts[0].Trim());
                            if (pingrep.Status == IPStatus.Success)
                            {
                                foundone = true;
                            }
                        }
                        catch { }
                        break;
                    }
                }
                s = sr.ReadLine();
            }
        }
    }

    return foundone;
}
¿Fue útil?

Solución

Un enfoque diferente es el uso de herramientas y ping arp. Dado que los paquetes ARP sólo pueden permanecer en el mismo dominio de difusión, se puede hacer ping a la dirección de difusión de la red y cada cliente responderá con una respuesta ARP. Cada una de estas respuestas se almacenan en caché en su tabla ARP, que se puede ver con el comando arp -a. Así que el resumen:

rem Clear ARP cache
netsh interface ip delete arpcache

rem Ping broadcast addr for network 192.168.1.0
ping -n 1 192.168.1.255

rem View ARP cache to see if the MAC addr is listed
arp -a

Algunos de estos se puede hacer en código administrado, como en el System.Net.NetworkInformation espacio de nombres.

Nota: Si borra la memoria caché ARP puede tener un efecto sobre el rendimiento marginal de la red en la limpieza de las entradas de caché de otros servidores locales. Sin embargo, la caché se aclaró por lo general cada 20 minutos o menos de todos modos.

Otros consejos

Se podría utilizar el RARP protocolo para transmitir una petición de quién posee esa dirección MAC. El propietario responderá con su dirección IP. No sé de una herramienta RARP o biblioteca para recomendar, por lo que puede que no escribe su propio nivel de red para enviar / recibir estos paquetes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top