11

This kind of project has been done with Bluetooth before but the 30 foot range and extra battery consumption make me want to just ping the router instead of people's phones. I know that routers keep track of unique MAC address's for each device. I was hoping to register each phone's address and have the PI Periodically check the router to update a dynamic web page to display who is home.

I want to know if there is a reasonable way to pull this info with the PI.

Codiush
  • 121
  • 1
  • 6
  • what about wifi (ping the phones hostnames instead)? – user236012 Feb 23 '16 at 22:49
  • 2
    You could also assign static IP addresses from the router, then use nmap and the IP addresses to identify devices. – ArtOfCode Feb 24 '16 at 00:18
  • I have done something similar in C# on Windows here: http://stackoverflow.com/questions/2567107/ping-or-otherwise-tell-if-a-device-is-on-the-network-by-mac-in-c-sharp - I'd be happy to send you the most recent version code if you'd like. I don't know how useful C# is on a Raspberry Pi, but it should point you in the right direction. It reliably detects that I'm home before I even get in from the garage. – Aric TenEyck Feb 24 '16 at 03:59
  • I capture this + a whole lot more information by putting a bash script on the router that posts the results into a webserver every minute. With this sysem I monitor and manage internet uptime, connected clients, WAN IP's, fiber attenuation and power budget, VOIP services, wifi passwords etc. Mileage differs by your the CPU power of your router. – EDP Feb 24 '16 at 05:01
  • 1
    Screen scraping on the router? You could also upgrade to a Linuxbased router (openwrt) and simply log in and look in the arp cache. – Thorbjørn Ravn Andersen Feb 24 '16 at 09:39
  • @Cody that is a very cool project idea! I actually am thinking about doing something very similar. I want to have a display somewhere in the kitchen that shows how far everyone is from home based on GPS coords pulled from their android. – dmikester1 Feb 24 '16 at 20:53

5 Answers5

6

In order to track unique mac addresses on your Raspberry Pi, you need a tool (rather service) called arpwatch. I have used arpwatch on BSD extensively and it logs all arp and rarp requests into syslog.

From Syslog you can parse dates and times and mac addresses.

ARP works and table exists only on the physical network (technical word: collision domain). When a packet leaves for another network, the source mac address is replaced by router's mac address.

Running arp command on Raspberry Pi will only list mac + IP addresses of hosts who have transacted (IP communication) with the host on which the command is run (Raspberry Pi). It will not list mac addresses of other hosts on the network.

Another advanced way would be to use nmap on your Raspberry Pi to do a host discovery. You can use nmap -sP to ping all hosts on the network. It will tell you IP addresses of all active hosts on your network. Then you can run arp command to find out mac of who is active.

chetan@Linux:~$ nmap -sP 192.168.100.0/24

Starting Nmap 6.40 ( http://nmap.org ) at 2016-02-23 16:08 PST
Nmap scan report for 192.168.100.4
Host is up (0.0087s latency).
Nmap scan report for 192.168.100.58
Host is up (0.0024s latency).
Nmap scan report for 192.168.100.160
Host is up (0.049s latency).
Nmap scan report for 192.168.100.164
Host is up (0.063s latency).
Nmap done: 256 IP addresses (4 hosts up) scanned in 2.68 seconds
Chetan Bhargava
  • 1,262
  • 3
  • 15
  • 29
  • 1
    I think this is probably a much more robust and flexible method than the web scraping one. On many ISP issued routers the page that is supposed to show connected devices w/ info will not be reliable. – goldilocks Feb 24 '16 at 08:26
  • @goldilocks +1, yes, I thought about it after I upvoted the accepted answer. I assume they have a router that has a page for active connections (SPI status or similar). Nice router they have. – Chetan Bhargava Feb 24 '16 at 09:03
6

It is possible. I suggest you provide your script with login credentials and read the page that display the info. Then you could parse it's content and fill an array with the data you want. Since these pages sometimes contain more information like dates and time you could build a really nice log.

Here is a quick example on how I would proceed;

On your router's page you could find something like the following;

<div id="flex">
 <div id="dm-name">
  name : Your_device_name
 </div>
 <div id="dm-ip">
  IP : 192.168.x.xxx
 </div>
 <div id="dm-mac">
  <span>MAC:D4:04:CD:FE:5A:17</span>
 </div>
</div>

So we know wright that every device will be listed like that. And that all MAC adresse will have the same length.

The script could be something like that;

var string_to_parse = "file read from router.html";
cursor = 0;  // The position of your cursor;
i =0;
    while(cursor > 0){

    begin_at = string_to_parse.indeOf('MAC:');
    end_at = length_of_Mac; // this is standard for al mac

    mac[i] = string_to_parse.substring(begin_at, begin_at + end_at);
    cursor = begin_at + end_at;
i++;
    }

This code will need tweaking but the idea is there. Its a loop that will run all the file to find all Mac adresse. until it reach the end of the file.

MadeInDreams
  • 306
  • 1
  • 2
  • 10
4

I've just been playing around with the command line version of fing. It does a decent job of finding everything on the network and spitting out CSV files containing:

  • IP address
  • Custom Name of the Node (if you have assigned custom names in the .properties file)
  • The state (UP/DOWN)
  • The timestamp of last change
  • The host name (if you have enabled DNS)
  • The Hardware address (if you are discoverying a local network)
  • The Hardware vendor

Per previous answers, some text manipulation would be necessary to get the contents of the CSVs onto a web page, and be careful what you're publishing externally.

I've used the Android version pretty extensively and it does a good job of finding everything on my home network (and kind of fun to play with on public wifi).

goobering
  • 10,730
  • 4
  • 39
  • 64
3

The command arp will give you a list of devices connected to the network. You'll need to do some basic string manipulation to get the data you want, but that would certainly be easier than trying to get the information yourself.

Functionality note:

Some routers block this type of functionality by default, and yours may be configured as such. If it doesn't work, dig around it's documentation a little to check how to allow it.

SECURITY NOTE:

There are some very serious security implications of having a website that displays who's currently home. Please think very carefully about the security in place, and whether it's good enough for the risks involved.

Jacobm001
  • 11,898
  • 7
  • 46
  • 56
  • Good idea, I guess I withdraw my previous comment. – Ghanima Feb 23 '16 at 22:44
  • 1
    There are a couple of interesting looking caveats about using arp for this here. They suggest that devices might not show up if they haven't sent any packets to the arp-running device, and that a ping might be necessary. – goobering Feb 23 '16 at 23:49
  • @goobering +1. simply running arp command will not list all the active hosts on the network. Arpwatch will log all arp packets on the network. – Chetan Bhargava Feb 23 '16 at 23:58
1

It is possible to do, and other people have suggested some good methods. I wrote a python script a few years back to screen scrape this information from a netgear router and threw it up on github. It can be found here. It is crude, and looking at it now I would redo it somewhat differently, but it worked for pretty much the exact same purpose as you are after for a couple of years until I moved.

Ed.
  • 111
  • 1