如果有信号,如何创建仅连接到 WiFi 的配置?30%?

Dav*_*ave 6 networking wifi configuration optimization connectivity

有没有机会创建一个配置来完成以下工作?


仅当信号强于 30% 时才连接到可用的 WiFi


在很多地方,我都住在几乎没有wifi信号的边境地区。于是那些不可避免的信号中断就很烦人,所以我总是不得不自己手动在移动数据和wifi之间切换。

是否有机会设置一些仅允许连接到 WiFi 的配置,以便在信号强度足以避免终止的情况下(并由此保证稳定的连接)?


简化方法:

如果信号强度 < 30 % ? 连接容许

如果信号强度是 ? 30%?允许连接


30% 的值当然只是一个例子......也许 20% 会更有意义,我们会看到!

xav*_*beg 7

我尝试在 python(python3,但也适用于 2)中编写一个脚本,您可以使用它。我已经试过了,直到连接和断开连接部分,以便您可以使用您喜欢的方法:

with open("/proc/net/wireless", "r") as f:
data = f.read()

link = int(data[177:179])
level = int(data[182:185])
noise = int(data[187:192])

# print("{}{}{}".format(link, level, noise))

lmtqlty = -80

if(link < lmtqlty):
    os.system(nmcli c down id NAME`)  # Will disconnect the network NAME
else:
    os.system(nmcli c down id NAME`)  # Will connect the network NAME
Run Code Online (Sandbox Code Playgroud)

您必须以 sudo 的身份运行它,但这没问题,因为您现在会将其放入 cron 服务中。我还没有使用过 cron 服务,但如果你不能管理自己,我会尝试一下。


编辑解释:当您阅读“/proc/net/wireless”的内容时,您会得到以下长字符串:

Inter-| sta-|   Quality        |   Discarded packets               | Missed | WE
face  | tus | link level noise |  nwid  crypt   frag  retry   misc | beacon | 22
 wlan0: 0000   31.  -79.  -256        0      0      0      7      0        0
Run Code Online (Sandbox Code Playgroud)

所以您想从 Quality 列中提取正确的值。此文件为您提供有关此系统与网络之间的连接的信息。在这里你有更多关于它的信息,为了解释每个质量子栏的含义,让我引用一篇文章

分贝是描述信号之间相对关系的对数单位(1 dB = 1/10 Bel,1 Bel = 功率比 1.259 = 幅度比 1.122)。有关详细信息和表格,请参阅维基百科。负分贝意味着接收到的信号比发送的信号弱(这当然是自然发生的)。

电平表示接收时信号的强度与发送时的强度/假设强度相比。这是物理测量,原则上对于每个 Wifi 硬件都是相同的。但是,通常它没有正确校准等。

链接是对信号质量的计算测量(即硬件/软件从中恢复数据的难易程度)。这受到回声、多径传播、使用的编码类型等的影响;每个人都使用自己的方法来计算它。通常(但不总是)它被计算为与“级别”值处于同一比例的某个值。

根据经验,对于我见过的大多数硬件,周围-50的东西意味着信号还可以,周围的东西-80意味着它很弱,但可以使用。如果它低得多,则连接变得不可靠。

这些值应被视为粗略的指示,而不是您可以依赖的科学数据,并且您不应期望它们在不同的硬件上相似甚至可比,甚至不是“级别”。学习解释它的最好方法是带上你的硬件,随身携带一点,观察信号如何变化以及对速度、错误率等的影响。

所以我认为你对链接感兴趣(只是在那里改变了它)。


只是为了给你更多我搜索的想法,你有这个单行脚本,它动态显示链接值:

watch -n 1 "awk 'NR==3 {print \"WiFi Signal Strength = \" \$3 \"00 %\"}''' /proc/net/wireless"
Run Code Online (Sandbox Code Playgroud)

您可以将它集成到 bash 脚本而不是 python 中:)