Android/Linux设备有线&无线 双网共存(同时上内、外网)

嵌入式开发 同时被 2 个专栏收录
29 篇文章 6 订阅
8 篇文章 0 订阅


Shell脚本实现嵌入式Android/Linux有线和无线网卡双网共存

  • 一、网络环境及问题再现
  • 二、命令行方式实现双网共存
  • 三、Shell脚本自动实现双网共存(根据网络环境动态配置IP路由)

–>问题:在使用某嵌入式开发板(Android 6.0系统)过程中,发现无法同时进行有线(Ethernet)和无线(WiFi)网卡同时通讯,同时产品又有需求,必须同时通过这两个网卡与内网和外网进行通信。
–>解决:实际方案有两种: 第一种:更改Android 6.0 Firmware层的代码,适配双网卡运行逻辑,可以从根本上解决该双网共存问题。 第二种方案很简单:根据实际网络情况,通过脚本更改路由,实现双网共存。
–>测试环境:嵌入式开发板,无线路由器,网线

实际测试用第二种方案也完全可以实现双网共存的需求(可比第一种简单了N条街),可以有效解决有线网卡和无线网卡同时上内、外网。
其本质就是实现了两个不同的IP网段子网与Internet的互联互通,下面介绍其实现:

下载脚本完整代码(带网络状态、异常检测及配置结果的验证):http://download.csdn.net/detail/howiexue/9908099
GitHub源码地址(好用别忘加个星哦):
https://github.com/HowieXue/setDualNet


一、网络环境及问题再现

我使用的嵌入式开发板(全志A64)跑的Android 6.0系统,开机后插入网线Ethernet(内网),并且连上无线路由器产生的WiFi(外网)。

有线网络环境(eth0):网关为:192.168.199.1,有线的IP为动态获取192.168.199.189。无法访问互联网
无线网络环境(wlan0):网关为192.168.30.1,IP也为DHCP分配的192.168.30.78,可以访问互联网

ifconfig 如下图:
这里写图片描述
路由表如下图:
这里写图片描述

这时,问题有两种情况:一是 ping 无线网关和互联网都可以通,但无法ping通有线网关;另一种就是ping有线网可以通,但ping无线和互联网就不通。(既只能单网络,无法双网共存),如下图:
这里写图片描述


二、命令行方式实现双网共存

1、将两个网络都设置为静态IP,在shell中手敲命令吧:

ifconfig eth0 192.168.199.188
ifconfig wlan0 192.168.30.66
注意改动WiFi的IP后,WiFi可能会重连而再次自动获取,导致配置失败,解决方法:多试几次(简单粗暴)

2、在路由表中添加默认网关路由,因为我的WiFi是连互联网的,所以我的默认路由添加的WiFi的网关。

route add default gw 192.168.30.1

其实这里就是关键所在了,因此我们之前没有默认网关,所以当有线网"主导时",系统不知道如何路由;现在设置了默认网关为无线网络,则除了访问有线192.168.199.x网段的网络,其他的默认都是通过无线来走。

如下图:
这里写图片描述

实现结果:

(这里无线路由器改了网段,也是摸索了好久从Android系统层次又到Linux驱动层次,最后就这样简单粗暴的实现了双网共存。。)
这里写图片描述


三、Shell脚本自动实现双网共存(根据网络环境动态配置IP路由)

上面手动输入命令固然可以实现双网共存,但应用到产品中,总不能每个都手输,并且网络环境改变后,IP和route路由表都会有不同变化。
所以就需要写脚本自动实现上面过程,虽然简单的几行命令,但脚本写起来还是要考虑很多异常情况,使配置能够真正高效、稳定。

完整脚本代码连接(带异常检测和状态验证):http://download.csdn.net/detail/howiexue/9908099

脚本会先利用 ifconfig 和 route 命令动态获取设备的IP和路由信息,然后根据其IP和路由进行设置静态IP和配置默认路由。

1、首先要通过ifconfig获取wlan0和eth0的IP地址以及网关数据,由于Android的shell中不支持awk,所以使用sed去获得这些数据:

WlanIP=$(ifconfig wlan0|grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g')
EtherIP=$(ifconfig eth0|grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g')

2、修改WlanIPEtherIP。上面说到首要更改静态IP,但实际测试中,如果直接使用DHCP分配的原IP设置静态会不成功(费解)。
所以我先设置不同的中间IP,然后再设置会原IP,才能成功配置成静态IP(现在也不明白为什么,大家知道可以指点下)。

我将中间IP配置成原IP段的广播地址(最后面替换为255),这里提供两种方法实现对IP数据末位的更改:其中InterIPLast就是IP地址最后的(子网段)数据,InterIP就是前三个数据。

	InterIP=${WlanIP%.*}
	InterIPLast=${WlanIP##*.}
	WlanInterIP=$InterIP.255
	
	InterIPLast="255"
	InterIP=${EtherIP%.*}
	EtherInterIP=$InterIP.$InterIPLast

在我的网络环境中最后得到中间IP为:192.168.199.255以及192.168.30.255

3、利用Ifconfig对中间IP以及原IP进行配置

	ifconfig wlan0 $WlanInterIP netmask 255.255.255.0 up
	ifconfig eth0 $EtherInterIP netmask 255.255.255.0 up
	CheckWlanStatus
	sleep 1;
	ifconfig eth0 $EtherIP netmask 255.255.255.0 up
	ifconfig wlan0 $WlanIP netmask 255.255.255.0 up
	CheckWlanStatus	

其中CheckWlanStatus 是我在脚本里写的函数,因为配置Wlan0的IP时,WiFi会有重启的现象,导致配置失败,所以我要检查该状态,如果重启了就再重新执行一次。完整代码见链接
CheckWlanStatus代码:这里是通过route来判断,因此WiFi重连时候,路由表里不会有wlan0的信息

function CheckWlanStatus()
{
	if route|grep wlan >/dev/null;
	then
		if ifconfig wlan0|grep 'inet addr' >/dev/null;
		then
			:
		else
			echo "WLAN is reconnected, scripts may failed...pls check wlan status"
		fi
	else
		echo "WLAN is reconnected, scripts may failed...pls check wlan status"
	fi
}

4、配置默认网关:考虑网关的不确定性,脚本会有一个输入参数来输入接入外网所用的默认网关,如果没有参数,则默认是使用WiFi的IP地址,并把最后位设为1的作为网关IP,如192.168.30.1
代码首先判断有无默认路由:然后根据输入参数设置默认路由,该代码也展示了如何判断shell脚本有无输入参数($1),以及获取并更改route信息的方式:

DefaultGWStatus=$(route | grep default)
	if [$DefaultGWStatus == ""];
	then
		if [ ! -n "$1" ]; then
			echo "Param1 Not Enter, default gw use *.*.*.1 of wlan ip"
			route add default gw $WlanDefaultGw
			echo "Add Default Gateway:" $WlanDefaultGw
		else
			route add default gw $1
			echo "Add Default Gateway:" $1
		fi
	else 
		echo "Default Gateway Existence, pls check it"
	fi

5、上述代码执行完后,接下来进行检查和验证脚本执行结果:首先会ping一下已设置的默认网关,确认默认网关是可以通的,然后分别ping外网(8.8.8.8)和另一个网关,如果都通了则脚本配置成功,否则重新ifconfig:
这里也展示了如何在脚本中进行ping,注意ping的参数都设置了-c 和-W保障脚本执行

	if [ ! -n "$1" ]; 
	then
		if ping -c 2 -W 2 $WlanDefaultGw >/dev/null;
		then
			echo "Ping default gw from Para1 "$WlanDefaultGw" Sucess!"
		else
			echo "Ping default gw from Para1"$WlanDefaultGw" failed, now reconfig ip, pls check later..."
			ifconfig eth0 $EtherIP netmask 255.255.255.0 up
			ifconfig wlan0 $WlanIP netmask 255.255.255.0 up
		fi
	else
		if ping -c 2 -W 2 $1 >/dev/null;
		then
			echo "Ping default gw "$1" Sucess!"
		else
			echo "Ping default gw "$1" failed, now reconfig ip, pls check later..."
			ifconfig eth0 $EtherIP netmask 255.255.255.0 up
			ifconfig wlan0 $WlanIP netmask 255.255.255.0 up
		fi
		
	fi
	CheckWlanStatus
	if ping -c 2 -W 2 8.8.8.8 >/dev/null;
	then
		echo "Ping Internet 8.8.8.8 Sucess!"
	else
		echo "Ping Internet failed, now reconfig ip, pls also check Wlan..."
		ifconfig eth0 $EtherIP netmask 255.255.255.0 up
#		ifconfig wlan0 $WlanIP netmask 255.255.255.0 up
	fi

实际效果如图

有输入参数

这里写图片描述

无输入参数(默认为x.x.x.1)

这里写图片描述


博主热门文章推荐:

一篇读懂系列:

LoRa Mesh系列:

网络安全系列:

嵌入式开发系列:

AI / 机器学习系列:


  • 5
    点赞
  • 5
    评论
  • 11
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

<h4 style="font-weight:500;font-size:1.5rem;font-family:'PingFang SC', 'Hiragino Sans GB', Arial, 'Microsoft YaHei', Verdana, Roboto, Noto, 'Helvetica Neue', sans-serif;color:#222226;background-color:#ffffff;text-align:center;"> <span style="font-size:14px;">期末</span><span style="font-size:14px;background-color:#fbeeb8;">考点</span><span style="font-size:14px;">都对应</span><span style="font-size:14px;background-color:#fbeeb8;">详解视频</span><span style="font-size:14px;">,</span><span style="font-size:14px;"><span style="color:#e03e2d;">基础阶段</span></span><span style="font-size:14px;">容全面,语言通俗易懂(翻译书中的语言为</span><span style="font-size:14px;background-color:#fbeeb8;">人话)</span><span style="font-size:14px;">,</span> </h4> <h4 style="font-weight:500;font-size:1.5rem;font-family:'PingFang SC', 'Hiragino Sans GB', Arial, 'Microsoft YaHei', Verdana, Roboto, Noto, 'Helvetica Neue', sans-serif;color:#222226;background-color:#ffffff;text-align:center;"> <span style="font-size:14px;">老师精心研究</span><span style="font-size:14px;background-color:#fbeeb8;">百份</span><span style="font-size:14px;">考卷,总结每一个考点,同时结合你肯定可以听懂的骚话,</span> </h4> <h4 style="font-weight:500;font-size:1.5rem;font-family:'PingFang SC', 'Hiragino Sans GB', Arial, 'Microsoft YaHei', Verdana, Roboto, Noto, 'Helvetica Neue', sans-serif;color:#222226;background-color:#ffffff;text-align:center;"> <span style="font-size:14px;background-color:#fbeeb8;">扫清你的数据库系统盲区</span> </h4> <h4 style="font-weight:500;font-size:1.5rem;font-family:'PingFang SC', 'Hiragino Sans GB', Arial, 'Microsoft YaHei', Verdana, Roboto, Noto, 'Helvetica Neue', sans-serif;color:#222226;background-color:#ffffff;text-align:center;"> <span style="font-size:14px;"><span style="color:#e03e2d;">真题阶段</span></span><span style="font-size:14px;">为你提供</span><span style="font-size:14px;background-color:#fbeeb8;">解题思路</span><span style="font-size:14px;">,培养你的</span><span style="font-size:14px;background-color:#fbeeb8;">解题思维</span><span style="font-size:14px;">,同时</span><span style="font-size:14px;background-color:#fbeeb8;">点明考点</span><span style="font-size:14px;">,结合文档进行重点解读,加深你的印象.</span> </h4> <h4 style="font-weight:500;font-size:1.5rem;font-family:'PingFang SC', 'Hiragino Sans GB', Arial, 'Microsoft YaHei', Verdana, Roboto, Noto, 'Helvetica Neue', sans-serif;color:#222226;background-color:#ffffff;text-align:center;"> <span style="font-size:14px;color:#3598db;">只为你的高分,我们交个朋友!让每位学生都可以学的起!!</span> </h4> <p> <span style="font-size:14px;color:#3598db;"><img src="https://img-bss.csdnimg.cn/202103040423318088.png" alt="" width="788" height="450" /></span> </p>
©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值