【Ubutun】 在Linux Yocto的基础上去适配4G模块

1)、完整解决流程总结


一. 固定4G模块的网络接口名 usb0(基于物理路径)

bash 复制代码
# 创建UDEV规则文件
sudo vi /etc/udev/rules.d/10-4g-rename.rules

添加内容:

bash 复制代码
SUBSYSTEM=="net", ACTION=="add", ATTRS{busnum}=="2", ATTRS{devpath}=="1.3", NAME="usb0"

生效规则:

bash 复制代码
sudo udevadm control --reload
sudo udevadm trigger

作用 :无论接口MAC如何变化,始终命名为 usb0


二、4G模块自动分配ip

1. 隔离 ModemManager 和 NetworkManager 的管理范围

作用

• ModemManager 管理 ttyUSB0-3(用于短信/拨号)。

• NetworkManager 管理 usb0(用于网络通信)。

2. 通过udev设置ModemManager管理权限
bash 复制代码
# 禁止ModemManager管理网络接口(usb0)
sudo vi /etc/udev/rules.d/77-mm-ignore-usb0.rules

添加内容:

bash 复制代码
SUBSYSTEM=="net", ACTION=="add", ATTRS{busnum}=="2", ATTRS{devpath}=="1.3", ENV{ID_MM_DEVICE_IGNORE}="1"
bash 复制代码
# 允许ModemManager管理AT指令端口(ttyUSB0-3)
sudo vi /etc/udev/rules.d/77-mm-manage-ttyUSB.rules

添加内容:

bash 复制代码
SUBSYSTEM=="tty", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ENV{ID_MM_PORT_IGNORE}="0"

生效规则:

bash 复制代码
sudo udevadm control --reload
sudo udevadm trigger

3. 通过udev设置 NetworkManager 全局策略
bash 复制代码
# 修改全局配置文件,强制允许管理usb0接口
sudo vi /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf

在这个文件加上在这个文件加上except:interface-name:usb0

修改后内容:

ini 复制代码
[keyfile]
unmanaged-devices=*,except:type:wifi,except:type:gsm,except:type:cdma,except:type:ethernet,except:interface-name:usb0

重启服务:

bash 复制代码
sudo systemctl restart NetworkManager

作用 :显式允许管理 usb0(绕过类型识别依赖)。


4. 创建 NetworkManager 连接配置
bash 复制代码
# 删除旧配置
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(关键!)**
bash 复制代码
# 创建UDEV规则,禁止ModemManager管理ttyUSB2
sudo vi /etc/udev/rules.d/78-mm-ignore-ttyUSB2.rules

添加内容:

bash 复制代码
SUBSYSTEM=="tty", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTRS{devpath}=="1.3", ENV{ID_MM_PORT_IGNORE}="1"

生效规则:

bash 复制代码
sudo udevadm control --reload
sudo udevadm trigger
sudo systemctl restart ModemManager

作用 :让 ttyUSB2 仅由用户程序控制,避免 ModemManager 冲突。


四. 验证串口权限

bash 复制代码
# 确保用户属于dialout组
sudo usermod -aG dialout $USER
# 重启生效
sudo reboot

五、最终验证

1. 网络功能
bash 复制代码
nmcli dev status          # 应显示 usb0 为 connected
ip addr show usb0         # 应显示 IPv4 地址
ping -I usb0 8.8.8.8     # 测试网络连通性
2. 短信功能
bash 复制代码
# 发送短信
./send_sms /dev/ttyUSB2 192******** "www.tronlong.com"
# 预期输出:AT+CMGF=1 返回 OK
3. 电话功能
bash 复制代码
# 拨打电话
./phone_call /dev/ttyUSB2 192********
# 预期输出:ATD19200952893; 触发拨号

六、关键问题解释

为什么之前失败?
  1. ModemManager 冲突

    ModemManager 默认会接管所有 ttyUSB* 设备,导致用户程序无法直接控制 ttyUSB2
    解决 :通过 ENV{ID_MM_PORT_IGNORE}="1" 显式禁止其管理。

  2. NetworkManager 策略限制

    原配置仅允许管理特定类型设备,而 usb0 未被正确识别为 ethernet
    解决 :通过 except:interface-name:usb0 强制放行。


七、总结

配置文件路径 作用
/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自动分配+通信(发短信和打电话)功能均可正常工作。



2)、更为详细的总结

超详细解释与操作指南


一、基础概念解释

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)
bash 复制代码
# 文件:/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 的设备(通过 dmesgudevadm info 可查看)。

ATTRS{devpath}=="1.3":匹配设备在总线上的路径为 1.3(表示 USB 集线器的第一个端口下的第三个设备)。

ENV{ID_MM_DEVICE_IGNORE}="1":设置环境变量 ID_MM_DEVICE_IGNORE1,告知 ModemManager 忽略此设备。

作用 :让 ModemManager 不管理 usb0 接口(避免与 NetworkManager 冲突)。


(2) 允许 ModemManager 管理 AT 指令端口(ttyUSB0-3)
bash 复制代码
# 文件:/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_IGNORE0,告知 ModemManager 管理此设备。

作用:允许 ModemManager 管理所有 Quectel 模块的串口(用于短信、拨号等)。


(3) 禁止 ModemManager 管理特定串口(ttyUSB2)
bash 复制代码
# 文件:/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_IGNORE1,告知 ModemManager 忽略此端口。

作用 :让用户程序独占 /dev/ttyUSB2,避免 ModemManager 冲突。


3. 环境变量 ID_MM_* 的含义

命名由来

ID_MM 前缀表示这些变量专为 ModemManager 设计。

PORT_IGNOREDEVICE_IGNORE 是 ModemManager 定义的变量名。

作用

ID_MM_PORT_IGNORE=1:让 ModemManager 忽略某个串口。

ID_MM_DEVICE_IGNORE=1:让 ModemManager 忽略某个网络设备。


三、操作步骤详解

1. 固定接口名 usb0

命令

bash 复制代码
sudo vi /etc/udev/rules.d/10-4g-rename.rules
bash 复制代码
SUBSYSTEM=="net", ACTION=="add", ATTRS{busnum}=="2", ATTRS{devpath}=="1.3", NAME="usb0"

作用 :无论模块的 MAC 地址如何变化,接口名始终为 usb0,避免因动态命名(如 enp0s1)导致配置失效。


2. 隔离 ModemManager 和 NetworkManager

禁止 ModemManager 管理网络接口

bash 复制代码
sudo vi /etc/udev/rules.d/77-mm-ignore-usb0.rules
bash 复制代码
SUBSYSTEM=="net", ACTION=="add", ATTRS{busnum}=="2", ATTRS{devpath}=="1.3", ENV{ID_MM_DEVICE_IGNORE}="1"

作用 :防止 ModemManager 干扰 usb0 的网络功能。

允许 ModemManager 管理其他串口

bash 复制代码
sudo vi /etc/udev/rules.d/77-mm-manage-ttyUSB.rules
bash 复制代码
SUBSYSTEM=="tty", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ENV{ID_MM_PORT_IGNORE}="0"

作用 :允许 ModemManager 管理模块的诊断端口(如 ttyUSB0),用于获取信号强度、SIM 状态等。


3. 强制 NetworkManager 管理 usb0

修改全局策略文件

bash 复制代码
sudo vi /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf
ini 复制代码
[keyfile]
unmanaged-devices=*,except:type:wifi,except:type:gsm,except:type:cdma,except:type:ethernet,except:interface-name:usb0

作用 :覆盖默认策略,强制 NetworkManager 管理 usb0


4. 创建网络连接配置

命令

bash 复制代码
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

命令

bash 复制代码
sudo vi /etc/udev/rules.d/78-mm-ignore-ttyUSB2.rules
bash 复制代码
SUBSYSTEM=="tty", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTRS{devpath}=="1.3", ENV{ID_MM_PORT_IGNORE}="1"

作用 :让用户程序(如 send_sms)独占 ttyUSB2,避免 ModemManager 冲突。


6. 生效规则

重新加载 UDEV 规则

bash 复制代码
sudo udevadm control --reload
sudo udevadm trigger

重启服务

bash 复制代码
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_IGNOREID_MM_DEVICE_IGNORE 是 ModemManager 的"开关",1 表示忽略,0 表示管理。

命名逻辑 :规则文件名中的 mm 表示 ModemManager,ignore 表示忽略设备,manage 表示管理设备。

真实案例------调试过程

1.配置自动分配ip

2.配置发短信、打电话

5G

分步解决方案:解决5G模块问题


1. 确认5G模块的USB信息
bash 复制代码
# 插入模块后执行
lsusb

输出示例

bash 复制代码
Bus 002 Device 003: ID 2cb7:0102 Fibocom FG652-CN

记录 idVendor(如 2cb7)和 idProduct(如 0102)。


2. 更新UDEV规则
bash 复制代码
# 创建新规则文件
sudo vi /etc/udev/rules.d/80-fg652-cn.rules

添加内容:

bash 复制代码
# 固定网络接口名为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"

生效规则:

bash 复制代码
sudo udevadm control --reload
sudo udevadm trigger

3. 强制NetworkManager管理usb0
bash 复制代码
# 确保策略文件包含usb0
sudo vi /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf

修改为:

ini 复制代码
[keyfile]
unmanaged-devices=*,except:interface-name:usb0

重启服务:

bash 复制代码
sudo systemctl restart NetworkManager

4. 检查IP分配
bash 复制代码
# 手动获取IP(如果DHCP失败)
sudo dhclient -v usb0
# 查看IP
ip addr show usb0

预期输出:显示有效的IPv4或IPv6地址。


5. 测试网络连通性
bash 复制代码
# 强制使用IPv4(避免IPv6干扰)
ping -4 www.baidu.com -I usb0

6. 手动测试AT指令
bash 复制代码
# 安装minicom
sudo apt install minicom
# 测试不同ttyUSB端口
sudo minicom -D /dev/ttyUSB0 -b 115200
sudo minicom -D /dev/ttyUSB1 -b 115200

在minicom中输入:

plaintext 复制代码
AT+CPIN?          # 检查SIM卡状态
AT+CSQ            # 检查信号质量
AT+CMGF=1         # 设置文本模式

关键点

  1. 确认正确的AT指令端口(如 ttyUSB1)。
  2. 确认波特率(可能为 1152009600)。

7. 修改短信/电话脚本

如果AT指令端口或波特率变化,需更新程序中的默认参数:

bash 复制代码
# 示例:修改send_sms脚本中的默认端口和波特率
sudo vi send_sms

修改代码:

python 复制代码
# 原始配置
port = "/dev/ttyUSB2"
baudrate = 9600

# 新配置
port = "/dev/ttyUSB1"
baudrate = 115200

8. 验证驱动兼容性
bash 复制代码
# 检查内核日志
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=2cb7idProduct=0102
串口通信错误 波特率不匹配(如FG652-CN需115200) 在程序或minicom中显式设置波特率

总结

  1. UDEV规则更新:确保新模块的USB ID和路径被正确匹配。
  2. 网络调试:优先使用IPv4,确认DHCP/IP分配正常。
  3. AT指令适配:手动验证端口和波特率,更新程序配置。
  4. 驱动兼容性:检查内核日志,必要时安装厂商驱动。

按此流程操作后,5G模块的网络和通信功能应恢复正常。若仍有问题,请提供 dmesgjournalctl -u NetworkManager 日志。

相关推荐
AOwhisky23 分钟前
Python 学习笔记(第十四期)——运维自动化(下·中篇):远程文件传输——paramiko进阶篇
运维·python·学习·云原生·自动化·文件传输·paramiko
imc.111 小时前
linux基础IO
linux·运维·服务器
躺不平的理查德1 小时前
让Ubuntu 的第二块网卡 ens37 永久固定为 192.168.30.111
运维·服务器
bitbrowser2 小时前
Facebook 验证反复回到原页面,应该从哪里排查
运维·服务器·facebook
Land03292 小时前
AI网页元素变化无法自动修复?自带元素自愈的自动化解决方案
运维·人工智能·ai·自动化·rpa
fengyehongWorld2 小时前
Jenkins 安装与简单配置
运维·jenkins
云智慧AIOps社区2 小时前
2026 国产化 ITSM 替代指南:横向测评 ServiceNow、轻帆云、Jira等五款主流IT服务管理平台
运维·人工智能·运维开发·it服务管理·itsm平台
Urbano2 小时前
针织卫衣全流程生产工序科普:自动化替代、产能优化与设备选型实战方案
运维·自动化
BelongPanda3 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
AC赳赳老秦3 小时前
招投标公开数据自动化采集实战:基于 OpenClaw 的定时抓取与业务关键词精准推送
运维·服务器·数据库·自动化·测试用例·deepseek·openclaw