【问题标题】:How to get the value of an item from the string?如何从字符串中获取项目的值?
【发布时间】:2021-11-19 12:36:08
【问题描述】:

我试图找到信号电平的值只是因为我想通过dBm测量wifi信号。

我正在使用this 命令查看信号级别(我想使用 python 获取):

$ iw dev wlx88366cfd0226 link

Connected to c4:41:1e:e5:86:f6 (on wlx88366cfd0226)
    SSID: Hlab_linksys
    freq: 5785
    signal: -22 dBm
    tx bitrate: 867.0 MBit/s

完整代码为:

import subprocess
import time
import argparse

parser = argparse.ArgumentParser(description='Display WLAN signal strength.')
parser.add_argument(dest='interface', nargs='?', default='wlx88366cfd0226',
                    help='wlan interface (default: wlx88366cfd0226)')
args = parser.parse_args()

print '\n---Press CTRL+Z or CTRL+C to stop.---\n'

while True:
    cmd = subprocess.Popen('iwconfig %s' % args.interface, shell=True,
                           stdout=subprocess.PIPE)
    # print "cmd.stdout",cmd.stdout
    for line in cmd.stdout:
        if 'Link Quality' in line:
            # print"s"
            print (line.lstrip(' ')),
        elif 'Not-Associated' in line:
            print 'No signal'
    time.sleep(1)

输出的类型为字符串数据流为:

Link Quality=85/100  Signal level=78/100  Noise level=0/100

我只想获得 78/100 以便转换为 dBm。

原代码来自 here

就我而言,当我使用此命令时,请参阅 here: iwconfig

wlx88366cfd0226  IEEE 802.11AC  ESSID:"Hlab_linksys"  Nickname:"<WIFI@REALTEK>"
          Mode:Managed  Frequency:5.785 GHz  Access Point: C4:41:1E:E5:86:F6   
          Bit Rate:867 Mb/s   Sensitivity:0/0  
          Retry:off   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=84/100  Signal level=78/100  Noise level=0/100
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

enp3s0    no wireless extensions.

lo        no wireless extensions.

所以,我在代码中使用了wlx88366cfd0226

更新

如何只获取信号的值:

这是我的代码:

import subprocess
import time
import argparse

parser = argparse.ArgumentParser(description='Display WLAN signal strength.')
parser.add_argument(dest='interface', nargs='?', default='wlx88366cfd0226',
                    help='wlan interface (default: wlx88366cfd0226)')
args = parser.parse_args()

print '\n---Press CTRL+Z or CTRL+C to stop.---\n'

while True:
    cmd = subprocess.Popen('iw dev %s link' % args.interface, shell=True,
                           stdout=subprocess.PIPE)
    # print "cmd.stdout",cmd.stdout
    for line in cmd.stdout:
        if 'signal' in line:
            # print"s"
            print (line.lstrip(' ')),
        elif 'Not-Associated' in line:
            print 'No signal'
    time.sleep(1)

这里的输出是:

    signal: -23 dBm
    signal: -23 dBm
    signal: -23 dBm
    signal: -23 dBm
    signal: -23 dBm
    signal: -23 dBm
    signal: -23 dBm
    signal: -23 dBm

我需要它作为一个数字用于下一个方程式。

【问题讨论】:

    标签: python string ubuntu wifi rssi


    【解决方案1】:

    分割方式:

    line.split("  ")[1].split('=')[1]
    

    阅读:我们选择这条线。将其拆分为 2 个空格。这给了我们 3 个部分(“链接质量”、“信号级别”和“噪声级别”),然后我们使用第一个 [1] 访问第二个元素,这给了我们“信号级别 = 78/100”。然后我们把它用=吐出来,这给了我们['Signal level', '78/100'],我们最后用第二个[1]访问第二个元素,我们得到了我们想要的。

    或者如果字符串操作更符合你的口味:

    level = line[line.find("Signal level=")+13:line.find(" ", line.find("Signal level=")+13)]
    

    阅读它:我们采用我们知道的具有我们想要的值的行,并在该字符串中找到Signal level=find 返回字符串中匹配的第一个字符的索引,因此我们必须添加 13(Signal level= 中的字符数)才能将其添加到 Signal level= 的末尾。然后我们必须在您要查找的内容之后找到空间。我们通过查找Signal level=+13 之后的第一个 字符来做到这一点。

    【讨论】:

    • 谢谢,现在使用 level = line[line.find("Signal level=")+13:line.find(" ", line.find("Signal level=") 运行良好+13)],第一个的输出是:IndexError: list index out of range。将 1 替换为 0 时,无输出。
    • @Redhwan 是的。拆分一个非常依赖于字符串中的字符。很可能是因为您的终端正在打印 \t 而不是空格。不管怎样,很高兴它有效
    • 非常感谢。你节省了我的时间。
    猜你喜欢
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    相关资源
    最近更新 更多