wifi_hotpot/wifi_manger.py

158 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import subprocess
import os
import time
from flask import Flask, render_template, request, redirect, url_for, make_response
app = Flask(__name__)
# 检测 Wi-Fi 连接状态
def check_wifi_connection():
try:
# 使用nmcli命令检查Wi-Fi连接状态
output = subprocess.check_output(['nmcli', 'device', 'status']).decode('utf-8')
# 分析输出以查找Wi-Fi连接状态
for line in output.split('\n'):
if 'wifi' in line and 'connected' in line:
return True
except subprocess.CalledProcessError as e:
print(f"Error checking Wi-Fi status: {e}")
return False
# 设置热点
def set_hotspot():
try:
subprocess.run(['sudo', 'create_ap', 'wlan0', 'eth0', 'Takway-Toy', '--no-virt'], check=True)
except subprocess.CalledProcessError as e:
print(f"Error setting up hotspot: {e}")
def scan_wifi():
try:
subprocess.run(['nmcli', 'dev', 'wifi', 'rescan'], check=True)
time.sleep(1)
output = subprocess.check_output(['nmcli', 'dev', 'wifi'])
wifi_list = []
lines = output.decode().splitlines()
for idx, line in enumerate(lines[1:]):
print(f"{idx}: {line}")
# 分割字符串以空格为分隔符
columns = line.split()
# 提取第一列和第三列的值
mac_address = columns[0]
ssid = " ".join(columns[1:3])
if "Infra" in ssid:
ssid = ssid.replace(" Infra", "")
# 提取第六列的强度值
last_info = columns[4:8]
# 去除所有的空格
columns = line.replace(" ", "")
# 提取"Mbit/s"后两位数字
strength = int(columns[columns.index("Mbit/s")+6:columns.index("Mbit/s")+8])
# print("MAC地址:", mac_address)
# print("SSID:", ssid)
# print("强度:", strength)
wifi_list.append({'ssid': ssid, 'signal': strength})
if len(wifi_list) == 15:
break
return wifi_list
except subprocess.CalledProcessError as e:
print(f"Error scanning for Wi-Fi networks: {e}")
return []
def scan_wifi_table():
import csv
import subprocess
from io import StringIO
# 调用 nmcli dev wifi 命令并获取输出
output = subprocess.check_output(['nmcli', 'dev', 'wifi']).decode()
# 创建一个内存中的文件对象
file_object = StringIO(output)
# 使用csv模块读取文件对象并指定分隔符为whitespace
reader = csv.reader(file_object, delimiter=' ')
# 将数据存储到二维列表中
data = [row for row in reader]
# 打印表格数据
for row in data:
print(row)
# 连接 Wi-Fi
def connect_wifi(ssid, password):
scan_wifi()
time.sleep(1)
try:
subprocess.run(['sudo', 'create_ap', '--stop', 'wlan0'], check=True)
print("Stopping create_ap service")
except subprocess.CalledProcessError as e:
print(f"Error stopping hotspot: {e}")
time.sleep(1)
try:
subprocess.run(['nmcli', 'dev', 'wifi', 'connect', ssid, 'password', password], check=True)
except subprocess.CalledProcessError as e:
print(f"Error connecting to Wi-Fi: {e}")
time.sleep(5)
# 检查是否成功连接Wi-Fi
if check_wifi_connection():
print("成功连接到Wi-Fi程序即将退出。")
os._exit(0) # 成功连接后退出程序
else:
print("Wi-Fi连接失败。")
# 主页
@app.route('/')
def index():
wifi_list = scan_wifi()
response = make_response(render_template('index.html', wifi_list=wifi_list))
response.headers.set('Content-Type', 'text/html')
response.headers.set('Apple-Web-App-Capable', 'yes')
response.headers.set('Apple-Mobile-Web-App-Status-Bar-Style', 'black-translucent')
return response
# 提交 Wi-Fi 信息
@app.route('/submit', methods=['POST'])
def submit():
ssid = request.form['ssid']
password = request.form['password']
print(f"Connecting to Wi-Fi: {ssid} with password {password}")
connect_wifi(ssid, password)
stop_hotspot() # 关闭热点
return redirect(url_for('index'))
if __name__ == '__main__':
debug_mode = False # 设置为 True 以跳过 Wi-Fi 连接状态检测
if not debug_mode:
if check_wifi_connection():
print("已连接到 Wi-Fi 网络")
else:
print("未连接到 Wi-Fi 网络")
set_hotspot()
print("Starting Flask server")
print("----------------------------")
wf_list = scan_wifi()
print("----------------------------")
print(wf_list)
'''
# 启动 Flask 服务器
app.run(host='0.0.0.0', port=80, debug=True)
'''