7 from dbus
.mainloop
.glib
import DBusGMainLoop
9 WPAS_DBUS_SERVICE
= "fi.w1.wpa_supplicant1"
10 WPAS_DBUS_INTERFACE
= "fi.w1.wpa_supplicant1"
11 WPAS_DBUS_OPATH
= "/fi/w1/wpa_supplicant1"
13 WPAS_DBUS_INTERFACES_INTERFACE
= "fi.w1.wpa_supplicant1.Interface"
14 WPAS_DBUS_INTERFACES_OPATH
= "/fi/w1/wpa_supplicant1/Interfaces"
15 WPAS_DBUS_BSS_INTERFACE
= "fi.w1.wpa_supplicant1.Interface.BSS"
17 def byte_array_to_string(s
):
21 if c
>= 32 and c
< 127:
24 r
+= urllib
.quote(chr(c
))
27 def list_interfaces(wpas_obj
):
28 ifaces
= wpas_obj
.Get(WPAS_DBUS_INTERFACE
, 'Interfaces',
29 dbus_interface
=dbus
.PROPERTIES_IFACE
)
31 if_obj
= bus
.get_object(WPAS_DBUS_SERVICE
, path
)
32 ifname
= if_obj
.Get(WPAS_DBUS_INTERFACES_INTERFACE
, 'Ifname',
33 dbus_interface
=dbus
.PROPERTIES_IFACE
)
36 def stateChanged(newState
, oldState
):
37 print "StateChanged(%s -> %s)" % (oldState
, newState
)
40 net_obj
= bus
.get_object(WPAS_DBUS_SERVICE
, bss
)
41 net
= dbus
.Interface(net_obj
, WPAS_DBUS_BSS_INTERFACE
)
43 # Convert the byte-array for SSID and BSSID to printable strings
44 val
= net_obj
.Get(WPAS_DBUS_BSS_INTERFACE
, 'BSSID',
45 dbus_interface
=dbus
.PROPERTIES_IFACE
)
48 bssid
= bssid
+ ":%02x" % item
50 val
= net_obj
.Get(WPAS_DBUS_BSS_INTERFACE
, 'SSID',
51 dbus_interface
=dbus
.PROPERTIES_IFACE
)
52 ssid
= byte_array_to_string(val
)
54 val
= net_obj
.Get(WPAS_DBUS_BSS_INTERFACE
, 'WPAIE',
55 dbus_interface
=dbus
.PROPERTIES_IFACE
)
59 val
= net_obj
.Get(WPAS_DBUS_BSS_INTERFACE
, 'RSNIE',
60 dbus_interface
=dbus
.PROPERTIES_IFACE
)
64 freq
= net_obj
.Get(WPAS_DBUS_BSS_INTERFACE
, 'Frequency',
65 dbus_interface
=dbus
.PROPERTIES_IFACE
)
66 signal
= net_obj
.Get(WPAS_DBUS_BSS_INTERFACE
, 'Signal',
67 dbus_interface
=dbus
.PROPERTIES_IFACE
)
68 val
= net_obj
.Get(WPAS_DBUS_BSS_INTERFACE
, 'MaxRate',
69 dbus_interface
=dbus
.PROPERTIES_IFACE
)
70 maxrate
= val
/ 1000000
72 print " %s :: ssid='%s' wpa=%s wpa2=%s signal=%d rate=%d freq=%d" % (bssid
, ssid
, wpa
, wpa2
, signal
, maxrate
, freq
)
74 def scanDone(success
):
75 gobject
.MainLoop().quit()
76 print "Scan done: success=%s" % success
78 res
= if_obj
.Get(WPAS_DBUS_INTERFACES_INTERFACE
, 'BSSs',
79 dbus_interface
=dbus
.PROPERTIES_IFACE
)
81 print "Scanned wireless networks:"
86 def bssAdded(bss
, properties
):
87 print "BSS added: %s" % (bss
)
91 print "BSS removed: %s" % (bss
)
94 dbus
.mainloop
.glib
.DBusGMainLoop(set_as_default
=True)
96 bus
= dbus
.SystemBus()
97 wpas_obj
= bus
.get_object(WPAS_DBUS_SERVICE
, WPAS_DBUS_OPATH
)
99 if len(sys
.argv
) != 2:
100 list_interfaces(wpas_obj
)
103 wpas
= dbus
.Interface(wpas_obj
, WPAS_DBUS_INTERFACE
)
104 bus
.add_signal_receiver(scanDone
,
105 dbus_interface
=WPAS_DBUS_INTERFACES_INTERFACE
,
106 signal_name
="ScanDone")
107 bus
.add_signal_receiver(bssAdded
,
108 dbus_interface
=WPAS_DBUS_INTERFACES_INTERFACE
,
109 signal_name
="BSSAdded")
110 bus
.add_signal_receiver(bssRemoved
,
111 dbus_interface
=WPAS_DBUS_INTERFACES_INTERFACE
,
112 signal_name
="BSSRemoved")
113 bus
.add_signal_receiver(stateChanged
,
114 dbus_interface
=WPAS_DBUS_INTERFACES_INTERFACE
,
115 signal_name
="StateChanged")
119 # See if wpa_supplicant already knows about this interface
122 path
= wpas
.GetInterface(ifname
)
123 except dbus
.DBusException
, exc
:
124 if not str(exc
).startswith("fi.w1.wpa_supplicant1.InterfaceUnknown:"):
127 path
= wpas
.CreateInterface({'Ifname': ifname
, 'Driver': 'test'})
130 except dbus
.DBusException
, exc
:
131 if not str(exc
).startswith("fi.w1.wpa_supplicant1.InterfaceExists:"):
135 if_obj
= bus
.get_object(WPAS_DBUS_SERVICE
, path
)
137 iface
= dbus
.Interface(if_obj
, WPAS_DBUS_INTERFACES_INTERFACE
)
138 iface
.Scan({'Type': 'active'})
140 gobject
.MainLoop().run()
142 wpas
.RemoveInterface(dbus
.ObjectPath(path
))
144 if __name__
== "__main__":