airport_events

airport-events is a MacOS specific library that receives WiFi related events. It currently supports:

event           parameters                    triggers when

connected       String ssid, DateTime date    A WiFi networks has been successfully connected.
disconnected    DateTime date                 Computer is going to sleep, airport has been disabled or system halts. 

The library is extremely fresh and currently has no tests and has only been tested on MacOS 10.7.5.

I created it to log the amount of time I spend on different WiFi networks. Check out the airport-log utility below for an example implementation.

Why?

  • Detect when a machine has joined a specific network.
  • Log the amount of time that's spent on different networks.

Installation

gem install airport-events

The gem depends on an official Apple command line tool called "airport" which is disabled by default. To enable the "airport" command, symlink it into PATH by running the following command:

sudo ln -s /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport /usr/sbin/airport

Usage

require 'airport_events'

# Create a new Watcher instance and set up some event listeners.
watcher = AirportEvents::Watcher.new

watcher.on :connected do |ssid, date|
  puts "Connected to #{ssid} on #{date}"
end

watcher.on :disconnected do |date|
  puts "Disconnected on #{date}"
end

# Start the watcher, which runs in a separate Thread.
watcher.start

# Keep program alive until interrupted (For instance: CTRL + C).
interrupted = false
trap("INT") { interrupted = true }

while true do
  exit if interrupted
  sleep 0.1
end

Binary: airport-log

The gem is shipped with a binary called 'airport-log' which logs wifi connect/disconnect events to a JSON file.

For usage instructions run: airport-log -h

Example JSON output:

[
  {
    "ssid": "orca",
    "connected_at": "2013-02-24T22:35:54+00:00",
    "disconnected_at": "2013-02-24T22:47:38-05:00"
  },
  {
    "ssid": "beluga",
    "connected_at": "2013-02-24T22:48:23-05:00",
    "disconnected_at": null
  }
]

When disconnected_at is null it means the network is still connected or a disconnect event was never sent.