- 更新:2022-03-27 20:47:03
- 首发:2021-01-25 00:49:21
- 教程
- 12637
识别模块
将4G/5G开发板插入设备,终端输入lsusb
或lspci
,看设备是否识别到4G/5G模块。
root@raspberrypi:~ $ lsusb
Bus 001 Device 001: ID 05c6:1000 Qualcomm, Inc. Mass Storage Device
以树莓派(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.114
,ping www.baidu.com
。
查询当前IP地址:
$ curl cip.cc
创建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
也可以使用NetworkManager
借助ModemManager
实现上网,通用性非常强,兼容高通芯片和其他主流芯片。
感谢回复! Clang 在生成时沿用了 GCC 的版本号标识,我是不是可以理解为Clang 18.1.4生成时使用的就是GCC4.8,所以我后续使用gcc 9.4
gcov
就会有不兼容的问题抱歉,这块我也不太清楚,尝试寻求AI的帮助吧。
我在这个过程中遇到了各种问题- -,现在在UDC core: g_serial: couldn't find an available UDC卡住了,请问大佬有什么解决方案吗,还是说我前置的设置就错了呢,> 这个需求很特殊。是可以的,但是比较困难,需要修改驱动配置。
好思路呀!!
关于hex编辑器,网上没找到特别好用的(小白没办法),最后在vscode上扩展一搜hex,第一个安装一下就可以用vscode进行hex编译了