Home | History | Annotate | Download | only in examples
      1 #!/usr/bin/python
      2 
      3 import dbus
      4 import sys, os
      5 import time
      6 
      7 WPAS_DBUS_SERVICE = "fi.epitest.hostap.WPASupplicant"
      8 WPAS_DBUS_INTERFACE = "fi.epitest.hostap.WPASupplicant"
      9 WPAS_DBUS_OPATH = "/fi/epitest/hostap/WPASupplicant"
     10 
     11 WPAS_DBUS_INTERFACES_INTERFACE = "fi.epitest.hostap.WPASupplicant.Interface"
     12 WPAS_DBUS_INTERFACES_OPATH = "/fi/epitest/hostap/WPASupplicant/Interfaces"
     13 WPAS_DBUS_BSSID_INTERFACE = "fi.epitest.hostap.WPASupplicant.BSSID"
     14 
     15 def byte_array_to_string(s):
     16 	import urllib
     17 	r = ""    
     18 	for c in s:
     19 		if c >= 32 and c < 127:
     20 			r += "%c" % c
     21 		else:
     22 			r += urllib.quote(chr(c))
     23 	return r
     24 
     25 def main():
     26 	if len(sys.argv) != 2:
     27 		print "Usage: wpas-test.py <interface>"
     28 		os._exit(1)
     29 
     30 	ifname = sys.argv[1]
     31 
     32 	bus = dbus.SystemBus()
     33 	wpas_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_OPATH)
     34 	wpas = dbus.Interface(wpas_obj, WPAS_DBUS_INTERFACE)
     35 
     36 	# See if wpa_supplicant already knows about this interface
     37 	path = None
     38 	try:
     39 		path = wpas.getInterface(ifname)
     40 	except dbus.dbus_bindings.DBusException, exc:
     41 		if str(exc) != "wpa_supplicant knows nothing about this interface.":
     42 			raise exc
     43 		try:
     44 			path = wpas.addInterface(ifname, {'driver': dbus.Variant('wext')})
     45 		except dbus.dbus_bindings.DBusException, exc:
     46 			if str(exc) != "wpa_supplicant already controls this interface.":
     47 				raise exc
     48 
     49 	if_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
     50 	iface = dbus.Interface(if_obj, WPAS_DBUS_INTERFACES_INTERFACE)
     51 	iface.scan()
     52 	# Should really wait for the "scanResults" signal instead of sleeping
     53 	time.sleep(5)
     54 	res = iface.scanResults()
     55 
     56 	print "Scanned wireless networks:"
     57 	for opath in res:
     58 		net_obj = bus.get_object(WPAS_DBUS_SERVICE, opath)
     59 		net = dbus.Interface(net_obj, WPAS_DBUS_BSSID_INTERFACE)
     60 		props = net.properties()
     61 
     62 		# Convert the byte-array for SSID and BSSID to printable strings
     63 		bssid = ""
     64 		for item in props["bssid"]:
     65 			bssid = bssid + ":%02x" % item
     66 		bssid = bssid[1:]
     67 		ssid = byte_array_to_string(props["ssid"])
     68 		wpa = "no"
     69 		if props.has_key("wpaie"):
     70 			wpa = "yes"
     71 		wpa2 = "no"
     72 		if props.has_key("rsnie"):
     73 			wpa2 = "yes"
     74 		freq = 0
     75 		if props.has_key("frequency"):
     76 			freq = props["frequency"]
     77 		caps = props["capabilities"]
     78 		qual = props["quality"]
     79 		level = props["level"]
     80 		noise = props["noise"]
     81 		maxrate = props["maxrate"] / 1000000
     82 
     83 		print "  %s  ::  ssid='%s'  wpa=%s  wpa2=%s  quality=%d%%  rate=%d  freq=%d" % (bssid, ssid, wpa, wpa2, qual, maxrate, freq)
     84 
     85 	wpas.removeInterface(dbus.ObjectPath(path))
     86 	# Should fail here with unknown interface error
     87 	iface.scan()
     88 
     89 if __name__ == "__main__":
     90 	main()
     91 
     92