I wrote an application to generate a wireless (802.11) heat map based on signal strength. The reason for it was to find the best place/area (for my laptop) to be with the highest signal strength. Below is a screenshot of the application (with the ESSID and BSSID removed for security reasons).
This heat map has about 100 samples in it, which are shown as white dots. There is a balcony at the top of the image and the common office area on the right, which was drawn by hand (hence the waviness). As you can see it has pinpointed the location of the access point in the red area.
Below is another heat map with the same points but on a different access point.
Even though I don’t have points of data on the neighbour’s office area, the algorithm has worked out the approximate area of the access point.
The application (which is tentatively named “wirelessheatmap”) is written in Python with the OpenGL library, pyglet. It relies on a wireless packet sniffer called airodump-ng from the Aircrack-ng suite of wireless tools. I also had to patch airodump-ng so that it writes the (later explained) CSV (comma-separated values) file more often.
After setting my Wi-Fi device to “monitor” mode, I run airodump-ng, listening on all channels. It writes a CSV file containing the signal strength of all access points from where my laptop is. With the patched version it updates this file every second. While airodump-ng is running, I also run the Python application with an image overlay containing the floor plan for reference.
To map out the points, I simply go to a location, wait a second or two for the signal strength to stabilize and for the CSV file to be updated. In the application, I click on my location on the floor plan map, then the application reads the CSV file along with all of the access point information, then saves the data for the location. I continue collecting points until I have a nice supply of sample points. This creates a mapping of 2D points to signal strength data for every access point.
I am currently developing this for iPhone and Android and is estimated to be complete in 2012.