Cpywpa:控制 wpa 的另一个工具

Cython

This article was last updated on <span id="expire-date"></span> days ago, the information described in the article may be outdated.

前言

其实我很久之前就想用 Python 来控制 Linux 的 WiFi 了。由于 Linux 基本都是用 wpa 来连接 WiFi 的 (iwd 也挺好用的),所以控制了 wpa (以下我就这么简称了) 就能控制 WiFi。

我以前在 Ubuntu 上试过 pywifi,Windows 上是可以正常工作的,但是我的 Ubuntu 就不行。由于是大一时候的事情了,我也就懒得再深究原因。最近几个月断断续续的在 Github 和 Google 上找了好久,都没有搜索到符合我要求的包:

  • 使用 wpa 的官方接口

于是我就索性自己写了一个。

简介

Cpywpa,名称取自 Cython 与 wpa 的缩写,表示着这个包是使用 Cython 编写的。Cpywpa 是一个用来控制 wifi 的 Python 包,它突出的特点是使用 wpa 官方提供的 C 接口进行通讯,而不是使用 d-Bus 或者另外自定义的 socket 接口。

包的底层与 wpa 通讯的部分是使用 C 语言写的 (wpa 官方什么时候出 Python 的接口呀),然后用 Cython 对其包装,封装成一个 Cython 扩展类,这样就达到了在 Python 中使用官方接口的目的。

安装

题外话

考虑到跨平台,我仅往 pypi 上传了项目的源码,但是之后我发现,pypi 似乎帮我编译好了对应平台的二进制安装包。所以,以下的依赖库中 Cython 并不是必须的,在将来我会考虑将 Cython 从项目的依赖库中移除。

正题

直接从 pypi 安装即可,需要的依赖库会被自动安装,当然这些库只在安装过程中会用到,安装完成以后不想要的可以删掉。

1
pip install Cpywpa

使用

Cpywpa 中有我写好的一个 NetworkManager 类,直接使用即可。

  1. 获取当前网络状态
1
2
3
4
5
from Cpywpa import NetworkManager
from pprint import pprint

manager = NetworkManager()
pprint(manager.getStatus())
  1. 列出已知的网络
1
2
3
4
5
from Cpywpa import NetworkManager
from pprint import pprint

manager = NetworkManager()
pprint(manager.listNetwork())
  1. 扫描周围的网络并返回结果
1
2
3
4
5
6
7
8
9
10
11
12
from Cpywpa import NetworkManager
from pprint import pprint
from time import sleep

manager = NetworkManager()
# 你可以使用 scan() 来同时扫描和返回结果
# scan_time 控制了中间睡眠的时间
pprint(manager.scan(scan_time=8))
# 或者使用 onlyScan() 只进行扫描并调用 scanResults() 来获得结果
manager.onlyScan()
sleep(10)
pprint(manager.scanResults())
  1. 连接到一个网络
1
2
3
4
5
6
7
8
from Cpywpa import NetworkManager

manager = NetworkManager()
# 连接到一个已知的网络
# Syize 是 wifi 名称
manager.connect('Syize')
# 连接到一个新的网络,这个网络必须是存在的
manager.connect('Syize', passwd='wifi-password')
  1. 添加一个网络,但是不连接
1
2
3
4
from Cpywpa import NetworkManager

manager = NetworkManager()
manager.addNetwork('Syize', 'wifi-password')
  1. 删除一个保存的网络
1
2
3
4
from Cpywpa import NetworkManager

manager = NetworkManager()
manager.removeNetwork('Syize')

使用 cpw_core

cpw_core 是 Cpywpa 中 Cython 的扩展类,提供了很原始的方法来与 wpa 通讯。再原始就变成 C 了

你可以直接定义一个 Python 类来继承 cpw_core,这样你就可以使用 cpw_core 中的函数了。

1
2
3
4
5
from Cpywpa.ccore import cpw_core

class YourOwnClass(cpw_core):
def __init__(self):
super(YourOwnClass, self).__init__()

下面是 cpw_core 中能够使用的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# cpw_core funtions
# all funtions below except _AddNetwork() return message if success or 1 if error occurs

# Get network status
def _GetStatus(self)
# List saved network
def _ListNetworks(self)
# Get scan results
def _ScanResults(self)
# Tell wpa to scan
def _Scan(self)
# Disconnect
def _Disconnect(self)
# connect to a network
def _SelectNetwork(self, network_id)
# enable a network
def _EnableNetwork(self, network_id)
# disable a network
def _DisableNetwork(self, network_id)
# remove a network
def _RemoveNetwork(self, network_id)
# set network variable
def _SetNetwork(self, network_id, variable, value)
# get network variable
def _GetNetwork(self, network_id, variable)
# add a network
def _AddNetwork(self)
# save a network
def _SaveConfig(self)
# reconnect
def _Recconect(self)

最后的结尾

如果你不小心从搜索引擎中找到了这里,又不小心喜欢上了我写的项目,麻烦给个 ⭐star 呗 😋

传送门

Author: Syize

Permalink: https://blog.syize.cn/2022/01/30/Cpywpa/

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Syizeのblog

Comments