0

我想编写一个脚本,它会继续尝试连接到网络,即使它不可用,所以一旦它可用它就会连接到它。这就是我现在所拥有的

def connect_to_yeelight(ssid, iface):
sys.setrecursionlimit(2000)
iface_channel = f"sudo iwconfig {iface} channel 6"
os.system(iface_channel)
connect_yeelight_cmd = f"nmcli d wifi connect {ssid} ifname {iface} > /dev/null 2>&1"

def try_connection():
    if os.system(connect_yeelight_cmd) != 0:
            try_connection()
            time.sleep(1)
    else:
        return True

try_connection()

正如您可能通过这段代码所说的那样,我得到了“RecursionError:比较中超出了最大递归深度”。有没有其他方法可以实现这样的脚本,我觉得我从错误的角度看这个。

4

2 回答 2

1

第一次使用可以使用 sleep() 或 schedule 功能来实现函数的继续调用。

我编写了一个执行控制台命令并返回输出的函数:

def _executeConsoleCommand(command):
    '''Executes the linux command line arguments and returns the output if needed'''
     try:
         stream = os.popen(command)
         return stream.read().strip()
     except:
         return ''

现在,您只需要一个在 wifi 可用时连接您的功能。请注意,您只能nmcli rescan function每 10 到 20 秒调用一次 - 否则它将拒绝下次扫描任何内容。这就是为什么我建议使用iw module.

def tryConnect():
    yourSSID = 'TestWifi'
    yourPassword = '12345678'
    ssids = _executeConsoleCommand('sudo iwlist wlan0 scan | grep "SSID" | awk \'!a[$0]++\' | cut -d \':\' -f2').split(os.linesep) # scans your deviceses 
    ssids = [ssid.replace('"', '') for ssid in ssids] # remove the exclaimation marks
    if yourSSID in ssids:
        _executeConsoleCommand('sudo nmcli device wifi rescan ifname wlan0 ssid {}'.format(yourSSID)) #you have to call this before you connect  - thats a thing of nmcli
        _executeConsoleCommand('sudo nmcli dev wifi connect {} password "{}" ifname wlan0'.format(yourSSID, yourPassword))
        # now check if your connected 
        ssid_on_interface_wlan0 = 'sudo iw wlan0 info | grep ssid | awk \'{{ print $2 }}\'' 
        if yourSSID in _executeConsoleCommand(ssid_on_interface_wlan0):
            return True
    return False

现在你只需要经常调用它......例如:

def run():
    connected = False
    while not connected:
        connected = tryConnect
        time.sleep(10)
run()
于 2021-09-17T06:14:52.917 回答
-1
cmd = ["nmcli", "-f",  "SSID,BSSID,ACTIVE", "dev", "wifi", "list"] 
networks = subprocess.Popen(cmd, stdout=subprocess.PIPE)
output, errors = networks.communicate()
print(output.decode("utf-8"))

如果您的 Wi-Fi 在此列表中联机,这将返回所有活动的 Wi-Fi,您可以尝试连接到它。

于 2021-06-27T13:05:47.537 回答