轶哥

妄图改变世界的全栈程序员。

Linux使用4G/5G无线网卡模块上网

识别模块

5G模块

将4G/5G开发板插入设备,终端输入lsusblspci,看设备是否识别到4G/5G模块。

root@raspberrypi:~ $ lsusb
Bus 001 Device 001: ID 05c6:1000 Qualcomm, Inc. Mass Storage Device

IMG6477.JPG

以树莓派(Raspberry)为例,上述命令显示设备识别到高通芯片的4G模块。了解更多详情请阅读《Linux安装无线网卡驱动通用方法》

需要特别注意的是,部分4G模块(特别是性能较好的高通芯片)是内核免驱,载入成功后直接体现为网卡。使用ifconfig即可直接看到网卡并能上网。这种情况下,USB接口实现的是一个USB网卡端,类似于Raspberry OTG USB上网。参考:《树莓派4使用OTG功能变身有线网卡》

查看驱动加载情况

查看dmesg信息,确认模块驱动加载情况。不同的4G/5G网卡,加载的驱动模式可能有差异。通常情况下,4G无线网卡包含两个模式,一个CD存储模式,另一个是Modem模式(调制解调器模式)。5G模块的无线网卡通常走USB Type-C,具有专门的驱动,但是拨号过程大同小异。

$ dmesg

如果usb模式切换正常,通常可以看到类似如下输出:

 ttyUSB1: GSM modem (1-port) converter now disconnected from ttyUSB1

否则,可能只识别到USB Storage device或者CD-ROM。这种情况下,需要安装usb-modeswitch usb-modeswitch-data等库,并设置切换为modem模式。

配置wvdial拨号

sudo apt install wvdial ppp

修改wvdial配置文件/etc/wvdial.conf。我使用的电信手机卡进行测试:

[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0
Init3 = AT+CGDCONT=1,"IP","ctnet"
Modem Type = Analog Modem
Baud = 9600
New PPPD = yes
Modem = /dev/ttyUSB1
ISDN = 0
Phone = *99#
Password = card
Username = card
Auto DNS = on

相应的,你需要将APN设置的一行Init3内容进行修改,4G模块中移动cmnet、联通3gnet、电信ctnet,相应的物联网卡APN和5G使用的配置数据,根据供应商给到的参数进行设置。Modem一栏即4G模块的USB虚拟串口设备路径或5G模块的TTY接口。

运行:

$ wvdial

直接执行wvdial命令,即可看到拨号上网的过程。如果成功,将会看到:

--> WvDial: Internet dialer version xxx
--> Initializing modem.
--> Sending: ATZ
OK
--> Sending: ATQ0 V1 E1 S0=0
OK
--> Modem initialized.
--> Sending: ATDT*99#
--> Waiting for carrier.
ATDT*99#
CONNECT 150000000
--> Carrier detected.  Starting PPP immediately.
--> Starting pppd at Sun Jan 24 14:45:37 2021
--> Pid of pppd: 1330
--> Using interface ppp0
--> pppd: X/?[01]X/?[01]
--> local  IP address xxx.xxx.xxx.xxx
--> pppd: X/?[01]X/?[01]
--> remote IP address xxx.xxx.xxx.xxx
--> pppd: X/?[01]X/?[01]
--> primary   DNS address xxx.xxx.xxx.xxx
--> pppd: X/?[01]X/?[01]
--> secondary DNS address xxx.xxx.xxx.xxx
--> pppd: X/?[01]X/?[01]

可以成功获取local IP地址,基本上就快成功了。其中,remote IP address 10.64.64.64是正常的。

部分5G模块拨号成功后,数据是不走ppp网卡的。需要根据具体模块文档进行调试。

检查是否可以上网

运行:

$ ifconfig

如果调制解调器正常运行,则可以看到ppp0输入类似内容:

ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet xxx.xxx.xxx.xxx  netmask 255.255.255.255  destination 10.64.64.64
        ppp  txqueuelen 3  (Point-to-Point Protocol)
        RX packets 11065  bytes 1348146 (1.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 12168  bytes 1585065 (1.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

每次成功启动后都会分配到一个随机IP地址(也有可能固定,取决于运营商),这就说明4G/5G模块初始化成功。使用IPv6场景的5G模块,还需要针对IPv6进行网卡配置。

检查路由表:

$ route -n

得到类似信息:

root@NanoPi-NEO2:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 ppp0
0.0.0.0         10.10.10.252    0.0.0.0         UG    100    0        0 eth0
10.10.10.0      0.0.0.0         255.255.255.0   U     100    0        0 eth0
10.64.64.64     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0

在双网卡情况下,如果要使用ppp0上网,可以这么做:

# 删除第一条路由信息:
$ sudo route del –net 0.0.0.0 eth0
# 新增一条ppp0的路由信息:
$ sudo route add –net 0.0.0.0 ppp0

可以参考文章《MacOS 同时使用内网和外网(双网卡同时联网)》,进行多网卡同时联网的设置。

确认路由正常后,就可以开始常规的确认网络操作了。例如ping网关ping 114.114.114.114ping www.baidu.com

查询当前IP地址:

$ curl getip.icu

创建wvdial服务

需要在加载完USB调制解调器后自动拨号,可以创建wvdial.service文件。

$ vim /etc/systemd/system/wvdial.service

[Unit]
Description=wvdial

[Service]
ExecStart=/usr/bin/wvdial
Restart=on-failure
RestartSec=5

将下述内容添加到99-com.rules文件中。wvdial.service加载USB调制解调器后,它将被自动调用。

$ vim /etc/udev/rules.d99-com.rules

SUBSYSTEM=="tty", KERNEL=="ttyUSB1", TAG+="systemd", ENV{SYSTEMD_WANTS}+="wvdial.service"

其它Linux常规操作

# 启动wvdial服务
systemctl start wvdial

# 关闭wvdial服务
systemctl stop wvdial

# 查询是否存在wvdial进程
ps aux|grep wvdial

# 关闭wvdial进程
killall wvdial

# 查看wvdial服务日志
journalctl -u wvdial
打赏
交流区

暂无内容

尚未登陆
发布
  上一篇 (JavaScript练习题)
下一篇 (NuxtJS中Axios的配置说明)  

评论回复提醒