1.  
  2. Python连接Ubuntu 环境 wifi流程
  3.  
  4.  

1、获取网络接口列表

通过wifi_net.py 的query_net_cards方法获取终端物理网络接口列表及IP信息:
获取物理网络接口列表:

  1. ls -d /sys/class/net/*/device | cut -d/ -f5
  1. 或者:
  1. find /sys/class/net -type l -not -lname '*virtual*' -printf '%f\n'
  2. iwifconfig

代码示例:

  1. # 查询所有物理网卡
  2. def _query_net_card_info(if_name):
  3. net_card_info = {
  4. "mac": "",
  5. "type": "eth",
  6. "ip": "",
  7. "netmask": "",
  8. }
  9. try:
  10. net_info = netifaces.ifaddresses(if_name)
  11. except ValueError:
  12. logger.error("No such interface: %s" % if_name)
  13. return net_card_info
  14. # 如果为无线网卡,将修改网卡类型为wlan
  15. if if_name in common.cmd_excute("iw dev | awk '$1==\"Interface\" {print $2}'"):
  16. net_card_info["type"] = "wlan"
  17.  
  18. net_card_info["mac"] = net_info[netifaces.AF_LINK][0]["addr"].upper()
  19. ipv4_info = net_info.get(netifaces.AF_INET)
  20. if ipv4_info:
  21. net_card_info["ip"] = ipv4_info[0]["addr"]
  22. net_card_info["netmask"] = ipv4_info[0]["netmask"]
  23. return net_card_info
  24.  
  25. @staticmethod
  26. def query_net_cards():
  27. """
  28. {
  29. "enp2s0": // 接口名称
  30. {
  31. "mac": "98:FA:9B:99:E5:6A", // MAC地址
  32. "type": "eth", // 接口类型,eth-有线网卡, wlan-无线网卡
  33. "ip": "192.168.2.90", // 接口当前IP
  34. "netmask": "255.255.255.0", // 接口掩码
  35. "dns":"192.168.2.1", // dns服务器ip
  36. "gateway": "192.168.2.1" // 网管地址
  37. },
  38. "wlan0":
  39. {
  40. "mac": "98:FA:9B:99:E5:6A", // MAC地址
  41. "type": "wlan", // 接口类型,eth-有线网卡, wlan-无线网卡
  42. "ip": "", // 接口当前IP
  43. "netmask": "", // 接口掩码
  44. "dns":"192.168.2.1", // dns服务器ip
  45. "gateway": "192.168.2.1" // 网管地址
  46. }
  47. }
  48. """
  49. net_cards = dict()
  50. # 获取所有物理网卡名称
  51. command = "ls -d /sys/class/net/*/device | cut -d/ -f5"
  52. interfaces = common.cmd_excute(command)
  53.  
  54. # 获取dns服务器ip
  55. dns_path = '/etc/resolv.conf'
  56. dns_list = []
  57. if os.path.exists(dns_path):
  58. dns_list = common.cmd_excute("cat %s|grep ^nameserver|awk '{print $2}'" % dns_path, b_print=False)
  59. # 获取网管地址
  60. gateways = netifaces.gateways().get('default').get(netifaces.AF_INET)
  61.  
  62. for interface in interfaces:
  63. net_card = Network._query_net_card_info(if_name=interface)
  64. net_card["dns"] = dns_list if dns_list else ""
  65. net_card["gateway"] = gateways[0] if gateways else ""
  66. net_cards[interface] = net_card
  67. return net_cards

2、获取无线网络列表
通过wifi_net.py 的query_wifi_ssids方法获取扫描到的无线网络列表:

扫描无线网络:
通过iwlist 命令获取,需要解析命令行输出:

  1. iwlist wlan0 scan

或,通过python库 wifi解析:

  1. def query_wifi_ssids(wifi_if):
  2. import wifi
  3. import codecs
  4. ssid_list = []
  5. try:
  6. common.cmd_excute("ifconfig %s up" % wifi_if)
  7. cell_list = wifi.Cell.all(wifi_if)
  8. except wifi.exceptions.InterfaceError as e:
  9. # 可能非Wifi接口
  10. logger.error("_get_wireless_ssid_list exception: %s" % traceback.format_exc())
  11. return ssid_list
  12.  
  13. for cell in cell_list:
  14. ssid_list.append(
  15. {
  16. "ssid": codecs.utf_8_decode(cell.ssid)[0].encode('utf-8'),
  17. "mac": cell.address,
  18. "encrypted": cell.encrypted,
  19. "quality": cell.quality,
  20. # "signal": cell.signal,
  21. }
  22. )
  23.  
  24. return ssid_list

返回数据示例:

  1. [
  2. {
  3. "ssid": "leifeng_2", // 无线网络SSID
  4. "mac": "58:D9:D5:D3:FB:01", // 无线接入点MAC
  5. "enctypted": True // 是否加密
  6. "quality": cell.quality //信号强度
  7. },
  8. {
  9. "ssid": "leifeng_2_5G",
  10. "mac": "58:D9:D5:D3:FB:05",
  11. "enctypted": True
  12. "quality": cell.quality
  13. }
  14. ]

3、连接无线网络,检查连接结果
connect_wifi方法连接无线网络:

  1. # 配置无线网络:
  2. wpa_passphrase "leifeng_2" "radeon123" > /etc/wpa_supplicant/wpa_supplicant.conf
  3. # leifeng_2网络名称 radeon123 wifi密码
  4. # 连接无线网络:
  5. wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf &
  6. # -B后台执行
  1. # 代码示例
  2. def connect_wifi(net_card, ssid, password, static_ip=""):
  3. """连接wifi"""
  4. wifi_conf_command = 'wpa_passphrase "%s" "%s" > /etc/wpa_supplicant/wpa_supplicant.conf' % (ssid, password)
  5. common.cmd_excute(wifi_conf_command)
  6.  
  7. wifi_conn_command = 'wpa_supplicant -i %s -c /etc/wpa_supplicant/wpa_supplicant.conf -B > /tmp/wifi_conn.txt' % net_card
  8. logger.debug("Start wifi connection: %s " % wifi_conn_command)
  9. common.cmd_excute(wifi_conn_command)
  10. if not static_ip:
  11. # flush
  12. flush_command = "ip addr flush dev %s" % net_card
  13. common.cmd_excute(flush_command)
  14. # 自动分配ip地址
  15. auto_command = "dhclient %s" % net_card
  16. common.cmd_excute(auto_command)
  17. else:
  18. # 配置静态ip
  19. manual_common = "ifconfig %s %s" %(net_card,static_ip)
  20. common.cmd_excute(manual_common)
  21. for i in range(10):
  22. wifi_status_command = "cat /sys/class/net/{}/operstate".format(net_card)
  23. wifi_status_process = subprocess.Popen(wifi_status_command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
  24. if wifi_status_process.stdout.readline() == "up":
  25. logger.debug("wifi %s connection success") % ssid
  26. break
  27. time.sleep(1)
  28. else:
  29. wifi_result_command = "cat /tmp/wifi_conn.txt | grep reason=WRONG_KEY"
  30. wifi_result_process = subprocess.Popen(wifi_result_command, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
  31. shell=True)
  32. if wifi_result_process.stdout.readline():
  33. logger.debug("wifi %s connection fail,password error") % ssid
  34. return False,"password error"
  35. logger.debug("wifi %s connection timeout") % ssid
  36. return False,"connect timeout"
  37. return True,"success"

4、封装cmd命令

定义common.py文件,

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 2020/11/11 下午3:21
  4. import subprocess
  5.  
  6. def shell_excute(rsyncStr, shell=False, b_print=True):
  7. p = subprocess.Popen(rsyncStr, shell=shell,
  8. stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  9. output = "".join(p.communicate())
  10. return output
  11.  
  12. def cmd_excute(command, b_trip=True, b_print=True):
  13. ret_list = []
  14. cmd_ret = shell_excute(command, shell=True, b_print=b_print).splitlines()
  15. if b_trip:
  16. for sline in cmd_ret:
  17. if len(sline.strip()) != 0:
  18. ret_list.append(sline.strip())
  19. else:
  20. ret_list = cmd_ret
  21. return ret_list

  

python操作 linux连接wifi,查看wifi连接状态方法的更多相关文章

  1. python操作mongodb根据_id查询数据的实现方法

    python操作mongodb根据_id查询数据的实现方法   python操作mongodb根据_id查询数据的实现方法,实例分析了Python根据pymongo不同版本操作ObjectId的技巧, ...

  2. linux中可以查看端口占用的方法

    在自己搭建的服务器中,经常容易出现端口被占用的问题,那么怎么知道自己的端口是否被占用了呢? 可以使用下面的方法: linux中可以查看端口占用的方法. netstat -ant | grep 80 ( ...

  3. 在Linux终端中查看公有IP的方法详解

    首先回顾一下一般的查看IP的命令: ifconfigLinux查看IP地址的命令--ifconfigifconfig命令用于查看和更改网络接口的地址和参数 $ifconfig -a  lo0: fla ...

  4. python操作文件和目录查看、创建、删除、复制

    python内置了os模块可以直接调用操作系统提供的接口函数,os.name查询的是操作系统,‘nt’表示windows系统 >>> import os >>> o ...

  5. linux设置和查看环境变量的方法

    1.    显示环境变量HOME $ echo $HOME /home/redbooks 2.    设置一个新的环境变量hello $ export HELLO="Hello!" ...

  6. Linux设置和查看环境变量的方法 详解

    1. 显示环境变量HOME $ echo $HOME /home/redbooks 2. 设置一个新的环境变量hello $ export HELLO="Hello!" $ ech ...

  7. python 下载.whl 文件,查看已安装软件包方法

    下载地址       https://www.lfd.uci.edu/~gohlke/pythonlibs/ 另一个Python packages地址为    https://pypi.org/ 下载 ...

  8. 【转】Linux设置和查看环境变量的方法

    转: http://www.jb51.net/LINUXjishu/77524.html 1. 显示环境变量HOME $ echo $HOME /home/redbooks 2. 设置一个新的环境变量 ...

  9. python在linux中输出带颜色的文字的方法

    在开发项目过程中,为了方便调试代码,经常会向stdout中输出一些日志,默认的这些日志就直接显示在了终端中.而一般的应用服务器,第三方库,甚至服务器的一些通告也会在终端中显示,这样就搅乱了我们想要的信 ...

  10. linux系统快速查看进程pid的方法

    一个很简单的命令,pgrep,可以迅速定位包含某个关键字的进程的pid:使用这个命令,再也不用ps aux 以后去对哪个进程的pid了 一个很简单的命令,pgrep,可以迅速定位包含某个关键字的进程的 ...

随机推荐

  1. vue-seamless-scroll 组件用法-区域内容滚动效果

    1.滚动效果 2.代码 <div class="page-container" style=""> <vue-seamless-scroll ...

  2. Vue 数组响应

    响应渲染 在Vue中,被渲染的数据都是响应式的,即Vue实例中进行改变页面中也会跟着改变: <body> <div id="app"> <p>{ ...

  3. go ice相关配置

    set GO111MODULE=on set GOPROXY=https://goproxy.cn,direct set GOPRIVATE=*.jd.com go get git.jd.com/ch ...

  4. 用python将Mybatis日志中的Preparing与Parameters转换为可执行SQL并且美化格式

    一.源代码下载 https://gitee.com/rmtic/SqlLog 说明: 1.可以处理oracle中正则表达中的'?',解决参数'?'冲突问题 2.如果要处理mysql和处理oracle中 ...

  5. 使用CSS 绘制各种形状

      如何使用CSS 绘制各种形状? 很多小伙伴在做开发的时候,遇到一些要画很多形状的时候,就很纠结了,知道怎么用CSS去布局,就是不知道怎么画图案. 其实使用CSS可以绘制出很形状的,比如三角形,梯形 ...

  6. laravel视图响应

    1.输出json $data = [ 'id' => 1, 'name' => 'jack', ]; return response()->json($data); 2.重定向 // ...

  7. Django——全局配置settings详解

    Django设置文件包含你所有的Django安装配置.这个文件一般在你的项目文件夹里.比如我们创建了一个名为mysite的项目,那么这个配置文件setting.py就在项目里的mysite文件夹里. ...

  8. map()函数应用

    title: map()函数应用 author: 杨晓东 permalink: map()函数应用 date: 2021-10-02 11:27:04 categories: - 投篮 tags: - ...

  9. vue 报错Uncaught (in promise) cancel

    解决:.catch()不能省略(因为取消操作时,无法捕获) .then(res => {...}) .catch(()=>{});(then之后把catch加上)

  10. SEO高质量外链怎么做?

    其实seo是一个很枯燥的东西,说技术也没有什么技术可言 1.你需要每天坚持更新你的网站,坚持写软文 2.你需要每天发外链,而且有质量的外链 3.你需要每天交换友情链接来增加网站的权重名 4.你需要每天 ...