WiFi Mapping Software: Footprint

WiFi signal propagation is tricky and unpredictable, mostly due to the the fact that radio waves begin to act like light beams at high frequencies.  This means that these signals can have shadows, reflections, and so on just like light would.  The only way to accurately generate a map of a WiFi transmitter is to actually go and measure the signal strength at each spot on a map.


 Since this would be very tedious, algorithms have been developed which simplify this process.  Interesting work on this subject can be seen here; it uses a mathematical method called Inverse DistanceWeighting (IDW).




 We made Footprint to create signal strength plots from NetStumbler data.  It seems like someone would have already done this, but when we last checked there really wasn't much out there.


You are welcome to download a copy of the Footprint code and start making your own maps.   In order to get it to work, you will need a couple items: 

Here's how it works:


Step 1: Gather data

You'll need to get NetStumbler running and talking to your WiFi card and also the GPS.  This has been documented elsewhere online, and we don't really have the time or space to get into the details here.  In some cases you may need to use special software in order for NetStumbler to "see" your particular GPS. 


Gathering your data, as simple as it sounds, is probably the most complicated step of the whole process here.  This is because there are a million different WiFi cards and another million different GPSes, and they are all different.  Contacting the GPS manufaturer might help a little, but most likely you are just going to have to buckle down for some serious Googling and tinkering. 


Once your GPS and Netstumbler are talking, and NetStumbler can see your WiFi card, start walking around the area you want to map.  Netstumbler should be recording data at this point, resulting in a text file you can save on your laptop.  A good speed for data gathering is probably about 1m/s or 5 MPH.  It's not that critical; if you gather too many data points, footprint will delete the redundant ones (the ones closer than one meter apart) anyway.


Once you have finished your sweep and saved your file, open it in a text editor and make sure the data looks good.  Here are some things to check for:

  • You should have a lot of data.  A two minute sweep should result in about 400 lines of text.
  • Your data must have valid looking latitude and longitude numbers, in decimal notation (not degrees/minutes/seconds).  Make sure these are not all zero, either; zeros mean there is something wrong with your GPS setup!
  • IMPORTANT: The "Sig" column (between "SNR" and "Noise") should have numbers between about 150 and 200.  The reason for this is that Footprint needs to operate on what are called "dB" or decibel values, which are negative numbers.  A lot of cards give a value that is the "dB" value plus 249, so Footprint is programmed to automatically subtract 249 from any value in the "Sig" column.  If your card is different, you will have to let Footprint know how to calculate a "dB" value by changing the $rssi_offset value around line 458 in the footprint.pl file.

 We've uploaded a sample NetStumbler file for you to play with and compare to your data.  It's called example.txt and is available here.


Step 2: Load the file into Footprint 

Put your netstumbler file and footprint.pl in the same directory, and open a command prompt.  If you run footprint.pl without any arguments, you should get an output like the following:


C:\Users\Joseph\Desktop\Clever things\Footprint>footprint.pl

# footprint.pl
# version 1.0, April 2008
# Synopsis: footprint.pl <file> [mac_address [mac_address [...]]]
# Example: footprint.pl data.txt 00:01:de:14:01:cc
# Accepts a netstumbler-generated text file containing a series of latitudes,
# longitudes, and RSSI values.
# If given just a filename, outputs a list of BSS MAC addresses from the file.
# If given a filename and one or more MACs, outputs a .png image with a signal
# plotmap of the data for those MACs.
# Map generation methodology, including the use of IDW (Inverse Distance
# Weighting) closely follows that shown in "A Toolkit for Automatically
# Constructing Outdoor Radio Maps" (Connelly, Liu, Bulwinkle, Miller & Bobbitt)
# http://www.cs.indiana.edu/surg/Publications/itcc2005_toolkit.pdf
# GIS calculations based on WGS84.
# Licensed for use under the GNU GPL
# Copyright (c) 2008 Joseph Sullivan


All very well and good.  If you get any errors at this point, it probably means that Perl is not installed, GD is not installed, or you didn't make the footprint.pl file executable (on Unix systems, you will need to type something lilke "chmod a+x footprint.pl".


Now let's take a look at the data we collected.  Give footprint the name of the NetStumbler file:


C:\Users\Joseph\Desktop\Clever things\Footprint>footprint.pl example.txt
Parsing data...
Parsed 498 BSS lines defining 6 unique APs
BSS MAC                 Datapoints      SSID
00:15:6d:54:aa:cc       98              PhilomathWiFi
00:13:10:9f:d3:a9       173             ALYRICA_SHOP
00:12:17:bf:70:e8       17              BlueBerry
02:15:6d:54:aa:d8       91
02:15:6d:54:aa:d9       91
00:50:f2:cf:2e:dc       28              MSHOME


You'll see we are detecting several stations.  You will need to decide which are of interest.  For our purposes, we are going to use the data we collected from the Alyrica parking lot; the ALYRICA_SHOP signal is our company WiFi network.  This network is identified with the MAC address 00:13:10:9f:d3:a9.  Notice that we have 173 measured data points from this network; since this was a three minute scan, this isn't bad.  If we only had a few points (like the BlueBerry network) we would need to re-scan under different conditions since we need a lot of data points in order to be able to make a reasonably nice map.  Low data point count for a particular network might mean that your WiFi card is having trouble hearing the network; it might just be to far away.


We're going to re-run Footprint, this time telling it to plot the ALYRICA_SHOP signal map.


C:\Users\Joseph\Desktop\Clever things\Footprint>footprint.pl example.txt 00:13:
Parsing data...done (173 points)
Deleting crowded points < 1.0 meter...104 points deleted. Point count now 69.
Checking data...done
Generating palette for signal image...done
Adding pseudo points and mapping far field image areas...100% (25 points added)
Creating track (datapoint location) file track_plot.png...done.
Plotting signal map...100%
Drawing legend...done.
track_plot.png, signal_plot.png created successfully
Size: 320 x 240 px
Image center: N 44.5434405463768, W -123.357207010145
Image topleft: N 44.546388125854, W -123.35917206313
Image bmright: N 44.5404929668997, W -123.35524195716
Simulated altitude: 300 m


as you can see, footprint made some calculations and created two map files for us.  Since example.txt is a relatively small plot, this only took a couple seconds.  For large maps, however, don't be surprised if your computer runs all night.


Let's take a look at the track_plot.png file first.  It looks like the image to the right, the one with all the white dots.


The squiggly line in the middle is a trace of where the user travelled when the data was being gathered. 


The white dots regularly spaced around the periphery are pseudo points created by Footprint.  They are points at which we assume the signal to be zero.  Since we can't measure the whole earth every time we generate a signal map, we use the assumption that signals all fade off to zero at some distance from our measurements.


Now for the actual plot map file, the one called signal_plot.png.  This is what you've been waiting for.  The legend across the top represents the spectrum of possible signal strengths.  As of version 1, you will have to look in the code in order to see which dB values correspond to which colors.  As with most things, however, green is good.


Step 3: Overlay on a Map

In order for your image to be particularly useful, you'll need to represent it on a map somewhere.  The easiest way to do this is to use Google Earth.


Open up Google Earth and add an image overlay (Ctrl+Shift+o).  Browse to the track_plot.png file and open it.


Now go to the Location tab and enter the North, South, East, and West coordinates for the image.  These are given by Footprint as "topleft" and "bmright" coordinates.   Since "top" is North and "right" is East on a map, we will use the following settings for our example file:


North 44.546388125854
South 44.5404929668997
East -123.35524195716

West -123.35917206313

Typing these values into Google, we get the map shown.  The map can now be zoomed, panned, or combined with other landmark data.


A few final notes:

  • If you are making a map that crosses both sides of zero degrees longitude (in other words, you are in some parts of the UK), there may be a program bug that causes trouble.  If you do find a bug, please let us know.
  • If you want to create a higher resolution map than the default, you can do so by changing the width and height parameters around line 40 in footprint.pl.
  • We want to know about any bugs you find.  Otherwise, we do not provide software support for free copies of this software.  If you want professional mapping services, let us know.  
  • If you want to turn off the legend, put a # sign in front of the word "$image..." around line 383 of footprint.pl