Frage

Ich entwickle eine Home-Security-Anwendung. Eine Sache, Ich mag würde tun, ist es automatisch aus- und wieder einschalten, basierend auf, ob ich zu Hause bin. Ich habe ein Telefon mit Wifi, die automatisch zu meinem Netzwerk verbindet, wenn ich zu Hause bin.

Das Telefon verbindet und erhält seine Adresse über DHCP. Während ich es so konfigurieren, könnte eine statische IP zu verwenden, würde ich eher nicht. Gibt es eine Art ‚Ping‘ oder gleichwertig in C # / .Net, das die MAC-Adresse eines Geräts nehmen und sagen Sie mir, ob es im Netzwerk gerade aktiv ist?

Edit:. Um zu klären, ich bin mit Software auf einem PC, dass ich möchte in der Lage sein das Telefon auf dem gleichen LAN zu erkennen

Edit: Hier ist der Code, dass ich kam mit, dank spoulson Hilfe. Es erkennt zuverlässig, ob irgendeine der Telefone ich im Haus sind interessiert bin.

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;
}
War es hilfreich?

Lösung

Ein anderer Ansatz ist ping und arp Werkzeuge zu benutzen. Da ARP-Pakete nur in der gleichen Broadcast-Domäne bleiben können, können Sie Ihr Netzwerk-Broadcast-Adresse anpingen und jeder Kunde wird mit einer ARP-Antwort antworten. Jede dieser Antworten wird in Ihrer ARP-Tabelle zwischengespeichert, die Sie mit dem Befehl arp -a anzeigen können. So die heruntergekommenen:

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

Einige von ihnen können in verwaltetem Code, wie in der System.Net.NetworkInformation Namespace.

Hinweis: Löschen des ARP-Cache einen marginalen Einfluss auf die Netzwerkleistung kann durch das Löschen zwischengespeicherten Einträge von anderen lokalen Servern. Jedoch wird der Cache in der Regel alle 20 Minuten oder weniger ohnehin gelöscht.

Andere Tipps

könnten Sie verwenden das RARP-Protokoll eine Anforderung zu senden, die besitzt die MAC-Adresse. Der Eigentümer wird mit seiner IP-Adresse. Ich weiß nicht, von einem RARP-Tool oder Bibliothek zu empfehlen, so können Sie prüfen Ihre eigene Netzwerk-Layer-Schreiben / empfangen diese Pakete zu senden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top