WiFi to Ethernet: 树莓派共享无线连接至有线网口,自动通过Captive Poartal网页登录认证
- 物联网开发系列:
- 物联网开发之旅① WiFi to Ethernet: 树莓派共享无线连接至有线网口,自动通过Captive Poartal验证
- 物联网开发番外篇之 Captive Portal验证原理
文章目录
- 背景
- 实现工具
- 实现细节
- 一、将无线连接共享到以太网
- 1. 配置静态IP地址
- 2. 启用IP转发
- 3. 配置NAT(网络地址转换)
- 4. 自动应用iptables规则
- 二、自动通过WiFi的登录验证
- 1. 编写登录脚本
- 2. 编写网络检查脚本
- 3. 使用`systemd`定时器
- 总结
- 参考
背景
在物联网开发中,大多数设备都是通过无线局域网进行通信的,在局域网下非常容易实现,但是有些时候我们需要在远程对物联网设备进行管理,例如在公司关掉在家忘了关掉的空调,或者在家查看公司物联网设备的工作状态,这时候就需要将局域网的设备暴露到互联网上。
最简单的方式当然是通过一根网线将局域网路由器连接到有互联网的路由器,但是有些情况下这种方法并不可行,否则就不会有本文了。
不便之处在于公司只能够提供一个WiFi连接,这就需要将无线连接获取到的互联网连接共享到局域网设备中。
另外,公司提供的无线连接通常具有captive portal功能,WiFi本身是不加密的,但是连接上之后需要通过一个账号密码进行验证才能上网。
因此要解决这个问题就要完成两个主要任务:
- 将无线连接共享到以太网
- 自动通过公司的Captive Portal认证
再次注意本文的需求,是将无线连接共享到有线网口,目前大多数网上的方案都是将以太网共享到WiFi,这没什么难度,开个热点就好了。
具体网络拓扑可以参考以下图片

实现工具
要将无线连接共享到以太网并自动通过WiFi的登录验证,我们需要选择适当的工具和方法。以下是选择这些工具的原因:
- 使用
nmcli工具:nmcli是NetworkManager的命令行接口,可以方便地管理网络连接。 - 使用
iptables进行NAT:iptables是Linux内核的包过滤系统,可以配置NAT(网络地址转换)来共享网络连接。 - 编写Shell脚本:通过编写Shell脚本,可以自动化WiFi连接和登录验证。
- 使用
systemd定时器:systemd是现代Linux系统的初始化系统和服务管理器,可以用来定时运行任务。
实现细节
一、将无线连接共享到以太网
1. 配置静态IP地址
首先,需要为以太网接口(eth0)配置一个静态IP地址,以便作为网络共享的网关。
编辑/etc/dhcpcd.conf文件:
sudo nano /etc/dhcpcd.conf
添加以下内容,为eth0配置静态IP地址:
interface eth0
static ip_address=192.168.0.1/24
static routers=
static domain_name_servers=
保存并退出编辑器,然后重启网络服务:
sudo systemctl restart dhcpcd
2. 启用IP转发
编辑/etc/sysctl.conf文件,启用IP转发:
sudo nano /etc/sysctl.conf
取消以下行的注释:
net.ipv4.ip_forward=1
使更改立即生效:
sudo sysctl -p
3. 配置NAT(网络地址转换)
配置iptables以共享无线连接到以太网:
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
将iptables规则保存到文件中:
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
4. 自动应用iptables规则
编辑/etc/rc.local文件,在exit 0之前添加以下内容,以便在启动时自动应用iptables规则:
sudo nano /etc/rc.local
添加以下内容:
iptables-restore < /etc/iptables.ipv4.nat
保存并退出编辑器。
小插曲:当我设置好转发之后,发现网络十分不稳定,研究之后发现是树莓派的射频功率不够,导致无线连接不稳定。改进方法有两个,一是给树莓派连接外置天线,可以参考这个视频(有点硬核)。我图省事就选了另一种方法,买个USB无线网卡(建议买免驱动的,省事)。
二、自动通过WiFi的登录验证
关于WiFi的Captive Portal认证功能,可以点击这里了解更多。
要让树莓派自动通过Captive Portal的登录认证,主要思想是抓取一个登录界面的数据包进行分析,将点击登陆时提交的账号密码的过程替换成脚本自动提交。
编写一个自动登录脚本,包含自动连接WiFi,自动提交登录账号密码,检查登录结果。
在系统上电初始化完成后运行登录脚本完成登录,同时运行一个30s的定时任务检查互联网连接是否正常,如不正常则运行一次登录脚本。
1. 编写登录脚本
创建一个名为login.sh的脚本,用于连接到WiFi并通过登录验证:
nano /home/pi/auto_login/login.sh
添加以下内容:
#!/bin/bash# 连接到WiFi网络
sudo nmcli device wifi connect 'Your SSID'# 等待连接建立
sleep 5# 检查WiFi连接状态
nmcli device status# 检查IP地址
ip addr show wlan0# 提交登录表单并输出详细信息
curl -X POST https://[your login domain] \-d "username=[your account]" \-d "password=[your password]" \-d "buttonClicked=4" \-d "redirect_url=" \-d "err_flag=0" \-d "info_flag=0" \-d "info_msg=0" \-v# 检查登录结果
curl -I http://github.com
保存并退出编辑器,然后使脚本可执行:
chmod +x /home/pi/auto_login/login.sh
2. 编写网络检查脚本
创建一个名为network_check.sh的脚本,用于定期检查网络连接状态:
nano /home/pi/auto_login/network_check.sh
添加以下内容:
#!/bin/bashLOGFILE="/var/log/network-reconnect.log"
TARGET="http://github.com" # 注意选择合适的网站,我选择http://www.baidu.com的时候就会获取到不能用的IP导致系统误以为网络没连接上while true; doecho "$(date): Checking network connectivity..." >> $LOGFILE# 检查网络连接状态if ! ping -c 1 -W 1 github.com > /dev/null; thenecho "$(date): Network is down or unable to access internet, running login script..." >> $LOGFILE/home/pi/auto_login/login.sh >> $LOGFILE 2>&1elseecho "$(date): Network is up and internet is accessible." >> $LOGFILEfi# 等待 30 秒sleep 30
done
保存并退出编辑器,然后使脚本可执行:
chmod +x /home/pi/auto_login/network_check.sh
3. 使用systemd定时器
创建一个systemd服务文件:
sudo nano /etc/systemd/system/network_check.service
添加以下内容:
[Unit]
Description=Network Check Script[Service]
Type=simple
ExecStart=/home/pi/auto_login/network_check.sh
保存并退出编辑器。
创建一个systemd定时器文件:
sudo nano /etc/systemd/system/network_check.timer
添加以下内容:
[Unit]
Description=Run Network Check Script every 30 seconds[Timer]
OnBootSec=30s
OnUnitActiveSec=30s
Unit=network_check.service[Install]
WantedBy=timers.target
保存并退出编辑器。
重新加载systemd配置,并启用和启动定时器:
sudo systemctl daemon-reload
sudo systemctl enable network_check.timer
sudo systemctl start network_check.timer
总结
本文分享了使用树莓派将WiFi连接的互联网共享至以太网,并且通过脚本实现登录界面的自动认证。
希望这篇博客能帮助到你。如果你有任何问题或需要进一步帮助,请在评论区留言。
参考
https://blog.csdn.net/weixin_45501411/article/details/103772070
相关文章:
WiFi to Ethernet: 树莓派共享无线连接至有线网口,自动通过Captive Poartal网页登录认证
物联网开发系列:物联网开发之旅① WiFi to Ethernet: 树莓派共享无线连接至有线网口,自动通过Captive Poartal验证物联网开发番外篇之 Captive Portal验证原理 文章目录 背景实现工具实现细节一、将无线连接共享到以太网1. 配置静态IP地址2. 启用IP转发3…...
【神软大数据治理平台-高级动态SQL(接口开发)】
1、背景 业务部门需大数据平台按照所提需求提供企业数据接口,基于神软大数据治理平台-高级动态SQL功能,满足业务需求,如下: (1)业务系统需求: 输入: enterpriseName:…...
【Java数据结构】Map和Set超详细两万字讲解(内含搜索树+哈希表)
🔒文章目录: 1.❤️❤️前言~🥳🎉🎉🎉 2. Map和Set的基础概念 3.Map的基础使用 4.Set的基础使用 5. TreeMap的本质——红黑树 5.1二叉搜索树的概念 5.2二叉搜索树的模拟实现 二叉搜索树——查找 二…...
中国制造2025,会抛弃精益生产吗?
时至今日,“精益生产”模式依旧大行其道,它始终支持着中国制造业以最低的成本做出优质产品。我们认为,纵然是中国制造2025成为现实,精益生产模式也仍然是整个制造业的精髓之一。 首先,精益生产模式最重要的一根脊梁就是…...
Rust 循环
Rust 循环 在编程语言中,循环是一种重要的控制结构,它允许我们重复执行一段代码直到满足特定的条件。Rust 语言提供了多种循环方式,每种方式都有其特定的用途和语法。本文将详细介绍 Rust 中的循环,包括 loop、while、while let、…...
数据结构(其四)--特殊矩阵的存储
目录 11.特殊矩阵的压缩存储 (1).一维数组的储存结构 (2).二维数组的存储结构 (3).普通矩阵的存储 (4).特殊矩阵的压缩存储 i.对称矩阵 ii.三角矩阵 iii.三对角矩阵 iiii.稀疏矩…...
系统化学习 H264视频编码(06)哥伦布编码
说明:我们参考黄金圈学习法(什么是黄金圈法则?->模型 黄金圈法则,本文使用:why-what)来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法,理论方面会更多地讲清楚 音视频中概念的…...
手机在网状态接口如何对接?(一)
一、什么是手机在网状态? 传入手机号码,查询该手机号的在网状态,返回内容有正常使用、停机、在网但不可用、不在网(销号/未启用/异常)、预销户等多种状态。 二、手机在网状态使用场景? 1.信贷审核&#…...
数据结构链表2(常考习题1)(C语言)
移除链表元素: . - 力扣(LeetCode) 题目: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 解题思路: 情况1: 情…...
Rust的运行时多态
Rust的运行时多态 Rust的静态多态即编译时多态,通过**泛型特征约束(Generic Type Trait Constrait)**来实现; 那么动态多态(运行时多态)呢?答案是特征对象(Trait Objectÿ…...
sqllabs通关
sqllabs5:(报错注入) ?id1 回显You are in........... ?id2-1 回显You are in........... ?id1 回显 1 LIMIT 0,1 判断是字符型,闭合。?id1order by 3-- //页面显示正常我们试了4行得出是报错注入 我们先爆库名 http://127.0.0.1/sqli-labs-master/L…...
RTSP系列四:RTSP Server/Client实战项目
RTSP系列: RTSP系列一:RTSP协议介绍-CSDN博客 RTSP系列二:RTSP协议鉴权-CSDN博客 RTSP系列三:RTP协议介绍-CSDN博客 RTSP系列四:RTSP Server/Client实战项目-CSDN博客 目录 一、RTSP Server实战项目 1、准备 2、…...
sqli-labs-php7-master第11-16关
猜注入点 先来猜数字型 单引号字符型: 发现注入点找到了 猜测数据库有多少个字段: 1’ order by 4 # 密码随便输的。 这里没有使用--注释,因为没作用,可能是过滤掉了 继续猜。刚才没猜对 1 order by 2 # 没报错,猜…...
c++初阶 string的底层实现
string 基础函数成员成员变量构造函数析构函数:拷贝构造赋值构造 遍历下标访问迭代器 增删插开辟空间push_backappendinserterase 功能函数swapfindc_strsubstrclear 其他函数比较函数流提取<<流插入>>getline 完整版 声明:非纯手搓…...
微信小程序实现上传照片功能
案例: html: <view class"zhengjianCont fontSize30" style"margin-bottom: 40rpx;"><view class"kuai"><image binderror"imageOnloadError" bind:tap"upladPhoto" data-params"business…...
lombok安装成功但是找不到方法
2024.1.1版本的IDE的插件安装了默认的lombok(如图1),pom文件中也引入了lombok的依赖,在实体类写了Data的注解,当调用实体类的get和set方法运行时,报错找不到相应的方法,但是在调用get、set方法的…...
单细胞Seurat的umi矩阵-与feature、counts(用于质控)
目录 关于umi矩阵学习 用umi计算feature、counts值 ①meta数据查看 ②Count和Feature计算(生成Seurat时自动计算) 1)提取UMI矩阵 2)计算 其他指标 评估质量指标(重点) 1)UMI计数 2)基因计数 3)UMIs vs. genes detected 4)线粒体计数比率 5)综合过滤 过…...
安防视频监控EasyCVR视频汇聚平台设备发送了GPS位置,但是订阅轨迹为空是什么原因?
安防视频监控EasyCVR视频汇聚平台兼容性强、支持灵活拓展,平台可提供视频远程监控、录像、存储与回放、视频转码、视频快照、告警、云台控制、语音对讲、GIS地图、轨迹跟踪、平台级联等视频能力。 用户描述,设备在电子地图中可以查看到定位信息ÿ…...
在 VueJS 中使用事件委托处理点击事件(事件委托,vue事件委托,什么是事件委托,什么是vue的事件委托)
前言 在开发 Vue 项目时,我们经常需要处理大量的点击事件。为每个可点击的元素单独添加事件监听器不仅会增加代码的复杂度,还会降低性能。事件委托是一种有效的优化方式,它可以显著减少事件监听器的数量,提高代码的可维护性和执行…...
密码学简史:时间密语
注:机翻,未校。 A brief history of cryptography: Sending secret messages throughout time Stemming from the Greek words for “hidden writing,” cryptography is the practice of encrypting transmitted information so that it can only b…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
