如何使用Python模块wpa_supplicant连接到安全的WiFi?
问题描述:
我试图使用wpa_supplicant python模块连接到wpa的wifi。在API中,我找到了一个名为select_network的函数,它似乎应该可以帮助我关联一个wifi AP,但我不明白输入参数的含义。如何使用Python模块wpa_supplicant连接到安全的WiFi?
输入参数被称为到所需网络的D-bus对象路径。 谷歌搜索后,我找不到有关使用此功能的任何示例。
更新
我使用d-脚下看到/ FI/W1/wpasupplicant1对象路径。 像下面这样:
/fi/w1/wpa_supplicant1
/fi/w1/wpa_supplicant1/interfaces/7
/fi/w1/wpa_supplicant1/interfaces/7/BSSs/14
/fi/w1/wpa_supplicant1/interfaces/7/Networks/0
/fi/w1/wpa_supplicant1/interfaces/7/Networks/1
更新-1
还是不知道如何处理select_network此功能。 但是我发现下面的链接:
http://www.programcreek.com/python/example/10250/dbus.Dictionary
此链接介绍如何使用DBUS模块dircetly连接到无线网络。
任何提示将不胜感激。
答
另外本作的人努力得到这个工作,你需要通过添加-u启用的应用程序的wpa_supplicant DBUS守护功能(使DBUS)关于如何使用它
简单的例子,只是一个粗略的编程例。
from wpa_supplicant.core import WpaSupplicantDriver
from twisted.internet.selectreactor import SelectReactor
import threading
import time
import errno
import sys
import types
import netifaces
import dbus
class PythonWifiScanner:
wifiAccessPoints = []
def __init__(self,reactor):
self._reactor = reactor
threading.Thread(target=self._reactor.run, kwargs={'installSignalHandlers': 0}).start()
time.sleep(0.2) # let reactor start
self.driver = WpaSupplicantDriver(reactor)
self.supplicant = self.driver.connect()
# get network interfaces
self.net_iface = netifaces.interfaces()
def get_configured_networks(self,interfaceNumber):
return self.supplicant.get_interface(self.net_iface[interfaceNumber].decode()).get_networks()
def get_single_wpa_interface(self,interfaceNumber):
return self.supplicant.get_interface(self.net_iface[interfaceNumber].decode())
def get_interfaces(self):
return self.net_iface
def select_network(self,network_path,interfaceNumber):
return self.supplicant.get_interface(self.net_iface[interfaceNumber].decode()).select_network(network_path)
def add_network(self,network_cfg,interfaceNumber):
return self.supplicant.get_interface(self.net_iface[interfaceNumber].decode()).add_network(network_cfg)
def scan_interface_for_networks(self,interfaceNumber):
# Get interface and scan the network
interface = self.supplicant.get_interface(self.net_iface[interfaceNumber].decode())
wifiNetworks = interface.scan(block=True)
self.wifiAccessPoints = []
for singleWifi in wifiNetworks:
self.wifiAccessPoints.append(singleWifi.get_ssid())
return wifiNetworks
# Start a simple Twisted SelectReactor
sample_network_cfg = {}
sample_network_cfg['psk'] = "EnterYourKeyHere"
sample_network_cfg['ssid'] = "EnterYourWifiHere"
sample_network_cfg['key_mgmt'] = "WPA-PSK"
reactor = SelectReactor()
dave=PythonWifiScanner(reactor)
value = None
bus = dbus.SystemBus()
print "Interface:" + dave.get_interfaces()[3]
# scan for available networks
for singleWifi in dave.scan_interface_for_networks(3):
print "Wifi SSID:" + singleWifi.get_ssid()
print "Wifi Network Type:" + singleWifi.get_network_type()
# Add network configuration to wpa_supplicant
configpath = dave.add_network(sample_network_cfg,3)
# Attach and Select your network (will need to setip address)
dave.select_network(configpath.get_path(),3)
reactor.stop()