python - 编写一个与 wpa_supplicant 交互的外部程序

标签 python python-3.x linux sockets wpa-supplicant

我需要直接与 Python 中的 wpa_supplicant 交互。据我了解,可以使用 Unix 套接字和 wpa_supplicant 控制接口(interface) ( 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 sendto failed: 107 - Transport endpoint is not connected



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

最佳答案

显然,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)

关于python - 编写一个与 wpa_supplicant 交互的外部程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60422924/

相关文章:

Python:如果应用程序已经在运行,如何禁止打开它

c++ - 在C++中动态地将文件放在文件夹中

python:tkinter 显示来自网络摄像头的视频并进行 QR 扫描

用于将函数输出与传递给脚本的参数进行比较的 Python 脚本

python - Pyglet OpenGL 设置雾颜色

python - 了解 maxmin 函数

python - 运行终端命令并保存使用 Python/Django 返回的值?

linux - 当 bash 中找不到标记时无法获取空子字符串

python - `python --version` 未返回任何结果

python - python 中的一切都是对象,但为什么不将关键字作为对象呢?