之前的文章,讲了如何移植 WiFi 驱动,如何使用 WiFi 功能;没看过的小伙伴点这里「我对 WiFi 驱动移植过程,做了一次总结复盘」

本篇文章分享一个实际功能需求,简要描述为:当设备通过多种方式联网时,如何控制网络连接方式的优先级?

1 需求场景

设备可以通过三种方式连接网络,分别是:

  • 4G
  • WiFi
  • 有线网络

功能需求:就是要能控制这三种联网方式的优先级,实现不同场景的切换。

举个例子,如果设备当前既可以连接 WiFi (只有局域网),又可以连接 4G 模块,此时设备需要同时连接 互联网 + 局域网 。如果不做优先级控制,设备全部通过 WiFi 联网,则 只能连接局域网,无法连接互联网

此时,如果我们可以控制优先级,当连接互联网时,优先通过 4G 连接;当连接局域网时,通过 WiFi 连接,这不就实现了我们想要的功能吗?

2 方案分析

如何实现我们想要的功能呢?

首先把所有功能组合列出来,然后根据需求,看是否可以做一些简化。如下图

设备联网优先级处理_WiFi

可以看到,图片中相同颜色的,我把他归纳为同一类。

纯有线联网 == WiFi + 有线连接

由于这两种方式都可以连接外网 + 局域网,但是由于 有线网络更加稳定 ,因此简化为使用有线连接网络。

4G + 有线联网 == 4G + WiFi + 有线联网

这两种方案,基本与上述方案处理情况一致,即 WiFi 和有线网络同时有效时,优先使用有线网络

3 场景举例

通过查找资料,发现可以通过控制 metric ,来控制对应网卡优先级。

参考资料释义:
metric Metric 为路由指定一个整数成本值标(从 1 至 9999),当在路由表(与转发的数据包目标地址最匹配)的多个路由中进行选择时可以使用。

参考网址:linux服务器两块网卡路由优先级冲突 Metric值

简单理解为,从目的地 A 到目的地 B ,需要经过的路由器跳数(中转数)。

此数值越小,则对应的网卡优先级越高,因为 路程近了 ,网络肯定会优先选择近的路走。

数值相同 时,则由内核随机选择一个网卡,进行数据交互。

由下图可知,绿色线路,metric 跳数为 0 ,也是最近的 “道路” ;红色线路,metric 跳数为 3 ,很直观的看绕路了,因此走这条路的概率就会大大降低。

设备联网优先级处理_# WiFi_02

(PS:metric 跳数仅做举例演示用,与网络中实际跳数可能不一致。)


基于此,我想到了几种场景,分别如下:

1、首先规定:4G 模块相关操作,必须断电进行;

(1)设备只在上电时,判断一次 4G 模块状态;

(2)在设备工作过程中,如果拔出 4G 模块,设备不会自动切换到其他连接方式,局域网连接功能不受影响;

2、4G + 有线网络同时开启

(1)设计方案:4G 连接外网,有线连接局域网;

(2)其他情况说明:

  • 如果 4G 模块正常,则需要降低有线网卡优先级,以达到设计方案目的;
  • 如果 4G 模块异常(模块不存在、网卡不存在、没插入 SIM 卡),则应使用有线连接互联网、局域网;
  • 4G 模块仅在设备上电后,判断一次;

3、4G + WiFi 同时开启

(1)设计方案:4G 连接外网,WiFi 连接局域网;

(2)其他情况说明:

  • 如果 4G 模块正常,则需要降低 WiFi 网卡优先级,以达到设计方案目的;
  • 如果 4G 模块异常(模块不存在、网卡不存在、没插入 SIM 卡),则应使用 WiFi 连接互联网、局域网;
  • 4G 模块仅在设备上电后,判断一次;

4、4G + 有线网络 + WiFi 同时开启

(1)设计方案:简化为 4G + 有线网络方案;

(2)其他情况说明:

  • 如果拔出网线,则切换为 4G + WiFi 方案,对应上文第 3 点;
  • 如果插入网线,则切换为 4G + 有线网络方案,对应上文第 2 点;

5、有线网络开启,WiFi 关闭

(1)设计方案:有线网络连接互联网、局域网;

(2)其他情况说明:

  • 如果拔出网线,设备不能正常联网;
  • 如果插入网线,设备可正常联网;

6、有线网络关闭,WiFi 开启或者 WiFi 热点开启

(1)设计方案:WiFi 连接互联网、局域网;或者 WiFi 热点正常工作;

(2)其他情况说明:

  • 如果拔出网线,设备应正常使用 WiFi 功能,AP / Station;
  • 如果插入网线,设备应正常使用 WiFi 功能,AP / Station;
4 方案实现

4.1 方案原理

有了上述理论知识 + 设计方案,就能来实现我们想要的功能了。

简单的说,就是控制网卡优先级,或者说 控制网关优先级

当只有有线网络时,查看当前默认网关,结果如下

[root]#ip route
default via 192.168.3.1 dev eth0 
192.168.3.0/24 dev eth0  proto kernel  scope link  src 192.168.3.10 

此种情况,设备 只能通过有线网关连接网络

如果设备同时开启有线网络 + WiFi 时,查看当前默认网关,结果如下

[root]#ip route
default via 192.168.3.1 dev wlan0 
default via 192.168.3.1 dev eth0
192.168.3.0/24 dev eth0  proto kernel  scope link  src 192.168.3.10 
192.168.3.0/24 dev wlan0  proto kernel  scope link  src 192.168.3.6 

此时会发现,有两个一模一样的 默认网关 ,这个时候设备就会出现混乱,他不知道该用哪个网关进行连接。

4.2 基础命令

上一小节对默认网关有了基础认识。这一小节,我们就要通过命令行,来实际操作网关。

参考资料:linux 路由表设置 之 route 指令详解(https://cloud.tencent.com/developer/article/1441501)

  • 添加默认网关;
route add default gw 192.168.3.1
  • 删除默认网关;
route del default gw 192.168.3.1
  • 添加某一网卡默认网关;
# 添加 wlan0 网卡默认网关
route add default gw 192.168.3.1 wlan0

# 添加 eth0 网卡默认网关
route add default gw 192.168.3.1 eth0
  • 删除某一网卡默认网关;
# 删除 wlan0 网卡默认网关
route del default gw 192.168.3.1 wlan0

# 删除 eth0 网卡默认网关
route del default gw 192.168.3.1 eth0
  • 添加路由域;猜想应该是代表网关所在的地址范围;
route add -net 192.168.3.0/24 eth0
  • 删除路由域;
route del -net 192.168.3.0/24 eth0
  • 添加默认网关,并设置网关优先级;
  • 注意:metric 数值越低优先级越高
route add default gw 192.168.3.1 metric 200

# 添加 wlan0 网卡的默认网关,并设置网关优先级
route add default gw 192.168.3.1 metric 100 wlan0

# 添加 eth0 网卡的默认网关,并设置网关优先级
route add default gw 192.168.3.1 metric 200 eth0

好了,基础命令就这么多,剩下的就是组合利用这些命令,实现我们想要的功能。

4.3 实际验证

4G + 有线网络同时开启 场景为例。

由于 4G 模块,使用的也是命令行启动方式,因此在启动后,会自动设置默认的网关。

那我们就只能赶在 4G 命令启动之前,先配置好有线网络的网关。

操作步骤简述如下:

  • 删除目前有线网络默认网关;
  • 添加有线网络默认网关,并调整有线网关优先级,类似 metric 100 ;
  • 启动 4G 模块,使其自动分配默认网关;

配置后的路由表应该类似这样:

[root]#ip route
default via 10.168.100.6 dev eth1
default via 192.168.3.1 dev eth0  metric 100 
10.168.100.0/24 dev eth1  proto kernel  scope link  src 10.168.100.6
192.168.3.0/24 dev eth0  proto kernel  scope link  src 192.168.3.10 

其中 eth1 为 4G 网卡。

其他方案,操作步骤基本相似,只是根据各自的功能不同,略有偏差。


说到这里突然想起来,4G + 有线网络 + WiFi 同时开启 这个场景稍微有点复杂,也在这里分析总结一下吧。

其实在之前的方案总结中,已经拆分的很清楚了。有几个要点:

  • 三种方式都能联网;
  • 当有线网络与 WiFi 同时有效时,由于有线网络更稳定,因此优先级更高;
  • 当有线网络失效(网线拔出、网卡down)时,可以自动连接 WiFi ;

为了便于您理解,画了一个流程图,如下

设备联网优先级处理_linux_03

图中有几个概念,在这里备注一下

1、是否具备有线连接条件?

  • 网线是否插入?
  • 有线网络是否已使能?
  • 有线网卡是否已开启?

备注:

  • 网线拔出,内核自动检测网卡 down 掉;
  • 程序 down 掉有线网卡,内核会认为网线已经拔出;

2、是否具备 WiFi 连接条件?

  • WiFi 是否已使能?
  • WiFi 连接路由参数是否正常?

3、是否具备 4G 连接条件?

  • 4G 模块是否存在?
  • 4G 网卡是否存在?
  • SIM 卡是否正常?

好了,通过上述步骤,应该就可以设置我们自己的网络优先级了。

5 问题说明

说了这么多,这里还有几个问题,需要跟您指出来????

5.1 天线问题

4G 模块和 WiFi 模块,一定、一定、一定需要连接匹配的天线。

5.2 局域网连接

如何确保设备只连接到局域网?

通过 控制 DNS 即可间接实现。

当不想让设备连接外网时,删除默认配置的 DNS 即可。

6 总结

说了这么多,又到了我们的总结时间。

本篇文章,从需求、到实际应用场景、再到具体实现方案,详细记录了一个功能点是如何开发的,他又有哪些应用场景。

结合实际应用,分析需求,这样才更容易理解。

最后,祝您工作顺利,牛年大吉!