Linux下使用python和终端指令自动切换连接wifi,含完整代码用例

使用的指令wpa_cli和iwlist, nmcli,详细请看这篇文章
https://www.cnblogs.com/hotwater99/p/12760261.html
先建立两个文件
第一个文件:向conf文件添加wifi,必须使用终端执行,博主是添加多个wifi,为了从办公室到实验室自动切换连接使用
做了微调,不知道为啥树莓派安装network-manager以后会变成动态ip,就只好写了两个版本,Ubuntu和Raspi各一个


def add_wifi_to_config(ssid, password):
    config = (
        f'\nnetwork={{\n' +
        f'\tssid="{ssid}"\n' +
        f'\tpsk="{password}"\n' + '}')
    print(config)
    with open("/etc/wpa_supplicant/wpa_supplicant.conf", "a+") as wifi:
        wifi.write(config)
    wifi.close()
    print("Wifi config added")
    return True


if __name__ == '__main__':
    ssids = ['11', '222', '333', '444', '555']
    passwords = ['1', '2', '3', '4', '5']
    for idx, _ssid in enumerate(ssids):
        result = add_wifi_to_config(_ssid, passwords[idx])
        print(result)

第二个文件:自动连接wifi

import os
import time
import threading
# 树莓派需要先把账号密码存入conf文件中  /etc/wpa_supplicant/wpa_supplicant.conf


class RaspWifi(object):

    def __init__(self, interface_name, interval_frequency=1):
        self._interface_name = interface_name
        # THREAD
        self._interval_frequency = interval_frequency
        self._thread = threading.Thread(target=self._working)
        self._thread.daemon = True
        self._thread.start()

    def _working(self):
        while 1:
            if not self._is_wifi_connected():
                print('Connecting....')
                wifi_id = self._get_target_wifi_id()
                os.system(f'wpa_cli -i wlan0 select_network {wifi_id}')
            time.sleep(self._interval_frequency)

    def _get_target_wifi_id(self):
        # 把conf文件中存储的wifi和wifi_id拿出来
        wifi_in_conf = os.popen('wpa_cli -i wlan0 list_network')
        lines = [x for x in wifi_in_conf.read().split('\n') if x != '']
        wifi = dict()
        for line in lines[1:]:
            one_wifi_info = line.split('\t')
            wifi[one_wifi_info[1]] = one_wifi_info[0]
        for key in wifi.keys():
            #  扫描wifi并把和conf文件中一直的wifi名字提取出来
            print('Scanning....')
            command = """iwlist {} scan | grep -ioE 'ssid:"(.*{}.*)'"""
            wifi_in_scan = os.popen(command.format(self._interface_name, key))
            wifi_in_scan = list(wifi_in_scan)
            if 'Device or resource busy' in wifi_in_scan:
                return None
            else:
                wifi_list = [item.lstrip('SSID:').strip('"\n') for item in wifi_in_scan]
                if wifi_list:
                    return wifi[key]

    def _is_wifi_connected(self):
        result = os.popen('iw {} link'.format(self._interface_name))
        if 'Connected to ' in result.read():
            print('success')
            wifi_connected = True
        else:
            print('failed')
            wifi_connected = False
        return wifi_connected


if __name__ == '__main__':
    _test = RaspWifi('wlan0')

三、Ubuntu
import os
import time
import threading
wifi = {'111': '111',
        '222': '222',
        '333': '333',
        '444': '444'}


class UbuntuWifi(object):

    def __init__(self, interface_name, interval_frequency=1):
        self._interface_name = interface_name
        # THREAD
        self._interval_frequency = interval_frequency
        self._thread = threading.Thread(target=self._working)
        self._thread.daemon = True
        self._thread.start()

    def _working(self):
        while 1:
            if not self._is_wifi_connected():
                print('Connecting....')
                wifi_name = self._scan()
                os.system(f'nmcli dev wifi connect {wifi_name} password {wifi[wifi_name]}')
            time.sleep(self._interval_frequency)

    def _scan(self):
        print('Scanning....')
        for wifi_name in wifi.keys():
            command = """iwlist {} scan | grep -ioE 'ssid:"(.*{}.*)'"""
            wifi_in_scan = os.popen(command.format(self._interface_name, wifi_name))
            wifi_in_scan = list(wifi_in_scan)
            if 'Device or resource busy' in wifi_in_scan:
                return None
            else:
                wifi_list = [item.lstrip('SSID:').strip('"\n') for item in wifi_in_scan]
                if wifi_list:
                    return wifi_name

    def _is_wifi_connected(self):
        result = os.popen('iw {} link'.format(self._interface_name))
        if 'Connected to ' in result.read():
            print('success')
            wifi_connected = True
        else:
            print('failed')
            wifi_connected = False
        return wifi_connected


if __name__ == '__main__':
    _test = UbuntuWifi('wlp3s0')
    while 1:
        time.sleep(1)

完成,从楼上到楼下测试无问题,转载请注明出处
三、大家可以看看pywifi这个库,也贴一下博主自己之前写的把,封装好的库使用起来比较简单

import pywifi
from time import sleep, time
wifi = {'222': '1',
        '111 P30': '2',
        '2223': '3'}

class WiFi(object):

    def __init__(self):
        super().__init__()
        # WIFI
        self._interface = None
        for interface in pywifi.PyWiFi().interfaces():
            if interface.name() == 'wlan0':
                self._interface = interface

    def is_connect(self):
        wifi_state = False
        if self._interface.status() == pywifi.const.IFACE_DISCONNECTED:  # 0
            # print('Wifi is disconnect')
            wifi_state = False
        elif self._interface.status() == pywifi.const.IFACE_CONNECTED:  # 1
            # print('Wifi is connected')
            wifi_state = True
        return wifi_state

    def scan(self):
        print('Scanning...')
        result = list()
        self._interface.scan()
        sleep(1)
        wifi_names = self._interface.scan_results()
        for wifi_name in wifi_names:
            if wifi_name.ssid in wifi.keys():
                result = [wifi_name.ssid, wifi[wifi_name.ssid]]
                break
        return result

    def connect(self, ssid, key, timeout=10):
        # CONNECT
        profile = pywifi.Profile()  # 配置文件
        profile.ssid = ssid  # wifi名称
        profile.auth = pywifi.const.AUTH_ALG_OPEN  # 需要密码
        profile.akm.append(pywifi.const.AKM_TYPE_WPA2PSK)  # 加密类型
        profile.cipher = pywifi.const.CIPHER_TYPE_CCMP  # 加密单元
        profile.key = key  # wifi密码
        self._interface.remove_all_network_profiles()
        tmp_profile = self._interface.add_network_profile(profile)
        self._interface.connect(tmp_profile)
        # CHECK CONNECT
        ts_start = time()
        while time() - ts_start < timeout:
            print('connecting...{:.1f}'.format(time() - ts_start))
            if self._interface.status() == pywifi.const.IFACE_CONNECTED:
                print('Successful connect')
                break
            sleep(1)


if __name__ == '__main__':

    __wifi = WiFi()
    while 1:
        if not __wifi.is_connect():
            _result = __wifi.scan()
            __wifi.connect(ssid=_result[0], key=_result[1], timeout=10)
        sleep(2)

编程快一年了,有时候就不想学了,有没有小伙伴一起交流的,可以留个微信

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用Python实现softmaxLayer的代码示例: ```python import numpy as np class SoftmaxLayer: def __init__(self): self.input = None def forward(self, input): self.input = input exp_input = np.exp(input) return exp_input / np.sum(exp_input, axis=1, keepdims=True) def backward(self, output_grad, learning_rate): batch_size = self.input.shape[0] output = self.forward(self.input) d_input = np.zeros_like(self.input) for i in range(batch_size): jacobian = np.diag(output[i]) - np.outer(output[i], output[i]) d_input[i] = np.dot(output_grad[i], jacobian) return d_input ``` 以下是使用Python编写的softmaxLayer的测试用例: ```python def test_softmax_layer(): layer = SoftmaxLayer() input = np.array([[-1, 2, 3], [0, -2, -1]]) output = layer.forward(input) expected_output = np.array([[0.01587624, 0.11731043, 0.86681333], [0.66524096, 0.09003057, 0.24472847]]) assert np.allclose(output, expected_output, rtol=1e-5, atol=1e-5) output_grad = np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]]) input_grad = layer.backward(output_grad, learning_rate=0.1) expected_input_grad = np.array([[-0.01922149, 0.04060154, -0.02138006], [0.15242616, -0.20610701, 0.05368084]]) assert np.allclose(input_grad, expected_input_grad, rtol=1e-5, atol=1e-5) print("softmax layer test passed!") ``` 在这个测试用例中,我们首先创建了一个softmax层并使用给定的输入计算输出。然后,我们使用输出梯度调用反向传播函数,以计算输入梯度。最后,我们检查计算出的输出和输入梯度是否与预期值非常接近。如果测试用例没有抛出异常,则说明softmax层实现正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值