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

第十五章 DAC (下篇)

【正點原子FPGA連載】第十五章 窗口門狗(WWDG)實驗 -摘自【正點原子】新起點之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?上位機搜索和配置示例

評論