linux通过无线网卡上网,Linux使用4G/5G无线网卡模块上网

识别模块

0caf8fdd63e56d928c3b907994a5ad58.png

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

root@raspberrypi:~ $ lsusb

Bus 001 Device 001: ID 05c6:1000 Qualcomm, Inc. Mass Storage Device

0a492d21ebada4599a54bc9d79d3f1fd.png

以树莓派(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 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

确认路由正常后,就可以开始常规的确认网络操作了。例如ping网关,ping 114.114.114.114,ping 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