控網(wǎng)關(guān):Modbus、SNMP與MQTT協(xié)議轉(zhuǎn)換實(shí)戰(zhàn)指南)
1. 機(jī)房與工業(yè)現(xiàn)場(chǎng)的設(shè)備接入困境干過(guò)機(jī)房運(yùn)維或者工業(yè)自動(dòng)化集成的朋友大概率都經(jīng)歷過(guò)這種場(chǎng)面機(jī)柜里塞著不同年代、不同品牌的設(shè)備PLC用的是Modbus RTU空調(diào)監(jiān)控走的是SNMP電表可能又是Modbus TCP還有一堆傳感器輸出的是私有協(xié)議。你想把這些數(shù)據(jù)統(tǒng)一采集上來(lái)做集中監(jiān)控光是協(xié)議對(duì)接就能把人折騰到懷疑人生。這個(gè)項(xiàng)目的核心就是用一個(gè)智能監(jiān)控網(wǎng)關(guān)把這些亂七八糟的協(xié)議統(tǒng)一收口向下兼容Modbus RTU、Modbus TCP、SNMP等常見(jiàn)工業(yè)與機(jī)房協(xié)議向上通過(guò)MQTT把數(shù)據(jù)推送到監(jiān)控平臺(tái)。說(shuō)白了它扮演的是一個(gè)翻譯官快遞員的角色——把不同設(shè)備說(shuō)的方言翻譯成統(tǒng)一的普通話再打包送到你指定的地方。這篇文章適合三類人看一是機(jī)房運(yùn)維工程師手里管著一堆動(dòng)環(huán)設(shè)備想做集中監(jiān)控二是工業(yè)自動(dòng)化從業(yè)者需要把PLC、傳感器、數(shù)控機(jī)床的數(shù)據(jù)接進(jìn)上層系統(tǒng)三是物聯(lián)網(wǎng)方向的開(kāi)發(fā)者想搞清楚協(xié)議轉(zhuǎn)換網(wǎng)關(guān)到底是怎么工作的、怎么選、怎么調(diào)。我會(huì)從整體設(shè)計(jì)思路講到具體實(shí)操包括Modbus的線圈和寄存器怎么讀、MQTT的訂閱發(fā)布怎么配、SNMP的OID怎么找以及我在實(shí)際調(diào)試中踩過(guò)的那些坑。2. 整體設(shè)計(jì)思路與方案選型2.1 為什么需要一個(gè)協(xié)議轉(zhuǎn)換網(wǎng)關(guān)很多人第一反應(yīng)是我直接用一臺(tái)工控機(jī)跑個(gè)采集程序不就行了裝個(gè)Modbus Poll讀數(shù)據(jù)再寫(xiě)個(gè)腳本推到MQTT服務(wù)器理論上確實(shí)能跑通。但實(shí)際項(xiàng)目中這種方案的問(wèn)題很快會(huì)暴露出來(lái)。首先是穩(wěn)定性。工控機(jī)跑Windows系統(tǒng)動(dòng)不動(dòng)彈個(gè)更新、重啟一下采集就斷了。工業(yè)現(xiàn)場(chǎng)和機(jī)房環(huán)境對(duì)連續(xù)運(yùn)行的要求很高一次斷采可能導(dǎo)致告警漏報(bào)。其次是部署成本每個(gè)機(jī)房放一臺(tái)工控機(jī)硬件成本、功耗、占空間都是問(wèn)題。再就是協(xié)議適配的靈活性不同項(xiàng)目現(xiàn)場(chǎng)的設(shè)備協(xié)議組合千差萬(wàn)別用軟件方案每次都要重新配置和調(diào)試效率很低。智能監(jiān)控網(wǎng)關(guān)的思路是把這些能力固化到一個(gè)低功耗的嵌入式設(shè)備里。它向下提供多種物理接口RS485、RS232、以太網(wǎng)口內(nèi)置協(xié)議棧向上提供標(biāo)準(zhǔn)的MQTT/HTTP接口。你只需要在網(wǎng)關(guān)的配置界面上告訴它去讀哪個(gè)設(shè)備的哪個(gè)寄存器它就會(huì)自動(dòng)完成采集、轉(zhuǎn)換、上報(bào)的全流程。2.2 協(xié)議選型的邏輯向下采集側(cè)Modbus幾乎是繞不開(kāi)的。這個(gè)協(xié)議在工業(yè)領(lǐng)域的地位就像HTTP在互聯(lián)網(wǎng)領(lǐng)域的地位一樣雖然老但生態(tài)極其完善。Modbus RTU跑在RS485總線上適合連接電表、溫濕度傳感器、變頻器這類設(shè)備Modbus TCP跑在以太網(wǎng)上適合連接PLC、數(shù)控機(jī)床等較新的設(shè)備。兩者的數(shù)據(jù)模型是一樣的都是通過(guò)線圈Coil、離散輸入Discrete Input、保持寄存器Holding Register、輸入寄存器Input Register這四類地址空間來(lái)組織數(shù)據(jù)。SNMP則是機(jī)房動(dòng)環(huán)監(jiān)控的主力協(xié)議。UPS、精密空調(diào)、交換機(jī)這些設(shè)備基本都支持SNMP通過(guò)OID對(duì)象標(biāo)識(shí)符來(lái)讀取設(shè)備狀態(tài)。比如你想知道UPS的電池電壓就需要找到對(duì)應(yīng)的OID然后發(fā)起GET請(qǐng)求。向上推送側(cè)MQTT是目前物聯(lián)網(wǎng)領(lǐng)域最主流的消息協(xié)議。它的發(fā)布/訂閱模型非常適合監(jiān)控場(chǎng)景——網(wǎng)關(guān)作為發(fā)布者把數(shù)據(jù)推到Broker監(jiān)控平臺(tái)作為訂閱者接收數(shù)據(jù)。相比HTTP輪詢MQTT的實(shí)時(shí)性更好開(kāi)銷更小而且天然支持一對(duì)多分發(fā)。2.3 網(wǎng)關(guān)的核心架構(gòu)從功能模塊上拆一個(gè)智能監(jiān)控網(wǎng)關(guān)通常包含這幾層物理接口層RS485/RS232串口、以太網(wǎng)口負(fù)責(zé)和現(xiàn)場(chǎng)設(shè)備建立物理連接協(xié)議解析層Modbus RTU/TCP主站、SNMP客戶端、以及可能的其他協(xié)議棧數(shù)據(jù)映射層把采集到的原始數(shù)據(jù)按照配置映射成統(tǒng)一的JSON格式上報(bào)層MQTT客戶端負(fù)責(zé)連接Broker、發(fā)布消息、處理斷線重連配置管理層Web配置界面或配置文件讓用戶定義采集規(guī)則和上報(bào)規(guī)則這個(gè)架構(gòu)的關(guān)鍵設(shè)計(jì)原則是采集與上報(bào)解耦。采集側(cè)按照自己的節(jié)奏輪詢?cè)O(shè)備上報(bào)側(cè)按照配置的周期發(fā)布數(shù)據(jù)中間用一個(gè)數(shù)據(jù)緩沖區(qū)銜接。這樣即使MQTT Broker暫時(shí)不可達(dá)采集也不會(huì)中斷數(shù)據(jù)可以在緩沖區(qū)里暫存等連接恢復(fù)后再補(bǔ)發(fā)。3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)3.1 Modbus數(shù)據(jù)模型線圈和寄存器到底怎么區(qū)分這是很多新手最容易搞混的地方。Modbus定義了四種數(shù)據(jù)類型每種對(duì)應(yīng)不同的地址空間和功能碼數(shù)據(jù)類型地址范圍功能碼讀讀寫(xiě)權(quán)限典型用途線圈 Coil00001-0999901讀寫(xiě)開(kāi)關(guān)量輸出如繼電器控制離散輸入 Discrete Input10001-1999902只讀開(kāi)關(guān)量輸入如門(mén)磁狀態(tài)輸入寄存器 Input Register30001-3999904只讀模擬量輸入如溫度值保持寄存器 Holding Register40001-4999903讀寫(xiě)參數(shù)設(shè)定值、運(yùn)行數(shù)據(jù)實(shí)際配置網(wǎng)關(guān)的時(shí)候你拿到的設(shè)備手冊(cè)上寫(xiě)的可能是寄存器地址40001也可能是寄存器地址0功能碼03。這兩種表述指的是同一個(gè)東西只是偏移量不同。40001對(duì)應(yīng)的實(shí)際協(xié)議地址是040002對(duì)應(yīng)1以此類推。有些設(shè)備手冊(cè)直接用協(xié)議地址從0開(kāi)始有些用Modbus標(biāo)準(zhǔn)地址從1開(kāi)始配置時(shí)一定要確認(rèn)清楚否則會(huì)讀錯(cuò)地址。注意Modbus協(xié)議本身對(duì)地址的描述是從0開(kāi)始的但很多設(shè)備廠商在手冊(cè)里用的是從1開(kāi)始的編號(hào)。這個(gè)差1的問(wèn)題是我見(jiàn)過(guò)最多的配置錯(cuò)誤來(lái)源。3.2 Modbus RTU與TCP的關(guān)鍵差異雖然數(shù)據(jù)模型一樣但RTU和TCP在報(bào)文結(jié)構(gòu)上差別很大調(diào)試時(shí)需要注意Modbus RTU的報(bào)文格式是從站地址1字節(jié) 功能碼1字節(jié) 數(shù)據(jù)N字節(jié) CRC校驗(yàn)2字節(jié)。它跑在串口上需要配置波特率、數(shù)據(jù)位、停止位、校驗(yàn)位這些串口參數(shù)。常見(jiàn)的配置是9600/8/N/1或19200/8/E/1具體要看設(shè)備手冊(cè)。Modbus TCP的報(bào)文格式是事務(wù)標(biāo)識(shí)符2字節(jié) 協(xié)議標(biāo)識(shí)符2字節(jié) 長(zhǎng)度2字節(jié) 單元標(biāo)識(shí)符1字節(jié) 功能碼1字節(jié) 數(shù)據(jù)N字節(jié)。它跑在以太網(wǎng)上默認(rèn)端口502。因?yàn)闆](méi)有CRC校驗(yàn)由TCP層保證可靠性所以報(bào)文結(jié)構(gòu)更簡(jiǎn)單。調(diào)試工具方面Modbus Poll是Windows下最常用的Modbus主站模擬工具可以快速驗(yàn)證設(shè)備是否正常響應(yīng)。Linux下可以用mbpoll或者pymodbus庫(kù)來(lái)測(cè)試。我個(gè)人的習(xí)慣是先用Modbus Poll確認(rèn)設(shè)備能正常讀取再去配置網(wǎng)關(guān)這樣可以把問(wèn)題范圍縮小。3.3 SNMP的OID查找與配置SNMP的核心概念是OID它是一棵樹(shù)狀結(jié)構(gòu)每個(gè)節(jié)點(diǎn)用數(shù)字表示。比如1.3.6.1.2.1.1.1.0表示系統(tǒng)描述1.3.6.1.2.1.1.3.0表示系統(tǒng)運(yùn)行時(shí)間。配置網(wǎng)關(guān)采集SNMP數(shù)據(jù)時(shí)你需要知道三樣?xùn)|西設(shè)備的IP地址、SNMP團(tuán)體名Community String類似密碼、以及你要讀取的OID。團(tuán)體名常見(jiàn)的是public只讀和private讀寫(xiě)但出于安全考慮很多設(shè)備會(huì)改成自定義的值。查找OID的方法有幾種一是查設(shè)備手冊(cè)廠商通常會(huì)提供MIB文件二是用SNMP Walk工具遍歷設(shè)備支持的OID樹(shù)比如用snmpwalk -v 2c -c public 192.168.1.1命令三是用MIB Browser這類圖形化工具加載MIB文件后可以直觀地瀏覽。實(shí)操心得SNMP Walk出來(lái)的結(jié)果可能非常長(zhǎng)建議先Walk系統(tǒng)組1.3.6.1.2.1.1確認(rèn)基本連通性再針對(duì)性地Walk你關(guān)心的OID分支。另外SNMP v2c的團(tuán)體名是明文傳輸?shù)娜绻O(shè)備支持v3建議用v3的認(rèn)證加密模式。3.4 MQTT主題設(shè)計(jì)與QoS選擇MQTT的主題設(shè)計(jì)直接影響后續(xù)監(jiān)控平臺(tái)的訂閱邏輯。一個(gè)好的主題結(jié)構(gòu)應(yīng)該具備層次清晰、可擴(kuò)展的特點(diǎn)。比如gateway/{網(wǎng)關(guān)ID}/device/{設(shè)備ID}/data gateway/{網(wǎng)關(guān)ID}/device/{設(shè)備ID}/status gateway/{網(wǎng)關(guān)ID}/alarm這種設(shè)計(jì)的優(yōu)勢(shì)是監(jiān)控平臺(tái)可以用通配符訂閱比如gateway//device//data可以訂閱所有網(wǎng)關(guān)下所有設(shè)備的數(shù)據(jù)gateway/GW001/#可以訂閱特定網(wǎng)關(guān)的所有消息。QoS服務(wù)質(zhì)量等級(jí)的選擇需要權(quán)衡可靠性和開(kāi)銷QoS 0最多一次發(fā)了就不管可能丟消息。適合高頻、可容忍丟包的場(chǎng)景QoS 1至少一次保證送達(dá)但可能重復(fù)。適合大多數(shù)監(jiān)控?cái)?shù)據(jù)上報(bào)QoS 2恰好一次保證不丟不重但開(kāi)銷最大。適合計(jì)費(fèi)、告警等關(guān)鍵數(shù)據(jù)實(shí)際項(xiàng)目中數(shù)據(jù)采集上報(bào)用QoS 1就足夠了告警消息可以用QoS 2。另外要注意MQTT的保留消息Retained Message功能它可以讓新訂閱者立即收到最后一次發(fā)布的消息適合用來(lái)發(fā)布設(shè)備狀態(tài)。4. 實(shí)操過(guò)程與核心環(huán)節(jié)實(shí)現(xiàn)4.1 硬件接線與網(wǎng)絡(luò)配置以RS485設(shè)備為例接線時(shí)需要注意A接A、B接B不要接反。RS485總線是菊花鏈拓?fù)渌性O(shè)備并聯(lián)在同一對(duì)雙絞線上最遠(yuǎn)通信距離1200米波特率9600時(shí)??偩€兩端需要接120歐姆的終端電阻短距離幾十米內(nèi)可以不接但長(zhǎng)距離或高波特率下必須接否則信號(hào)反射會(huì)導(dǎo)致通信不穩(wěn)定。網(wǎng)關(guān)的以太網(wǎng)口通常配置一個(gè)靜態(tài)IP方便管理。假設(shè)網(wǎng)關(guān)IP設(shè)為192.168.1.100你需要確保它和SNMP設(shè)備、MQTT Broker在同一網(wǎng)絡(luò)或路由可達(dá)。4.2 Modbus采集規(guī)則配置在網(wǎng)關(guān)的配置界面上你需要為每個(gè)從站設(shè)備創(chuàng)建一條采集規(guī)則。以讀取一個(gè)溫濕度傳感器為例假設(shè)從站地址1波特率96008數(shù)據(jù)位無(wú)校驗(yàn)1停止位溫度值輸入寄存器地址0對(duì)應(yīng)300012字節(jié)有符號(hào)整數(shù)實(shí)際值需除以10濕度值輸入寄存器地址1對(duì)應(yīng)300022字節(jié)有符號(hào)整數(shù)實(shí)際值需除以10配置時(shí)你需要指定功能碼04讀輸入寄存器起始地址0讀取數(shù)量2。然后在數(shù)據(jù)映射里定義第1個(gè)寄存器是溫度縮放系數(shù)0.1第2個(gè)寄存器是濕度縮放系數(shù)0.1。如果設(shè)備用的是保持寄存器功能碼03配置方式類似只是功能碼不同。有些設(shè)備的數(shù)據(jù)是32位浮點(diǎn)數(shù)占用兩個(gè)連續(xù)的寄存器這時(shí)候需要指定數(shù)據(jù)類型為float32并注意字節(jié)序大端或小端。字節(jié)序搞錯(cuò)的話讀出來(lái)的值會(huì)是一個(gè)完全不著邊際的數(shù)字。4.3 SNMP采集配置假設(shè)你要監(jiān)控一臺(tái)UPS已知IP地址192.168.1.50團(tuán)體名public電池電壓OID1.3.6.1.2.1.33.1.2.5.0輸出負(fù)載OID1.3.6.1.2.1.33.1.4.4.1.5.1在網(wǎng)關(guān)上添加SNMP采集規(guī)則填入IP和團(tuán)體名然后逐條添加OID。采集周期建議設(shè)為30秒到60秒SNMP設(shè)備通常不需要太高的采集頻率。4.4 MQTT上報(bào)配置MQTT配置需要填寫(xiě)B(tài)roker地址、端口、客戶端ID、用戶名密碼如果有、以及主題模板。以連接一個(gè)本地部署的MQTT Broker為例{ broker: 192.168.1.200, port: 1883, clientId: gateway_GW001, username: monitor, password: your_password, keepAlive: 60, cleanSession: true, topicTemplate: gateway/GW001/device/{deviceId}/data, qos: 1, reportInterval: 10 }上報(bào)的數(shù)據(jù)格式通常是可以自定義的常見(jiàn)的是JSON{ gatewayId: GW001, deviceId: TH_SENSOR_01, timestamp: 1718000000, data: { temperature: 25.3, humidity: 62.1 } }4.5 聯(lián)調(diào)驗(yàn)證步驟配置完成后按這個(gè)順序驗(yàn)證物理層驗(yàn)證確認(rèn)串口接線正確用Modbus Poll直接連接設(shè)備能讀到數(shù)據(jù)網(wǎng)關(guān)采集驗(yàn)證在網(wǎng)關(guān)的調(diào)試界面上查看采集狀態(tài)確認(rèn)能讀到正確的值MQTT連接驗(yàn)證用MQTT客戶端如MQTTX、mosquitto_sub訂閱對(duì)應(yīng)主題確認(rèn)能收到消息數(shù)據(jù)準(zhǔn)確性驗(yàn)證對(duì)比網(wǎng)關(guān)讀到的值和設(shè)備實(shí)際值確認(rèn)縮放系數(shù)、字節(jié)序都正確穩(wěn)定性驗(yàn)證讓系統(tǒng)連續(xù)跑24小時(shí)觀察是否有斷采、重連、數(shù)據(jù)異常等情況5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 Modbus通信失敗排查現(xiàn)象可能原因排查方法完全無(wú)響應(yīng)接線錯(cuò)誤、串口參數(shù)不匹配檢查A/B線是否接反確認(rèn)波特率/校驗(yàn)位偶爾超時(shí)總線干擾、終端電阻缺失加終端電阻檢查屏蔽線接地讀到的值不對(duì)地址偏移錯(cuò)誤、數(shù)據(jù)類型錯(cuò)誤確認(rèn)地址是從0還是從1開(kāi)始確認(rèn)數(shù)據(jù)類型CRC校驗(yàn)錯(cuò)誤波特率偏差、線路質(zhì)量差降低波特率測(cè)試檢查線纜質(zhì)量多設(shè)備沖突從站地址重復(fù)確認(rèn)每個(gè)設(shè)備地址唯一5.2 MQTT連接問(wèn)題排查MQTT連不上的原因通常比較明確Broker地址或端口填錯(cuò)、用戶名密碼不對(duì)、客戶端ID沖突、網(wǎng)絡(luò)不通。我遇到過(guò)最隱蔽的一個(gè)問(wèn)題是客戶端ID重復(fù)——兩個(gè)網(wǎng)關(guān)用了同一個(gè)客戶端ID導(dǎo)致它們互相踢下線表現(xiàn)就是連接時(shí)斷時(shí)續(xù)。排查時(shí)先用mosquitto_sub命令行工具測(cè)試基本連通性再檢查網(wǎng)關(guān)的配置。另一個(gè)常見(jiàn)問(wèn)題是主題權(quán)限。有些MQTT Broker配置了ACL訪問(wèn)控制列表限制了哪些用戶能發(fā)布/訂閱哪些主題。如果網(wǎng)關(guān)發(fā)布的主題不在允許范圍內(nèi)消息會(huì)被靜默丟棄表現(xiàn)就是連接正常但收不到數(shù)據(jù)。5.3 SNMP采集超時(shí)處理SNMP采集超時(shí)通常是這幾個(gè)原因團(tuán)體名錯(cuò)誤、OID不存在、設(shè)備SNMP服務(wù)未開(kāi)啟、網(wǎng)絡(luò)ACL攔截了UDP 161端口。排查時(shí)先用snmpget命令直接測(cè)試snmpget -v 2c -c public 192.168.1.50 1.3.6.1.2.1.1.1.0如果這條命令能返回結(jié)果說(shuō)明SNMP基本配置沒(méi)問(wèn)題問(wèn)題出在網(wǎng)關(guān)側(cè)。如果返回超時(shí)就檢查網(wǎng)絡(luò)和設(shè)備配置。5.4 數(shù)據(jù)上報(bào)頻率與性能平衡采集頻率和上報(bào)頻率不是越高越好。Modbus RTU在9600波特率下一次讀取2個(gè)寄存器的請(qǐng)求-響應(yīng)大約需要50-100毫秒。如果你掛了10個(gè)從站輪詢一圈就需要1秒左右。如果采集周期設(shè)得太短比如100毫秒會(huì)導(dǎo)致請(qǐng)求堆積反而容易出現(xiàn)超時(shí)。我的經(jīng)驗(yàn)值是Modbus RTU設(shè)備的采集周期不低于1秒Modbus TCP可以到500毫秒SNMP不低于30秒。上報(bào)周期可以和采集周期一致也可以做數(shù)據(jù)聚合后降低上報(bào)頻率。避坑技巧如果某個(gè)從站設(shè)備響應(yīng)特別慢不要因?yàn)樗下麄€(gè)輪詢周期。可以在網(wǎng)關(guān)配置里給每個(gè)從站設(shè)置獨(dú)立的超時(shí)時(shí)間和重試次數(shù)超時(shí)的從站跳過(guò)下一輪再試。6. 協(xié)議網(wǎng)關(guān)的擴(kuò)展與進(jìn)階玩法6.1 邊緣計(jì)算在網(wǎng)關(guān)上做數(shù)據(jù)預(yù)處理基礎(chǔ)的協(xié)議轉(zhuǎn)換只是把數(shù)據(jù)搬來(lái)搬去但很多場(chǎng)景下你需要在網(wǎng)關(guān)側(cè)做一些預(yù)處理。比如死區(qū)過(guò)濾溫度變化小于0.5度時(shí)不上報(bào)減少無(wú)效數(shù)據(jù)閾值告警本地判斷是否超過(guò)閾值只有告警時(shí)才發(fā)布MQTT消息數(shù)據(jù)聚合把1分鐘內(nèi)采集的多個(gè)值求平均后再上報(bào)這些邏輯在網(wǎng)關(guān)的腳本引擎或規(guī)則引擎里配置可以大幅降低上行帶寬和云端處理壓力。6.2 多協(xié)議混合組網(wǎng)實(shí)際項(xiàng)目中一個(gè)網(wǎng)關(guān)往往需要同時(shí)處理多種協(xié)議。比如一個(gè)機(jī)房場(chǎng)景Modbus RTU接電表和溫濕度傳感器SNMP接UPS和空調(diào)Modbus TCP接智能PDU。網(wǎng)關(guān)需要同時(shí)運(yùn)行多個(gè)協(xié)議棧并且把采集到的數(shù)據(jù)統(tǒng)一映射到同一個(gè)數(shù)據(jù)模型里。配置時(shí)的關(guān)鍵是設(shè)備命名規(guī)范。建議用協(xié)議類型_位置_設(shè)備類型_編號(hào)的格式比如MB_RM01_TH_01表示Modbus協(xié)議、01機(jī)房、溫濕度、01號(hào)設(shè)備。這樣在MQTT主題和數(shù)據(jù)平臺(tái)上都能一目了然。6.3 與上層平臺(tái)的對(duì)接網(wǎng)關(guān)通過(guò)MQTT上報(bào)數(shù)據(jù)后上層平臺(tái)通常需要做幾件事數(shù)據(jù)存儲(chǔ)時(shí)序數(shù)據(jù)庫(kù)如InfluxDB、可視化Grafana、告警規(guī)則引擎。如果平臺(tái)支持MQTT直接接入那網(wǎng)關(guān)配置好主題就行。如果平臺(tái)只支持HTTP API可以在中間加一個(gè)橋接服務(wù)訂閱MQTT消息后轉(zhuǎn)發(fā)到HTTP接口。有些場(chǎng)景還需要反向控制比如通過(guò)MQTT下發(fā)指令去寫(xiě)Modbus線圈。這時(shí)候主題設(shè)計(jì)要區(qū)分上行和下行g(shù)ateway/GW001/device/{deviceId}/data # 上行數(shù)據(jù) gateway/GW001/device/{deviceId}/cmd # 下行指令 gateway/GW001/device/{deviceId}/cmdResp # 指令響應(yīng)網(wǎng)關(guān)訂閱cmd主題收到指令后執(zhí)行Modbus寫(xiě)操作然后把結(jié)果發(fā)布到cmdResp主題。7. 選型與部署的幾點(diǎn)個(gè)人建議關(guān)于網(wǎng)關(guān)的選型我踩過(guò)最大的坑是只看協(xié)議支持列表忽略了并發(fā)能力。有些網(wǎng)關(guān)標(biāo)稱支持Modbus、SNMP、MQTT但實(shí)際跑起來(lái)發(fā)現(xiàn)串口輪詢和網(wǎng)絡(luò)采集互相搶資源數(shù)據(jù)延遲很大。選型時(shí)要關(guān)注幾個(gè)硬指標(biāo)串口數(shù)量、CPU主頻、內(nèi)存大小、最大支持從站數(shù)、MQTT最大連接數(shù)。部署方面網(wǎng)關(guān)的供電要穩(wěn)定最好接UPS。工業(yè)現(xiàn)場(chǎng)電壓波動(dòng)大網(wǎng)關(guān)雖然功耗低但掉電重啟會(huì)導(dǎo)致采集中斷。另外網(wǎng)關(guān)的固件版本要記錄清楚不同版本的功能和Bug差異可能很大出問(wèn)題時(shí)方便回溯。最后說(shuō)一個(gè)實(shí)際經(jīng)驗(yàn)配置一定要備份。網(wǎng)關(guān)的配置文件導(dǎo)出一份存好設(shè)備更換或固件升級(jí)后可以直接導(dǎo)入省去重新配置的麻煩。我見(jiàn)過(guò)太多因?yàn)闆](méi)備份配置換了個(gè)網(wǎng)關(guān)后花半天重新配的案例。