【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 日志。

相关推荐
十年磨一剑~19 分钟前
C实现md5功能
linux·算法
CZIDC40 分钟前
信创服务器-大国崛起,信创当道!
运维·服务器
SoFlu软件机器人1 小时前
电商系统开发:基于飞算JavaAI的分布式事务解决方案自动化实践
运维·分布式·自动化
liyongjun63161 小时前
Zookeeper 命令返回数据的含义
linux·服务器·zookeeper
dessler1 小时前
Kubernetes(k8s)-服务目录(ServiceCatalog)介绍(二)
linux·运维·kubernetes
我的Go语言之路果然有问题2 小时前
案例速成linux手把手教学(个人笔记)
linux
塔能物联运维2 小时前
案例:塔能科技驱动河南某市政照明智慧升级
大数据·运维
Fanche4042 小时前
SQL 语句基础(增删改查)
运维·数据库·sql·mysql·web安全·oracle
正点原子2 小时前
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——4G模块ME3630测试
linux·stm32·单片机·嵌入式硬件·stm32mp257
movee3 小时前
高性能编程开发(一):HugePage
linux·后端·性能优化