平震宇
(江蘇信息職業(yè)技術(shù)學(xué)院,江蘇 無錫 214101)
隨著雙向HFC網(wǎng)絡(luò)改造大規(guī)模地推進,加上政府在政策上的扶持,HFC網(wǎng)絡(luò)管理被提到各有線電視運營商的日程中來。各大有線電視臺在網(wǎng)絡(luò)改造設(shè)備招標中,大部分都提出了網(wǎng)管方面的需求。HFC網(wǎng)管的國際標準陸續(xù)頒布,國標的制定工作也已經(jīng)有了很大的進展,得到了大部分HFC設(shè)備廠商的認同與支持。2005年10月12日,《HFC網(wǎng)絡(luò)設(shè)備管理系統(tǒng)規(guī)范》被批準為國家標準,2006年5月1日正式實施。在技術(shù)和政策方面因素的推動下,國內(nèi)商用HFC網(wǎng)絡(luò)管理系統(tǒng)的市場正在全面啟動。
國標對網(wǎng)絡(luò)管理應(yīng)答設(shè)備作出了細致的定義,這是因為網(wǎng)絡(luò)管理應(yīng)答器的設(shè)計是整個網(wǎng)絡(luò)管理系統(tǒng)的重點,關(guān)系到整個網(wǎng)絡(luò)管理系統(tǒng)的有效性和兼容性。本文將論述《HFC網(wǎng)絡(luò)設(shè)備管理系統(tǒng)規(guī)范》的II類應(yīng)答器設(shè)計思想和總體結(jié)構(gòu)以及MIB庫模塊擴展等關(guān)鍵技術(shù)問題。
完整的HFC網(wǎng)絡(luò)管理系統(tǒng)包括基于SNMP協(xié)議的HFC設(shè)備管理軟件、連接IP網(wǎng)絡(luò)與HFC網(wǎng)絡(luò)的前端控制器網(wǎng)關(guān)和安裝于被管理設(shè)備端的應(yīng)答器。國標定義了I/II/III類應(yīng)答器,I類應(yīng)答器需要通過前端控制器(Headend Element,HE)來進行協(xié)議轉(zhuǎn)換,完成 SNMP/IP到SNMP/MAC/RF的轉(zhuǎn)換?;贗P接口的II/III類應(yīng)答器是標準SNMP/IP接口,直接與SNMP管理站相聯(lián)。II類應(yīng)答器的物理層符合IEEE802.314條規(guī)定的10BASE-T規(guī)范,在UDP/IP協(xié)議棧上實現(xiàn)SNMP V1.0協(xié)議,用于HFC網(wǎng)設(shè)備管理的SNMP代理。由于目前絕大部分采用非標準網(wǎng)管接口的前端機房設(shè)備,應(yīng)答器與被管設(shè)備之間的接口(如光平臺/光站、放大器、供電器等)需要定制專門的協(xié)議轉(zhuǎn)換器,它與被管設(shè)備之間一般為自定義協(xié)議通過串口進行通信[1]。系統(tǒng)協(xié)議模型如圖1所示。
II類應(yīng)答器主要功能有:
1)II類應(yīng)答器需要支持SNMP V1.0協(xié)議規(guī)定的協(xié)議數(shù)據(jù)單元(PDU),負責(zé)接收、處理來自網(wǎng)管站的請求報文,然后從設(shè)備上其他協(xié)議模塊中取得管理變量的數(shù)值,形成響應(yīng)報文,反送給SNMP管理站。在一些緊急情況下,如接口狀態(tài)發(fā)生改變、呼叫成功等情況,主動通知SNMP管理站(發(fā)送陷阱TRAP報文)。II類應(yīng)答器接收SNMP管理站請求報文 SetRequest,Get Request和 Get Next Request,II類應(yīng)答器以GetResponse消息報文響應(yīng)請求。GetRequest取回一個或多個參數(shù)值,使用GetNextRequest請求表中的下一個參數(shù)值,通過GetRequest和GetNextRequest結(jié)合起來使用可以獲得一個表中的參數(shù)值。SetRequest對設(shè)備中的參數(shù)進行遠程配置(如設(shè)備的配置參數(shù)、設(shè)置報警門限等)。此外,通過端口162發(fā)送給管理站的Trap(告警)報文消息,告知管理站設(shè)備發(fā)生了一個特定事件(如端口失敗、掉電重起等),管理站可作出相應(yīng)的處理。
2)II類應(yīng)答器需要與HFC設(shè)備通信,按照各種設(shè)備的私有協(xié)議獲取設(shè)備參數(shù)以及按照SNMP管理要求設(shè)置設(shè)備參數(shù)。需要根據(jù)II類應(yīng)答器與被管理設(shè)備之間通信的特性,設(shè)計串口通信協(xié)議,規(guī)定通信傳輸?shù)姆绞健⑺俾?、等待超時時間、通信中斷判斷、通信幀結(jié)構(gòu)等。
系統(tǒng)整體構(gòu)架借助于net-snmp。net-snmp是開放源代碼的簡單網(wǎng)絡(luò)管理協(xié)議軟件,它從ucd-snmp更名過來,ucd-snmp源自Carnegie-Mellon大學(xué)的SNMP軟件包 CMU-snmp,由University of Califonia at Davis開發(fā)和維護,故命名為ucd-snmp。2000年11月,ucd-snmp轉(zhuǎn)由SourceForge管理,并更名為net-snmp。net-snmp支持 SNMP V1.0,SNMP V2.0c與 SNMP V3.0。net-snmp軟件包主要由以下內(nèi)容組成:可擴展的SNMP代理程序(snmpd),SNMP代理和管理程序開發(fā)庫,用于請求或設(shè)置 SNMP代理變量的工具程序(snmpget,snmpset,snmptable,snmpwalk等),用于生成或處理SNMP陷阱(trap)的工具程序(snmptrapd 和 snmptrap)等。 II類應(yīng)答器系統(tǒng)框架如圖2所示。
網(wǎng)管代理進程snmpd是net-snmp主代理程序,按照SNMP協(xié)議完成II類應(yīng)答器與SNMP管理站之間的信息交互,從管理信息庫(Management Information Base,MIB)獲取或設(shè)置相應(yīng)數(shù)據(jù),以響應(yīng)相應(yīng)的請求或根據(jù)MIB的相應(yīng)數(shù)據(jù)決定Trap的發(fā)送。當接收到管理站發(fā)送的GET命令,在MIB樹中查詢相應(yīng)對象的值經(jīng)過解析與組裝SNMP包,發(fā)送給SNMP管理站;如果是SET命令,則在MIB樹中對相應(yīng)對象設(shè)值,修改數(shù)據(jù)共享區(qū)相應(yīng)數(shù)值。當II類應(yīng)答器檢查某被管對象滿足閾值條件時,發(fā)送Trap消息給SNMP管理站。snmpd包括了眾多標準MIB的實現(xiàn),可以使用子代理對其進行擴展。
net-snmp提供了接口以便于擴展MIB,使用netsnmp擴展代理有兩種方式:(1)靜態(tài)鏈接形式,通過修改配置頭文件,在相應(yīng)地方包含新引入的MIB模塊的.c和.h文件,然后重新編譯庫文件和代理程序;(2)共享鏈接庫形式,只須把新引入的MIB模塊的.c和.h文件編譯成動態(tài)庫,通過設(shè)置能夠讓代理程序載入。MIB擴展模塊將按照HMS的MIB增加相應(yīng)的實現(xiàn)代碼。
數(shù)據(jù)共享區(qū)可以使用內(nèi)存共享或者文件共享的方式,主要用于MIB擴展模塊獲取HFC設(shè)備數(shù)據(jù)以及提供配置數(shù)據(jù)信息。數(shù)據(jù)共享區(qū)是MIB擴展模塊與設(shè)備輪詢模塊之間數(shù)據(jù)交換的通道。
設(shè)備數(shù)據(jù)輪詢模塊與設(shè)備通信協(xié)議模塊共同完成被管理設(shè)備的數(shù)據(jù)采集與設(shè)置。輪詢進程主要完成與管理設(shè)備的模塊通信的功能,由于應(yīng)答器需要管理不止一個設(shè)備,因此對于設(shè)備的通信過程主要通過輪詢的方式來訪問。將收集到的本地設(shè)備存放到數(shù)據(jù)共享區(qū)中。設(shè)備通信協(xié)議模塊為一個獨立的、可加載的模塊,將根據(jù)被管設(shè)備的種類加載相對應(yīng)的模塊程序,從而使得應(yīng)答器可以適應(yīng)不同的HFC設(shè)備。
MIB定義代理進程中所有可被查詢和修改的參數(shù),指明了網(wǎng)絡(luò)元素所維持的變量 (即能夠被管理站查詢和設(shè)置的信息),給出了一個網(wǎng)絡(luò)中所有可能的被管理對象的數(shù)據(jù)結(jié)構(gòu)。MIB是一種樹型結(jié)構(gòu)的數(shù)據(jù)庫,被監(jiān)管的對象都處于葉子節(jié)點上。每個被監(jiān)管對象都由一個唯一的對象標識符來識別。對象信息的存儲結(jié)構(gòu)由MIB定義的簡單變量和表來構(gòu)造,一般包含描述名(對象標識符)、數(shù)據(jù)類型、讀寫規(guī)則、功能描述、狀態(tài)。
系統(tǒng)采用的MIB可以根據(jù)項目要求采用按照國標定義的MIB或者按照SCTE HMS定義的MIB。HMS定義了眾多的MIB文本以實現(xiàn)對傳輸設(shè)備的管理,其中HMS Root-MIB和HMS Tree-MIB定義了其他眾多MIB在ISO的MIB樹中的位置,如圖3所示;commonIdent定義了與應(yīng)答器相關(guān)的通用管理信息,包含應(yīng)答器本身的相關(guān)信息、應(yīng)答器MAC層的管理信息和應(yīng)答器的射頻特性參數(shù)信息等;alarmsIdent定義了具有報警功能的模擬、離散參數(shù)報警信息的編碼格式;propertyIdent定義了對具有報警功能的模擬、離散參量的管理、維護的一組信息;此外,針對HFC網(wǎng)絡(luò)多種類型的傳輸設(shè)備,HMS分別定義了相對應(yīng)的MIB,比如fnIdent定義了室外光節(jié)點設(shè)備的相關(guān)管理信息;psIdent定義了電源設(shè)備的相關(guān)管理信息[2-3]。MIB文本包含了被管理設(shè)備的所有的管理信息,為應(yīng)答器的設(shè)計提供了有效的依據(jù)。
圖3 HMS的MIB樹
由于引入HFC設(shè)備(即MIB庫發(fā)生了變化),需要net-snmp原有的模塊上擴展代理以支持新的MIB庫。首先需要編寫MIB文件,定義節(jié)點名稱、位置、類型、訪問限制和簡單注釋等。對于II類應(yīng)答器將使用HMS定義的MIB文件,將MIB文件放在net-snmp源文件目錄的mibs目錄下。擴展代理通常采用靜態(tài)連接方式,該方式是在編譯過程中把擴展的MIB模塊編譯進代理程序中??梢越柚鷑et-snmp軟件包中的mib2c工具生成大致的程序框架,MIB代理模塊的實現(xiàn)可以在mib2e生成的程序框架基礎(chǔ)上進行添加修改,也可以參照net-snmp提供的例子example.c和example.h,在其基礎(chǔ)上進行修改。使用參數(shù)(--with-mib-modules=scte)重新配置并編譯Agent程序,并且需要創(chuàng)建一個頭文件,列表單個的MIB模塊,如 config_require(scte/commonAdminGroup)。
筆者在由mib2c生成的*.h和*.c的基礎(chǔ)上進行修改,實現(xiàn)設(shè)備參數(shù)的訪問與控制功能的完整程序。MIB模塊一般都由變量和表組成,因此net-snmp把SMI中的對象分為scalar和table。scalar包含常用的整型、字符串、時間等數(shù)據(jù)類型。table是scalar的一種集合,有一個或多個列組成,類似于數(shù)據(jù)庫中的表。它必須具有索引項,用來按一定順序檢索表項。下面對實現(xiàn)擴展代理的主要模塊進行詳細分析,分析程序中如何實現(xiàn)單個變量 (以commonAdminGroup為例)以及table(以hePsUnitTable為例)的get和set功能,最后介紹Trap的實現(xiàn)方法。
1.3.1 簡單變量的實現(xiàn)方法
1)修改commonAdminGroup.h文件。commonAdmin-Group.h 聲明了初始化函數(shù) init_commonAdminGroup()、get方法使用的函數(shù) var_commonAdminGroup()、set方法使用的函數(shù)write_commonLogicalID()等函數(shù)??梢栽诖寺暶饕恍╊A(yù)定義的全局變量,定義需要使用的結(jié)構(gòu)等。
2)修改init模塊。init_commonAdminGroup模塊主要完成擴展代理的初始化功能。init_commonAdminGroup模塊用 commonAdminGroup_variables_oid[]={1,3,6,1,4,1,5591,1,3,1}定義了需要擴展的 MIB 在 MIB樹中的具體位置。然后以一個variable4結(jié)構(gòu)的數(shù)組commonAdminGroup_variables[]定義了該節(jié)點下的葉子節(jié)點,對每個節(jié)點的描述是按照magic number、變量類型、讀寫權(quán)限、回調(diào)函數(shù)、變量長度和變量后綴的順序組成。初始化的最主要的功能是注冊需要擴展的MIB,用net-snmp提供的函數(shù)REGISTER_MIB(“commonAdmin-Group”,commonAdminGroup_variables,variable4,common-AdminGroup_variables_oid)來實現(xiàn)。按照commonAdmin-Group節(jié)點下面的變量設(shè)置初始數(shù)據(jù)。
3)get實現(xiàn)模塊。get功能是SNMP的基本功能,也是最常用的重要功能。commonAdminGroup.c文件中實現(xiàn)get功能的是commonAdminGroup.h中聲明的var_common-AdminGroup()函數(shù),該函數(shù)結(jié)構(gòu)非常清晰,是switch case結(jié)構(gòu),switch中的條件變量就是magic number,由一個指針對象vp控制;case對應(yīng)的就是每個具體的magic number。需要對每個case做具體的添加和修改,返回用戶需要get的變量值。實例代碼如下:
unsigned char *var_commonAdminGroup(struct variable*vp,oid
4)set實現(xiàn)模塊。commonAdminGroup.c文件中實現(xiàn)set功能的是write_commonLogicalID()函數(shù),與get函數(shù)不同的是,switch條件中的是action,即一種操作;case包括RESERVEl,RESERVE2,F(xiàn)REE,ACTION,UNDO 和 COMMIT幾個部分。前2個是保留的,F(xiàn)REE用于釋放資源,ACTION是set真正要實現(xiàn)的功能,但只保存在內(nèi)存中,UNDO是取消上一次操作,COMMIT是提交,把ACTION所做的事情提交。實例代碼如下:
1.3.2 Table的實現(xiàn)方法
SNMP中把一些標量在邏輯上組織在一起,形成一個邏輯上的表結(jié)構(gòu):一些單個對象作為表中的列,所有的列組成表中的一行 (entry),若干個行就組成了一個表(table)。跟關(guān)系型的表一樣,SNMP中的表也需要有索引,不然無法唯一地標識行。索引的設(shè)計需要考慮到索引列能不能唯一地標識列,如果有歧義將會引起很多問題,是不被支持的。從實現(xiàn)方式和數(shù)據(jù)結(jié)構(gòu)來看,表是一個結(jié)構(gòu)體變量數(shù)組;從系統(tǒng)管理來看,就是數(shù)據(jù)庫中的表單。hePsUnitTable是機架電源信息表,如圖4所示。
圖4 hePsUnitTableMIB樹
每個電源信息將是一行記錄,每一行將包括輸入電流、輸入功率、型號、輸入電壓以及設(shè)備號組成,設(shè)備號是由entPhysicalTable定義的,作為檢索電源的索引。Table的實現(xiàn)比單個變量要復(fù)雜,但同樣可以借助mib2c-c mib2c.mfd.conf hePsUnitTable生成大致的程序框架。mib2c.mfd.conf提供了更加細致的代碼框架,通過多層交互,可以區(qū)分實時、半實時、永久型的數(shù)據(jù),可以選擇數(shù)據(jù)的存儲方式,可以作為列或表之間的依賴關(guān)系,數(shù)據(jù)結(jié)構(gòu)的自動綁定或手工編輯,以及其他復(fù)雜的選項。
1)修改結(jié)構(gòu)體hePsUnitTable_rowreq_ctx。hePsUnit-Table_rowreq_ctx是最重要的一個結(jié)構(gòu),保存了hePsUnitTable中的所有數(shù)據(jù)或者指針。hePsUnitTable_mib_index 是 entPhysicalIndex(表的索引),hePsUnitTable_data是定義的電流、功率等數(shù)據(jù)。代碼如下:
2)初始化表中數(shù)據(jù)。hePsUnitTable_cache_load()函數(shù)初始化表中數(shù)據(jù)。需要從共享數(shù)據(jù)中把電源信息獲取并填入表中。代碼如下:
3)修改get,set實現(xiàn)模塊。操作步驟與簡單變量相似。
1.3.3 Trap的實現(xiàn)方法
為了更好地實現(xiàn)網(wǎng)絡(luò)的故障管理,在HMS MIB中定義相應(yīng)的系統(tǒng)告警信息來實現(xiàn)告警的實時響應(yīng)并進行故障診斷。對于Trap報文,即代理向管理進程發(fā)送預(yù)定義事件的異步通知,在SNMP V1.0和SNMP V2.0中不需要管理進程發(fā)送響應(yīng)報文,因而代理無法知道管理進程如何響應(yīng)它的Trap報文。管理進程可以通過兩種方法在UDP的162端口得到Trap報文:一種是中斷驅(qū)動報告方式,即實時發(fā)送警告報文;另一種是輪詢方式,即適時地詢問每個代理,有無異常情況需要報告。本文使用的流程是在SNMP進程啟動時,讀取設(shè)備告警信息,并通過trap發(fā)送給網(wǎng)管,然后定時地檢測設(shè)備告警的情況,如果設(shè)備告警情況有變,則再發(fā)送trap消息,通過send_v2trap()函數(shù)來實現(xiàn)。
系統(tǒng)采用ARM7TDMI內(nèi)核的ARM處理器,操作系統(tǒng)采用PPClinux,硬件平臺配置為:CPU選用Philip公司的 LPC2200 芯片;SDRAM16Mbyte;2Mbyte NOR Flash+8 Mbyte NAND Flash;串口;以太網(wǎng)口。
基本測試環(huán)境包括兩個組成部分,即SNMP管理站所在的測試系統(tǒng)部分和II類應(yīng)答器與B平臺,SNMP管理站使用測試軟件MIB-Browser。運行snmpd代理,在默認的161端口就可以通過對HMS MIB的訪問實現(xiàn)對設(shè)備的實時監(jiān)控。用MIB Browser對insidePlantIdent組中的節(jié)點進行Get操作獲取變量的值,對比所取回的變量值與實際值相同。對MIB庫定義的可讀寫的參數(shù)進行Set操作,設(shè)置完成后用get取回的值與set設(shè)置的值一致。同時snmpd代理也具有trap監(jiān)聽功能,可以接收系統(tǒng)發(fā)來的一些標準的trap信息如冷熱啟動等,設(shè)備發(fā)生故障時可以使用將trap信息發(fā)送至162端口。
本文論述了利用net-snmp軟件包實現(xiàn)可擴展SNMP代理的技術(shù)和方法實現(xiàn)HFC網(wǎng)絡(luò)管理系統(tǒng)中的II類應(yīng)答器,其重點是編寫代理操作支持例程程序以及處理擴展部分,采用模塊化的結(jié)構(gòu),可根據(jù)需要擴展所支持的管理信息庫模塊,實現(xiàn)新的應(yīng)用。將擴展的SNMP程序移植到開發(fā)板上后,測試和驗證了II類應(yīng)答器的有效性。本系統(tǒng)符合國內(nèi)標準《HFC網(wǎng)絡(luò)設(shè)備管理系統(tǒng)規(guī)范草案》,在濟南、重慶等地的HFC網(wǎng)絡(luò)管理系統(tǒng)中得到運用,系統(tǒng)運行穩(wěn)定可靠。
[1]Tutorials[EB/OL].[2010-03-20].http://www.net-snmp.org/wiki/index.php/Tutorials.
[2]ANSI/SCTE 25-22002.Hybrid Fiber Coax Outside Plant Status Monitoring-Media Access Control(MAC)Layer Specification vl.0[S].2002.
[3]ANSI/SCTE 25-12002.Hybrid Fiber Coax Outside Plant Status Monitoring-Physical(PHY)Layer Specification vl.0[S].2002.