:從接線到開機自啟)
前陣子給一臺跑Ubuntu 22.04的工控機配5G上網選型時直接鎖定了移遠RM520N-GL。這塊模塊在M.2 5G模組里算是很主流的選擇Sub-6GHz頻段覆蓋全USB直連Ubuntu 22.04的內核自帶了qmi_wwan和rndis_host驅動理論上插上就能用。但真正動手后發(fā)現從硬件接線到系統(tǒng)識別再到撥號上網和開機自啟每一步都有不少細節(jié)稍不注意就會卡住。這篇教程就把我實際跑通的全過程記錄下來從接線、AT指令、ECM/QMI兩種上網方案到systemd開機自啟一次性講清楚適合正在用RM520N-GL或者同類移遠模組做設備聯(lián)網的開發(fā)者、嵌入式工程師參考。1. 硬件準備與接線別在網絡接口前先栽在供電和天線上很多人拿到模塊第一件事就是往電腦上一插然后發(fā)現lsusb里啥都沒有。RM520N-GL是M.2 Key B封裝的模組大部分臺式機主板和工控主板并沒有對應的M.2 B Key插槽所以基本上都要走一塊轉接板。轉接板選不好后面全是坑。1.1 模塊封裝與轉接板怎么選RM520N-GL默認是M.2 3052尺寸轉接板我建議買帶獨立DC-DC供電電路、且支持USB 3.0的版本。你可能覺得轉接板就是個物理接口轉換能插上就行其實供電差別很大。我實測過這塊模塊在弱信號環(huán)境下發(fā)射功率瞬間拉滿時電流能沖到2A以上如果轉接板供電能力不足模塊會直接重啟。表現就是網絡接口消失過幾秒又出現反復循環(huán)一開始還以為是驅動問題最后換了一塊供電扎實的轉接板才解決。另外一個重點是供電電壓范圍。RM520N-GL的電源引腳要求是3.4V到4.4V典型值是3.8V絕對不能直接拿5V去懟模塊的供電引腳。市面上正規(guī)的M.2轉USB板都已經處理好了電平轉換和穩(wěn)壓直接用USB線插主機就行。但如果是那種便宜的、只有簡單引腳的轉接板一定要仔細看說明書確認供電方案靠譜再用。1.2 SIM卡座、天線接口的細節(jié)SIM卡方面轉接板上一般會有標準的SIM卡座直接用普通SIM卡插進去就行。這里有個很容易踩的坑RM520N-GL默認會檢測SIM_DET引腳如果你的轉接板沒有把SIM_DET這腳處理好模塊會一直認為沒插卡。遇到這種情況可以通過AT指令關閉SIM卡檢測ATQSIMDET0 ATQSIMSTAT0關掉之后模塊就只靠電氣連接判斷SIM卡是否存在大多數轉接板配合這個指令都能正常識別SIM卡。如果關掉檢測還是不認卡再檢查卡座觸點、SIM卡方向甚至換一張卡試試。天線這塊更不能馬虎。RM520N-GL在模塊本體上是IPEX 4代的座子連接轉接板上的IPEX轉SMA線后再外接天線。至少要把主集天線ANT0接上分集天線ANT1也建議接上否則網速會受很大影響。想要跑滿速盡量把MIMO天線都接上。我遇到過信號強度顯示99代表無信號的情況排查半天發(fā)現是天線線材內部斷了換一根線馬上恢復。另外天線位置影響也很大放在鐵殼機箱里和放在窗邊信號強度能差出20dBm這個差距直接決定了是5G滿格還是頻繁掉線。1.3 通電前先確認固件版本硬件接好、模塊上電后在Linux下先別急著撥號先確認固件版本。老固件對近幾年運營商新發(fā)的SIM卡支持不太好可能會出現“SIM卡能識別但始終注冊不上網絡”的情況。用下面的AT指令查看ATI ATCGMRATCGMR返回的就是固件版本。如果版本比較舊建議在Windows下用移遠的QFlash工具升級固件。注意升級過程中絕對不能斷電否則模塊可能變磚。雖然Linux下也有升級工具但我個人還是推薦Windows下操作穩(wěn)定性更好步驟也簡單裝好驅動、插上模塊、打開QFlash、選固件、點升級等進度條走完就行。2. 系統(tǒng)識別與USB工作模式搞清網卡從哪來硬件就緒后把模塊插到Ubuntu 22.04主機上。Ubuntu 22.04默認內核版本是5.15已經包含了rndis_host、cdc_ether、qmi_wwan這些驅動不用額外編譯任何內核模塊。2.1 用lsusb和dmesg確認設備枚舉模塊插入后先用lsusb查看lsusb正常情況下會看到一個2c7c開頭的USB設備2c7c是移遠的USB Vendor ID。如果看不到大概率是硬件鏈路問題。這時候再配合dmesg看內核日志dmesg | tail -n 50能看到USB枚舉、ttyUSB創(chuàng)建、網絡接口注冊的過程。如果dmesg里完全沒反應先別查驅動回頭查USB線、USB口和轉接板供電百分之八十是這里的問題。模塊正常枚舉后會生成一組ttyUSB設備比如/dev/ttyUSB0、/dev/ttyUSB1第一個通常是AT命令口。可以用screen連上去測試sudo apt install screen -y screen /dev/ttyUSB0 115200輸入AT回車返回OK就說明AT口正常。這是一個很基礎的判斷所有后續(xù)配置都依賴這個口。2.2 ECM、RNDIS、QMI模式的切換模塊在系統(tǒng)里顯示的網卡名稱跟USB工作模式有關。如果工作在RNDIS或ECM模式系統(tǒng)里會多出一個以en開頭的網卡比如enp0s20f0u2這種如果工作在QMI模式會生成wwan0這種接口。RM520N-GL支持通過AT指令切換USB模式ATQCFGusbnet,0 # RNDIS ATQCFGusbnet,2 # ECM切換后需要重啟模塊生效。RNDIS在Windows下體驗好Linux下也能用ECM是標準CDC Ethernet協(xié)議在Linux下非常穩(wěn)我個人做項目默認用ECM模式。這個模式切換在后面的開機自啟配置里也很關鍵因為它決定了你要用哪套方案。2.3 撥號前必做的AT體檢在配置網絡之前先用幾條AT指令確認模塊狀態(tài)ATCPIN? ATCOPS? ATQENGservingcell ATCSQATCPIN?返回READY說明SIM卡被正常識別ATCOPS?看當前注冊的運營商ATQENGservingcell能看到當前服務小區(qū)、制式、信號質量ATCSQ返回的兩個數字中第一個越大信號越好99代表沒有信號。這幾條命令比任何圖形界面都直觀。如果這些都正常模塊側的鏈路就沒問題接下來就處理上網。3. 聯(lián)網方案ECM自動撥號與QMI/ModemManager怎么選RM520N-GL有一個我很喜歡的特性模塊本身支持自動注冊網絡并撥號。只要SIM卡正常、APN正確、信號正常模塊上電后自己就會完成撥號電腦這邊的網卡只要拿到IP就能上網。這就是最常見的“模塊自己撥號電腦當網卡用”的方案。3.1 方案一模塊自動撥號 ECM網卡直連先用AT指令把APN配置好ATCGDCONT1,IPV4V6,cmnet把cmnet替換成你所在運營商的APN。常見的有cmnet、3gnet、ctnet這些不確定就打運營商客服問千萬別猜。配置成功后再確認一下模塊已經注冊上網絡然后電腦端把對應的網卡啟用并獲取IPsudo ip link set enp0s20f0u2 up sudo dhclient enp0s20f0u2如果提示dhclient命令不存在先安裝sudo apt update sudo apt install isc-dhcp-client -y正常的話幾秒后就能拿到IP然后ping一下外網測試ping -c 4 223.5.5.5能通就說明模塊已經自己撥號成功并且系統(tǒng)路由也正常。這個方案的優(yōu)點非常明顯電腦側只看到一個普通網卡所有撥號邏輯都在模塊內部完成沒有額外服務穩(wěn)定性極高。3.2 方案二ModemManager NetworkManager的QMI方式如果你是帶桌面環(huán)境的Ubuntu插上模塊后右上角網絡菜單通常會自動出現“移動寬帶”選項背后就是ModemManager在檢測和托管模塊。命令行環(huán)境下的操作也很簡單sudo apt install modemmanager libqmi-utils network-manager -y sudo systemctl enable --now ModemManager mmcli -Lmmcli -L會列出模塊記下Modem的編號。接著用nmcli創(chuàng)建并激活連接nmcli con add type gsm ifname cdc-wdm0 con-name 5g apn cmnet nmcli con up 5g這樣NetworkManager就會通過QMI通道撥號。優(yōu)點是由NetworkManager統(tǒng)一管理開機自啟配置起來比較簡單。不過QMI方式對模塊固件版本有一定依賴我遇到過幾次撥號不穩(wěn)定或者模塊被ModemManager識別后串口被占用的情況排查起來比ECM方式費勁。3.3 兩種方案怎么取舍方案優(yōu)點缺點適用場景ECM自動撥號簡單、穩(wěn)定、無額外服務依賴需要先用AT指令配好APN工控機、嵌入式設備、長期無人值守QMI/ModemManager可由NetworkManager管理有GUI支持依賴服務撥號邏輯對固件敏感桌面環(huán)境、臨時調試、喜歡用NetworkManager的人我自己的項目里主力用ECM原因就是系統(tǒng)里能少裝就少裝開機自啟邏輯也最簡單不會出現服務互相搶設備和串口的情況。4. 開機自啟三種方法總有一種適合你聯(lián)網配置好之后最煩人的就是開機自啟。手動執(zhí)行dhclient沒問題重啟后網卡就是不起來這個坑幾乎每個人都踩過。下面給出三種方案按推薦程度排序。4.1 systemd服務腳本最穩(wěn)定推薦ECM模式下最穩(wěn)的開機自啟是寫一個systemd服務開機后等模塊枚舉完成再拉起網卡獲取IP。腳本內容如下#!/bin/bash # /usr/local/bin/rm520n-up.sh IFACE for i in $(seq 1 30); do IFACE$(ip -o link show | awk -F: /enp[0-9]u[0-9]/ {print $2}) if [ -n $IFACE ]; then break fi sleep 2 done if [ -n $IFACE ]; then ip link set $IFACE up dhclient -v $IFACE else exit 1 fi這個腳本里的等待循環(huán)是關鍵。模塊從加電到USB枚舉完成一般需要5到15秒如果systemd服務不等待就直接dhclient百分百失敗。腳本最多等待60秒覆蓋了模塊冷啟動時間。給腳本加上執(zhí)行權限sudo chmod x /usr/local/bin/rm520n-up.sh然后創(chuàng)建systemd服務[Unit] DescriptionRM520N-GL 5G Network Up Afternetwork.target [Service] Typeoneshot ExecStart/usr/local/bin/rm520n-up.sh RemainAfterExityes [Install] WantedBymulti-user.target保存到/etc/systemd/system/rm520n-up.service然后sudo systemctl daemon-reload sudo systemctl enable rm520n-up.service這樣開機后腳本會自動拉網卡、DHCP拿地址。要注意的是如果你的系統(tǒng)里同時開了NetworkManagerNetworkManager也會嘗試接管這個網卡容易沖突。所以要么用NetworkManager要么用腳本別兩個都管同一個網卡。4.2 NetworkManager自動連接適合QMI方式如果你用的是QMI方式并且已經在NetworkManager里保存了5g連接一般默認是開機自動連接的。檢查一下nmcli con show 5g | grep autoconnect如果顯示yesNetworkManager會在設備出現時自動激活連接。但有一個隱患如果模塊初始化比NetworkManager慢NM啟動時看不到設備這個連接就不會激活。雖然有自動重試機制但偶爾也會不靠譜??梢栽趕ystemd里加一個延時服務或者寫個NetworkManager dispatcher腳本。不過說實話如果你都走到這一步了我建議直接切到ECM方案用上面那個systemd服務邏輯更直白。4.3 用udev固定網卡名避免腳本失效再分享一個實戰(zhàn)技巧。模塊生成的網卡名每次可能不一樣取決于USB拓撲比如插到不同的USB口網卡名就從enp0s20f0u2變成enp0s20f0u4了。這對腳本來說是致命的。解決辦法是用udev根據MAC地址固定網卡名。先查看模塊網卡的MAC地址ip link show enp0s20f0u2假設MAC地址是aa:bb:cc:dd:ee:ff創(chuàng)建udev規(guī)則cat /etc/udev/rules.d/90-rm520n.rules EOF SUBSYSTEMnet, ACTIONadd, ATTR{address}aa:bb:cc:dd:ee:ff, NAMEwwan0 EOF sudo udevadm control --reload-rules這樣以后模塊生成的網卡就固定叫wwan0了腳本和路由配置都可以寫死不用擔心換USB口導致腳本找不到設備。這個技巧在多網口工控機上尤其重要。我之前有一次線上設備就是被同事插拔了一次USB線網卡名變了開機自啟腳本直接失效花了半天才排查出來。4.4 掉線自動重連的小看門狗開機自啟解決的是“開機后能不能聯(lián)網”但5G模塊在實際運行中偶爾會因為信號波動、運營商側原因掉線。掉線后ECM網卡可能還在但IP和路由已經斷了??梢约右粋€簡單的看門狗腳本定時檢測外網連通性不通就重新獲取IP#!/bin/bash # /usr/local/bin/rm520n-watchdog.sh while true; do sleep 30 if ! ping -c 1 -W 3 223.5.5.5 /dev/null 21; then dhclient -r wwan0 dhclient wwan0 fi done再用nohup或者systemd把它跑起來。對長時間運行的邊緣設備來說這個小腳本能省掉很多“設備離線”的尷尬。ping的目標地址建議填你業(yè)務環(huán)境里必須訪問的地址不要只ping模塊網關因為網關通不代表外網通。5. 常見問題速查與排查心得這個模塊我用了大半年前后踩過的坑不少。下面整理一份實戰(zhàn)問題清單按排查順序排列。5.1 模塊插上但lsusb完全看不到這基本是硬件鏈路問題和驅動、系統(tǒng)配置都無關。先換USB線、換USB口優(yōu)先用主板后置USB口別用前置面板延長線。再檢查轉接板供電。還有一種可能是模塊之前被配置成異常模式導致枚舉失敗斷電重新上電一般能恢復。5.2 SIM卡提示沒有插入優(yōu)先檢查SIM_DET引腳邏輯用ATQSIMDET0關掉檢測。其次檢查SIM卡座金屬觸點和卡方向。最簡單的方法是把SIM卡先放手機里確認能正常出流量、沒停機。運營商新卡和舊模塊固件之間也有兼容性問題如果ATCPIN?一直返回ERROR更新固件通常能解決。5.3 AT口敲命令沒反應確認串口速率是115200確認用的是/dev/ttyUSB0而不是其它串口。如果系統(tǒng)里插了多個USB串口設備設備路徑可能不是固定的可以通過dmesg確認當前ttyUSB對應哪個設備。另外Ubuntu上如果開了ModemManager它會默認占用串口用minicom或screen連不上的時候先停掉ModemManager再試。5.4 網卡拿到IP但ping不通外網先查路由表ECM模式下模塊拿到的IP通常是192.168.225.x之類的網段網關就是模塊自己。如果系統(tǒng)里有多條默認路由優(yōu)先級會亂手動加一下ip route show sudo ip route add default via 模塊網關地址 dev wwan0如果路由正常還是不通查DNS/etc/resolv.conf里改成223.5.5.5和8.8.8.8試試。5.5 信號強度99永遠注冊不上99代表沒有信號或信號極低。先看天線有沒有接再看天線是不是壞了。如果天線正常把模塊挪到開闊位置測試。RM520N-GL是Global版頻段覆蓋很全很少出現頻段不對齊的問題遇到99大概率還是天線和環(huán)境問題。5.6 開機后模塊能識別但網絡沒自動起來典型場景是手動執(zhí)行dhclient沒問題重啟后網卡沒起來。原因基本是systemd服務執(zhí)行時機太早模塊還沒枚舉完。把腳本里的等待循環(huán)時間加長或者用udev規(guī)則觸發(fā)。我更推薦“等待設備出現”這種主動等待邏輯而不是簡單地在systemd里寫個sleep 20因為sleep時間寫短了沒用寫長了又拖慢開機。最后聊兩句我在工控機上用RM520N-GL跑了大半年整體感受是移遠模塊的硬件底子不錯Ubuntu 22.04下免驅真正容易出問題的是系統(tǒng)集成層的細節(jié)——模式對不對、APN對不對、自啟時機對不對。如果你按這套流程走大概率能一次跑通。我個人踩得最深的一個坑就是供電不足導致模塊隨機重啟這個如果硬件階段沒處理好后面怎么調軟件都白搭。所以開頭的基礎一定要打好。模塊真正穩(wěn)定跑起來之后還能繼續(xù)做一些有意思的擴展比如5G和有線網絡的自動切換、按信號強度調整天線方向、定時重啟模塊保持長期在線等等這些都是在這個基礎上可以繼續(xù)玩的方向。