尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Ubuntu 22.04 下移远 RM520N-GL 5G 模块从接线到开机自启全攻略

Ubuntu 22.04 下移远 RM520N-GL 5G 模块从接线到开机自启全攻略 前段时间给手头一台 Ubuntu 22.04 主机接移远 RM520N-GL 5G 模块本以为插上 USB、装好 SIM 卡就能直接出网结果从硬件接线到驱动识别从拨号到开机自启前前后后折腾了大半天踩了一堆doc里查不到的坑。现在把这条完整链路整理出来硬件怎么接、系统怎么认、拨号怎么配、开机自启怎么弄最后附上我实际遇到的问题和解决办法。不管你是拿它做 5G CPE、边缘网关还是给工控机加一条蜂窝备用链路这套流程都能直接抄作业。1. 硬件接线别急着上电先理清这几根线1.1 需要准备的物料和选型说明RM520N-GL 是 M.2 Key-B 封装的模组不是随便插个转接板就能跑的裸设备。要把它在 Ubuntu 上顺利用起来至少需要这几样东西RM520N-GL 模组本身。注意型号尾缀GL 是全球版支持的频段更全国内 5G 频段也覆盖到了。M.2 转接板。市面上常见两种M.2 转 USB 3.0 和 M.2 转 PCIe x1。我强烈建议优先选 USB 3.0 转接板因为 Ubuntu 下走 qmi_wwan 或 cdc_mbim 非常顺不用额外处理 PCIe 驱动的兼容性问题。天线。RM520N-GL 支持 4x4 MIMO套件里一般带 4 根棒状天线。就算只是测试至少也要接 2 根不然信号强度和速率都会很难看。nano SIM 卡。注意是 nano 卡别拿 micro SIM 卡套凑合很多转接板的卡托根本塞不进去。供电线。很多转接板上有独立 DC 电源口需要 12V/3A 左右。USB 口那点 5V 供电在模组注册 5G 网络的时候非常容易掉尤其你还接了延长线的时候。散热片。这个真不是可选项RM520N-GL 长时间跑 5G 发热很大后面我会单独说。选转接板时有一个关键点最好选择带独立 USB 数据口和独立电源口的板子而不是完全靠 USB 供电。我试过几块便宜的转接板只靠 USB 取电时dmesg里模组会反复枚举、断开开 5G 后十分钟内必断一次。后来换成 12V 外部供电才彻底稳定下来。1.2 接线顺序和上电检查接线没有太高技术含量但顺序错了容易出怪问题。我的操作习惯是先把 4 根天线接到模组上的 MHF4 座上。天线末端接口非常小别用蛮力最好配一把镊子或撬棒对准后垂直压下去咔一声就到位了。把模组以 30 度左右角度插入 M.2 卡槽压平后拧上固定螺丝。这里最容易出错后面我会讲我踩过的一次接触不良。装 SIM 卡。金属触点朝下推进去直到听到咔嗒声。先接转接板供电等待 3 到 5 秒再插 USB 数据线到 Ubuntu 主机。开机后检查dmesg | tail -30和lsusb。如果lsusb里能看到类似2c7c:0800或2c7c:0801的设备就说明模组 USB 枚举成功了。2c7c是移远的厂商 IDPID 会随工作模式不同而变化有的固件在 QMI 模式下显示 0800MBIM 模式显示 0801。这个不影响后续流程只要 VID 是 2c7c 就行。还有一个细节天线别贴着金属机箱也别放在强电磁干扰源旁边。5G 高频信号对遮挡和干扰非常敏感。我第一次调试时把天线直接压在铁皮机箱上RSRP 一度掉到 -100dBm 以下后来用延长线把天线拉出来竖起来信号直接改善了十几个 dB。这一步看着不起眼但直接决定你后面测速的心情。2. 系统识别让 Ubuntu 22.04 认出 RM520N-GL2.1 上电后的第一眼lsusb 与 dmesgUSB 线插上后先执行lsusb dmesg | tail -50正常情况下lsusb会输出类似下面这样一行Bus 002 Device 003: ID 2c7c:0800 Quectel Wireless Solutions Co., Ltd. RM520N-GL内核日志里也会出现qmi_wwan或cdc_mbim相关的绑定信息。同时/dev/下面会多出几个设备节点典型映射大致是/dev/ttyUSB0或/dev/ttyUSB1DM 口和 AT 口用来发 AT 指令/dev/cdc-wdm0QMI 通道libqmi和qmicli都走这个节点wwan0网络接口实际上网流量的出口。如果/dev/cdc-wdm0没有出现先别急着往下走大概率是驱动没有绑定看下一节。2.2 驱动绑定内核认识不代表驱动认Ubuntu 22.04 默认内核是 5.15已经自带了qmi_wwan、cdc_mbim等驱动但这里有个很尴尬的坑部分 RM520N-GL 固件上报的 USB PID 不在驱动的 ID 表里导致驱动不会自动绑定。典型表现是lsusb能看到设备但/dev/cdc-wdm0不出现mmcli也查不到模组。这种情况可以临时手动绑定sudo modprobe qmi_wwan sudo sh -c echo 2c7c 0801 /sys/bus/usb/drivers/qmi_wwan/new_id如果之后/dev/cdc-wdm0和wwan0出现了就说明是新 PID 没在驱动 ID 表里的问题。要永久生效写一条 udev 规则比如/etc/udev/rules.d/90-rm520n.rulesACTIONadd, ATTRS{idVendor}2c7c, ATTRS{idProduct}0801, RUN/bin/sh -c echo 2c7c 0801 /sys/bus/usb/drivers/qmi_wwan/new_id写好后重载规则或者重新插拔 USBsudo udevadm control --reload-rules sudo udevadm trigger如果你的固件 PID 已经被内核默认识别这步直接跳过别没事乱加规则反而会绑错网络接口。判断方法是先看dmesg里有没有驱动绑定成功的日志。之后安装基础工具sudo apt update sudo apt install -y modemmanager network-manager libqmi-utils curl jqUbuntu 22.04 的apt update如果慢就先把软件源换成国内镜像方法网上一大把这里不展开。装完后把两个关键服务拉起来sudo systemctl enable --now ModemManager sudo systemctl enable --now NetworkManager只要 ModemManager 在跑后续大部分拨号工作都可以交给它。3. 拨号上网ModemManager 一条龙 vs 手动 qmicli3.1 推荐路线ModemManager NetworkManagerModemManager 启动后先确认模组被发现mmcli -L正常输出大致是/org/freedesktop/ModemManager1/Modem/0 [Quectel] RM520N-GL然后查看详细状态mmcli -m 0重点关注几项Status里的state是不是disabledSIM项有没有读到卡号3GPP里的registration state是不是registered或roaming。如果state是 disabled先启用mmcli -m 0 --enable确认注册网络之后直接用 ModemManager 建承载并连接。以国内最常见的公用 APN 为例mmcli -m 0 --commandATCGDCONT1,IP,cmnet mmcli -m 0 --create-bearerapncmnet,ip-typeipv4 mmcli -m 0 --connect-bearer1这里的apncmnet只是示例实际要换成运营商分配的 APN。移动常见的是cmnet联通是3gnet或wonet电信场景则要看你的资费套餐别照抄。连接成功后检查网络接口ip addr show wwan0正常情况下wwan0已经拿到一个 IPv4 地址并且内核会自动配上默认路由。如果地址没出现可以先试试 DHCP 兜底sudo dhclient wwan0能起来说明大概率是 raw-ip 数据格式没协商好后面写自启脚本的时候我会加一层防护逻辑。如果你不想跟 MM 手动命令打交道还有一条更省事的路线让 NetworkManager 管理这条连接。nmcli connection add type gsm ifname wwan0 con-name rm5g apn cmnet ipv4.method auto autoconnect yes nmcli connection up rm5gNetworkManager 本身会调用 ModemManager 完成拨号、IP、DNS 配置autoconnect yes也给了它开机自连的能力。不过这里我要泼一盆冷水5G 模组这种 USB 设备上光靠autoconnect经常不稳定原因我在下一章专门讲。3.2 手动路线qmicli 直连如果你的系统不想跑 ModemManager或者 ModemManager 和 NetworkManager 打架也可以全程用qmicli手动拨号。这个思路适合嵌入式老手也能帮你理解 QMI 协议在底层干了什么。先检查数据格式避免 raw-ip 问题qmicli -d /dev/cdc-wdm0 --wda-get-data-format如果返回的是raw-ip而内核网络接口还用的是 802.3 模式就需要手动切sudo ip link set wwan0 down echo Y /sys/class/net/wwan0/qmi/raw_ip sudo ip link set wwan0 up然后启动网络sudo qmicli -p -d /dev/cdc-wdm0 --device-open-netnet-raw-ip|net-no-qos-header --wds-start-networkapncmnet,ip-typeipv4 --client-no-release-cid上面这个命令加上--client-no-release-cid会把 QMI 会话保持住方便后续查询和断线重连。启动成功后会返回 packet data handle。然后加默认路由sudo ip route add default dev wwan0手动路线的优点是完全可控坏处是断线重连、开机恢复都得自己写逻辑。生产环境不建议从头造轮子Ubuntu 上让 ModemManager 管理模组生命周期比裸 qmicli 稳太多。3.3 实在不行就 ECM模块直接变USB 网卡QMI 和 MBIM 都试过还是搞不定时还有一条万金油退路把模组切成 ECM 模式。ECM 会把拨号过程简化成一张标准 USB 网卡宿主侧只需要 DHCP 就能拿 IP。先用 AT 指令切换设备节点一般是/dev/ttyUSB2或/dev/ttyUSB3sudo screen /dev/ttyUSB2 115200然后在 AT 终端里发送ATQCFGusbnet,0 ATCFUN1,1ATCFUN1,1是重启模组让新参数生效。重启后lsusb的 PID 可能会变网络接口变成usb0或enx*然后直接用 NetworkManager 新建一个 ethernet 连接或者dhclient usb0就能上网。ECM 模式简单但稳定性和效率不如原生 QMI/MBIM个别固件在高负载下会出兼容问题。我建议把它当排障手段而不是长期方案。4. 开机自启用 systemd 把 5G 网络焊死4.1 为什么 autoconnect 靠不住先说结论USB 挂载的 5G 模块开机自启最大的敌人是时序。开机时内核枚举 USB 设备需要时间模组固件初始化需要时间ModemManager 扫描发现模组也需要时间。NetworkManager 如果在这个窗口期尝试连接rm5g很可能撞上模组还没就绪的情况连接失败。更烦人的是NM 一旦标记失败后续重试策略并不是你想的那么勤快有时候必须手动nmcli connection up rm5g才能恢复。这类问题的本质和 Linux 下 CIFS 开机没自动挂载是同一个坑你以为写进了配置就完事但系统执行时网络或设备还没就绪于是直接失败。正确做法是把等设备、等网络这些动作交给 systemd 按依赖顺序执行。这也是为什么我最终选择写脚本而不是只靠 NetworkManager 的 autoconnect。4.2 自启脚本带重试的 ModemManager 流程我写了一个启动脚本放到/usr/local/bin/rm5g-up.sh。逻辑很直白等 ModemManager 找到模组启用模组创建 bearer连接 bearer再兜底配置默认路由。#!/bin/bash LOG_TAGrm5g logger -t $LOG_TAG waiting ModemManager to enumerate modem... MM_INDEX for i in $(seq 1 30); do MM_INDEX$(mmcli -L 2/dev/null | grep -oE modem/[0-9] | head -1 | cut -d/ -f2) if [ -n $MM_INDEX ]; then break fi sleep 2 done if [ -z $MM_INDEX ]; then logger -t $LOG_TAG modem not found after 60s, exit exit 1 fi logger -t $LOG_TAG modem index: $MM_INDEX mmcli -m $MM_INDEX --enable 2/dev/null || true sleep 2 BEARER_ID$(mmcli -m $MM_INDEX --list-bearers 2/dev/null | grep -oE bearer/[0-9] | head -1 | cut -d/ -f2) if [ -z $BEARER_ID ]; then OUT$(mmcli -m $MM_INDEX --create-bearerapncmnet,ip-typeipv4 21) BEARER_ID$(echo $OUT | grep -oE bearer [0-9] | grep -oE [0-9]) fi if [ -z $BEARER_ID ]; then logger -t $LOG_TAG create bearer failed: $OUT exit 1 fi mmcli -m $MM_INDEX --connect-bearer$BEARER_ID 2/dev/null || true sleep 3 ip link set wwan0 up 2/dev/null || true if ! ip route show default 2/dev/null | grep -q wwan0; then ip route add default dev wwan0 2/dev/null || true fi logger -t $LOG_TAG 5G link is up脚本里的mmcli --create-bearer参数apn一定要改成你自己的。如果运营商要求ip-typeipv4v6或者指定user/password直接在这个命令后面追加即可。给脚本加上执行权限sudo chmod x /usr/local/bin/rm5g-up.sh4.3 systemd 单元与启用再创建一个 systemd 服务文件/etc/systemd/system/rm5g-up.service[Unit] DescriptionBring up RM520N-GL 5G link Afternetwork-pre.target ModemManager.service WantsModemManager.service Beforenetwork.target [Service] Typeoneshot ExecStart/usr/local/bin/rm5g-up.sh RemainAfterExityes Restarton-failure RestartSec10 [Install] WantedBymulti-user.target然后启用sudo systemctl daemon-reload sudo systemctl enable --now rm5g-up.service重启验证之前先手动执行一次确认在当前环境能跑通sudo systemctl restart rm5g-up.service journalctl -u rm5g-up -b看到5G link is up的日志说明脚本本身没问题。然后sudo reboot开机后等十几秒检查ip addr show wwan0和ip route show default。4.4 顺带解决 USB 自动挂起这个坑很有迷惑性模组拨号正常跑着跑着网断了翻日志发现 USB 设备进入了 autosuspend。这是内核 USB 电源管理和模组交互时序冲突导致的。可以用一条 udev 规则根治ACTIONadd, SUBSYSTEMusb, ATTRS{idVendor}2c7c, ATTR{power/autosuspend}-1写好后sudo udevadm control --reload-rules sudo udevadm trigger如果已经处于挂起状态手动恢复echo on | sudo tee /sys/bus/usb/devices/*/power/control这里的*建议精确到具体总线地址别一股脑全改否则影响其他 USB 设备。4.5 和 Windows 习惯对比一下从 Windows 转过来的朋友平时可能习惯用 PowerShell 开机脚本处理开机后要干的事。Windows 的做法是塞进计划任务或者启动文件夹Linux 这边对应的就是 systemd 服务。两者本质一样把开机后必须执行的动作变成系统托管任务并且能查日志、能自动重试。我见过不少人把 Windows 上的启动脚本思路直接照搬过来却不看系统日志结果脚本报错也不知道问题在哪。到了 systemd 这边先把journalctl用熟排障效率能高一个量级。尤其是Restarton-failure加RestartSec10的组合在模组初始化慢的环境下非常管用。5. 常见问题与排查实录5.1 问题速查表现象排查方向解决方法lsusb看不到设备供电、接线、USB 口检查 12V 供电重新插拔模组换 USB 直连口lsusb有设备但mmcli -L空驱动未绑定检查 dmesg用new_id绑定 qmi_wwan写 udev 规则固化mmcli -m 0显示 disabled模组处于 disabled 状态mmcli -m 0 --enable或者 ATCFUN1SIM 卡读不到SIM 接触、PIN 码、卡槽断电插 SIM查 ATCPIN?关掉 PIN 码拨号成功但 wwan0 无 IPraw-ip 格式没对上用 qmicli 检查 WDA 数据格式手动切 raw-ip或 dhclient 兜底无法 ping 外网默认路由、DNSip route检查默认路由加default dev wwan0检查 /etc/resolv.conf开机后没自启时序、服务依赖看 journalctl等模组枚举调 RestartSec跑一会儿断流USB autosuspend关掉 auto 挂起检查散热5.2 典型排查记录模组完全不枚举我遇到最典型的问题是转接板供电接上后lsusb里什么都看不到dmesg 也没有任何 USB 插入事件。排查过程是这样先排除数据线换了一根带屏蔽的 USB 3.0 线无效再排除 USB 口插到主板直出的 Type-A 口还是无效最后把转接板拆下来发现 M.2 卡槽里的模组没有完全压平一侧翘起来了金手指接触不良。重新插入、压平、锁螺丝后上电立刻枚举成功。这个案例提醒我M.2 模组安装时压平这一步看着简单实际非常容易出错。如果你遇到完全无响应的情况第一步永远是重新检查物理连接而不是改软件。5.3 典型排查记录拨号成功但上不了外网除了wwan0没 IP还有一个常见伴生问题IP 有了但 ping 外网不通。这时候先看路由ip route show如果默认路由还在有线网卡上5G 的包就会走错出口。手工加一条优先级路由sudo ip route add default dev wwan0 metric 100metric 设高一点可以让有线网卡优先作为默认路由5G 当备份链路。如果你需要 5G 作为主链路把这个 metric 调低即可。另一个隐蔽问题是IPv4 地址拿到了但 DNS 还是内网服务器导致域名解析失败。用nmcli device show wwan0查看或者直接编辑/etc/resolv.conf把公共 DNS 加进去。5.4 典型排查记录信号看着正常但速率拉胯你可以用这条命令查看服务小区信息mmcli -m 0 --commandATQENGservingcell重点关注 RSRP 和 SINR。如果 RSRP 在 -85dBm 以内、SINR 在 10dB 以上速率还是上不去多半是天线没接满或者模组被限制在 4G 模式。检查注册模式mmcli -m 0 --commandATCOPS? mmcli -m 0 --commandATQNWPREFCFGmode_pref,NR5G_SA部分运营商的 5G 卡默认不注册 SA需要把模组的模式偏好改成 SA 或 NSA。注意不是所有固件都支持这条指令具体以移远官方 AT 手册为准。5.5 一种被我放弃的方案纯 NetworkManager 自连早期调试时我试过只依赖 NetworkManager 的开机自连nmcli connection modify rm5g connection.autoconnect yes单独看配置没有任何问题但实测开机 10 次里有 2 到 3 次连不上。一旦失败NM 要等较长时间才重试中间完全无网。后面改成 systemd 服务等模组稳定再拨号连续重启十几次都能过。所以如果你也遇到 autoconnect 偶尔失灵别死磕 NM直接上脚本最省心。写在最后的一点经验整套流程跑通之后真正让我省心的不是某一条神奇命令而是一块散热片。RM520N-GL 跑起来发热相当明显尤其是连续上下行测试时模组表面温度能到七八十度高到一定程度就开始掉速。我后来在模块背面贴了一块 30x30 毫米的铝散热片再配合转接板的通风孔长时间 ping 和跑脚本都没掉过包。这个硬件层面的小改动比我在软件上折腾半天都管用。如果你也要长时间跑 5G建议第一件事就把散热做好再去纠结参数。等软件方案稳定后这套东西还能扩展成 4G/5G 自动切换的备份链路或者加上健康检查脚本实现断线自动重拨。那又是另一个话题了等后面有空再单独写一篇。
返回列表