I had this idea for doing a MarcoPolo-like script that required me to grab a list of all the Wi-Fi “SSIDs”:Wikipedia:SSID that my Eee PC saw nearby, and instead of using
iwlist like everyone else, I decided to use the Python
dbus bindings and query
NetworkManager for the info it already had.
Ought to be simple, right?
Well, no. As is usual, it is damn near impossible to find structured documentation regarding bleeding-edge Linux packages, and the API changed from 0.6.x to 0.7.x (and, of course, I’m running 0.7.whatever right now), so I had to Google for stuff until I came across cnetworkmanager, whose very internal structure is a testament to the insane amount of changes
NetworkManager has gone through.
After poking around inside it a bit, I came up with “this simple script”:cid:scanner.py.txt that grabs the list of SSIDs
NetworkManager 0.7.x knows about:
import dbus NM = 'org.freedesktop.NetworkManager' NMP = '/org/freedesktop/NetworkManager' NMI = NM + '.Device' PI = 'org.freedesktop.DBus.Properties' def list_ssids(): # get the base NetworkManager object and bind an interface to it bus = dbus.SystemBus() nm = bus.get_object(NM,NMP) nmi = dbus.Interface(nm,NM) # Iterate over the devices queried via the interface for dev in nmi.GetDevices(): # get each and bind a property interface to it devo = bus.get_object(NM,dev) devpi = dbus.Interface(devo,PI) # Single out the Wi-Fi ones if devpi.Get(NM,'DeviceType') == 2: wdevi = dbus.Interface(devo,NMI + '.Wireless') for ap in wdevi.GetAccessPoints(): apo = bus.get_object(NM,ap) api = dbus.Interface(apo,PI) # unpack the SSID string print ''.join(["%c" % b for b in api.Get(NMI,'Ssid')]) if __name__ == '__main__': list_ssids()
This is of dubious (and most likely ephemeral) interest, but it might be useful to someone.
I will eventually figure out how to get
NetworkManager to connect to a specific “SSID”:Wikipedia:SSID, but there is one bit of missing functionality that strikes me as obvious (and that was why I stuck to trying to figure out
dbus until I had enough) – building a
dbus listener that gets notified every time a new Wi-Fi network pops up, which is left as an exercise to the reader.