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

发布于:2025-04-12 ⋅ 阅读:(39) ⋅ 点赞:(0)

1)、完整解决流程总结


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

# 创建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

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


二、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管理AT指令端口(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. 通过udev设置 NetworkManager 全局策略
# 修改全局配置文件,强制允许管理usb0接口
sudo vi /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf

在这个文件加上在这个文件加上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 连接配置
# 删除旧配置
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(关键!)**
# 创建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; 触发拨号

六、关键问题解释

为什么之前失败?
  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)
# 文件:/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)
# 文件:/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)
# 文件:/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

命令

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_IGNOREID_MM_DEVICE_IGNORE 是 ModemManager 的“开关”,1 表示忽略,0 表示管理。
命名逻辑:规则文件名中的 mm 表示 ModemManager,ignore 表示忽略设备,manage 表示管理设备。

真实案例——调试过程

1.配置自动分配ip

在这里插入图片描述

2.配置发短信、打电话

在这里插入图片描述

5G

分步解决方案:解决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         # 设置文本模式

关键点

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

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=2cb7idProduct=0102
串口通信错误 波特率不匹配(如FG652-CN需115200) 在程序或minicom中显式设置波特率

总结

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

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


网站公告

今日签到

点亮在社区的每一天
去签到