目录
2. 检查是否正确加载了串口设备 (ttyUSBx),执行:
一、应用场景:
大疆M350RTK无人机的PSDK二次开发,购买了大疆E-port套件、4G通信模块(USB linux免驱版)和一块树莓派4B带屏开发套件。
大疆PSDK教程参考网址:
4G模块型号:EC20CEFHLG
二、测试环节
由于是linux免驱版,所以插在了VM上,直接就可以使用,在拿到树莓派的时候突然就不行了,换了个人手机卡(原本是物联网卡)也不行。也不知道是哪里的问题,按道理PI系统应该和linux系统一样。
三、问题排查
找了许多网页,也问了tb客服,都没有给出实质性的解决方案,后面一顿折腾,总结了如下的方法:
1. 检查树莓派是否识别到EC20模块
在树莓派的终端执行以下命令,检查模块是否被正确识别:
lsusb
观察板子的输出,我的输出为
pi@raspberrypi:~ $ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 1a2c:2d23 China Resource Semico Co., Ltd Keyboard
Bus 001 Device 004: ID 30fa:0302 Instant USB Optical Mouse
Bus 001 Device 003: ID 2c7c:0125 Quectel Wireless Solutions Co., Ltd. EC25 LTE modem
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
可以看到EC25 LTE modem存在,证明4G模块已经成功被系统识别到了,包括PID和VID。
2. 检查是否正确加载了串口设备 (ttyUSBx),执行:
dmesg | grep -i ttyUSB
输出如下:
pi@raspberrypi:~ $ dmesg | grep -i ttyUSB
[ 8.080667] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB0
[ 8.200375] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB1
[ 8.201901] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB2
[ 8.234391] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB3
树莓派已经正确识别了 EC25 模块,并成功创建了ttyUSB0到ttyUSB3设备,这说明驱动是正常的。接下来,我们需要测试模块是否能够拨号上网。
3. AT测试
使用minicom进行测试,下面是安装代码:
sudo apt install minicom -y
随后打开minicom,找到对应的USB口(通常是ttyUSB2):
sudo minicom -D /dev/ttyUSB2
随后就可以输入对应的AT指令测试4G模块的各个部分了:
AT # 测试模块是否响应,应该返回 OK
AT+CPIN? # 检查 SIM 卡状态,返回 READY 说明正常
AT+CSQ # 查询信号强度,返回 rssi,ber,例如 +CSQ: 20,99,30以内越高信号越好
AT+COPS? # 查询运营商
AT+CGDCONT? # 查询当前 APN 设置
tips:mini在输入的时候是不显示内容的,按下回车直接显示结果。退出minicom的步骤为先按下“Ctrl+A”,随后“X”,最后“Enter”(选择YES退出)。
我的各个测试语句正常,随后进行下一步排查。
4. 检查网关
由于我的4G模块存在一个很奇葩的问题:就是连上了WIFI后4G模块就会拨号,否则4G模块就不拨号(这样的话我还要这个4G模块干啥,直接WIFI得了呗哈哈哈),于是检查到底是哪个环节在上网,输入以下指令检查默认网关:
ip route show
我的输出如下,其中的metric 值越低,优先级越高。
pi@raspberrypi:/home $ ip route show
default via 192.168.225.1 dev usb0 proto dhcp src 192.168.225.57 metric 100
default via 192.168.137.1 dev wlan0 proto dhcp src 192.168.137.174 metric 600
192.168.137.0/24 dev wlan0 proto kernel scope link src 192.168.137.174 metric 600
192.168.225.0/24 dev usb0 proto kernel scope link src 192.168.225.57 metric 100
说实话测试到这里我都有点懵逼了,为什么USB网口优先级最高但是却上不了网?只能做下一步排查:
6. 断开WiFi,观察4G是否还存在
输入以下指令来关闭WIFI并查看USB的IP:
sudo ifconfig wlan0 down
ip a show usb0
由于WIFI断开,所以SSH也失去了连接,这里开始就不把输出的结果放上来了。
这里的输出是看得到IP的,也就是说关闭WIFI后4G仍然存在,8.8.8.8可以ping通,但是百度ping不通,提示:temporary failure in name resolution。
聪明的人应该应该已经猜到了是DNS的问题了吧。
7. 排查DNS的问题
输入以下指令查看当前的DNS配置文件:
cat /etc/resolv.conf
正常情况下应该输出:
nameserver 8.8.8.8
nameserver 8.8.4.4
但是我终于找到了我的问题所在:我的DNS配置文件是空的,只有一行内容:
#Generate by NetworkManager
于是我开始了修改(由于我每次的修改重启后都会被覆盖,所以我在这里也标明了不被覆盖的方法):
(1)修改文件
sudo nano /etc/resolv.conf
随后进行如下修改:
# 添加以下内容
nameserver 8.8.8.8
nameserver 8.8.4.4
保存并退出(按"Ctrl+X",然后按“Y”,最后按“Enter”)。
(2)禁止其他修改
在这里我敏锐地通过标题的注释发现了修改DNS配置的罪魁祸首就是NetworkManager,于是果断输入下列指令:
sudo nano /etc/NetworkManager/NetworkManager.conf
进行如下修改:
在[main]部分下,添加以下行,禁用NetworkManager对 DNS 的自动管理:
[main]
dns=none
随后将DNS配置文件设置为不可修改:
请注意:如果你希望确保/etc/resolv.conf永久不被修改,可以将其设置为不可变文件,防止被任何程序(包括 NetworkManager)修改。
sudo chattr +i /etc/resolv.conf # 禁止修改resolv.conf
sudo chattr -i /etc/resolv.conf # 解除锁定resolv.conf,用于日后需要编辑的情况
修改后出现了一个更加奇葩的问题了,DNS现在有正确的内容了,但是IP却获取不了了,于是我尝试了许多办法,最终确定了问题:
8. 检查 DHCP 是否正常工作
有一说一我当时都快崩溃了,我把1-7的流程走了不知道多少次,都找不到原因,甚至准备重装系统了,但是考虑到我好不容易安装好的库,只能硬着头皮继续搞了:
sudo dhclient usb0 # 这将尝试为usb0接口获取一个新的IP地址
随后进行测试,ping 8.8.8.8和www.baidu.com均获得了成功,皆大欢喜!而且这条指令只需要执行一次,重启后仍然可以正常上网。不知道当换了一个地方IP变化的时候是不是要重新设置,不过这都是后话了哈哈哈!
四、总结
虽然这个问题在专业人士看起来十分微不足道,但是对于一个第一次接受科研课题的本科学生来说还是花费了蛮多心思的,最后问题也成功得到了解决,太不容易了哈哈,要感谢CSDN和chatGPT。
实物图: