香橙派——自发热点连Wi-Fi

1. 安装依赖

sudo apt-get update
sudo apt-get install hostapd dnsmasq
sudo pip install flask

2. 热点功能

(1)开启热点(并断开当前连接的Wi-Fi)

sudo nmcli radio wifi off && \
sudo nmcli radio wifi on && \
sudo systemctl stop dnsmasq && \
sudo systemctl restart NetworkManager && \
nohup sudo create_ap wlan0 eth0 Takway-Toys --no-virt > create_ap.log 2>&1 &

(2)运行Web后端

sudo chmod 777 app.py
sudo python3 app.py
  • app.py
# coding: utf-8
import subprocess
import os
import time
from flask import Flask, render_template, request, redirect, url_for

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}")

# 扫描 Wi-Fi
def scan_wifi():
    try:
        subprocess.run(['nmcli', 'device', 'wifi', 'rescan'], check=True)
    except subprocess.CalledProcessError as e:
        print(f"Error scanning for Wi-Fi networks: {e}")

# 连接 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():
    return render_template('index.html')

# 提交 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)
    return redirect(url_for('index'))

if __name__ == '__main__':
    debug_mode = True  # 设置为 True 以跳过 Wi-Fi 连接状态检测

    if not debug_mode:
        if check_wifi_connection():
            print("已连接到 Wi-Fi 网络")
        else:
            print("未连接到 Wi-Fi 网络")
            set_hotspot()


    # 创建 index.html 文件
    index_html_path = 'index.html'
    if not os.path.exists(index_html_path):
        with open(index_html_path, 'w') as f:
            f.write("""<!DOCTYPE html>
<html>
<head>
    <title>Wi-Fi 设置</title>
</head>
<body>
    <h1>输入 Wi-Fi 信息</h1>
    <form method="post" action="{{ url_for('submit') }}">
        <label for="ssid">Wi-Fi 名称 (SSID):</label>
        <input type="text" id="ssid" name="ssid" required>
        <br>
        <label for="password">密码:</label>
        <input type="password" id="password" name="password" required>
        <br>
        <input type="submit" value="连接">
    </form>
</body>
</html>""")

    app.run(host='0.0.0.0', port=80, debug=True)
  • 手动连接http://192.168.12.1/

3. 开启自启动脚本

方式一:配置系统开机自启动service服务

香橙派——基本配置教程

sudo vim /etc/systemd/system/wifi_hotspot.service
[Unit]
Description=My Service
After=network.target
 
​
[Service]
Type=simple
WorkingDirectory=/home/orangepi
ExecStart=python3 /home/orangepi/app.py
User=root
 
[Install]
WantedBy=multi-user.target
  • 第二种
[Unit]
Description=WiFi Hotspot Wrapper
After=network.target
Wants=network.target

[Service]
Type=oneshot
ExecStart=python3 /home/orangepi/wifi_hotpot/wifi_manager.py
WorkingDirectory=/home/orangepi/wifi_hotpot
User=root

[Install]
WantedBy=default.target
sudo systemctl daemon-reload
sudo systemctl enable wifi_hotspot.service
# sudo systemctl disable wifi_hotspot.service
sudo systemctl start wifi_hotspot.service
sudo systemctl status wifi_hotspot.service

其他常用命令及脚本

  • 扫描Wi-Fi:
nmcli dev wifi rescan
  • 断开WiFi连接
sudo systemctl stop dnsmasq
sudo systemctl stop NetworkManager
sudo systemctl restart NetworkManager
  • 连接Wi-Fi
nmcli dev wifi connect Innoxsz-Public password innox2023
nmcli dev wifi connect Takway-AI password takway123
  • 开启热点:
# 有密码
sudo create_ap -m nat wlan0 eth0 orangepi orangepi --no-virt
# 无密码
sudo create_ap wlan0 eth0 Takway-AI --no-virt
# nohup
nohup sudo create_ap wlan0 eth0 Takway-Toys --no-virt > create_ap.log 2>&1 &
  • 关闭热点:
sudo create_ap --stop wlan0

BUG解决

  • nmcli dev status出现wlan0 unmanaged的情况:
orangepi@orangepizero3:~/wifi_hotpot$ nmcli dev status
DEVICE  TYPE      STATE        CONNECTION
eth0    ethernet  unavailable  --
lo      loopback  unmanaged    --
wlan0   wifi      unmanaged    --

步骤 1:修改 NetworkManager 配置文件
/etc/NetworkManager/NetworkManager.conf 文件中移除或注释掉 [keyfile] 部分的 unmanaged-devices 条目,因为它可能阻止了 NetworkManager 管理 wlan0 接口。编辑文件如下:

[keyfile]
#unmanaged-devices=interface-name:ap0;interface-name:wlan0

保存并关闭文件。

步骤 2:重启 NetworkManager
修改配置文件后,重启 NetworkManager 服务以应用更改:

sudo systemctl restart NetworkManager

步骤 3:检查 wlan0 状态
使用 nmcli dev status 检查 wlan0 的状态是否已经变为 managed

通过以上步骤,您应该能够解决 wlan0 处于 unmanaged 状态的问题。如果问题仍然存在,可能需要更深入的调查或联系设备制造商的技术支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值