嵌入式Linux網(wǎng)關(guān)實(shí)戰(zhàn):EC20 SGMII網(wǎng)口與FC20 Wi-Fi 6 AP配置全解析
1. 項(xiàng)目概述當(dāng)4G模組遇上高速網(wǎng)口與Wi-Fi最近在搞一個(gè)工業(yè)網(wǎng)關(guān)項(xiàng)目核心需求是把現(xiàn)場(chǎng)的各種傳感器數(shù)據(jù)通過(guò)4G網(wǎng)絡(luò)穩(wěn)定地傳到云端同時(shí)設(shè)備本地還得有個(gè)Wi-Fi熱點(diǎn)方便現(xiàn)場(chǎng)工程師用筆記本或手機(jī)快速連接進(jìn)去做配置和調(diào)試。這個(gè)需求聽(tīng)起來(lái)挺常規(guī)但真到選型和聯(lián)調(diào)的時(shí)候坑是一個(gè)接一個(gè)。主控平臺(tái)用的是性能還不錯(cuò)的嵌入式Linux系統(tǒng)帶千兆網(wǎng)口。最初的想法很簡(jiǎn)單找一款帶網(wǎng)口的4G模組直接插上網(wǎng)線就能讓整個(gè)系統(tǒng)上網(wǎng)再配一個(gè)獨(dú)立的Wi-Fi模組做AP。市面上這類模組不少移遠(yuǎn)的EC20系列就是其中的熱門(mén)選擇它有個(gè)衍生版本EC20-CEHLG支持SGMII接口理論上能和主控的千兆網(wǎng)口直連省去一個(gè)USB轉(zhuǎn)接性能和穩(wěn)定性應(yīng)該更好。而Wi-Fi部分看中了移遠(yuǎn)的FC20這是一款支持2.4G/5G雙頻的Wi-Fi 6模組做AP性能綽綽有余。想法很美好但“支持SGMII”和“調(diào)試通過(guò)”之間隔著一片名為“底層驅(qū)動(dòng)適配和硬件時(shí)序”的汪洋大海。網(wǎng)口通訊不像USB插上就能認(rèn)它涉及到物理層、鏈路層的諸多參數(shù)匹配而FC20模組雖然接口是常見(jiàn)的SDIO或USB但在Linux系統(tǒng)下把它配置成一個(gè)性能穩(wěn)定、功能完整的AP同樣需要一番折騰。這次調(diào)試就是要把EC20的SGMII網(wǎng)口徹底打通讓系統(tǒng)把它識(shí)別為一個(gè)標(biāo)準(zhǔn)的以太網(wǎng)設(shè)備比如eth1同時(shí)把FC20配置成一個(gè)雙頻的無(wú)線接入點(diǎn)。整個(gè)過(guò)程是對(duì)嵌入式Linux網(wǎng)絡(luò)驅(qū)動(dòng)、網(wǎng)絡(luò)配置、無(wú)線工具集的一次深度實(shí)踐。2. 核心需求與方案選型背后的考量2.1 為什么選擇SGMII接口的EC20模組在4G模組與主控的連接方式上常見(jiàn)的有USB、PCIe和網(wǎng)口RMII/SGMII等。USB方式最普遍驅(qū)動(dòng)成熟即插即用但缺點(diǎn)也明顯需要占用一個(gè)USB主機(jī)端口在某些緊湊型設(shè)計(jì)中資源緊張USB總線在高速率、大數(shù)據(jù)量傳輸時(shí)穩(wěn)定性和CPU占用率可能不如專用網(wǎng)絡(luò)接口此外還需要額外的USB網(wǎng)絡(luò)共享驅(qū)動(dòng)如rndis_host,qmi_wwan。而網(wǎng)口直連尤其是SGMIISerial Gigabit Media Independent Interface則提供了另一種思路。SGMII是一種串行吉比特媒體獨(dú)立接口常用于芯片與PHY物理層芯片或交換芯片之間的連接。選擇EC20-CEHLG的SGMII版本主要基于以下幾點(diǎn)考量性能與資源獨(dú)立SGMII是純硬件鏈路數(shù)據(jù)交換不經(jīng)過(guò)主控CPU的USB或PCIe控制器理論上延遲更低、吞吐更穩(wěn)定。對(duì)于需要保證4G通道數(shù)據(jù)實(shí)時(shí)性的工業(yè)場(chǎng)景這一點(diǎn)很重要。它相當(dāng)于給系統(tǒng)直接增加了一個(gè)由4G模組驅(qū)動(dòng)的“網(wǎng)卡”主控CPU負(fù)擔(dān)更輕。簡(jiǎn)化網(wǎng)絡(luò)拓?fù)湓贚inux系統(tǒng)看來(lái)通過(guò)SGMII連接的EC20就是一個(gè)標(biāo)準(zhǔn)的網(wǎng)絡(luò)接口。我們可以直接用ifconfig或ip命令來(lái)管理它用route命令添加默認(rèn)路由所有網(wǎng)絡(luò)棧TCP/IP的處理都和普通網(wǎng)卡無(wú)異軟件架構(gòu)清晰運(yùn)維也方便。硬件設(shè)計(jì)簡(jiǎn)化省去了USB接口所需的ESD保護(hù)、電源管理等外圍電路對(duì)于PCB布局和成本控制有一定好處。當(dāng)然這帶來(lái)了新的挑戰(zhàn)需要主控SoC支持SGMII接口并正確連接時(shí)鐘和數(shù)據(jù)線。為什么不選RMIIRMII是百兆接口而EC20的4G CAT4理論下行速率可達(dá)150Mbps在信號(hào)好時(shí)RMII可能成為瓶頸。SGMII是千兆接口為4G速率留足了余量未來(lái)升級(jí)到CAT6模組也無(wú)需改動(dòng)硬件接口。2.2 為什么選擇FC20作為Wi-Fi AP模組Wi-Fi模組的選擇主要看中三點(diǎn)性能、驅(qū)動(dòng)支持和功能。FC20是一款基于高通方案的Wi-Fi 6模組支持2.4GHz和5GHz雙頻并支持AP/STA/并發(fā)模式。雙頻支持這是選擇它的關(guān)鍵。現(xiàn)場(chǎng)環(huán)境復(fù)雜2.4GHz頻段干擾嚴(yán)重但穿墻性好5GHz頻段干凈、速率高但覆蓋范圍小。提供雙頻AP可以讓現(xiàn)場(chǎng)設(shè)備根據(jù)情況自動(dòng)選擇最佳頻段連接保障配置通道的可靠性。這也是搜索熱詞中“l(fā)inux wifi 模組如何設(shè)置ap 支持5g頻段”所關(guān)心的核心問(wèn)題。驅(qū)動(dòng)與軟件生態(tài)FC20通常使用ath11k驅(qū)動(dòng)該驅(qū)動(dòng)是Linux內(nèi)核主線支持的用于高通Wi-Fi 6芯片。主線驅(qū)動(dòng)意味著更好的兼容性、更持續(xù)的維護(hù)和更豐富的功能支持如802.11ax特性、WPA3加密等。相比于一些需要單獨(dú)移植私有驅(qū)動(dòng)SDK的模組主線驅(qū)動(dòng)的可維護(hù)性要高得多。接口與功耗FC20多采用SDIO或USB接口。SDIO接口功耗更低更適合嵌入式設(shè)備。我們的主控平臺(tái)SDIO資源充足因此選擇了SDIO接口的版本。方案總結(jié)最終硬件鏈路是EC20通過(guò)SGMII接口直接連接到主控SoC的MAC層FC20通過(guò)SDIO接口連接到主控。在操作系統(tǒng)層面我們需要讓Linux正確識(shí)別這兩個(gè)“網(wǎng)卡”并完成4G撥號(hào)和Wi-Fi AP的配置。3. EC20 SGMII接口驅(qū)動(dòng)調(diào)試詳解這是整個(gè)項(xiàng)目中最硬核、最容易踩坑的部分。EC20的SGMII接口并不是一個(gè)即插即用的標(biāo)準(zhǔn)以太網(wǎng)卡。模組內(nèi)部集成了一個(gè)以太網(wǎng)控制器可能是IP核并通過(guò)SGMII接口暴露出來(lái)。主控端需要做相應(yīng)的配置才能與之“握手”成功。3.1 硬件連接與引腳檢查首先必須確保硬件連接萬(wàn)無(wú)一失。SGMII接口通常包含以下幾組信號(hào)TXD/TXD-發(fā)送差分對(duì)RXD/RXD-接收差分對(duì)REFCLK參考時(shí)鐘非常重要其中時(shí)鐘信號(hào)是重中之重。SGMII的參考時(shí)鐘頻率通常是125MHz。需要確認(rèn)時(shí)鐘由誰(shuí)提供是主控輸出給模組還是模組輸出給主控或者雙方共用一個(gè)外部時(shí)鐘源EC20-CEHLG的規(guī)格書(shū)明確要求由主控提供125MHz參考時(shí)鐘。我們必須檢查主控SoC的相應(yīng)引腳是否配置為SGMII REFCLK輸出模式并用示波器測(cè)量時(shí)鐘頻率和幅值是否穩(wěn)定、準(zhǔn)確。差分?jǐn)?shù)據(jù)線的PCB走線必須嚴(yán)格遵循差分對(duì)規(guī)則等長(zhǎng)、等距、阻抗控制避免信號(hào)完整性出現(xiàn)問(wèn)題導(dǎo)致鏈接不穩(wěn)定。實(shí)操心得很多SGMII鏈接不上的問(wèn)題首先出在時(shí)鐘上。我們用示波器抓取時(shí)鐘信號(hào)發(fā)現(xiàn)幅值不足且波形有畸變。排查后發(fā)現(xiàn)是主控端時(shí)鐘輸出驅(qū)動(dòng)的強(qiáng)度drive-strength配置不夠在設(shè)備樹(shù)Device Tree中調(diào)整了對(duì)應(yīng)引腳的drive-strength屬性后時(shí)鐘波形立刻變得干凈漂亮鏈接成功率大幅提升。3.2 Linux內(nèi)核驅(qū)動(dòng)配置與設(shè)備樹(shù)編寫(xiě)硬件無(wú)誤后需要在軟件層面讓Linux內(nèi)核識(shí)別這個(gè)接口。這主要依靠設(shè)備樹(shù)Device Tree來(lái)描述硬件連接。啟用主控SGMII MAC驅(qū)動(dòng)首先確保內(nèi)核編譯時(shí)啟用了主控SoC的以太網(wǎng)控制器驅(qū)動(dòng)并且支持SGMII模式。例如對(duì)于NXP的i.MX系列需要啟用CONFIG_FEC并確認(rèn)其支持SGMII。編寫(xiě)設(shè)備樹(shù)節(jié)點(diǎn)這是核心步驟。我們需要在主控的以太網(wǎng)控制器節(jié)點(diǎn)下添加一個(gè)子節(jié)點(diǎn)來(lái)描述連接的PHY。但EC20內(nèi)部的以太網(wǎng)控制器本身就是一個(gè)“PHY”從Linux MAC的角度看。因此配置比較特殊。// 示例以i.MX6UL平臺(tái)為例fec1節(jié)點(diǎn)配置 fec1 { pinctrl-names default; pinctrl-0 pinctrl_fec1; // 引腳復(fù)用配置 phy-mode sgmii; // 關(guān)鍵指定模式為sgmii phy-handle sgmii_phy; // 指向我們定義的“PHY” status okay; mdio { #address-cells 1; #size-cells 0; // 定義一個(gè)“PHY”地址為0。實(shí)際上對(duì)應(yīng)EC20的內(nèi)部控制器 sgmii_phy: ethernet-phy0 { compatible ethernet-phy-ieee802.3-c22; // 使用標(biāo)準(zhǔn)兼容性 reg 0; // PHY地址需與硬件設(shè)計(jì)匹配 // 可能需要的特殊屬性如固定鏈接模式 fixed-link { speed 1000; // 固定為千兆 full-duplex; // 全雙工 // 有時(shí)需要指定 pause 等流控屬性 }; }; } };關(guān)鍵點(diǎn)解析phy-mode sgmii;必須明確指定。fixed-link由于EC20內(nèi)部不是標(biāo)準(zhǔn)的MDIO可管理PHY我們無(wú)法通過(guò)MDIO總線去讀取它的狀態(tài)寄存器比如鏈接狀態(tài)、速度協(xié)商。因此通常使用fixed-link屬性來(lái)告訴內(nèi)核“這是一個(gè)固定鏈接速度就是1000M全雙工你別去嘗試協(xié)商了”。這是解決“鏈路不停up/down”或“速度識(shí)別為10M/100M”問(wèn)題的關(guān)鍵。reg 0;這個(gè)PHY地址需要根據(jù)硬件設(shè)計(jì)來(lái)定如果EC20的MDIO管理地址是0這里就寫(xiě)0。編譯與更新內(nèi)核/設(shè)備樹(shù)修改設(shè)備樹(shù)源文件.dts后編譯生成設(shè)備樹(shù)二進(jìn)制文件.dtb并更新到開(kāi)發(fā)板。3.3 系統(tǒng)啟動(dòng)與網(wǎng)絡(luò)接口識(shí)別更新設(shè)備樹(shù)重啟后觀察內(nèi)核啟動(dòng)日志dmesg | grep -i fec或dmesg | grep -i eth。成功跡象fec 2188000.ethernet eth1: registered PHC device 0 fec 2188000.ethernet eth1: SGMII link up fec 2188000.ethernet eth1: Link is Up - 1Gbps/Full - flow control rx/tx出現(xiàn)類似“SGMII link up”和“1Gbps/Full”的日志并且使用ifconfig -a或ip link show能看到eth1或其他編號(hào)接口狀態(tài)為UP就說(shuō)明SGMII物理層和鏈路層已經(jīng)通了。常見(jiàn)問(wèn)題與排查看不到eth1接口檢查內(nèi)核驅(qū)動(dòng)是否編譯進(jìn)內(nèi)核或模塊檢查設(shè)備樹(shù)節(jié)點(diǎn)狀態(tài)是否為okay檢查引腳復(fù)用pinctrl配置是否正確。鏈路狀態(tài)不穩(wěn)定頻繁up/down99%是硬件問(wèn)題或fixed-link配置問(wèn)題。用示波器仔細(xì)檢查SGMII差分信號(hào)和時(shí)鐘質(zhì)量。確認(rèn)設(shè)備樹(shù)中fixed-link的speed和full-duplex屬性是否正確。速度顯示為100M或10M同樣是fixed-link配置問(wèn)題確保speed 1000;。也可能是硬件信號(hào)質(zhì)量差導(dǎo)致自動(dòng)協(xié)商雖然我們用了fixed-link但底層可能仍有機(jī)制失敗降速運(yùn)行。當(dāng)eth1接口穩(wěn)定出現(xiàn)后它就是一個(gè)普通的以太網(wǎng)接口了。給這個(gè)接口配置一個(gè)IP地址如192.168.225.1并嘗試ping通EC20模組內(nèi)部的網(wǎng)關(guān)地址通常是192.168.225.1這里需要查EC20 AT命令手冊(cè)通過(guò)ATCGDCONT和ATCGPADDR獲取這是驗(yàn)證數(shù)據(jù)鏈路層是否完全暢通的關(guān)鍵一步。4. EC20 4G網(wǎng)絡(luò)撥號(hào)與路由配置SGMII鏈路通了只意味著主控和EC20模組之間可以通信了。要讓整個(gè)設(shè)備通過(guò)4G上網(wǎng)還需要在EC20內(nèi)部建立PPPPoint-to-Point Protocol連接也就是常說(shuō)的“撥號(hào)”。4.1 使用QMI協(xié)議進(jìn)行撥號(hào)移遠(yuǎn)模組通常支持多種撥號(hào)協(xié)議如PPP、QMI、MBIM。在嵌入式Linux中使用QMIQualcomm MSM Interface是一種更現(xiàn)代、功能更強(qiáng)大的方式。它通過(guò)USB或網(wǎng)口暴露一個(gè)控制端口使用libqmi工具和qmichannel驅(qū)動(dòng)進(jìn)行交互。安裝必要工具在文件系統(tǒng)中需要包含libqmi、qmi-utils等軟件包??梢酝ㄟ^(guò)Buildroot或Yocto在編譯根文件系統(tǒng)時(shí)加入。識(shí)別QMI設(shè)備當(dāng)EC20通過(guò)SGMII“上網(wǎng)”后我們需要通過(guò)AT命令切換到QMI模式如果默認(rèn)不是的話。通常發(fā)送ATQCFGusbnet,2可以設(shè)置為QMI模式具體AT命令需查手冊(cè)。然后在主控Linux中應(yīng)該能看到一個(gè)新的網(wǎng)絡(luò)接口比如wwan0或者通過(guò)ls /dev/cdc-wdm*看到QMI的控制設(shè)備。執(zhí)行撥號(hào)腳本撥號(hào)過(guò)程可以編寫(xiě)成一個(gè)腳本。核心步驟如下#!/bin/bash # 1. 設(shè)置APN接入點(diǎn)名稱根據(jù)你的SIM卡運(yùn)營(yíng)商來(lái)定 APN3gnet # 2. 通過(guò)qmicli工具啟動(dòng)網(wǎng)絡(luò)連接 # 首先獲取網(wǎng)絡(luò)服務(wù)客戶端 qmicli -d /dev/cdc-wdm0 --wds-start-networkip-type4,apn$APN --client-no-release-cid # 此命令會(huì)返回一個(gè)數(shù)據(jù)端口如net0 # 3. 為上一步返回的數(shù)據(jù)端口如net0配置IP和路由 ifconfig net0 up # 使用dhcp從模組獲取IP也可以靜態(tài)配置 udhcpc -i net0 -q # 或者 dhclient -v net0 # 4. 配置默認(rèn)路由將所有流量指向4G網(wǎng)絡(luò) # 先刪除可能存在的默認(rèn)路由 ip route del default 2/dev/null # 添加通過(guò)net0接口的默認(rèn)路由 ip route add default dev net0配置DNS撥號(hào)成功后運(yùn)營(yíng)商會(huì)分配DNS服務(wù)器地址。udhcpc或dhclient通常會(huì)自動(dòng)更新/etc/resolv.conf。如果沒(méi)有可以手動(dòng)添加例如echo nameserver 8.8.8.8 /etc/resolv.conf。4.2 網(wǎng)絡(luò)地址轉(zhuǎn)換NAT與防火墻設(shè)備通過(guò)net0上網(wǎng)了但設(shè)備上其他接口如Wi-Fi AP的接口wlan0上的設(shè)備還不能上網(wǎng)。這就需要用到NAT網(wǎng)絡(luò)地址轉(zhuǎn)換。啟用IP轉(zhuǎn)發(fā)echo 1 /proc/sys/net/ipv4/ip_forward為了讓重啟后生效需要修改/etc/sysctl.conf設(shè)置net.ipv4.ip_forward1。配置iptables實(shí)現(xiàn)NAT# 清除現(xiàn)有規(guī)則生產(chǎn)環(huán)境慎用 iptables -F iptables -t nat -F # 設(shè)置默認(rèn)策略 iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT # 在nat表的POSTROUTING鏈上添加MASQUERADE規(guī)則 # 這條規(guī)則的意思是從wlan0出去要從net0接口發(fā)出的數(shù)據(jù)包將其源IP地址偽裝成net0的地址 iptables -t nat -A POSTROUTING -o net0 -j MASQUERADE # 允許轉(zhuǎn)發(fā)來(lái)自wlan0去往net0的流量 iptables -A FORWARD -i wlan0 -o net0 -j ACCEPT # 允許轉(zhuǎn)發(fā)已建立連接及相關(guān)流量返回wlan0 iptables -A FORWARD -i net0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT同樣這些iptables規(guī)則需要保存并在開(kāi)機(jī)時(shí)自動(dòng)加載。注意事項(xiàng)在調(diào)試階段可以暫時(shí)把防火墻規(guī)則放得寬松一些如上面設(shè)置的默認(rèn)策略為ACCEPT但產(chǎn)品化時(shí)必須根據(jù)安全需求嚴(yán)格配置INPUT、FORWARD鏈的規(guī)則僅開(kāi)放必要的端口和服務(wù)。至此4G通道應(yīng)該已經(jīng)完全打通。你可以嘗試在設(shè)備上ping一個(gè)外網(wǎng)地址如8.8.8.8如果成功說(shuō)明從主控到互聯(lián)網(wǎng)的路徑已經(jīng)暢通。5. FC20 Wi-Fi模組AP模式配置實(shí)戰(zhàn)接下來(lái)我們要把FC20變成一臺(tái)無(wú)線路由器。這需要幾個(gè)步驟加載驅(qū)動(dòng)、配置hostapd用于創(chuàng)建AP、配置DHCP服務(wù)器為連接的設(shè)備分配IP。5.1 驅(qū)動(dòng)加載與接口確認(rèn)FC20通過(guò)SDIO連接內(nèi)核需要加載ath11k驅(qū)動(dòng)。確保內(nèi)核配置中啟用了CONFIG_ATH11K和CONFIG_ATH11K_SDIO如果使用SDIO接口。啟動(dòng)后使用dmesg | grep ath11k查看驅(qū)動(dòng)加載日志。成功的話使用iw dev命令應(yīng)該能看到一個(gè)無(wú)線接口通常命名為wlan0或wlx...。# 查看無(wú)線接口 iw dev # 輸出示例 phy#0 Interface wlan0 ifindex 3 wdev 0x1 addr aa:bb:cc:dd:ee:ff type managed channel 1 (2412 MHz), width: 20 MHz, center1: 2412 MHz txpower 20.00 dBm如果接口類型是managed客戶端模式我們需要先將其設(shè)置為AP模式。但更常見(jiàn)的做法是直接用一個(gè)支持AP模式的網(wǎng)絡(luò)配置工具來(lái)管理它會(huì)自動(dòng)處理模式切換。5.2 使用hostapd創(chuàng)建雙頻Wi-Fi熱點(diǎn)hostapd是Linux下創(chuàng)建無(wú)線接入點(diǎn)的標(biāo)準(zhǔn)工具。我們需要為它編寫(xiě)一個(gè)配置文件同時(shí)定義2.4G和5G的SSID可以相同也可以不同。安裝hostapd確保文件系統(tǒng)中包含hostapd軟件包。創(chuàng)建配置文件例如/etc/hostapd/hostapd.conf。一個(gè)支持雙頻的簡(jiǎn)化配置如下# 通用接口和驅(qū)動(dòng)設(shè)置 interfacewlan0 drivernl80211 country_codeCN # 設(shè)置國(guó)家代碼影響可用信道和功率 hw_modeg # 2.4G的基礎(chǔ)模式 channel6 # 2.4G信道可改為1, 11等干擾少的 # 2.4GHz網(wǎng)絡(luò)配置 ssidMyIndustrialGateway_2G ignore_broadcast_ssid0 auth_algs1 wpa2 wpa_passphraseYourStrongPassword123 wpa_key_mgmtWPA-PSK wpa_pairwiseCCMP rsn_pairwiseCCMP # 5GHz網(wǎng)絡(luò)配置 (通過(guò)創(chuàng)建虛擬接口實(shí)現(xiàn)) # 首先需要確認(rèn)驅(qū)動(dòng)和硬件支持并發(fā)虛擬接口 # 這里使用 hostapd 的多 BSS 功能 bsswlan0_5g hw_modea # 5G的基礎(chǔ)模式 channel36 # 5G信道可選36, 40, 44, 48, 149, 153, 157, 161, 165 ht_capab[HT40][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40] vht_capab[SHORT-GI-80] ssidMyIndustrialGateway_5G ignore_broadcast_ssid0 auth_algs1 wpa2 wpa_passphraseYourStrongPassword123 wpa_key_mgmtWPA-PSK wpa_pairwiseCCMP rsn_pairwiseCCMP關(guān)鍵參數(shù)說(shuō)明hw_modeg對(duì)應(yīng)2.4GHza對(duì)應(yīng)5GHz。channel2.4G建議用1、6、11這三個(gè)不重疊的信道。5G信道根據(jù)國(guó)家法規(guī)選擇中國(guó)常用36-64149-165。country_code非常重要必須正確設(shè)置否則可能無(wú)法使用5GHz頻段或最大發(fā)射功率受限。設(shè)置CN表示中國(guó)。wpa和rsn_pairwise設(shè)置WPA2加密和AESCCMP加密算法這是目前最安全通用的配置。啟動(dòng)hostapdhostapd -B /etc/hostapd/hostapd.conf使用-B參數(shù)在后臺(tái)運(yùn)行。查看日志tail -f /var/log/messages或使用iw dev wlan0 info確認(rèn)接口模式已變?yōu)锳P。實(shí)操心得FC20的ath11k驅(qū)動(dòng)對(duì)并發(fā)虛擬接口即單個(gè)物理射頻同時(shí)提供2.4G和5G AP的支持可能需要較新的內(nèi)核版本和特定的固件。如果上述多BSS配置不生效一個(gè)更穩(wěn)妥但需要兩個(gè)物理射頻的方案是使用兩個(gè)獨(dú)立的FC20模組或者退而求其次只配置一個(gè)頻段2.4G或5G。另一種變通方法是配置一個(gè)雙頻合一的SSID讓AP根據(jù)情況在2.4G和5G之間切換但這需要更復(fù)雜的hostapd配置和驅(qū)動(dòng)支持如802.11v/k/r。5.3 配置DHCP服務(wù)器dnsmasqAP創(chuàng)建好了手機(jī)能搜到Wi-Fi信號(hào)并連接但連接后設(shè)備沒(méi)有IP地址無(wú)法通信。我們需要一個(gè)DHCP服務(wù)器來(lái)分配IP。dnsmasq是一個(gè)輕量級(jí)的DHCP和DNS服務(wù)器非常適合嵌入式場(chǎng)景。安裝dnsmasq。配置dnsmasq。編輯/etc/dnsmasq.conf關(guān)鍵配置如下# 指定監(jiān)聽(tīng)無(wú)線接口 interfacewlan0 # 禁用對(duì)有線接口的服務(wù)除非你需要 no-dhcp-interfaceeth0 # 設(shè)置DHCP地址池、租期、網(wǎng)關(guān)和DNS dhcp-range192.168.100.100,192.168.100.200,255.255.255.0,12h dhcp-optionoption:router,192.168.100.1 # 網(wǎng)關(guān)地址即AP本身的IP dhcp-optionoption:dns-server,8.8.8.8,114.114.114.114為wlan0接口配置靜態(tài)IP這個(gè)IP就是上面設(shè)置的網(wǎng)關(guān)地址。ifconfig wlan0 192.168.100.1 netmask 255.255.255.0 up啟動(dòng)dnsmasqdnsmasq -C /etc/dnsmasq.conf現(xiàn)在用手機(jī)連接MyIndustrialGateway_2G或MyIndustrialGateway_5G應(yīng)該能成功獲取到192.168.100.x網(wǎng)段的IP并且可以ping通網(wǎng)關(guān)192.168.100.1。5.4 整合與自啟動(dòng)最后我們需要將上述所有步驟整合到啟動(dòng)腳本中如/etc/rc.local或systemd服務(wù)單元確保設(shè)備上電后能自動(dòng)完成加載驅(qū)動(dòng)識(shí)別EC20 SGMII接口eth1和FC20無(wú)線接口wlan0。配置EC20接口IP執(zhí)行QMI撥號(hào)腳本建立4G連接net0。配置wlan0的靜態(tài)IP。啟動(dòng)hostapd創(chuàng)建Wi-Fi熱點(diǎn)。啟動(dòng)dnsmasq提供DHCP服務(wù)。配置iptables NAT規(guī)則開(kāi)啟IP轉(zhuǎn)發(fā)讓連接Wi-Fi的設(shè)備能通過(guò)4G上網(wǎng)。6. 調(diào)試過(guò)程中遇到的典型問(wèn)題與解決方案6.1 EC20 SGMII鏈路無(wú)法建立Link Down現(xiàn)象dmesg中始終顯示SGMII link downip link顯示接口狀態(tài)為DOWN。排查硬件第一用示波器測(cè)量SGMII的REFCLK125MHz是否穩(wěn)定、幅值是否達(dá)標(biāo)通常1.2V或1.8V LVDS。檢查T(mén)XD/RXD差分對(duì)是否有信號(hào)。設(shè)備樹(shù)檢查確認(rèn)phy-mode sgmii;。確認(rèn)fixed-link屬性是否正確設(shè)置speed1000; full-duplex;。檢查PHY地址reg值是否正確。電源與復(fù)位確保EC20模組的供電穩(wěn)定尤其是為SGMIO接口供電的電源。檢查模組的復(fù)位信號(hào)是否正常釋放。解決我們的案例中調(diào)整主控端時(shí)鐘引腳的驅(qū)動(dòng)強(qiáng)度解決了問(wèn)題。如果硬件測(cè)量無(wú)誤可以嘗試在設(shè)備樹(shù)中為MAC節(jié)點(diǎn)添加一些延遲屬性如tx-delay和rx-delay單位ps以補(bǔ)償時(shí)序偏差。6.2 Wi-Fi AP啟動(dòng)失敗hostapd報(bào)錯(cuò)現(xiàn)象運(yùn)行hostapd后報(bào)錯(cuò)例如nl80211: Could not configure driver mode或Interface initialization failed。排查驅(qū)動(dòng)與固件確認(rèn)ath11k驅(qū)動(dòng)已正確加載lsmod | grep ath11k。檢查必要的固件文件如WLAN.HK.2.0-xxxxx-2-fw.bin是否已放入/lib/firmware/ath11k/目錄。接口狀態(tài)運(yùn)行iw list查看Supported interface modes是否包含AP。如果不包含可能是驅(qū)動(dòng)或硬件不支持AP模式。國(guó)家代碼極其重要未設(shè)置或設(shè)置錯(cuò)誤的country_code會(huì)導(dǎo)致無(wú)法使用任何無(wú)線功能特別是5GHz。在hostapd.conf中務(wù)必正確設(shè)置country_codeCN并確保系統(tǒng)區(qū)域設(shè)置一致可通過(guò)iw reg set CN命令設(shè)置。RF Kill有些硬件有射頻硬件開(kāi)關(guān)RFKill。使用rfkill list查看如果被hard blocked需要檢查硬件如果被soft blocked使用rfkill unblock wifi解鎖。解決確保固件存在且驅(qū)動(dòng)加載無(wú)誤在hostapd.conf首行就設(shè)置正確的國(guó)家代碼并在啟動(dòng)hostapd前用rfkill和iw reg set命令做好環(huán)境準(zhǔn)備。6.3 手機(jī)能連接Wi-Fi但無(wú)法上網(wǎng)現(xiàn)象手機(jī)顯示已連接Wi-Fi并獲取到IP但無(wú)法打開(kāi)網(wǎng)頁(yè)ping外網(wǎng)地址不通。排查網(wǎng)關(guān)設(shè)備自身能否上網(wǎng)在網(wǎng)關(guān)上ping 8.8.8.8確認(rèn)4G撥號(hào)成功且路由正確。IP轉(zhuǎn)發(fā)是否開(kāi)啟檢查/proc/sys/net/ipv4/ip_forward是否為1。iptables NAT規(guī)則運(yùn)行iptables -t nat -L -n -v和iptables -L -n -v檢查POSTROUTING鏈的MASQUERADE規(guī)則和FORWARD鏈的規(guī)則是否存在且匹配-o net0,-i wlan0等。防火墻屏蔽某些發(fā)行版默認(rèn)防火墻如firewalld, ufw可能阻止轉(zhuǎn)發(fā)。臨時(shí)關(guān)閉防火墻測(cè)試iptables -F iptables -t nat -F iptables -P FORWARD ACCEPT。DNS問(wèn)題手機(jī)能ping通8.8.8.8但打不開(kāi)網(wǎng)頁(yè)可能是DNS問(wèn)題。檢查dnsmasq配置中的dhcp-optionoption:dns-server是否正確或手動(dòng)在手機(jī)上設(shè)置DNS。解決按照上述順序排查。最常見(jiàn)的原因是IP轉(zhuǎn)發(fā)未開(kāi)啟或iptables NAT規(guī)則未正確配置。一個(gè)完整的診斷命令序列是cat /proc/sys/net/ipv4/ip_forward # 檢查轉(zhuǎn)發(fā) iptables -t nat -L -n -v # 檢查NAT規(guī)則 iptables -L -n -v # 檢查過(guò)濾規(guī)則 # 在網(wǎng)關(guān)上跟蹤到手機(jī)IP和外網(wǎng)IP的路由 traceroute -i wlan0 手機(jī)IP # 在網(wǎng)關(guān)上抓取經(jīng)過(guò)wlan0和net0的包 tcpdump -i wlan0 -n tcpdump -i net0 -n6.4 網(wǎng)絡(luò)性能不達(dá)標(biāo)或不穩(wěn)定現(xiàn)象4G下載速度遠(yuǎn)低于理論值或Wi-Fi吞吐量低、延遲高。排查4G側(cè)通過(guò)EC20的AT命令如ATQENGservingcell檢查信號(hào)強(qiáng)度RSRP, RSRQ、小區(qū)信息。信號(hào)差是首要原因。其次檢查SGMII接口的ethtool eth1統(tǒng)計(jì)信息是否有大量的錯(cuò)誤或丟包。Wi-Fi側(cè)使用iw dev wlan0 station dump查看已連接客戶端的信息包括信號(hào)強(qiáng)度、速率等。確保AP和客戶端處于干擾少的信道2.4G用1/6/115G用36/149等。檢查是否有同頻干擾。系統(tǒng)負(fù)載使用top或htop查看CPU占用率。hostapd、加密解密WPA2、NAT轉(zhuǎn)發(fā)iptables/conntrack都會(huì)消耗CPU資源。對(duì)于高流量場(chǎng)景考慮使用更高效的網(wǎng)絡(luò)工具如nftables替代iptables或硬件加速特性。解決優(yōu)化天線擺放改善信號(hào)更換信道避免干擾對(duì)于高性能要求場(chǎng)景可能需要選用主頻更高的處理器并優(yōu)化系統(tǒng)軟件配置。整個(gè)調(diào)試過(guò)程是對(duì)嵌入式系統(tǒng)軟硬件結(jié)合能力的全面考驗(yàn)。從硬件原理圖、信號(hào)完整性到Linux內(nèi)核驅(qū)動(dòng)、網(wǎng)絡(luò)協(xié)議棧、無(wú)線配置每一個(gè)環(huán)節(jié)都需要仔細(xì)驗(yàn)證。當(dāng)最終看到設(shè)備指示燈規(guī)律閃爍手機(jī)通過(guò)Wi-Fi順暢地瀏覽網(wǎng)頁(yè)時(shí)那種成就感是對(duì)所有調(diào)試工作的最好回報(bào)。這套方案已經(jīng)穩(wěn)定運(yùn)行在多個(gè)現(xiàn)場(chǎng)網(wǎng)關(guān)設(shè)備中證明了EC20 SGMIIFC20 AP方案的可行性。

相關(guān)新聞

STM32 CAN總線通信從原理到實(shí)踐:核心協(xié)議、驅(qū)動(dòng)實(shí)現(xiàn)與調(diào)試指南

STM32 CAN總線通信從原理到實(shí)踐:核心協(xié)議、驅(qū)動(dòng)實(shí)現(xiàn)與調(diào)試指南

1. 項(xiàng)目概述:從零開(kāi)始理解CAN通信最近在做一個(gè)車(chē)載設(shè)備相關(guān)的項(xiàng)目,不可避免地要和CAN總線打交道。說(shuō)實(shí)話,第一次接觸CAN(Controller Area Network,控制器局域網(wǎng))時(shí),看著那一堆縮寫(xiě)和協(xié)議幀格式&…

2026/7/29 7:46:08 閱讀更多
麥昆STEAM教育機(jī)器人:從硬件解析到編程進(jìn)階的完整學(xué)習(xí)路徑

麥昆STEAM教育機(jī)器人:從硬件解析到編程進(jìn)階的完整學(xué)習(xí)路徑

1. 從“玩具”到“伙伴”:麥昆STEAM成長(zhǎng)記的緣起如果你是一位關(guān)注青少年科技教育或創(chuàng)客文化的家長(zhǎng)、老師,或者你本身就是個(gè)對(duì)機(jī)器人、編程充滿好奇的大朋友,那么“麥昆”這個(gè)名字你大概率不會(huì)陌生。它可能不是那個(gè)動(dòng)畫(huà)片里的賽車(chē),…

2026/7/29 7:36:08 閱讀更多
Intel Edison開(kāi)發(fā)板WiFi連接全攻略:從connmanctl配置到物聯(lián)網(wǎng)應(yīng)用實(shí)戰(zhàn)

Intel Edison開(kāi)發(fā)板WiFi連接全攻略:從connmanctl配置到物聯(lián)網(wǎng)應(yīng)用實(shí)戰(zhàn)

1. 項(xiàng)目概述:為什么需要連接WiFi?如果你手頭有一塊Intel Edison開(kāi)發(fā)板,并且已經(jīng)用它點(diǎn)亮過(guò)LED,或者跑通了基礎(chǔ)的“Hello World”,那么下一步,你大概率會(huì)想讓它“上網(wǎng)”。讓Edison連接上WiFi,是把…

2026/7/29 7:36:08 閱讀更多
Pokémon Showdown企業(yè)級(jí)對(duì)戰(zhàn)平臺(tái):從零構(gòu)建可擴(kuò)展的寶可夢(mèng)對(duì)戰(zhàn)系統(tǒng)

Pokémon Showdown企業(yè)級(jí)對(duì)戰(zhàn)平臺(tái):從零構(gòu)建可擴(kuò)展的寶可夢(mèng)對(duì)戰(zhàn)系統(tǒng)

Pokmon Showdown企業(yè)級(jí)對(duì)戰(zhàn)平臺(tái):從零構(gòu)建可擴(kuò)展的寶可夢(mèng)對(duì)戰(zhàn)系統(tǒng) 【免費(fèi)下載鏈接】pokemon-showdown Pokmon battle simulator. 項(xiàng)目地址: https://gitcode.com/gh_mirrors/po/pokemon-showdown Pokmon Showdown是一個(gè)專業(yè)級(jí)的開(kāi)源寶可夢(mèng)對(duì)戰(zhàn)模擬平臺(tái)&#x…

2026/7/29 14:47:16 閱讀更多
物聯(lián)網(wǎng)設(shè)備低功耗設(shè)計(jì):NBM7100A與PIC32MX675F512L優(yōu)化方案

物聯(lián)網(wǎng)設(shè)備低功耗設(shè)計(jì):NBM7100A與PIC32MX675F512L優(yōu)化方案

1. 項(xiàng)目背景與核心挑戰(zhàn) 在物聯(lián)網(wǎng)設(shè)備和便攜式電子產(chǎn)品的設(shè)計(jì)中,初級(jí)電池(不可充電電池)的壽命優(yōu)化一直是個(gè)棘手問(wèn)題。我曾參與過(guò)一個(gè)野外氣象監(jiān)測(cè)項(xiàng)目,設(shè)備需要在不更換電池的情況下持續(xù)工作5年以上。當(dāng)時(shí)我們測(cè)試了市面上各種方案…

2026/7/29 14:47:16 閱讀更多
終于搞定文獻(xiàn)綜述難題?PaperxieAI智能梳理|拒絕湊字?jǐn)?shù)、輕松寫(xiě)出高分綜述[特殊字符]

終于搞定文獻(xiàn)綜述難題?PaperxieAI智能梳理|拒絕湊字?jǐn)?shù)、輕松寫(xiě)出高分綜述[特殊字符]

官方入口🌐:https://www.paperxie.cn 寫(xiě)畢業(yè)論文最折磨人的不是正文分析,而是怎么寫(xiě)都不合格的文獻(xiàn)綜述! 很多同學(xué)熬好幾天查閱幾十篇文獻(xiàn),最后寫(xiě)出來(lái)的內(nèi)容依舊被導(dǎo)師吐槽:太淺、太亂、沒(méi)有研究邏輯、看…

2026/7/29 14:47:16 閱讀更多
JavaScript思維導(dǎo)圖實(shí)戰(zhàn)指南:構(gòu)建高性能知識(shí)可視化應(yīng)用

JavaScript思維導(dǎo)圖實(shí)戰(zhàn)指南:構(gòu)建高性能知識(shí)可視化應(yīng)用

JavaScript思維導(dǎo)圖實(shí)戰(zhàn)指南:構(gòu)建高性能知識(shí)可視化應(yīng)用 【免費(fèi)下載鏈接】js-mindmap JavaScript Mindmap 項(xiàng)目地址: https://gitcode.com/gh_mirrors/js/js-mindmap 在當(dāng)今信息爆炸的時(shí)代,如何高效組織和可視化復(fù)雜信息成為技術(shù)決策者和開(kāi)發(fā)者面臨…

2026/7/29 14:37:16 閱讀更多
面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個(gè)月,我在重構(gòu) AlgoMooc 網(wǎng)站過(guò)程中,發(fā)現(xiàn)一個(gè)問(wèn)題:在 Claude Code 里把一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,結(jié)果可能比 1 個(gè) agent 從頭干到尾還慢? 大多數(shù)人的第一反應(yīng)是反過(guò)來(lái)的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多
# 鴻蒙 HarmonyOS 應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫(huà)渲染精講

# 鴻蒙 HarmonyOS 應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫(huà)渲染精講

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂(lè)應(yīng)用,模擬了真實(shí)擲骰子的過(guò)程。應(yīng)用投擲兩個(gè)骰子(六面標(biāo)準(zhǔn)骰),使用 Unicode 骰面符號(hào)直觀展示每個(gè)骰子的點(diǎn)數(shù),并伴有快速滾動(dòng)的動(dòng)畫(huà)效果?!?/p>

2026/7/29 0:15:24 閱讀更多