Greg Klein's Blog

Using the Ubiquiti as a Yggdrasil Sensor

leave a comment »

My last post focused on using the Ubiquiti Wifi Access Point as a gateway to connect a SunSPOT to the internet (in this case, Twitter).

But we can also use the Ubiquiti as a sensor. The immediate utility that appeared to me was to use the Ubiquiti to scan for wireless networks and to get their signal strength. So let’s get started.

If you’re using a Linux box at home, you can scan for wireless networks using the command

root@localhost:~# iwlist scan

You’ll see an output something like this:

          Cell 01 - Address: 00:1E:4E:AB:CC:DF
                    Frequency:2.412 GHz (Channel 1)
                    Quality=97/100  Signal level:-29 dBm  Noise level=-127 dBm
                    Encryption key:on
                    IE: Unknown: 0007426967526F6F6D
                    IE: Unknown: 010482848B96
                    IE: Unknown: 030101
                    IE: Unknown: 2A0100
                    IE: Unknown: 2F0100
                    IE: IEEE 802.11i/WPA2 Version 1
                        Group Cipher : CCMP
                        Pairwise Ciphers (1) : CCMP
                        Authentication Suites (1) : PSK
                    IE: Unknown: 32080C1218243048606C
                    IE: Unknown: DD0700039301660000
                    IE: Unknown: DD06001018020100
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
                              9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
                              48 Mb/s; 54 Mb/s
                    Extra: Last beacon: 3492ms ago

Now there are three lines in this that we’re interested in. The first one states the MAC address of our access point. Next, we want the line describing the ESSID (the “name” of the network), and, finally, the line showing us how strong our signal is, in dBm.

Now whenever I have a bit of text parsing to do, I always go to Perl. Unfortunately, I haven’t got enough space on the Ubiquiti’s measly 4 MB of flash to install Perl. Instead, I’m writing all of this in Bash. So I wrote a small shell script in Bash that parses the output from our iwlist command and prints only the useful information:


aplist=$(iwlist ath0 scan|grep 'Address\|Signal\|ESSID')

for line in $aplist; do
	if [[ "$line" =~ Address ]]
			echo $line | sed 's/://g' | sed 's/.*s //g'
	if [[ "$line" =~ ESSID ]]
			echo $line | sed 's/.*:"//g' | sed 's/"//g'
	if [[ "$line" =~ Signal ]]
			echo $line | sed 's/.*Signal level=//g' | sed 's/ dBm.*//g'

echo "done"

Alright, let’s walk through that really fast. First thing I do is grab the output of our iwlist command and extract the useful lines (the ones containing Address, Signal, or ESSID), and put all of that into variable $aplist. I then step through the lines one by one and extract only the most useful information.

So the output now would look something like this:


Neat. Now I’ve got to come up with a clever way to send it back to our SunSPOT.

head -n 1 /dev/ttyS0 > /dev/null
./ > /dev/ttyS0

So now I just wait for the serial to hear a new line character ‘\n’ and then I can pipe the nicely formatted list back to my SunSPOT. Perfect.

Now I need a bit of logic over on my SunSPOT side of things.

        do {
            byte[] buffer = new byte[in.available()];
            read += new String(buffer);
        } while (read.indexOf("done") == -1);

That’s all we need to send the newline character and read in our list of APs.

Now to get that data back to I’m running a project called Yggdrasil on my Spot so that I can report my sensor readings back to

A bit of code later and I can get a nice look at how my wifi signal strength varies over time.


How about for all of the access points in the building?
The cool thing about using is that I can now, say, try to correlate these readings against humidity, or other sensor readings in the area.

Written by gregklein

August 4, 2009 at 3:26 pm

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: