Python 编写外部程序以与wpa_supplicant接口
我需要直接与Python中的wpa_请求者进行交互。据我所知,可以使用Unix套接字和wpa_请求控制接口()连接到wpa_请求。 我编写了一个发送PING命令的简单程序:Python 编写外部程序以与wpa_supplicant接口,python,python-3.x,linux,sockets,wpa-supplicant,Python,Python 3.x,Linux,Sockets,Wpa Supplicant,我需要直接与Python中的wpa_请求者进行交互。据我所知,可以使用Unix套接字和wpa_请求控制接口()连接到wpa_请求。 我编写了一个发送PING命令的简单程序: import socket CTRL_SOCKETS = "/home/victor/Research/wpa_supplicant_python/supplicant_conf" INTERFACE = "wlx84c9b281aa80" SOCKETFILE = "{}/{}".format(CTRL_SOCKETS,
import socket
CTRL_SOCKETS = "/home/victor/Research/wpa_supplicant_python/supplicant_conf"
INTERFACE = "wlx84c9b281aa80"
SOCKETFILE = "{}/{}".format(CTRL_SOCKETS, INTERFACE)
s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
s.connect(SOCKETFILE)
s.send(b'PING')
while 1:
data = s.recv(1024)
if data:
print(repr(data))
但当我运行它时,wpa_恳求者报告了一个错误:
wlx84c9b281aa80:ctrl_iface sendto失败:107-未连接传输终结点
是否有人可以提供一个示例,您将如何进行“扫描”,然后打印“扫描结果”。显然,wpa请求者使用的套接字类型(UNIX数据报)不提供服务器回复的任何方式。有。wpa_恳求者似乎特别支持通过单独的套接字(在每条消息末尾附加的路径中找到)进行回复 奇怪的是,这似乎是Linux中比较常见的一种做法: 以下是一个满足您要求的程序:
import socket, os
from time import sleep
def sendAndReceive(outmsg, csock, ssock_filename):
'''Sends outmsg to wpa_supplicant and returns the reply'''
# the return socket object can be used to send the data
# as long as the address is provided
csock.sendto(str.encode(outmsg), ssock_filename)
(bytes, address) = csock.recvfrom(4096)
inmsg = bytes.decode('utf-8')
return inmsg
wpasock_file = '/var/run/wpa_supplicant/wlp3s0'
retsock_file = '/tmp/return_socket'
if os.path.exists(retsock_file):
os.remove(retsock_file)
retsock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
retsock.bind(retsock_file)
replyToScan = sendAndReceive('SCAN', retsock, wpasock_file)
print(f'SCAN: {replyToScan}')
sleep(5)
replyToScanResults = sendAndReceive('SCAN_RESULTS', retsock, wpasock_file)
print(f'SCAN_RESULTS: {replyToScanResults}')
retsock.close()
os.remove(retsock_file)
顺便提一下,为什么在1:时使用
而不是在True:
时使用?我通常使用'True'时使用'code',但现在使用'while1'时简称'code'。