设备联网优先级处理
Posted FightingBoom
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设备联网优先级处理相关的知识,希望对你有一定的参考价值。
各位看官您好呀,我是小二。
之前的文章,讲了如何移植 WiFi 驱动,如何使用 WiFi 功能;没看过的小伙伴点这里「我对 WiFi 驱动移植过程,做了一次总结复盘」
本篇文章分享一个实际功能需求,简要描述为:当设备通过多种方式联网时,如何控制网络连接方式的优先级?
1 需求场景
设备可以通过三种方式连接网络,分别是:
- 4G
- WiFi
- 有线网络
功能需求:就是要能控制这三种联网方式的优先级,实现不同场景的切换。
举个例子,如果设备当前既可以连接 WiFi (只有局域网),又可以连接 4G 模块,此时设备需要同时连接 互联网 + 局域网 。如果不做优先级控制,设备全部通过 WiFi 联网,则 只能连接局域网,无法连接互联网 。
此时,如果我们可以控制优先级,当连接互联网时,优先通过 4G 连接;当连接局域网时,通过 WiFi 连接,这不就实现了我们想要的功能吗?
2 方案分析
如何实现我们想要的功能呢?
首先把所有功能组合列出来,然后根据需求,看是否可以做一些简化。如下图
可以看到,图片中相同颜色的,我把他归纳为同一类。
纯有线联网 == WiFi + 有线连接
由于这两种方式都可以连接外网 + 局域网,但是由于 有线网络更加稳定 ,因此简化为使用有线连接网络。
4G + 有线联网 == 4G + WiFi + 有线联网
这两种方案,基本与上述方案处理情况一致,即 WiFi 和有线网络同时有效时,优先使用有线网络 。
3 场景举例
通过查找资料,发现可以通过控制 metric ,来控制对应网卡优先级。
参考资料释义:
metric Metric 为路由指定一个整数成本值标(从 1 至 9999),当在路由表(与转发的数据包目标地址最匹配)的多个路由中进行选择时可以使用。
参考网址:linux服务器两块网卡路由优先级冲突 Metric值(https://blog.csdn.net/memory6364/article/details/84826150)
简单理解为,从目的地 A 到目的地 B ,需要经过的路由器跳数(中转数)。
此数值越小,则对应的网卡优先级越高,因为 路程近了 ,网络肯定会优先选择近的路走。
当 数值相同 时,则由内核随机选择一个网卡,进行数据交互。
由下图可知,绿色线路,metric 跳数为 0 ,也是最近的 “道路” ;红色线路,metric 跳数为 3 ,很直观的看绕路了,因此走这条路的概率就会大大降低。
(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 ;
为了便于您理解,画了一个流程图,如下
图中有几个概念,在这里备注一下
1、是否具备有线连接条件?
- 网线是否插入?
- 有线网络是否已使能?
- 有线网卡是否已开启?
备注:
- 网线拔出,内核自动检测网卡 down 掉;
- 程序 down 掉有线网卡,内核会认为网线已经拔出;
2、是否具备 WiFi 连接条件?
- WiFi 是否已使能?
- WiFi 连接路由参数是否正常?
3、是否具备 4G 连接条件?
- 4G 模块是否存在?
- 4G 网卡是否存在?
- SIM 卡是否正常?
好了,通过上述步骤,应该就可以设置我们自己的网络优先级了。
5 问题说明
说了这么多,这里还有几个问题,需要跟您指出来😏
5.1 天线问题
4G 模块和 WiFi 模块,一定、一定、一定需要连接匹配的天线。
5.2 局域网连接
如何确保设备只连接到局域网?
通过 控制 DNS 即可间接实现。
当不想让设备连接外网时,删除默认配置的 DNS 即可。
6 总结
说了这么多,又到了我们的总结时间。
本篇文章,从需求、到实际应用场景、再到具体实现方案,详细记录了一个功能点是如何开发的,他又有哪些应用场景。
结合实际应用,分析需求,这样才更容易理解。
好了,我是小二,喜欢总结、喜欢画图😁😁😁
各位看官,您如果有任何疑问,欢迎留言指出哦!
最后,祝您工作顺利,牛年大吉!
以上是关于设备联网优先级处理的主要内容,如果未能解决你的问题,请参考以下文章
为什么嵌入式 IoT 设备优先选择 RTOS 而不是Linux ?