目录

  • Shell脚本实现嵌入式Android/Linux有线和无线网卡双网共存
  • 一、网络环境及问题再现
  • 二、命令行方式实现双网共存
    • 实现结果:
  • 三、Shell脚本自动实现双网共存(根据网络环境动态配置IP路由)
  • 实际效果如图
    • 有输入参数
    • 无输入参数(默认为x.x.x.1)
  • 博主热门文章推荐:

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.255InterIPLast="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 upifconfig eth0 $EtherInterIP netmask 255.255.255.0 upCheckWlanStatussleep 1;ifconfig eth0 $EtherIP netmask 255.255.255.0 upifconfig wlan0 $WlanIP netmask 255.255.255.0 upCheckWlanStatus

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

function CheckWlanStatus()
{if route|grep wlan >/dev/null;thenif ifconfig wlan0|grep 'inet addr' >/dev/null;then:elseecho "WLAN is reconnected, scripts may failed...pls check wlan status"fielseecho "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 == ""];thenif [ ! -n "$1" ]; thenecho "Param1 Not Enter, default gw use *.*.*.1 of wlan ip"route add default gw $WlanDefaultGwecho "Add Default Gateway:" $WlanDefaultGwelseroute add default gw $1echo "Add Default Gateway:" $1fielse echo "Default Gateway Existence, pls check it"fi

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

 if [ ! -n "$1" ]; thenif ping -c 2 -W 2 $WlanDefaultGw >/dev/null;thenecho "Ping default gw from Para1 "$WlanDefaultGw" Sucess!"elseecho "Ping default gw from Para1"$WlanDefaultGw" failed, now reconfig ip, pls check later..."ifconfig eth0 $EtherIP netmask 255.255.255.0 upifconfig wlan0 $WlanIP netmask 255.255.255.0 upfielseif ping -c 2 -W 2 $1 >/dev/null;thenecho "Ping default gw "$1" Sucess!"elseecho "Ping default gw "$1" failed, now reconfig ip, pls check later..."ifconfig eth0 $EtherIP netmask 255.255.255.0 upifconfig wlan0 $WlanIP netmask 255.255.255.0 upfifiCheckWlanStatusif ping -c 2 -W 2 8.8.8.8 >/dev/null;thenecho "Ping Internet 8.8.8.8 Sucess!"elseecho "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 upfi

实际效果如图

有输入参数

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


博主热门文章推荐:

一篇读懂系列:

  • 一篇读懂无线充电技术(附方案选型及原理分析)
  • 一篇读懂:Android/iOS手机如何通过音频接口(耳机孔)与外设通信
  • 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)

LoRa Mesh系列:

  • LoRa学习:LoRa关键参数(扩频因子,编码率,带宽)的设定及解释
  • LoRa学习:信道占用检测原理(CAD)
  • LoRa/FSK 无线频谱波形分析(频谱分析仪测试LoRa/FSK带宽、功率、频率误差等)

网络安全系列:

  • ATECC508A芯片开发笔记(一):初识加密芯片
  • SHA/HMAC/AES-CBC/CTR 算法执行效率及RAM消耗 测试结果
  • 常见加密/签名/哈希算法性能比较 (多平台 AES/DES, DH, ECDSA, RSA等)
  • AES加解密效率测试(纯软件AES128/256)–以嵌入式Cortex-M0与M3 平台为例

嵌入式开发系列:

  • 嵌入式学习中较好的练手项目和课题整理(附代码资料、学习视频和嵌入式学习规划)
  • IAR调试使用技巧汇总:数据断点、CallStack、设置堆栈、查看栈使用和栈深度、Memory、Set Next Statement等
  • Linux内核编译配置(Menuconfig)、制作文件系统 详细步骤
  • Android底层调用C代码(JNI实现)
  • 树莓派到手第一步:上电启动、安装中文字体、虚拟键盘、开启SSH等
  • Android/Linux设备有线&无线 双网共存(同时上内、外网)

AI / 机器学习系列:

  • AI: 机器学习必须懂的几个术语:Lable、Feature、Model…
  • AI:卷积神经网络CNN 解决过拟合的方法 (Overcome Overfitting)
  • AI: 什么是机器学习的数据清洗(Data Cleaning)
  • AI: 机器学习的模型是如何训练的?(在试错中学习)
  • 数据可视化:TensorboardX安装及使用(安装测试+实例演示)

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

  1. Linux系统下使用桥接模式,无法ping通外网解决问题方案!

    Linux系统下使用桥接模式,无法ping通外网解决问题方案! 参考文章: (1)Linux系统下使用桥接模式,无法ping通外网解决问题方案! (2)https://www.cnblogs.com/ ...

  2. 输入你的密码来连接到_手机无线网络可以连接但上不了网如何解决【详解】

    "手机无线网络可以连接上,但上不了网怎么办?手机可以连接上路由器的无线wifi,但是不能上网,这是怎么回事?遇到这种情况又该怎么解决?"最近看到网上有很多网友在咨询这样的问题.其实 ...

  3. 笔记本同时内外网双网网卡上网(网线不能连外网,wifi可以连外网)

    在一些日常工作中,可能会出现内外网隔离情况,一般是为了网络安全才进行隔离,但是有时候偶尔会需要同时进行资料查找或协同解决紧急问题,使得无法进行.这里主要是windows环境, 场景:网线可以连内网,w ...

  4. 个人内外网存储服务器(主要是外网ftp)完整解决方案

    目录 引言 原理介绍 硬件与系统.软件配置 内网传输配置SMB 外网传输ftp客户端配置 网络设置(拨号.端口转发.动态域名服务) 使用方法与其他 总结 1.引言 随着互联网技术的发展,大家对于网络的 ...

  5. 内网机无法ping通外网机

    **内网机无法ping通外网机** 叙述:出差人员想通过外网连接公司内网服务器,公司内部通过TP-Link路由开启vpn服务,使用一台PC做中转内网机(双网口).一端连接外网192网段,一端连接内网服 ...

  6. 搭建ngrok服务器,实现内网穿透服务,实现外网到内网的在线访问

    一:前言 场景问题: 如果本地的项目在没有服务器的情况下,需要让他人访问: 在自己的电脑上搭建一个web服务器,实现本地的访问和外部的访问.我们就要做内网穿透了,内网穿透就是别人通过外网能够访问到我们 ...

  7. 网络安全之ENC1应用内/外网音视频传输完全隔离方案

    网络安全之ENC1应用内/外网音视频传输完全隔离方案 大家好,又见面了,前两天某客户买了ENC1两台,在支持的过程中,居然发现原来还能这样用,看来ENC1不火都不行啊. 随着计算机技术的飞速发展,信息 ...

  8. 实现一个电脑使用内网的同时也可以使用外网

    1,内网一般是设置Internet协议版本4使用ip地址,把内网每个电脑都设置一个单独的ip,这些ip和服务器的ip是同一网段,即服务器如果是192.168.0.200,那么其他电脑ip第三位也必须是 ...

  9. 内网服务器设置代理访问外网

    内网服务器设置代理访问外网 背景 首先需要两台云服务器,其中服务器A无公网IP,服务器B有公网IP. A B 公网IP / 110.40.255.180 内网IP 172.17.64.11 172.1 ...

最新文章

  1. 国内唯一ACL最佳论文得主冯洋:冲击最佳论文需要知道的事情
  2. 维基链超级节点竞选的具体细节有哪些?
  3. 【Linux】Linux添加系统调用以及内核编译过程
  4. python全排列字典序输出 递归_全排列-字典序列、递归方法c语言实现
  5. 《码出高效:Java开发手册》背后的故事
  6. Redola.Rpc 的一个小目标:20000 tps
  7. 【小虫虫】邮购笔记本的注意事项
  8. 玩转python(2)多线程的历史2
  9. sqlserverdatasouce控件如何让添加删除修改自动化
  10. 鼠标被计算机无法识别怎么办,win7系统usb鼠标无法识别怎么解决 电脑usb鼠标无法识别解决方法...
  11. 深度学习笔记(四):循环神经网络的概念,结构和代码注释
  12. 股票历史数据下载梳理汇总(一)
  13. 计算机ppt操作知识,计算机基础知识:PPT常用操作(一)
  14. Faster R-CNN算法详细流程
  15. Ceph测试工具总结
  16. 汽车租赁管理系统的设计与实现(JSP+SqlServer在线租车网站)
  17. eRPC:修改erpcgen代码生成模板增加#if#endif宏定义,解决多个eRPC服务共用时类型重复定义问题
  18. 安卓手机兼职教程,下载应用试玩,每天2小时50块
  19. win10取消文件的默认打开方式
  20. 基础 -- 网络相关单位换算(Mbps,Kbps,MBps等)

热门文章

  1. iOS- NSTimeInterval获取时间间隔
  2. 青岛职业高中计算机专业有哪些,青岛职业高中有哪些专业
  3. Google 测试总监聊如何经营成功的测试职业生涯
  4. Vue router 模式 hash 和 history
  5. 迅雷快鸟重大升级,23省市电信光纤宽带可提速至200M
  6. 需要更新的以前的visual studio 2010实例Microsoft Visual Studio 2010 Service Pack 1(exe)
  7. word自动更新所有引用
  8. 6.824 paper MapReduce: Simplified Data Processing on Large Clusters
  9. 对于JAVAEE的理解
  10. soar-php SQL语句优化与重写的自动化工具