Ⅰ)、结论
简而言之
一、更改4G/5G模块网络节点的名字
①使用udev规则,设定物理路程(4G/5G插入的物理地址)名字为usb0
二、自动分配ip:
①让ModemManager别管理usb0
②让ModemManager管理ttyUSB(0~3)
③让NetworkManager管理usb0
三、实现打电话、发短信:
①让ModemManager别管理ttyUSB2,我们要用来发AT指令
Ⅱ)、完整解决流程总结
一. 固定4G模块的网络接口名 usb0
(基于物理路径)
1.查看模块的总线号,端口号和vid和pid
ifconfig查看4G模块网络节点的名字,发现是etx44876393bb3a(wlx+mac地址)
通过udevadm info -a + /sys/class/net/etx44876393bba路径的命令去查看etx44876393bba的总线号,端口号和vid和pid对应的driver设备。
udevadm info -a /sys/class/net/etx44876393bb3a
udevadm info -a /sys/class/net/etx44876393bb3a | grep -i "idVendor\|idProduct\|driver"
2.根据模块的总线号,端口号和vid和pid的信息去设定规则
# 创建UDEV规则文件
sudo vi /etc/udev/rules.d/10-4g-rename.rules
添加内容:
SUBSYSTEM=="net", ACTION=="add", ATTRS{busnum}=="2", ATTRS{devpath}=="1.3", NAME="usb0"
生效规则:
sudo udevadm control --reload
sudo udevadm trigger
作用:设置接入物理路径(总线号为2,端口号为1.3)的名字都为usb0
,无论接口MAC地址如何变化,只要物理路径为(总线号为2,端口号为1.3),那么始终命名为 usb0
。
【后续的调试更改】!!!
因为除了4G和5G模块,我们这个接口(pcie转usb接口)还插wifi模块(8188、8811模块),那我们的wifi模块的网络节点不可能叫usb0,所以我们需要修改udev的4g/5g/wifi命名规则文件。改成如下图所示:
主要是基于插入的4g、5g、wifi模块的唯一的厂商id(VID) 和 产品id(PID)去修改模块的网络节点命名。
二、4G模块自动分配ip
1. 隔离 ModemManager 和 NetworkManager 的管理范围
作用:
• ModemManager 管理 ttyUSB0-3
(用于短信/拨号)。
• NetworkManager 管理 usb0
(用于网络通信)。
2. 通过udev设置ModemManager管理权限
# 禁止ModemManager管理网络接口(usb0)
sudo vi /etc/udev/rules.d/77-mm-ignore-usb0.rules
添加内容:
SUBSYSTEM=="net", ACTION=="add", ATTRS{busnum}=="2", ATTRS{devpath}=="1.3", ENV{ID_MM_DEVICE_IGNORE}="1"
# 允许ModemManager管理ttyUSB端口(ttyUSB0-3)
sudo vi /etc/udev/rules.d/77-mm-manage-ttyUSB.rules
添加内容:
SUBSYSTEM=="tty", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ENV{ID_MM_PORT_IGNORE}="0"
生效规则:
sudo udevadm control --reload
sudo udevadm trigger
3. 设置 NetworkManager 全局策略
# 修改全局配置文件,强制允许 NW 管理 usb0接口
sudo vi /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf
因为usb0没有被识别为ethernet类型,所以在这个文件加上except:interface-name:usb0
。
修改后内容:
[keyfile]
unmanaged-devices=*,except:type:wifi,except:type:gsm,except:type:cdma,except:type:ethernet,except:interface-name:usb0
重启服务:
sudo systemctl restart NetworkManager
作用:显式允许管理 usb0
(绕过类型识别依赖)。
4. 创建 NetworkManager 连接配置,让usb0自动分配ipv4
# 删除旧配置
sudo nmcli con delete "4G-USB"
# 创建新配置
sudo nmcli con add type ethernet \
con-name "4G-USB" \
ifname usb0 \
ipv4.method auto \
ipv6.method ignore \
autoconnect yes
# 激活连接
sudo nmcli con up "4G-USB"
三、 4G模块发短信和打电话
1. 禁止 ModemManager 占用 ttyUSB2
(关键!)
因为前面设置了77-mm-manage-ttyUSB.rules文件,让ModemManager管理所有的ttyUSB接口,但是这里的接口中的ttyUSB2我们要用,用来发AT指令,所以这里设置udev规则禁止ModemManager管理ttyUSB2。
# 创建UDEV规则,禁止ModemManager管理ttyUSB2
sudo vi /etc/udev/rules.d/78-mm-ignore-ttyUSB2.rules
添加内容:
SUBSYSTEM=="tty", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTRS{devpath}=="1.3", ENV{ID_MM_PORT_IGNORE}="1"
生效规则:
sudo udevadm control --reload
sudo udevadm trigger
sudo systemctl restart ModemManager
作用:让 ttyUSB2
仅由用户程序控制,避免 ModemManager 冲突。
四. 验证串口权限
# 确保用户属于dialout组
sudo usermod -aG dialout $USER
# 重启生效
sudo reboot
五、最终验证
1. 网络功能
nmcli dev status # 应显示 usb0 为 connected
ip addr show usb0 # 应显示 IPv4 地址
ping -I usb0 8.8.8.8 # 测试网络连通性
2. 短信功能
# 发送短信
./send_sms /dev/ttyUSB2 192******** "www.tronlong.com"
# 预期输出:AT+CMGF=1 返回 OK
3. 电话功能
# 拨打电话
./phone_call /dev/ttyUSB2 192********
# 预期输出:ATD19200952893; 触发拨号
六、关键问题解释
为什么之前失败?
-
ModemManager 冲突:
我们只需要ModemManager管理除ttyUSB2以外的其它端口,因为ttyUSB2我们要用来发送AT指令给模块进行操作。但是ModemManager 默认会接管所有ttyUSB*
设备,会导致用户程序无法直接控制ttyUSB2
。所以我们需要去禁止 ModemManager 管理 ttyUSB2。
解决:通过ENV{ID_MM_PORT_IGNORE}="1"
显式禁止其管理。 -
NetworkManager 策略限制:
原配置仅允许管理特定类型设备,而usb0
未被正确识别为ethernet
。
解决:因为而usb0
未被正确识别为ethernet
,所以except:ethernet
没有使usb0生效,导致usb0没有受到NetworkManager管控。我们通过except:interface-name:usb0` 让NetworkManager正确识别,并受到NetworkManager的管控,让NetworkManager为usb0自动分配ip做准备。
七、总结
配置文件路径 | 作用 |
---|---|
/etc/udev/rules.d/10-4g-rename.rules | 使网络接口名固定为 usb0 |
/etc/udev/rules.d/77-mm-ignore-usb0.rules | 禁止 ModemManager 管理 usb0 |
/etc/udev/rules.d/77-mm-manage-ttyUSB.rules | 允许 ModemManager 管理其他 ttyUSB* 端口 |
/etc/udev/rules.d/78-mm-ignore-ttyUSB2.rules | 禁止 ModemManager 管理 ttyUSB2 (用户程序独占) |
/usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf | 强制 NetworkManager 管理 usb0 |
按此流程操作后,4G模块的命名修改 + ip自动分配+通信(发短信和打电话)功能均可正常工作。
Ⅲ)、更为详细的总结
超详细解释与操作指南
一、基础概念解释
1. UDEV 是什么?
• 定义:UDEV 是 Linux 系统中的一个守护进程,负责在 /dev
目录下动态管理设备节点(如 /dev/ttyUSB2
、/dev/usb0
等)。
• 作用:当设备插入或移除时,UDEV 会根据规则文件(位于 /etc/udev/rules.d/
)动态创建设备节点,并设置权限或触发其他操作。
• 规则文件命名:
• 规则文件以数字开头(如 77-mm-...
),数字越小优先级越高。
• 文件名可自定义,但通常用数字表示优先级,例如 10-
开头的规则会在 90-
之前执行。
2. ModemManager 是什么?
• 定义:ModemManager 是 Linux 中管理移动宽带模块(如4G模块)的守护进程,负责处理拨号、短信、网络注册等功能。
• 名字由来:
• Modem:调制解调器(Mobile Broadband Modem)。
• Manager:管理器。
合起来就是“调制解调器管理器”。
• 功能:自动检测模块、管理 SIM 卡状态、发送 AT 指令等。
3. 为什么 ModemManager 的设置与 UDEV 有关?
• 设备管理依赖:ModemManager 需要通过 /dev/ttyUSB*
这样的串口设备与模块通信。
• 冲突问题:如果 ModemManager 和用户程序同时操作同一个串口,会导致资源冲突(例如用户程序无法发送 AT 指令)。
• 解决方式:通过 UDEV 规则控制哪些设备由 ModemManager 管理,哪些由用户程序直接控制。
二、UDEV规则详解
1. 规则文件路径与命名
• 路径:/etc/udev/rules.d/
• 这是 UDEV 规则的标准存放目录,系统会加载此目录下所有 .rules
文件。
• 命名示例:
• 10-4g-rename.rules
:以 10
开头,表示优先级较高。
• 77-mm-ignore-usb0.rules
:以 77
开头,表示优先级中等,mm
表示与 ModemManager 相关。
2. 规则语法解析
(1) 禁止 ModemManager 管理网络接口(usb0)
# 文件:/etc/udev/rules.d/77-mm-ignore-usb0.rules
SUBSYSTEM=="net", ACTION=="add", ATTRS{busnum}=="2", ATTRS{devpath}=="1.3", ENV{ID_MM_DEVICE_IGNORE}="1"
• 逐字段解释:
• SUBSYSTEM=="net"
:匹配设备类型为网络接口(如以太网卡、WiFi)。
• ACTION=="add"
:当设备被添加到系统时触发规则。
• ATTRS{busnum}=="2"
:匹配 USB 总线号为 2 的设备(通过 dmesg
或 udevadm info
可查看)。
• ATTRS{devpath}=="1.3"
:匹配设备在总线上的路径为 1.3
(表示 USB 集线器的第一个端口下的第三个设备)。
• ENV{ID_MM_DEVICE_IGNORE}="1"
:设置环境变量 ID_MM_DEVICE_IGNORE
为 1
,告知 ModemManager 忽略此设备。
• 作用:让 ModemManager 不管理 usb0
接口(避免与 NetworkManager 冲突)。
(2) 允许 ModemManager 管理 AT 指令端口(ttyUSB0-3)
# 文件:/etc/udev/rules.d/77-mm-manage-ttyUSB.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ENV{ID_MM_PORT_IGNORE}="0"
• 逐字段解释:
• SUBSYSTEM=="tty"
:匹配设备类型为串口(如 /dev/ttyUSB0
)。
• ATTRS{idVendor}=="2c7c"
:匹配设备的厂商ID为 2c7c
(Quectel 的厂商ID)。
• ATTRS{idProduct}=="0125"
:匹配设备的产品ID为 0125
(例如 Quectel EC25 模块的ID)。
• ENV{ID_MM_PORT_IGNORE}="0"
:设置环境变量 ID_MM_PORT_IGNORE
为 0
,告知 ModemManager 管理此设备。
• 作用:允许 ModemManager 管理所有 Quectel 模块的串口(用于短信、拨号等)。
(3) 禁止 ModemManager 管理特定串口(ttyUSB2)
# 文件:/etc/udev/rules.d/78-mm-ignore-ttyUSB2.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTRS{devpath}=="1.3", ENV{ID_MM_PORT_IGNORE}="1"
• 逐字段解释:
• ATTRS{devpath}=="1.3"
:精确匹配设备路径为 1.3
(即该模块的 AT 指令端口)。
• ENV{ID_MM_PORT_IGNORE}="1"
:设置环境变量 ID_MM_PORT_IGNORE
为 1
,告知 ModemManager 忽略此端口。
• 作用:让用户程序独占 /dev/ttyUSB2
,避免 ModemManager 冲突。
3. 环境变量 ID_MM_*
的含义
• 命名由来:
• ID_MM
前缀表示这些变量专为 ModemManager 设计。
• PORT_IGNORE
和 DEVICE_IGNORE
是 ModemManager 定义的变量名。
• 作用:
• ID_MM_PORT_IGNORE=1
:让 ModemManager 忽略某个串口。
• ID_MM_DEVICE_IGNORE=1
:让 ModemManager 忽略某个网络设备。
三、操作步骤详解
1. 固定接口名 usb0
• 命令:
sudo vi /etc/udev/rules.d/10-4g-rename.rules
SUBSYSTEM=="net", ACTION=="add", ATTRS{busnum}=="2", ATTRS{devpath}=="1.3", NAME="usb0"
• 作用:无论模块的 MAC 地址如何变化,接口名始终为 usb0
,避免因动态命名(如 enp0s1
)导致配置失效。
2. 隔离 ModemManager 和 NetworkManager
• 禁止 ModemManager 管理网络接口:
sudo vi /etc/udev/rules.d/77-mm-ignore-usb0.rules
SUBSYSTEM=="net", ACTION=="add", ATTRS{busnum}=="2", ATTRS{devpath}=="1.3", ENV{ID_MM_DEVICE_IGNORE}="1"
• 作用:防止 ModemManager 干扰 usb0
的网络功能。
• 允许 ModemManager 管理其他串口:
sudo vi /etc/udev/rules.d/77-mm-manage-ttyUSB.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ENV{ID_MM_PORT_IGNORE}="0"
• 作用:允许 ModemManager 管理模块的诊断端口(如 ttyUSB0
),用于获取信号强度、SIM 状态等。
3. 强制 NetworkManager 管理 usb0
• 修改全局策略文件:
sudo vi /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf
[keyfile]
unmanaged-devices=*,except:type:wifi,except:type:gsm,except:type:cdma,except:type:ethernet,except:interface-name:usb0
• 作用:覆盖默认策略,强制 NetworkManager 管理 usb0
。
4. 创建网络连接配置
• 命令:
sudo nmcli con add type ethernet con-name "4G-USB" ifname usb0 ipv4.method auto ipv6.method ignore autoconnect yes
• 作用:创建一个名为 4G-USB
的连接,自动通过 DHCP 获取 IPv4 地址。
5. 禁止 ModemManager 占用 ttyUSB2
• 命令:
sudo vi /etc/udev/rules.d/78-mm-ignore-ttyUSB2.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTRS{devpath}=="1.3", ENV{ID_MM_PORT_IGNORE}="1"
• 作用:让用户程序(如 send_sms
)独占 ttyUSB2
,避免 ModemManager 冲突。
6. 生效规则
• 重新加载 UDEV 规则:
sudo udevadm control --reload
sudo udevadm trigger
• 重启服务:
sudo systemctl restart ModemManager NetworkManager
四、最终效果
• 网络功能:usb0
自动获取 IP,通过 ping -I usb0 8.8.8.8
测试。
• 短信功能:./send_sms /dev/ttyUSB2 19200952893 "Test"
直接控制串口发送短信。
• 电话功能:./phone_call /dev/ttyUSB2 19200952893
直接拨号。
五、总结
• UDEV 规则:通过精确匹配设备属性(如总线号、厂商ID),控制 ModemManager 的管理范围。
• 环境变量:ID_MM_PORT_IGNORE
和 ID_MM_DEVICE_IGNORE
是 ModemManager 的“开关”,1
表示忽略,0
表示管理。
• 命名逻辑:规则文件名中的 mm
表示 ModemManager,ignore
表示忽略设备,manage
表示管理设备。
Ⅳ)、真实案例——真实的调试过程
1.设置名字
2.配置自动分配ip
3.配置发短信、打电话
Ⅴ)、5G的配置(与4G差不多)
分步解决方案:解决5G模块问题
1. 确认5G模块的USB信息
# 插入模块后执行
lsusb
• 输出示例:
Bus 002 Device 003: ID 2cb7:0102 Fibocom FG652-CN
记录 idVendor
(如 2cb7
)和 idProduct
(如 0102
)。
2. 更新UDEV规则
# 创建新规则文件
sudo vi /etc/udev/rules.d/80-fg652-cn.rules
添加内容:
# 固定网络接口名为usb0
SUBSYSTEM=="net", ACTION=="add", ATTRS{idVendor}=="2cb7", ATTRS{idProduct}=="0102", NAME="usb0"
# 禁止ModemManager管理所有ttyUSB端口
SUBSYSTEM=="tty", ATTRS{idVendor}=="2cb7", ATTRS{idProduct}=="0102", ENV{ID_MM_PORT_IGNORE}="1"
生效规则:
sudo udevadm control --reload
sudo udevadm trigger
3. 强制NetworkManager管理usb0
# 确保策略文件包含usb0
sudo vi /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf
修改为:
[keyfile]
unmanaged-devices=*,except:interface-name:usb0
重启服务:
sudo systemctl restart NetworkManager
4. 检查IP分配
# 手动获取IP(如果DHCP失败)
sudo dhclient -v usb0
# 查看IP
ip addr show usb0
• 预期输出:显示有效的IPv4或IPv6地址。
5. 测试网络连通性(可选)
# 强制使用IPv4(避免IPv6干扰)
ping -4 www.baidu.com -I usb0
6. 手动测试AT指令(可选)
# 安装minicom
sudo apt install minicom
# 测试不同ttyUSB端口
sudo minicom -D /dev/ttyUSB0 -b 115200
sudo minicom -D /dev/ttyUSB1 -b 115200
在minicom中输入:
AT+CPIN? # 检查SIM卡状态
AT+CSQ # 检查信号质量
AT+CMGF=1 # 设置文本模式
• 关键点:
- 确认正确的AT指令端口(如
ttyUSB1
)。 - 确认波特率(可能为
115200
或9600
)。
7. 修改短信/电话脚本(可选)
如果AT指令端口或波特率变化,需更新程序中的默认参数:
# 示例:修改send_sms脚本中的默认端口和波特率
sudo vi send_sms
修改代码:
# 原始配置
port = "/dev/ttyUSB2"
baudrate = 9600
# 新配置
port = "/dev/ttyUSB1"
baudrate = 115200
8. 验证驱动兼容性
# 检查内核日志
dmesg | grep "Fibocom"
# 预期输出:
usb 2-1.3: New USB device found, idVendor=2cb7, idProduct=0102
cdc_ether 2-1.3:1.4 usb0: register 'cdc_ether' ...
• 若驱动未加载:
需安装模块特定驱动(参考厂商文档)。
关键问题解析
问题 | 原因 | 解决方案 |
---|---|---|
ping卡住且显示警告 | IPv6地址优先或DHCP未完成 | 使用 ping -4 强制IPv4,或检查DHCP配置 |
短信/电话失败 | AT指令端口变化(如从 ttyUSB2 变为 ttyUSB1 ) | 更新脚本中的默认端口 |
5G模块未被识别为usb0 | UDEV规则未匹配新模块的USB ID | 新增规则匹配 idVendor=2cb7 和 idProduct=0102 |
串口通信错误 | 波特率不匹配(如FG652-CN需115200) | 在程序或minicom中显式设置波特率 |
总结
- UDEV规则更新:确保新模块的USB ID和路径被正确匹配。
- 网络调试:优先使用IPv4,确认DHCP/IP分配正常。
- AT指令适配:手动验证端口和波特率,更新程序配置。
- 驱动兼容性:检查内核日志,必要时安装厂商驱动。
按此流程操作后,5G模块的网络和通信功能应恢复正常。若仍有问题,请提供 dmesg
和 journalctl -u NetworkManager
日志。