單芯片解決方案,開啟全新體驗(yàn)——W55MH32 高性能以太網(wǎng)單片機(jī)
W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機(jī),它為用戶帶來(lái)前所未有的集成化體驗(yàn)。這顆芯片將強(qiáng)大的組件集于一身,具體來(lái)說(shuō),一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達(dá)216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲(chǔ)與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨(dú)立的32KB以太網(wǎng)收發(fā)緩存,可供8個(gè)獨(dú)立硬件socket使用。如此配置,真正實(shí)現(xiàn)了All-in-One解決方案,為開發(fā)者提供極大便利。
在封裝規(guī)格上,W55MH32提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復(fù)雜工控場(chǎng)景設(shè)計(jì)。它擁有66個(gè)GPIO、3個(gè)ADC、12通道DMA、17個(gè)定時(shí)器、2個(gè)I2C、5個(gè)串口、2個(gè)SPI接口(其中1個(gè)帶I2S接口復(fù)用)、1個(gè)CAN、1個(gè)USB2.0以及1個(gè)SDIO接口。如此豐富的外設(shè)資源,能夠輕松應(yīng)對(duì)工業(yè)控制中多樣化的連接需求,無(wú)論是與各類傳感器、執(zhí)行器的通信,還是對(duì)復(fù)雜工業(yè)協(xié)議的支持,都能游刃有余,成為復(fù)雜工控領(lǐng)域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網(wǎng)關(guān)模組等場(chǎng)景,軟件使用方法一致。更多信息和資料請(qǐng)進(jìn)入http://www.w5500.com/網(wǎng)站或者私信獲取。
此外,本W(wǎng)55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應(yīng)用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網(wǎng)絡(luò)通信安全再添保障。
為助力開發(fā)者快速上手與深入開發(fā),基于W55MH32L這顆芯片,WIZnet精心打造了配套開發(fā)板。開發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線,就能輕松實(shí)現(xiàn)調(diào)試、下載以及串口打印日志等功能。開發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開發(fā)者全面評(píng)估芯片性能。
若您想獲取芯片和開發(fā)板的更多詳細(xì)信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價(jià)格等,歡迎訪問(wèn)官方網(wǎng)頁(yè):http://www.w5500.com/,我們期待與您共同探索W55MH32的無(wú)限可能。
第十五章 W55MH32 SNMP示例
本篇文章,我們將詳細(xì)介紹如何在W55MH32芯片上面實(shí)現(xiàn)SNMP功能。并通過(guò)實(shí)戰(zhàn)例程,為大家講解如何使用MIB Browser管理W55MH32。
該例程用到的其他網(wǎng)絡(luò)協(xié)議,例如DHCP,請(qǐng)參考相關(guān)章節(jié)。有關(guān)W55MH32的初始化過(guò)程,請(qǐng)參考NetworkInstall章節(jié),這里將不再贅述。
1 SNMP協(xié)議簡(jiǎn)介
SNMP(Simple Network Management Protocol,簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議)是一種用于管理和監(jiān)控網(wǎng)絡(luò)設(shè)備的協(xié)議。它是應(yīng)用層協(xié)議,廣泛應(yīng)用于網(wǎng)絡(luò)設(shè)備(如路由器、交換機(jī)、服務(wù)器、打印機(jī)等)的管理和監(jiān)控。SNMP提供了機(jī)制以便網(wǎng)絡(luò)管理員可以監(jiān)控網(wǎng)絡(luò)性能、發(fā)現(xiàn)網(wǎng)絡(luò)問(wèn)題,并對(duì)設(shè)備進(jìn)行管理。
2 SNMP協(xié)議特點(diǎn)
簡(jiǎn)單性:設(shè)計(jì)輕量,便于實(shí)現(xiàn)和部署。
互操作性:提供標(biāo)準(zhǔn)化的設(shè)備管理方式,不同廠商的設(shè)備可以通過(guò)SNMP實(shí)現(xiàn)互通。
跨平臺(tái)支持:SNMP是一種開放的標(biāo)準(zhǔn)協(xié)議,被廣泛應(yīng)用于各種網(wǎng)絡(luò)設(shè)備和操作系統(tǒng)。
實(shí)時(shí)監(jiān)控:支持快速的數(shù)據(jù)采集和報(bào)警機(jī)制。
擴(kuò)展性:通過(guò)MIB支持不同設(shè)備的特定功能。
資源效率:協(xié)議設(shè)計(jì)輕量,適合低帶寬和高延遲的網(wǎng)絡(luò)環(huán)境。
3應(yīng)用場(chǎng)景
接下來(lái),我們了解下在W55MH32上,可以使用SNMP協(xié)議完成哪些操作及應(yīng)用呢?
故障報(bào)警和日志管理:設(shè)備在檢測(cè)到異?;蚬收蠒r(shí),可以通過(guò) SNMP TRAP將報(bào)警信息發(fā)送到網(wǎng)絡(luò)管理系統(tǒng)。
工業(yè)自動(dòng)化和環(huán)境監(jiān)控:在工業(yè)自動(dòng)化和環(huán)境監(jiān)控中,W55MH32可通過(guò) SNMP匯報(bào)傳感器數(shù)據(jù)。
數(shù)據(jù)中心和機(jī)房管理:用于數(shù)據(jù)中心和機(jī)房中監(jiān)控服務(wù)器、交換機(jī)及其他網(wǎng)絡(luò)設(shè)備的狀態(tài)。
4使用MIB Browser管理W55MH32流程
下載并安裝MIB Browser(鏈接:https://www.ireasoning.com/download/mibfree/setup.exe)
創(chuàng)建分支
打開安裝目錄下 mibs文件夾,找到 RFC1213-MIB文件,右鍵使用記事本打開,上方路徑欄可以尋找路徑。
在snmp后添加一個(gè)新分支,命名為User
添加葉子節(jié)點(diǎn)(功能)
在分支后方繼續(xù)添加功能代碼
葉子節(jié)點(diǎn)格式如下:
setLED OBJECT-TYPE 添加一個(gè)新葉子節(jié)點(diǎn),命名為 setLED
SYNTAX INTEGER { enabled(1),disabled(0) }設(shè)置數(shù)據(jù)類型
ACCESS read-write設(shè)置讀寫權(quán)限
DESCRIPTION 注釋
::= { User 1 }葉子所在分支,與葉子編號(hào)
添加完畢后保存并退出
添加完成后,MIB Browser軟件如下所示:
代碼適配功能
測(cè)試
5 SNMP架構(gòu)組成
SNMP架構(gòu)包括以下三個(gè)主要部分:
管理站(Manager):運(yùn)行SNMP管理軟件,用于發(fā)送請(qǐng)求和接收設(shè)備信息。通過(guò)命令操作網(wǎng)絡(luò)設(shè)備,執(zhí)行配置或監(jiān)控任務(wù)。
代理(Agent):安裝在受管理設(shè)備上的軟件,負(fù)責(zé)將設(shè)備的狀態(tài)信息存儲(chǔ)在MIB中,并響應(yīng)來(lái)自管理站的查詢。能動(dòng)地發(fā)送陷阱(Trap)以報(bào)告事件。
管理信息庫(kù)(MIB):定義設(shè)備的可管理參數(shù)及其數(shù)據(jù)結(jié)構(gòu)MIB通常以樹狀結(jié)構(gòu)組織,每個(gè)節(jié)點(diǎn)代表一個(gè)管理對(duì)象,具有唯一的對(duì)象標(biāo)識(shí)符(OID)。
協(xié)議(SNMP協(xié)議本身):負(fù)責(zé)管理站和代理之間的通信,支持基本操作如獲取、設(shè)置和通知。
6 OID詳解
簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議(SNMP)的OID(對(duì)象標(biāo)識(shí)符)是一個(gè)用于唯一標(biāo)識(shí)網(wǎng)絡(luò)設(shè)備上管理信息庫(kù)(MIB)中對(duì)象的標(biāo)識(shí)符。OID是一種分層的命名方案,允許管理員查詢和設(shè)置網(wǎng)絡(luò)設(shè)備上的各種參數(shù)。
下面是OID的詳解:
OID結(jié)構(gòu)
OID由一系列整數(shù)組成,這些整數(shù)通過(guò)點(diǎn)號(hào)(.)分隔,形成了一個(gè)層次結(jié)構(gòu)。例如:
1.3.6.1.2.1.1.1.0
在這個(gè)結(jié)構(gòu)中,每個(gè)數(shù)字都代表一個(gè)組織或節(jié)點(diǎn)在層次結(jié)構(gòu)中的位置。
OID層次解釋
1:表示ISO(國(guó)際標(biāo)準(zhǔn)化組織)
3:表示org(組織)
6:指定IETF(互聯(lián)網(wǎng)工程任務(wù)組)作為組織
1:表示IETF管理的MIB(管理信息庫(kù))
后續(xù)的數(shù)字則進(jìn)一步定義了特定的MIB模塊、對(duì)象類型、實(shí)例等信息。
常見的OID前綴
1.3.6.1.2.1:這是最常用的OID前綴,通常簡(jiǎn)寫為.iso.org.dod.internet.mgmt.mib-2,它指的是IETF定義的MIB-2。
具體OID示例
1.3.6.1.2.1.1.1.0:這是sysDescr的OID,用于獲取系統(tǒng)描述。
1.3.6.1.2.1.1.2.0:這是sysObjectID的OID,用于獲取系統(tǒng)對(duì)象標(biāo)識(shí)符。
1.3.6.1.2.1.1.3.0:這是sysUpTime的OID,用于獲取系統(tǒng)正常運(yùn)行時(shí)間。
如何使用OID
查詢:使用SNMPGET請(qǐng)求,可以查詢特定OID的值。
設(shè)置:使用SNMPSET請(qǐng)求,可以修改特定OID的值(需要設(shè)備支持)。
遍歷:使用SNMPWALK請(qǐng)求,可以遍歷一個(gè)OID下的所有子節(jié)點(diǎn)。
注意事項(xiàng)
OID的具體值和結(jié)構(gòu)可能會(huì)隨著網(wǎng)絡(luò)設(shè)備的不同而有所不同。在使用OID之前,最好查閱相應(yīng)設(shè)備的MIB文檔,以了解其支持的具體OID及其功能。OID是SNMP管理中不可或缺的部分,通過(guò)OID,網(wǎng)絡(luò)管理員可以進(jìn)行監(jiān)控網(wǎng)絡(luò)狀態(tài)、配置網(wǎng)絡(luò)設(shè)備、接收警報(bào)通知等操作。理解和掌握OID對(duì)于網(wǎng)絡(luò)管理和故障排除非常重要。
7 SNMP報(bào)文格式
SNMP報(bào)文基于ASN.1(Abstract Syntax Notation One)編碼規(guī)則,通常使用BER(Basic Encoding Rules)進(jìn)行傳輸。以下是SNMP報(bào)文的基本格式和關(guān)鍵字段,本例程中使用的是SNMPv1版本,以下對(duì)SNMPv1進(jìn)行講解,而對(duì)于其他版本的報(bào)文格式,由于篇幅有限,這里將不再進(jìn)行講解,感興趣的朋友可自行查閱資料進(jìn)行學(xué)習(xí)。
SNMP報(bào)文結(jié)構(gòu)
字段名稱 | 類型 | 描述 |
Message | 序列(Sequence) | 整個(gè) SNMP消息的容器,包含以下字段。 |
Version | 整數(shù)(Integer) | SNMP協(xié)議版本號(hào),0表示 SNMPv1。 |
Community | 字符串(Octet String) | 社區(qū)字符串,用于身份驗(yàn)證,如 public或 private。 |
PDU類型 | 標(biāo)記(Tag, Context-Specific) | 表示操作類型,如:GET(0xA0)、GET-NEXT(0xA1)、SET(0xA3)、TRAP(0xA4)。 |
Request ID | 整數(shù)(Integer) | 請(qǐng)求的唯一標(biāo)識(shí),用于匹配請(qǐng)求和響應(yīng)。 |
Error Status | 整數(shù)(Integer) | 錯(cuò)誤狀態(tài),取值范圍為:0(noError)、1(tooBig)、2(noSuchName)等。 |
Error Index | 整數(shù)(Integer) | 錯(cuò)誤索引,指示變量綁定列表中出錯(cuò)的變量位置(從 1開始計(jì)數(shù))。 |
Variable Bindings | 序列(Sequence of VarBinds) | 變量綁定列表,每個(gè)綁定包含一個(gè) OID和對(duì)應(yīng)的值。 |
- OID | 對(duì)象標(biāo)識(shí)符(OID) | 被管理對(duì)象的標(biāo)識(shí)符,如 1.3.6.1.2.1.1.1.0表示系統(tǒng)描述(sysDescr)。 |
- Value | 可變類型(Null, Integer, String等) | OID對(duì)應(yīng)的值,可能為空值(GET請(qǐng)求)或具體數(shù)據(jù)(響應(yīng)或 SET請(qǐng)求)。 |
報(bào)文字段詳解
1. Message(消息整體)
這是 SNMP消息的最外層結(jié)構(gòu),是一個(gè)序列(Sequence),包含以下三個(gè)部分:
Version(版本號(hào))
此字段定義 SNMP協(xié)議的版本號(hào),用一個(gè)整數(shù)表示:
0表示 SNMPv1。
1表示 SNMPv2c。
3表示 SNMPv3。
該字段是解析報(bào)文的基礎(chǔ),不同版本的報(bào)文格式存在差異。
Community(社區(qū)字符串)
社區(qū)字符串是 SNMPv1和 SNMPv2c的一種簡(jiǎn)單身份驗(yàn)證機(jī)制,用于限制對(duì)管理對(duì)象的訪問(wèn)權(quán)限。它是一個(gè)字符串(Octet String),常見的值包括:
public:表示只讀訪問(wèn)權(quán)限。
private:表示讀寫訪問(wèn)權(quán)限。
PDU(協(xié)議數(shù)據(jù)單元)類型
PDU定義了操作類型,通過(guò)一個(gè)標(biāo)記值(Tag, Context-Specific)來(lái)區(qū)分:
0xA0:GET請(qǐng)求,用于獲取管理對(duì)象的值。
0xA1:GET-NEXT請(qǐng)求,用于獲取下一個(gè)對(duì)象的值。
0xA3:SET請(qǐng)求,用于設(shè)置管理對(duì)象的值。
0xA4:TRAP,用于代理向管理站報(bào)告事件。
2. Request ID(請(qǐng)求 ID)
請(qǐng)求 ID是一個(gè)整數(shù),用于唯一標(biāo)識(shí)一個(gè)請(qǐng)求。它由發(fā)起方生成,并在響應(yīng)中攜帶相同的 ID。通過(guò)此字段,接收方可以將響應(yīng)與對(duì)應(yīng)的請(qǐng)求進(jìn)行匹配。如果響應(yīng)中的請(qǐng)求 ID不一致,則表明響應(yīng)與請(qǐng)求無(wú)關(guān)。
3. Error Status(錯(cuò)誤狀態(tài))
此字段用整數(shù)表示請(qǐng)求的執(zhí)行狀態(tài):
0:noError,表示請(qǐng)求執(zhí)行成功,沒(méi)有錯(cuò)誤。
1:tooBig,請(qǐng)求的響應(yīng)數(shù)據(jù)超出接收方的最大允許大小。
2:noSuchName,請(qǐng)求中指定的 OID不存在。
3:badValue,請(qǐng)求中的值非法或不支持。
4:readOnly,請(qǐng)求試圖修改只讀對(duì)象。
5:genErr,發(fā)生了通用錯(cuò)誤,具體原因未明確。
4. Error Index(錯(cuò)誤索引)
如果 Error Status的值不為 0,此字段指示變量綁定列表中出錯(cuò)的變量位置(從 1開始計(jì)數(shù))。如果沒(méi)有錯(cuò)誤,此字段的值為 0。
5. Variable Bindings(變量綁定列表)
變量綁定列表是 SNMP報(bào)文的核心部分,包含一個(gè)或多個(gè)變量綁定(VarBind)。每個(gè)變量綁定由以下兩部分組成:
OID(對(duì)象標(biāo)識(shí)符)
OID是管理對(duì)象的唯一標(biāo)識(shí)符,用點(diǎn)分十進(jìn)制表示。例如:
1.3.6.1.2.1.1.1.0:表示 sysDescr,系統(tǒng)描述。
1.3.6.1.2.1.1.5.0:表示 sysName,系統(tǒng)名稱。
Value(值)
OID的值根據(jù)請(qǐng)求類型不同可能為以下幾種:
在 GET請(qǐng)求中,值通常為空(Null)。
在 GET-RESPONSE報(bào)文中,值為具體數(shù)據(jù),例如整型(Integer32)、字符串(Octet String)等。
在 SET請(qǐng)求中,值是要設(shè)置的新值。
SNMP報(bào)文解析
MIB Browser向W55MH32發(fā)送LED設(shè)置報(bào)文:
|報(bào)文解析| Simple Network Management Protocol (簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議(SNMP報(bào)文)) version: version-1 (0) (使用的 SNMP協(xié)議版本,值為 0表示 SNMPv1) community: public (社區(qū)字符串為 "public",通常表示只讀權(quán)限) data: set-request (3) (PDU 類型為 SET-REQUEST,表示設(shè)置管理對(duì)象的值) set-request request-id: 1479407980 (請(qǐng)求的唯一標(biāo)識(shí)符,用于匹配請(qǐng)求和響應(yīng)) error-status: noError (0) (錯(cuò)誤狀態(tài)為 noError (0),表示沒(méi)有錯(cuò)誤發(fā)生) error-index: 0 (錯(cuò)誤索引為 0,表示變量綁定列表中沒(méi)有錯(cuò)誤對(duì)象) variable-bindings: 1 item (變量綁定列表中包含 1個(gè)變量) 1.3.6.1.2.1.12.1.0: 1 (OID為 1.3.6.1.2.1.12.1.0,設(shè)置的值為 1) Object Name: 1.3.6.1.2.1.12.1.0 (iso.3.6.1.2.1.12.1.0) (OID 對(duì)應(yīng)的完整名稱) Value (Integer32): 1 (設(shè)置的值為整數(shù)類型,值為 1) [Response In: 237] (表示該請(qǐng)求的響應(yīng)報(bào)文序號(hào)為 237) |報(bào)文原文| 30 2a 02 01 00 04 06 70 75 62 6c 69 63 a3 1d 02 04 58 2d f9 6c 02 01 00 02 01 00 30 0f 30 0d 06 08 2b 06 01 02 01 0c 01 00 02 01 01
W55MH32響應(yīng)報(bào)文:
|報(bào)文解析| Simple Network Management Protocol version: version-1 (0) (版本號(hào):SNMPv1(值為 0)) community: public (社區(qū)字符串:"public",用于身份驗(yàn)證) data: get-response (2) (數(shù)據(jù)類型:GET-RESPONSE(值為 2),表示這是一個(gè)響應(yīng)報(bào)文) get-response (GET-RESPONSE 數(shù)據(jù)部分) request-id: 1479407980 (請(qǐng)求 ID:1479407980,用于匹配請(qǐng)求和響應(yīng)) error-status: noError (0) (錯(cuò)誤狀態(tài):noError(值為 0),表示沒(méi)有錯(cuò)誤) error-index: 0 (錯(cuò)誤索引:0,表示沒(méi)有發(fā)生錯(cuò)誤的變量索引) variable-bindings: 1 item (變量綁定:包含 1個(gè)變量) 1.3.6.1.2.1.12.1.0: 1 (變量綁定內(nèi)容) Object Name: 1.3.6.1.2.1.12.1.0 (iso.3.6.1.2.1.12.1.0) (對(duì)象標(biāo)識(shí)符(OID)) Value (Integer32): 1 (OID對(duì)應(yīng)的值,類型為 Integer32,值為 1) [Response To: 236] (對(duì)請(qǐng)求 ID 236的響應(yīng)) [Time: 0.023844000 seconds] 響應(yīng)耗時(shí):0.023844秒) |報(bào)文原文| 30 2a 02 01 00 04 06 70 75 62 6c 69 63 a2 1d 02 04 58 2d f9 6c 02 01 00 02 01 00 30 0f 30 0d 06 08 2b 06 01 02 01 0c 01 00 02 01 01
8實(shí)現(xiàn)過(guò)程
接下來(lái),我們看看如何在代碼上適配MIB Browser上添加的功能。
注意:測(cè)試實(shí)例需要PC端和W55MH32處于同一網(wǎng)段。
步驟1:初始化LED并注冊(cè)到SNMP中
user_led_init(); user_led_control_init(get_user_led_status, set_user_led_status);
步驟2:注冊(cè)snmp定時(shí)器
/** * @brief 1ms timer IRQ Handler * @param none * @return none */ void TIM3_IRQHandler(void) { static uint32_t tim3_1ms_count = 0; static uint8_t tim3_10ms_count = 0; if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { tim3_1ms_count++; tim3_10ms_count++; // 1000ms(1秒)定時(shí)處理DHCP if (tim3_1ms_count >= 1000) { DHCP_time_handler(); tim3_1ms_count = 0; } // 10ms定時(shí)處理SNMP if (tim3_10ms_count >= 10) { SNMP_time_handler(); tim3_10ms_count = 0; } // 清除中斷標(biāo)志位 TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } }
我們需要10ms調(diào)用一次SNMP_time_handler()函數(shù),方便SNMP進(jìn)行超時(shí)處理。
步驟3:添加功能函數(shù)
在snmp_custom.c文件中的snmpData結(jié)構(gòu)體變量中,添加功能函數(shù):
c
運(yùn)行
dataEntryType snmpData[] = { // System MIB // SysDescr Entry { 8, {0x2b, 6, 1, 2, 1, 1, 1, 0}, SNMPDTYPE_OCTET_STRING, 30, {"WIZnet Embedded SNMP Agent"}, NULL, NULL}, // SysObjectID Entry { 8, {0x2b, 6, 1, 2, 1, 1, 2, 0}, SNMPDTYPE_OBJ_ID, 8, {"x2bx06x01x02x01x01x02x00"}, NULL, NULL}, // SysUptime Entry { 8, {0x2b, 6, 1, 2, 1, 1, 3, 0}, SNMPDTYPE_TIME_TICKS, 0, {""}, currentUptime, NULL}, // sysContact Entry { 8, {0x2b, 6, 1, 2, 1, 1, 4, 0}, SNMPDTYPE_OCTET_STRING, 30, {"http://www.wizwiki.net/forum"}, NULL, NULL}, // sysName Entry { 8, {0x2b, 6, 1, 2, 1, 1, 5, 0}, SNMPDTYPE_OCTET_STRING, 30, {"http://www.wiznet.co.kr"}, NULL, NULL}, // Location Entry { 8, {0x2b, 6, 1, 2, 1, 1, 6, 0}, SNMPDTYPE_OCTET_STRING, 30, {"4F Humax Village"}, NULL, NULL}, // SysServices { 8, {0x2b, 6, 1, 2, 1, 1, 7, 0}, SNMPDTYPE_INTEGER, 4, {""}, NULL, NULL}, { 8, {0x2b, 6, 1, 2, 1, 12, 2, 0}, SNMPDTYPE_OCTET_STRING, 30, {""}, get_LEDStatus_UserLED, NULL}, { 8, {0x2b, 6, 1, 2, 1, 12, 1, 0}, SNMPDTYPE_INTEGER, 4, {""}, NULL, set_LEDStatus_UserLED}, // OID Test #1 (long-length OID example, 19865) {0x0a, {0x2b, 0x06, 0x01, 0x04, 0x01, 0x81, 0x9b, 0x19, 0x01, 0x00}, SNMPDTYPE_OCTET_STRING, 30, {"long-length OID Test #1"}, NULL, NULL}, // OID Test #2 (long-length OID example, 22210) {0x0a, {0x2b, 0x06, 0x01, 0x04, 0x01, 0x81, 0xad, 0x42, 0x01, 0x00}, SNMPDTYPE_OCTET_STRING, 35, {"long-length OID Test #2"}, NULL, NULL}, // OID Test #2: SysObjectID Entry {0x0a, {0x2b, 0x06, 0x01, 0x04, 0x01, 0x81, 0xad, 0x42, 0x02, 0x00}, SNMPDTYPE_OBJ_ID, 0x0a, {"x2bx06x01x04x01x81xadx42x02x00"}, NULL, NULL}, };
結(jié)構(gòu)體變量snmpData的結(jié)構(gòu)體dataEntryType定義如下所示:
typedef struct { uint8_t oidlen; // OID長(zhǎng)度 uint8_t oid[MAX_OID]; // OID數(shù)組(對(duì)象標(biāo)識(shí)符) uint8_t dataType; // 數(shù)據(jù)類型(對(duì)應(yīng)SNMP數(shù)據(jù)類型) uint8_t dataLen; // 數(shù)據(jù)長(zhǎng)度 union { uint8_t octetstring[MAX_STRING]; // 字符串類型數(shù)據(jù) uint32_t intval; // 整數(shù)類型數(shù)據(jù) } u; // 數(shù)據(jù)聯(lián)合體(存儲(chǔ)不同類型的數(shù)據(jù)) void (*getfunction)(void *, uint8_t *); // 獲取數(shù)據(jù)的回調(diào)函數(shù) void (*setfunction)(int32_t); // 設(shè)置數(shù)據(jù)的回調(diào)函數(shù) } dataEntryType;
步驟4:初始化snmp協(xié)議
void snmpd_init(uint8_t *managerIP, uint8_t *agentIP, uint8_t sn_agent, uint8_t sn_trap) { #ifdef _SNMP_DEBUG_ printf("rn - SNMP : Start SNMP Agent Daemonrn"); #endif SOCK_SNMP_AGENT = sn_agent; SOCK_SNMP_TRAP = sn_trap; // 檢查 socket 編號(hào)是否合法 if ((SOCK_SNMP_AGENT > _WIZCHIP_SOCK_NUM_) || (SOCK_SNMP_TRAP > _WIZCHIP_SOCK_NUM_)) { return; } startTime = getSNMPTimeTick(); // 記錄啟動(dòng)時(shí)間(單位:10ms) initTable(); // 初始化 OID 條目值 initial_Trap(managerIP, agentIP); // 初始化 Trap 相關(guān)配置 /* // SNMP Trap 示例代碼 { dataEntryType enterprise_oid = { 0x0a, {0x2b, 0x06, 0x01, 0x04, 0x01, 0x81, 0x9b, 0x19, 0x01, 0x00}, SNMPDTYPE_OBJ_ID, 0x0a, {"x2bx06x01x04x01x81x9bx19x10x00"}, NULL, NULL }; dataEntryType trap_oid1 = { 8, {0x2b, 6, 1, 4, 1, 0, 11, 0}, SNMPDTYPE_OCTET_STRING, 30, {""}, NULL, NULL }; dataEntryType trap_oid2 = { 8, {0x2b, 6, 1, 4, 1, 0, 12, 0}, SNMPDTYPE_INTEGER, 4, {""}, NULL, NULL }; strcpy((char *)trap_oid1.u.octetstring, "Alert!!!"); // 添加字符串?dāng)?shù)據(jù) trap_oid2.u.intval = 123456; // 添加整數(shù)值 // 通用 Trap: warmStart snmp_sendTrap((void *)"192.168.0.214", (void *)"192.168.0.112", (void *)"public", enterprise_oid, SNMPTRAP_WARMSTART, 0, 0); // 企業(yè)特定 Trap snmp_sendTrap((void *)"192.168.0.214", (void *)"192.168.0.112", (void *)"public", enterprise_oid, 6, 0, 2, &trap_oid1, &trap_oid2); } */ }
這一步,主要是將使用的socket號(hào),管理IP地址,請(qǐng)求IP地址等參數(shù)注冊(cè)進(jìn)去,并且記錄開始時(shí)間。如果想使用Trap主動(dòng)上報(bào),可以參考注釋中的示例代碼。
步驟5:在主循環(huán)中運(yùn)行snmpd_run()函數(shù)
snmpdrun()函數(shù)代碼如下:
int32_t snmpd_run(void) { int32_t ret; int32_t len = 0; uint8_t svr_addr[6]; uint16_t svr_port; // 檢查 socket 編號(hào)合法性 if (SOCK_SNMP_AGENT > _WIZCHIP_SOCK_NUM_) { return -99; } // 根據(jù) socket 狀態(tài)進(jìn)行處理 switch (getSn_SR(SOCK_SNMP_AGENT)) { case SOCK_UDP: // 檢查接收緩沖區(qū)是否有數(shù)據(jù) if ((len = getSn_RX_RSR(SOCK_SNMP_AGENT)) > 0) { // 接收 UDP 數(shù)據(jù) request_msg.len = recvfrom(SOCK_SNMP_AGENT, request_msg.buffer, len, svr_addr, &svr_port); } else { request_msg.len = 0; } // 處理接收到的請(qǐng)求數(shù)據(jù) if (request_msg.len > 0) { #ifdef _SNMP_DEBUG_ dumpCode((void *)"rn[Request]rn", (void *)"rn", request_msg.buffer, request_msg.len); #endif // 初始化請(qǐng)求和響應(yīng)消息 request_msg.index = 0; response_msg.index = 0; errorStatus = errorIndex = 0; memset(response_msg.buffer, 0x00, MAX_SNMPMSG_LEN); // 解析 SNMP 請(qǐng)求并發(fā)送響應(yīng) if (parseSNMPMessage() != -1) { sendto(SOCK_SNMP_AGENT, response_msg.buffer, response_msg.index, svr_addr, svr_port); } #ifdef _SNMP_DEBUG_ dumpCode((void *)"rn[Response]rn", (void *)"rn", response_msg.buffer, response_msg.index); #endif } break; case SOCK_CLOSED: // 創(chuàng)建 UDP socket if ((ret = socket(SOCK_SNMP_AGENT, Sn_MR_UDP, PORT_SNMP_AGENT, 0x00)) != SOCK_SNMP_AGENT) { return ret; } #ifdef _SNMP_DEBUG_ printf(" - [%d] UDP Socket for SNMP Agent, port [%d]rn", SOCK_SNMP_AGENT, PORT_SNMP_AGENT); #endif break; default: break; } return 1; }
snmpd_run()函數(shù)會(huì)執(zhí)行一個(gè)UDP狀態(tài)機(jī),當(dāng)收到SNMP管理的消息后會(huì)執(zhí)行解析以及回復(fù)操作。
9運(yùn)行結(jié)果
燒錄例程運(yùn)行后,首先可以看到打印了PHY鏈路檢測(cè)和DHCP獲取網(wǎng)絡(luò)信息,然后是運(yùn)行SNMP程序:
打開MIB Borwser,輸入W55MH32的地址,然后依次點(diǎn)擊system分支下的各個(gè)節(jié)點(diǎn),獲取到的結(jié)果與代碼定義相同:
再找到User分支下的setLED指令,右鍵指令,點(diǎn)擊set,類型選擇integer,Value填 1,點(diǎn)擊OK:
getLED指令,右鍵指令,點(diǎn)擊get,即可讀出LED狀態(tài):
10總結(jié)
本文講解了如何在 W55MH32芯片上實(shí)現(xiàn) SNMP功能,通過(guò)實(shí)戰(zhàn)例程展示了使用 MIB Browser管理 W55MH32的具體過(guò)程,涵蓋在 MIB Browser中創(chuàng)建分支、添加葉子節(jié)點(diǎn),以及在代碼中適配功能等關(guān)鍵步驟。文章詳細(xì)介紹了 SNMP協(xié)議的概念、特點(diǎn)、應(yīng)用場(chǎng)景、架構(gòu)組成、OID詳解和報(bào)文格式,幫助讀者理解其在網(wǎng)絡(luò)設(shè)備管理和監(jiān)控中的重要作用。
下一篇文章將聚焦 PING命令,解析其測(cè)試網(wǎng)絡(luò)連通性的原理及在網(wǎng)絡(luò)故障排查中的應(yīng)用,同時(shí)講解如何在W55MH32上使用 PING命令進(jìn)行網(wǎng)絡(luò)診斷,敬請(qǐng)期待!
WIZnet是一家無(wú)晶圓廠半導(dǎo)體公司,成立于 1998年。產(chǎn)品包括互聯(lián)網(wǎng)處理器 iMCU?,它采用 TOE(TCP/IP卸載引擎)技術(shù),基于獨(dú)特的專利全硬連線 TCP/IP。iMCU?面向各種應(yīng)用中的嵌入式互聯(lián)網(wǎng)設(shè)備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國(guó)、美國(guó)設(shè)有辦事處,提供技術(shù)支持和產(chǎn)品營(yíng)銷。
香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國(guó)和日本除外)。
審核編輯 黃宇
-
以太網(wǎng)
+關(guān)注
關(guān)注
41文章
5862瀏覽量
178545 -
SNMP
+關(guān)注
關(guān)注
0文章
93瀏覽量
30515
發(fā)布評(píng)論請(qǐng)先 登錄
第十五章 DAC (上篇)

第十五章 DAC (下篇)

【正點(diǎn)原子FPGA連載】第十五章 窗口門狗(WWDG)實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)之FPGA開發(fā)指南_V2.1

第二章 W55MH32 DHCP示例

第五章 W55MH32 UDP示例

第九章 W55MH32 HTTP Server示例

第十章 W55MH32 SNTP示例

第十一章 W55MH32 SMTP示例

第十二章 W55MH32 NetBIOS示例

第十四章 W55MH32 TFTP示例

第十六章 W55MH32 PING示例

第十七章 W55MH32 ARP示例

第十八章 W55MH32 FTP_Server示例

第二十五章 W55MH32 TCP_Server_Multi_Socket示例

第二十六章 W55MH32?上位機(jī)搜索和配置示例

評(píng)論