在Python中编写外部程序以与wpa_supplicant进行交互

问题描述 投票:0回答:1

我需要直接与Python中的wpa_supplicant进行交互。据我了解,可以使用Unix套接字和wpa_supplicant控制接口(https://w1.fi/wpa_supplicant/devel/ctrl_iface_page.html)连接到wpa_supplicant。我编写了一个发送PING命令的简单程序:

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_supplicant报告一个错误:

wlx84c9b281aa80:ctrl_iface发送失败:107-传输端点未连接

有人可以提供一个例子,说明如何进行“扫描”,然后打印“ scan_results”。

python python-3.x linux sockets wpa-supplicant
1个回答
0
投票

显然,wpa_supplicant使用的套接字类型(UNIX数据报)不提供服务器答复的任何方式。有a few ways to get around that。特别是wpa_supplicant似乎支持通过单独的套接字(在每个消息末尾附加的路径中找到)进行回复。

很奇怪,这在Linux中似乎是相对普遍的做法:/dev/log seems to work in the same way

这是一个满足您要求的程序:

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)
© www.soinside.com 2019 - 2024. All rights reserved.