基于xml實現(xiàn)家庭網(wǎng)關(guān)數(shù)據(jù)配置管理的方法
【專利摘要】本發(fā)明公開了一種基于XML實現(xiàn)家庭網(wǎng)關(guān)數(shù)據(jù)配置管理的方法,包括以下步驟:在內(nèi)存中分別定義TR_object和TR_param兩個數(shù)據(jù)結(jié)構(gòu);加載并遍歷家庭網(wǎng)關(guān)的XML配置文件,將其中的對象和參數(shù)以及各自的屬性信息配置到內(nèi)存中的TR_object、TR_param數(shù)據(jù)結(jié)構(gòu)中,構(gòu)造出內(nèi)存節(jié)點參數(shù)樹;將內(nèi)存節(jié)點參數(shù)樹中的配置數(shù)據(jù)寫回家庭網(wǎng)關(guān)的FLASH中,并保存形成新XML配置文件;家庭網(wǎng)關(guān)重啟后重新讀取FLASH中的新XML配置文件,進行配置管理。本發(fā)明利用XML規(guī)則設(shè)計一種用于統(tǒng)一存儲家庭網(wǎng)關(guān)數(shù)據(jù)的XML文件,并在參數(shù)信息變化時即時將配置信息保存到FLASH中,簡化配置數(shù)據(jù)加載流程,提高配置數(shù)據(jù)讀寫效率,降低程序內(nèi)存占有率。
【專利說明】基于XML實現(xiàn)家庭網(wǎng)關(guān)數(shù)據(jù)配置管理的方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及家庭網(wǎng)關(guān),具體涉及基于XML實現(xiàn)家庭網(wǎng)關(guān)數(shù)據(jù)配置管理的方法。
【背景技術(shù)】
[0002] 家庭網(wǎng)關(guān)是一個在家庭內(nèi)的網(wǎng)絡(luò)化信息設(shè)備與智能寬帶接入網(wǎng)之間的智能化網(wǎng) 關(guān)。它的主要作用是:(1)作為所有外部接入網(wǎng)連接到家庭內(nèi)部,同時將家庭內(nèi)部網(wǎng)絡(luò)連接 到外部的一種物理接口; (2)使住宅用戶可以獲得各種家庭服務(wù)(包括現(xiàn)有的服務(wù)和未來 可能出現(xiàn)的服務(wù))的平臺。
[0003] 隨著網(wǎng)絡(luò)技術(shù)的發(fā)展和普及,家庭網(wǎng)關(guān)已經(jīng)開始大規(guī)模地進入到普通家庭,在未 來幾年,它將替代目前大部分家庭正在使用的Modem和路由器,成為主流的家庭網(wǎng)絡(luò)接入 設(shè)備。
[0004] 家庭網(wǎng)關(guān)的上行方式主要支持:ADSL上行、LAN上行和Ρ0Ν上行,業(yè)務(wù)數(shù)據(jù)主要包 括 :Internet、VoIP、IPTV等。目前,家庭網(wǎng)關(guān)普遍遵循寬帶論壇發(fā)布的TR069規(guī)范中對數(shù) 據(jù)模型的定義要求,該數(shù)據(jù)模型具有良好的可管理性,能夠靈活適應(yīng)各種上行方式,為用戶 提供多種業(yè)務(wù)能力,因此,有利于網(wǎng)絡(luò)服務(wù)商進行統(tǒng)一的部署和管理。家庭網(wǎng)關(guān)的可管理性 需求,決定了家庭網(wǎng)關(guān)必須具有一套基于TR069數(shù)據(jù)模型進行業(yè)務(wù)配置管理的功能,其中 包括了數(shù)據(jù)定義、數(shù)據(jù)描述、數(shù)據(jù)存儲、數(shù)據(jù)讀寫等功能。
[0005] 如今,家庭網(wǎng)關(guān)配置管理的實現(xiàn)方式因生產(chǎn)廠家的不同而不同,主要采用的是嵌 入式數(shù)據(jù)庫管理,為不同的業(yè)務(wù)數(shù)據(jù)模型創(chuàng)建的不同配置文件存儲在數(shù)據(jù)庫上。這種方式 存在的主要問題是:家庭網(wǎng)關(guān)的配置數(shù)據(jù)加載流程復(fù)雜,配置數(shù)據(jù)讀寫訪問效率低下,內(nèi)存 占用率高。
[0006] 有鑒于此,急需對現(xiàn)有家庭網(wǎng)關(guān)配置管理的實現(xiàn)方式進行優(yōu)化設(shè)計,以簡化家庭 網(wǎng)關(guān)的配置數(shù)據(jù)加載流程,提高配置數(shù)據(jù)讀寫的效率。
【發(fā)明內(nèi)容】
[0007] 本發(fā)明所要解決的技術(shù)問題是解決家庭網(wǎng)關(guān)的配置數(shù)據(jù)加載流程復(fù)雜,配置數(shù)據(jù) 讀寫訪問效率低下,內(nèi)存占用率高的問題。
[0008] 為了解決上述技術(shù)問題,本發(fā)明所采用的技術(shù)方案是提供一種基于XML實現(xiàn)家庭 網(wǎng)關(guān)數(shù)據(jù)配置管理的方法,包括以下步驟:
[0009] 步驟100、在內(nèi)存中分別定義TR_object和TR_param兩個數(shù)據(jù)結(jié)構(gòu);
[0010] 步驟200、加載并遍歷家庭網(wǎng)關(guān)的XML配置文件,將其中的對象和參數(shù)以及各自的 屬性信息配置到內(nèi)存中的TR_ 〇bjeCt、TR_param數(shù)據(jù)結(jié)構(gòu)中,構(gòu)造出內(nèi)存節(jié)點參數(shù)樹;
[0011] 步驟300、將內(nèi)存節(jié)點參數(shù)樹中的配置數(shù)據(jù)寫回家庭網(wǎng)關(guān)的FLASH中,并保存形成 新XML配置文件;
[0012] 步驟400、家庭網(wǎng)關(guān)重啟后重新讀取FLASH中的新XML配置文件,進行配置管理。
[0013] 在上述方法中,所述TR_object數(shù)據(jù)結(jié)構(gòu)包括:
[0014] 指針字段TR_param*param,用于保存對象節(jié)點的第一個參數(shù)節(jié)點的地址,若對象 節(jié)點下無參數(shù)節(jié)點,則param值為NULL ;
[0015] 指針字段TR_object*parent,用于保存對象節(jié)點的父節(jié)點,若對象節(jié)點為樹根節(jié) 點,則parent值為NULL;
[0016] 指針字段TR_object*next,用于保存對象節(jié)點的右兄弟節(jié)點,若對象節(jié)點無右兄 弟節(jié)點,則next值為NULL ;
[0017] 指針字段TR_object*next_layer,用于保存對象節(jié)點的第一個左子樹節(jié)點,若對 象節(jié)點下無子樹節(jié)點,則next_layer值為NULL ;
[0018] 所述TR_param數(shù)據(jù)結(jié)構(gòu)包括:
[0019] 指針字段TR_param*next,用于保存參數(shù)節(jié)點的下一個兄弟參數(shù)節(jié)點,若無下一個 兄弟參數(shù)節(jié)點,則next值為NULL ;
[0020] 指針字段TR_object*parent,用于保存參數(shù)節(jié)點的父節(jié)點。
[0021] 在上述方法中,在構(gòu)建內(nèi)存節(jié)點參數(shù)樹過程中,參數(shù)配置節(jié)點在樹中均被定義為 葉子節(jié)點,參數(shù)配置節(jié)點的父節(jié)點必須是對象節(jié)點,對象節(jié)點和對象節(jié)點之間、同一對象節(jié) 點下的參數(shù)節(jié)點之間以及對象節(jié)點和對象節(jié)點下的參數(shù)節(jié)點之間均采用鏈表的方式關(guān)聯(lián)。
[0022] 在上述方法中,步驟200具體包括以下步驟:
[0023] 步驟201、獲取默認(rèn)XML配置文件路徑,獲取XML配置文件的默認(rèn)完整性保護讀寫 標(biāo)志;
[0024] 步驟202、根據(jù)完整性保護讀寫標(biāo)志是否為0判斷當(dāng)前XML配置文件的完整性, 如果完整性保護讀寫標(biāo)志不為0,則當(dāng)前XML配置文件不完整,轉(zhuǎn)步驟204 ;否則執(zhí)行步驟 203 ;
[0025] 步驟203、加載當(dāng)前XML配置文件并生成節(jié)點結(jié)構(gòu)樹,如果生成節(jié)點結(jié)構(gòu)樹失敗, 則轉(zhuǎn)步驟204 ;否則轉(zhuǎn)步驟205 ;
[0026] 步驟204、按照預(yù)定義的XML備份加載規(guī)則獲取當(dāng)前XML配置文件的冗余備份XML 配置文件,若獲取備份XML配置文件成功,則將備份XML配置文件設(shè)置為當(dāng)前XML配置文 件,轉(zhuǎn)步驟203 ;否則轉(zhuǎn)步驟212 ;
[0027] 步驟205、利用節(jié)點結(jié)構(gòu)樹構(gòu)造內(nèi)存節(jié)點參數(shù)樹,如果構(gòu)造成功,則轉(zhuǎn)步驟206 ;否 則轉(zhuǎn)步驟212 ;
[0028] 步驟206、直接判斷是否存在參數(shù)修改記錄日志文件,若存在則轉(zhuǎn)步驟207 ;否則 轉(zhuǎn)步驟208 ;
[0029] 步驟207、讀取參數(shù)修改記錄日志文件,并更新配置數(shù)據(jù)至內(nèi)存節(jié)點參數(shù)樹中;
[0030] 步驟208、同步設(shè)備出廠定制配置信息,更新數(shù)據(jù)到內(nèi)存節(jié)點參數(shù)樹中;
[0031] 步驟209、初始化對象節(jié)點路徑;
[0032] 步驟210、初始化參數(shù)配置節(jié)點路徑和參數(shù)值并進行關(guān)聯(lián);
[0033] 步驟211、保存當(dāng)前內(nèi)存節(jié)點參數(shù)樹配置數(shù)據(jù);
[0034] 步驟212,退出。
[0035] 在上述方法中,家庭網(wǎng)關(guān)的ROM存儲區(qū)存有一份能保證家庭網(wǎng)關(guān)設(shè)備數(shù)據(jù)成功構(gòu) 造的只讀XML配置文件。
[0036] 在上述方法中,步驟300具體包括以下步驟:
[0037] 步驟301、申請開辟預(yù)算大小的內(nèi)存緩沖區(qū),并用一個指針char*buf指向緩沖區(qū) 起始地址,如果申請成功,則轉(zhuǎn)步驟302 ;否則轉(zhuǎn)步驟322 ;
[0038] 步驟302、獲取配置內(nèi)存節(jié)點參數(shù)樹的根節(jié)點,將TR_objeCt*parent指針指向根 節(jié)點,若獲取配置內(nèi)存節(jié)點參數(shù)樹根節(jié)點失敗,則轉(zhuǎn)步驟322 ;否則執(zhí)行步驟303 ;
[0039] 步驟303、獲取當(dāng)前TR_object*parent指針指向?qū)ο蟮呐渲脭?shù)據(jù),且將所述配置 數(shù)據(jù)轉(zhuǎn)換為XML配置文件對象格式字符流,并輸出到臨時緩沖區(qū),將臨時緩沖區(qū)字符流復(fù) 制到指針buf指向的緩沖區(qū),同時該指針buf向后偏移臨時緩沖區(qū)字符流的長度;
[0040] 步驟304、判斷當(dāng)前TR_object*parent類型指針指向的對象節(jié)點是否存在參數(shù)子 節(jié)點,如果存在,則轉(zhuǎn)步驟305 ;否則轉(zhuǎn)步驟309 ;
[0041] 步驟305、將TR_param*param指針指向當(dāng)前TR_ob ject*parent指針指向?qū)ο蟮牡?一個左葉子參數(shù)節(jié)點;
[0042] 步驟306、獲取TR_param*param指針指向的參數(shù)節(jié)點的配置數(shù)據(jù),且將所述參數(shù) 節(jié)點的配置數(shù)據(jù)轉(zhuǎn)換為XML配置文件參數(shù)格式字符流,并輸出到臨時緩沖區(qū),將臨時緩沖 區(qū)字符流復(fù)制到指針buf指向的緩沖區(qū),同時指針buf向后偏移該臨時緩沖區(qū)字符流的長 度;
[0043] 步驟307、判斷TR_param*param指針指向的參數(shù)節(jié)點是否存在下一個兄弟參數(shù)節(jié) 點,如果存在,則轉(zhuǎn)步驟308 ;否則轉(zhuǎn)步驟309 ;
[0044] 步驟308、將TR_param*next指針指向其當(dāng)前指向的參數(shù)節(jié)點的下一個兄弟參數(shù) 節(jié)點,然后轉(zhuǎn)步驟306 ;
[0045] 步驟309、判斷TR_object*parent指針指向的對象節(jié)點是否存在子樹節(jié)點,如果 存在,則轉(zhuǎn)步驟310 ;否則轉(zhuǎn)步驟311 ;
[0046] 步驟310,將 TR_object*next_layer指針指向 TR_object*parent 當(dāng)前指向的對象 節(jié)點的第一個左子樹節(jié)點,然后轉(zhuǎn)步驟303 ;
[0047] 步驟311,按照XML語法要求添加對象節(jié)點結(jié)束符號到臨時緩沖區(qū),將臨時緩沖 區(qū)字符流復(fù)制到指針buf指向的緩沖區(qū),同時指針buf向后偏移該臨時緩沖區(qū)字符流的長 度;
[0048] 步驟312,將TR_object*parent指針指向其當(dāng)前指向的對象節(jié)點的父節(jié)點;
[0049] 步驟313、判斷TR_object*parent指針指向的對象節(jié)點是否為內(nèi)存節(jié)點參數(shù)樹根 節(jié)點,如果是內(nèi)存節(jié)點參數(shù)樹根節(jié)點,則轉(zhuǎn)步驟316 ;否則轉(zhuǎn)步驟314 ;
[0050] 步驟314、判斷TR_object*parent指針指向的對象節(jié)點是否存在右兄弟節(jié)點,如 果存在,則轉(zhuǎn)步驟315 ;否則轉(zhuǎn)步驟311 ;
[0051] 步驟315、將TR_object*next指針指向其當(dāng)前指向的對象節(jié)點的第一個右兄弟節(jié) 點,然后轉(zhuǎn)步驟303 ;
[0052] 步驟316、設(shè)置XML讀寫標(biāo)志為寫狀態(tài),并判斷是否成功設(shè)置為寫狀態(tài),如果不成 功,則轉(zhuǎn)步驟321 ;否則轉(zhuǎn)步驟317 ;
[0053] 步驟317、以寫入模式打開默認(rèn)XML配置文件,并判斷是否成功打開,如果打開失 敗,則轉(zhuǎn)步驟321 ;否則轉(zhuǎn)步驟318 ;
[0054] 步驟318、將緩沖區(qū)字符流寫入XML配置文件,并判斷是否成功寫入,如果寫入不 成功,則轉(zhuǎn)步驟320 ;否則轉(zhuǎn)步驟319 ;
[0055] 步驟319,設(shè)置XML配置文件讀寫標(biāo)志為寫狀態(tài);
[0056] 步驟320,關(guān)閉XML配置文件;
[0057] 步驟321,釋放緩沖區(qū);
[0058] 步驟322,退出。
[0059] 在上述方法中,步驟400具體包括以下步驟:
[0060] 步驟401、家庭網(wǎng)關(guān)重啟后,通過參數(shù)節(jié)點搜索接口判斷當(dāng)前參數(shù)讀寫配置節(jié)點的 全路徑是否存在于內(nèi)存節(jié)點參數(shù)樹中,若存在則轉(zhuǎn)步驟404 ;否則轉(zhuǎn)步驟402 ;
[0061] 步驟402、設(shè)置錯誤碼,同時返回NULL ;
[0062] 步驟403、結(jié)束讀寫操作;
[0063] 步驟404、判斷當(dāng)前需要進行的操作類型是否為讀操作,如果是讀操作,則轉(zhuǎn)步驟 405;否則是寫操作轉(zhuǎn)步驟408;
[0064] 步驟405、調(diào)用通用讀配置接口讀取配置數(shù)據(jù);
[0065] 步驟406、返回獲取得到的配置數(shù)據(jù);
[0066] 步驟407、結(jié)束讀操作;
[0067] 步驟408、調(diào)用通用寫配置接口設(shè)置配置數(shù)據(jù);
[0068] 步驟409、調(diào)用通用設(shè)置接口;
[0069] 步驟410、判斷當(dāng)前設(shè)置的參數(shù)是否已經(jīng)存在于參數(shù)修改記錄鏈表中,若存在則轉(zhuǎn) 步驟414 ;否則轉(zhuǎn)步驟413 ;
[0070] 步驟411、在參數(shù)修改記錄鏈表中分配當(dāng)前參數(shù)設(shè)置節(jié)點空間;
[0071] 步驟412、將需要設(shè)置的參數(shù)值寫入?yún)?shù)修改記錄鏈表;
[0072] 步驟413、將參數(shù)修改記錄鏈表數(shù)據(jù)寫入?yún)?shù)設(shè)置記錄文件;
[0073] 步驟414、結(jié)束寫操作。
[0074] 本發(fā)明基于XML語法規(guī)則設(shè)計保存家庭網(wǎng)關(guān)配置數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),將家庭網(wǎng)關(guān)配 置數(shù)據(jù)的XML配置文件解析并存入上述數(shù)據(jù)結(jié)構(gòu)內(nèi)完成內(nèi)存節(jié)點參數(shù)樹的構(gòu)造,利用內(nèi)存 中的數(shù)據(jù)構(gòu)造出新XML配置文件并寫入家庭網(wǎng)關(guān)的FLASH,利用Linux IPC接口完成配置數(shù) 據(jù)進程間的通信,實現(xiàn)家庭網(wǎng)關(guān)業(yè)務(wù)數(shù)據(jù)的配置管理功能,做到了在參數(shù)信息變化時可以 即時將配置信息保存到FLASH中,簡化配置數(shù)據(jù)加載流程,提高配置數(shù)據(jù)讀寫效率,降低程 序內(nèi)存占有率。
【專利附圖】
【附圖說明】
[0075] 圖1是本發(fā)明基于XML實現(xiàn)家庭網(wǎng)關(guān)數(shù)據(jù)配置管理的方法流程圖;
[0076] 圖2是本發(fā)明中配置數(shù)據(jù)XML存儲文件格式定義示意圖;
[0077] 圖3是本發(fā)明中內(nèi)存節(jié)點參數(shù)樹模型及數(shù)據(jù)結(jié)構(gòu)定義示意圖;
[0078] 圖4是本發(fā)明中構(gòu)造配置數(shù)據(jù)內(nèi)存節(jié)點參數(shù)樹的流程圖;
[0079] 圖5是本發(fā)明中內(nèi)存配置數(shù)據(jù)寫XML文件的流程圖;
[0080] 圖6是本發(fā)明中配置數(shù)據(jù)讀寫操作的流程圖。
【具體實施方式】
[0081] 下面結(jié)合說明書附圖對本發(fā)明做出詳細(xì)的說明。
[0082] 如圖1所示,本發(fā)明提供的基于XML實現(xiàn)家庭網(wǎng)關(guān)數(shù)據(jù)配置管理的方法(遵循 TR069規(guī)范定義家庭網(wǎng)關(guān)配置數(shù)據(jù)文件的數(shù)據(jù)結(jié)構(gòu)),具體包括以下步驟:
[0083] 步驟100、在內(nèi)存中分別定義TR_object和TR_param兩個數(shù)據(jù)結(jié)構(gòu)用于描述XML 配置文件中的對象obj及其屬性信息以及參數(shù)param及其屬性信息,用于構(gòu)造內(nèi)存節(jié)點參 數(shù)樹。
[0084] 如圖2、圖3所示,在內(nèi)存節(jié)點參數(shù)樹中,對象稱為對象節(jié)點,其屬性包括:name (對 象名稱)、rw (對象類型)以及key (對象下所帶參數(shù)節(jié)點是否存在關(guān)鍵參數(shù))和pnoe (動 態(tài)對象實例個數(shù)記錄參數(shù)節(jié)點相對路徑);參數(shù)稱為參數(shù)節(jié)點,其屬性包括:name(參數(shù)名 稱)、rw(參數(shù)讀寫屬性)、type (參數(shù)值存儲類型)、noti_rw(該參數(shù)noti屬性是否可 被修改)、value (參數(shù)值)、key (參數(shù)等級)、dev_func (參數(shù)原子操作函數(shù)在函數(shù)庫中索 引名稱)、sig_noti (參數(shù)在數(shù)據(jù)共享管理中所屬的業(yè)務(wù)類型)、noti (參數(shù)值發(fā)生改變時 候是否主動上報ITMS平臺)、flash_rw(參數(shù)值發(fā)生改變時候是否需要寫FLASH操作)、 accesslist (外部應(yīng)用程序是否可以讀取該參數(shù)的值)。
[0085] 在TR_ob ject數(shù)據(jù)結(jié)構(gòu)設(shè)計中,設(shè)計指針字段TR_param*param用于保存對象節(jié)點 的第一個參數(shù)節(jié)點的地址,若對象節(jié)點下無參數(shù)節(jié)點,則param值NULL ;設(shè)計指針字段TR_ ob ject*parent用于保存對象節(jié)點的父節(jié)點,若對象節(jié)點為樹根節(jié)點,則parent值為NULL ; 設(shè)計指針字段TR_object*next用于保存對象節(jié)點的右兄弟節(jié)點,若對象節(jié)點無右兄弟節(jié) 點,則next值為NULL ;設(shè)計指針字段TR_object*next_layer用于保存對象節(jié)點的第一個 左子樹根節(jié)點,若對象節(jié)點下無子樹節(jié)點,則next_layer值為NULL。
[0086] 在TR_param數(shù)據(jù)結(jié)構(gòu)設(shè)計中,設(shè)計指針字段TR_param*next用于保存參數(shù)節(jié)點 的下一個兄弟參數(shù)節(jié)點,若無下一個兄弟參數(shù)節(jié)點,則next值為NULL ;設(shè)計指針字段TR_ object*parent用于保存參數(shù)節(jié)點的父節(jié)點。
[0087] 參數(shù)節(jié)點在內(nèi)存節(jié)點參數(shù)樹中均被定義為葉子節(jié)點,參數(shù)節(jié)點的父節(jié)點必須是對 象節(jié)點,按照數(shù)據(jù)結(jié)構(gòu)定義,在構(gòu)造內(nèi)存數(shù)據(jù)結(jié)構(gòu)樹的設(shè)計中,兩種數(shù)據(jù)結(jié)構(gòu)中均包含另一 種數(shù)據(jù)結(jié)構(gòu)字段,對象節(jié)點和對象節(jié)點之間、同一對象節(jié)點下的參數(shù)節(jié)點之間以及對象節(jié) 點和對象節(jié)點下的參數(shù)節(jié)點之間均采用鏈表的方式關(guān)聯(lián),從而形成多層次多叉樹,通過根 節(jié)點即可訪問整棵樹。
[0088] 步驟200、將保存在家庭網(wǎng)關(guān)FLASH的XML配置文件中的家庭網(wǎng)關(guān)配置數(shù)據(jù)解析出 來,遍歷解析后的XML配置文件,將其中的對象和參數(shù)以及各自的屬性信息配置到內(nèi)存中 的TR_object、TR_param數(shù)據(jù)結(jié)構(gòu)中,構(gòu)造出內(nèi)存節(jié)點參數(shù)樹。如圖4所示,具體包括以下 步驟:
[0089] 步驟201、獲取默認(rèn)XML配置文件路徑,獲取XML配置文件默認(rèn)的完整性保護讀寫 物?志。
[0090] 步驟202、根據(jù)完整性保護讀寫標(biāo)志是否為0判斷當(dāng)前XML配置文件的完整性, 如果完整性保護讀寫標(biāo)志不為0,則當(dāng)前XML配置文件不完整,轉(zhuǎn)步驟204 ;否則執(zhí)行步驟 203。
[0091] 步驟203、加載當(dāng)前XML配置文件并生成節(jié)點(node)結(jié)構(gòu)樹,如果生成node結(jié)構(gòu) 樹失敗,則轉(zhuǎn)步驟204 ;否則轉(zhuǎn)步驟205。
[0092] 步驟204、按照預(yù)定義的XML備份加載規(guī)則獲取當(dāng)前XML配置文件的冗余備份XML 配置文件,若獲取備份XML配置文件成功,則將備份XML配置文件設(shè)置為當(dāng)前XML配置文 件,轉(zhuǎn)步驟203 ;否則轉(zhuǎn)步驟212。
[0093] 步驟205、利用node結(jié)構(gòu)樹構(gòu)造內(nèi)存節(jié)點參數(shù)樹,如果構(gòu)造成功,則轉(zhuǎn)步驟206 ;否 則轉(zhuǎn)步驟212。
[0094] 步驟206、判斷是否存在參數(shù)修改記錄日志文件,若存在則轉(zhuǎn)步驟207 ;否則轉(zhuǎn)步 驟 208。
[0095] 步驟207、讀取參數(shù)修改記錄日志文件,并更新配置數(shù)據(jù)至內(nèi)存節(jié)點參數(shù)樹中。 [0096] 步驟208、同步設(shè)備出廠定制配置信息,更新數(shù)據(jù)到內(nèi)存節(jié)點參數(shù)樹中。
[0097] 步驟209、初始化對象節(jié)點路徑信息(全局變量objpath),用于高效檢索對象的節(jié) 點路徑信息。
[0098] 步驟210、初始化參數(shù)配置節(jié)點路徑和參數(shù)值等信息(xml_peer全局變量)并進行 關(guān)聯(lián)。
[0099] 步驟211、保存當(dāng)前內(nèi)存節(jié)點參數(shù)樹配置數(shù)據(jù)。
[0100] 步驟212、退出配置加載程序。
[0101] 上述流程中,程序啟動時首先獲取默認(rèn)XML配置文件路徑及默認(rèn)XML配置文件完 整性保護讀寫標(biāo)志,然后根據(jù)默認(rèn)XML配置文件完整性保護讀寫標(biāo)志以及加載默認(rèn)XML配 置文件是否成功決定是否進入步驟204。步驟204中,采用冗余備份方式設(shè)計備份XML配置 文件路徑,且設(shè)計不同的備份讀取規(guī)則以保護和檢驗XML配置文件的完整性和可用性。通 過迭代獲取XML備份文件進行嘗試性讀取,若某一備份讀取成功,則程序正常啟動。在家庭 網(wǎng)關(guān)的ROM存儲區(qū)有一份能保證家庭網(wǎng)關(guān)設(shè)備數(shù)據(jù)成功構(gòu)造的只讀XML配置文件,確保了 家庭網(wǎng)關(guān)在FLASH的ROM存儲區(qū)不損壞情況下,能正常初始化XML配置文件。
[0102] 步驟300、將內(nèi)存節(jié)點參數(shù)樹中的配置數(shù)據(jù)寫回家庭網(wǎng)關(guān)中的FLASH,并保存形成 新XML配置文件,如圖5所示,具體步驟如下:
[0103] 步驟301、調(diào)用系統(tǒng)方法申請開辟預(yù)算大小的內(nèi)存緩沖區(qū),并用一個指針 char*buf指向緩沖區(qū)起始地址,如果申請成功,則轉(zhuǎn)步驟302 ;否則轉(zhuǎn)步驟322。
[0104] 步驟302、獲取配置內(nèi)存節(jié)點參數(shù)樹根節(jié)點,將TR_object*parent指針指向根節(jié) 點,若獲取配置內(nèi)存節(jié)點參數(shù)樹根節(jié)點失敗,則轉(zhuǎn)步驟322 ;否則執(zhí)行步驟303。
[0105] 步驟303、獲取當(dāng)前TR_object*parent指針指向?qū)ο蟮呐渲脭?shù)據(jù),且將該指針指 向?qū)ο蟮呐渲脭?shù)據(jù)按照特定算法轉(zhuǎn)換為XML配置文件對象格式字符流輸出到臨時緩沖區(qū), 將臨時緩沖區(qū)字符流復(fù)制到指針buf指向的緩沖區(qū),同時指針buf向后偏移臨時緩沖區(qū)該 字符流的長度。
[0106] 步驟304、判斷當(dāng)前TR_object*parent指針指向?qū)ο蟮墓?jié)點是否存在參數(shù)子節(jié) 點,如果存在,則轉(zhuǎn)步驟305 ;否則轉(zhuǎn)步驟309。
[0107] 步驟305、將TR_param*param指針指向當(dāng)前TR_ob ject*parent指針指向?qū)ο蟮牡?一個左葉子參數(shù)節(jié)點。
[0108] 步驟306、獲取當(dāng)前TR_param*param指針指向參數(shù)節(jié)點的配置數(shù)據(jù),且將TR_ param*param指針指向的參數(shù)節(jié)點配置數(shù)據(jù)按照特定算法轉(zhuǎn)換為XML配置文件參數(shù)格式字 符流輸出到臨時緩沖區(qū),將臨時緩沖區(qū)字符流復(fù)制到指針buf指向的緩沖區(qū),同時指針buf 向后偏移臨時緩沖區(qū)該字符流的長度。
[0109] 步驟307、判斷TR_param*param指針指向的參數(shù)節(jié)點是否存在下一個兄弟參數(shù)節(jié) 點,如果存在,則轉(zhuǎn)步驟308 ;否則轉(zhuǎn)步驟309。
[0110] 步驟308、將TR_param*next指針指向當(dāng)前TR_param*param指針指向的參數(shù)節(jié)點 的下一個兄弟參數(shù)節(jié)點,然后轉(zhuǎn)步驟306。
[0111] 步驟309、判斷TR_object*parent指針指向的對象節(jié)點是否存在子樹節(jié)點,如果 存在,則轉(zhuǎn)步驟310 ;否則轉(zhuǎn)步驟311。
[0112] 步驟310、將TR_object*next_laye指針指向當(dāng)前指向的對象節(jié)點的第一個左子 樹節(jié)點,然后轉(zhuǎn)步驟303。
[0113] 步驟311、按照XML語法要求添加對象節(jié)點結(jié)束符號到臨時緩沖區(qū),將臨時緩沖區(qū) 字符流復(fù)制到指針buf指向的緩沖區(qū),同時指針buf向后偏移臨時緩沖區(qū)該字符流的長度。
[0114] 步驟312、將TR_object*parent指針指向其當(dāng)前指向的對象節(jié)點的父節(jié)點。
[0115] 步驟313、判斷TR_object*parent指針指向的對象節(jié)點是否為內(nèi)存節(jié)點參數(shù)樹根 節(jié)點,如果是內(nèi)存節(jié)點參數(shù)樹根節(jié)點,則轉(zhuǎn)步驟316 ;否則轉(zhuǎn)步驟314。
[0116] 步驟314、判斷TR_object*parent指針指向的對象節(jié)點是否存在右兄弟節(jié)點,如 果存在,則轉(zhuǎn)步驟315 ;否則轉(zhuǎn)步驟311。
[0117] 步驟315、將TR_ob ject*next指針指向當(dāng)前TR_ob ject*parent指針指向的對象節(jié) 點的第一個右兄弟節(jié)點,然后轉(zhuǎn)步驟303。
[0118] 步驟316、設(shè)置XML讀寫標(biāo)志為寫狀態(tài),即設(shè)置為1,并判斷是否成功設(shè)置為寫狀 態(tài),如果不成功,則轉(zhuǎn)步驟321 ;否則轉(zhuǎn)步驟317。
[0119] 步驟317、以寫入模式打開默認(rèn)XML配置文件,并判斷是否成功打開,如果打開失 敗,則轉(zhuǎn)步驟321 ;否則轉(zhuǎn)步驟318。
[0120] 步驟318、將緩沖區(qū)字符流寫入XML配置文件,并判斷是否成功寫入,如果寫入不 成功,則轉(zhuǎn)步驟320 ;否則轉(zhuǎn)步驟319。
[0121] 步驟319、設(shè)置XML配置文件讀寫標(biāo)志為讀狀態(tài),即設(shè)置為0。
[0122] 步驟320、關(guān)閉XML配置文件。
[0123] 步驟321、釋放緩沖區(qū)。
[0124] 步驟322、退出寫XML配置文件程序。
[0125] 步驟400、家庭網(wǎng)關(guān)重啟后重新讀取FLASH中的新XML配置文件,進行配置管理,如 圖6所示,具體包括以下步驟 :
[0126] 步驟401、內(nèi)存中收到外部發(fā)送的配置管理命令并且解析檢查后,調(diào)用參數(shù)節(jié)點搜 索接口判斷當(dāng)前參數(shù)讀寫配置節(jié)點的全路徑是否存在于內(nèi)存節(jié)點參數(shù)樹中,若存在則轉(zhuǎn)步 驟404 ;否則轉(zhuǎn)步驟402。
[0127] 步驟402、設(shè)置錯誤碼,同時返回NULL。
[0128] 步驟403、退出配置讀寫程序,結(jié)束讀寫操作。
[0129] 步驟404、判斷當(dāng)前需要進行的操作類型是否為讀操作,如果是讀操作,則轉(zhuǎn)步驟 405 ;否則是寫操作轉(zhuǎn)步驟408。
[0130] 步驟405、調(diào)用通用讀配置接口 dev_func讀取配置數(shù)據(jù)。
[0131] 步驟406、返回獲取得到的配置數(shù)據(jù)。
[0132] 步驟407、退出讀參數(shù)程序,結(jié)束讀操作。
[0133] 步驟408、調(diào)用通用寫配置接口 deV_func設(shè)置配置數(shù)據(jù)。
[0134] 步驟409、調(diào)用通用設(shè)置接口。
[0135] 步驟410、判斷當(dāng)前設(shè)置的配置參數(shù)是否已經(jīng)存在于參數(shù)修改記錄鏈表中,若存在 則轉(zhuǎn)步驟414 ;否則轉(zhuǎn)步驟413。
[0136] 步驟411、在參數(shù)修改記錄鏈表中分配當(dāng)前參數(shù)設(shè)置節(jié)點空間。
[0137] 步驟412、將需要設(shè)置的參數(shù)值寫入?yún)?shù)修改記錄鏈表。
[0138] 步驟413、將參數(shù)修改記錄鏈表數(shù)據(jù)寫入?yún)?shù)設(shè)置記錄文件。
[0139] 步驟414、退出寫參數(shù)程序,結(jié)束寫操作。
[0140] 本發(fā)明不局限于上述最佳實施方式,任何人應(yīng)該得知在本發(fā)明的啟示下作出的結(jié) 構(gòu)變化,凡是與本發(fā)明具有相同或相近的技術(shù)方案,均落入本發(fā)明的保護范圍之內(nèi)。
【權(quán)利要求】
1. 基于XML實現(xiàn)家庭網(wǎng)關(guān)數(shù)據(jù)配置管理的方法,其特征在于,包括以下步驟: 步驟100、在內(nèi)存中分別定義TR_object和TR_param兩個數(shù)據(jù)結(jié)構(gòu); 步驟200、加載并遍歷家庭網(wǎng)關(guān)的XML配置文件,將其中的對象和參數(shù)以及各自的屬性 信息配置到內(nèi)存中的TR_〇bjeCt、TR_param數(shù)據(jù)結(jié)構(gòu)中,構(gòu)造出內(nèi)存節(jié)點參數(shù)樹; 步驟300、將內(nèi)存節(jié)點參數(shù)樹中的配置數(shù)據(jù)寫回家庭網(wǎng)關(guān)的FLASH中,并保存形成新 XML配置文件; 步驟400、家庭網(wǎng)關(guān)重啟后重新讀取FLASH中的新XML配置文件,進行配置管理。
2. 如權(quán)利要求1所述的方法,其特征在于,所述TR_〇b ject數(shù)據(jù)結(jié)構(gòu)包括: 指針字段TR_param*param,用于保存對象節(jié)點的第一個參數(shù)節(jié)點的地址,若對象節(jié)點 下無參數(shù)節(jié)點,則param值為NULL ; 指針字段TR_ob ject*parent,用于保存對象節(jié)點的父節(jié)點,若對象節(jié)點為樹根節(jié)點,貝U parent 值為 NULL ; 指針字段TR_object*next,用于保存對象節(jié)點的右兄弟節(jié)點,若對象節(jié)點無右兄弟節(jié) 點,則next值為NULL ; 指針字段TR_ob ject*next_layer,用于保存對象節(jié)點的第一個左子樹節(jié)點,若對象節(jié) 點下無子樹節(jié)點,則next_layer值為NULL ; 所述TR_param數(shù)據(jù)結(jié)構(gòu)包括: 指針字段TR_param*next,用于保存參數(shù)節(jié)點的下一個兄弟參數(shù)節(jié)點,若無下一個兄弟 參數(shù)節(jié)點,則next值為NULL ; 指針字段TR_object*parent,用于保存參數(shù)節(jié)點的父節(jié)點。
3. 如權(quán)利要求1所述的方法,其特征在于,在構(gòu)建內(nèi)存節(jié)點參數(shù)樹過程中,參數(shù)配置節(jié) 點在樹中均被定義為葉子節(jié)點,參數(shù)配置節(jié)點的父節(jié)點必須是對象節(jié)點,對象節(jié)點和對象 節(jié)點之間、同一對象節(jié)點下的參數(shù)節(jié)點之間以及對象節(jié)點和對象節(jié)點下的參數(shù)節(jié)點之間均 采用鏈表的方式關(guān)聯(lián)。
4. 如權(quán)利要求1所述的方法,其特征在于,步驟200具體包括以下步驟: 步驟201、獲取默認(rèn)XML配置文件路徑,獲取XML配置文件的默認(rèn)完整性保護讀寫標(biāo) 志; 步驟202、根據(jù)完整性保護讀寫標(biāo)志是否為0判斷當(dāng)前XML配置文件的完整性,如果完 整性保護讀寫標(biāo)志不為0,則當(dāng)前XML配置文件不完整,轉(zhuǎn)步驟204 ;否則執(zhí)行步驟203 ; 步驟203、加載當(dāng)前XML配置文件并生成節(jié)點結(jié)構(gòu)樹,如果生成節(jié)點結(jié)構(gòu)樹失敗,則轉(zhuǎn) 步驟204 ;否則轉(zhuǎn)步驟205 ; 步驟204、按照預(yù)定義的XML備份加載規(guī)則獲取當(dāng)前XML配置文件的冗余備份XML配置 文件,若獲取備份XML配置文件成功,則將備份XML配置文件設(shè)置為當(dāng)前XML配置文件,轉(zhuǎn) 步驟203 ;否則轉(zhuǎn)步驟212 ; 步驟205、利用節(jié)點結(jié)構(gòu)樹構(gòu)造內(nèi)存節(jié)點參數(shù)樹,如果構(gòu)造成功,則轉(zhuǎn)步驟206 ;否則轉(zhuǎn) 步驟212 ; 步驟206、直接判斷是否存在參數(shù)修改記錄日志文件,若存在則轉(zhuǎn)步驟207 ;否則轉(zhuǎn)步 驟 208 ; 步驟207、讀取參數(shù)修改記錄日志文件,并更新配置數(shù)據(jù)至內(nèi)存節(jié)點參數(shù)樹中; 步驟208、同步設(shè)備出廠定制配置信息,更新數(shù)據(jù)到內(nèi)存節(jié)點參數(shù)樹中; 步驟209、初始化對象節(jié)點路徑; 步驟210、初始化參數(shù)配置節(jié)點路徑和參數(shù)值并進行關(guān)聯(lián); 步驟211、保存當(dāng)前內(nèi)存節(jié)點參數(shù)樹配置數(shù)據(jù); 步驟212,退出。
5. 如權(quán)利要求4所述的方法,其特征在于,家庭網(wǎng)關(guān)的ROM存儲區(qū)存有一份能保證家庭 網(wǎng)關(guān)設(shè)備數(shù)據(jù)成功構(gòu)造的只讀XML配置文件。
6. 如權(quán)利要求2所述的方法,其特征在于,步驟300具體包括以下步驟: 步驟301、申請開辟預(yù)算大小的內(nèi)存緩沖區(qū),并用一個指針char*buf指向緩沖區(qū)起始 地址,如果申請成功,則轉(zhuǎn)步驟302 ;否則轉(zhuǎn)步驟322 ; 步驟302、獲取配置內(nèi)存節(jié)點參數(shù)樹的根節(jié)點,將TR_object*parent指針指向根節(jié)點, 若獲取配置內(nèi)存節(jié)點參數(shù)樹根節(jié)點失敗,則轉(zhuǎn)步驟322 ;否則執(zhí)行步驟303 ; 步驟303、獲取當(dāng)前TR_object*parent指針指向?qū)ο蟮呐渲脭?shù)據(jù),且將所述配置數(shù)據(jù) 轉(zhuǎn)換為XML配置文件對象格式字符流,并輸出到臨時緩沖區(qū),將臨時緩沖區(qū)字符流復(fù)制到 指針buf指向的緩沖區(qū),同時該指針buf向后偏移臨時緩沖區(qū)字符流的長度; 步驟304、判斷當(dāng)前TR_object*parent類型指針指向的對象節(jié)點是否存在參數(shù)子節(jié) 點,如果存在,則轉(zhuǎn)步驟305 ;否則轉(zhuǎn)步驟309 ; 步驟305、將TR_param*param指針指向當(dāng)前TR_ob ject*parent指針指向?qū)ο蟮牡谝粋€ 左葉子參數(shù)節(jié)點; 步驟306、獲取TR_param*param指針指向的參數(shù)節(jié)點的配置數(shù)據(jù),且將所述參數(shù)節(jié)點 的配置數(shù)據(jù)轉(zhuǎn)換為XML配置文件參數(shù)格式字符流,并輸出到臨時緩沖區(qū),將臨時緩沖區(qū)字 符流復(fù)制到指針buf指向的緩沖區(qū),同時指針buf向后偏移該臨時緩沖區(qū)字符流的長度; 步驟307、判斷TR_param*param指針指向的參數(shù)節(jié)點是否存在下一個兄弟參數(shù)節(jié)點, 如果存在,則轉(zhuǎn)步驟308 ;否則轉(zhuǎn)步驟309 ; 步驟308、將TR_param*next指針指向其當(dāng)前指向的參數(shù)節(jié)點的下一個兄弟參數(shù)節(jié)點, 然后轉(zhuǎn)步驟306 ; 步驟309、判斷TR_object*parent指針指向的對象節(jié)點是否存在子樹節(jié)點,如果存在, 則轉(zhuǎn)步驟310 ;否則轉(zhuǎn)步驟311 ; 步驟310,將TR_ob ject*next_layer指針指向TR_ob ject*parent當(dāng)前指向的對象節(jié)點 的第一個左子樹節(jié)點,然后轉(zhuǎn)步驟303 ; 步驟311,按照XML語法要求添加對象節(jié)點結(jié)束符號到臨時緩沖區(qū),將臨時緩沖區(qū)字符 流復(fù)制到指針buf指向的緩沖區(qū),同時指針buf向后偏移該臨時緩沖區(qū)字符流的長度; 步驟312,將TR_object*parent指針指向其當(dāng)前指向的對象節(jié)點的父節(jié)點; 步驟313、判斷TR_object*parent指針指向的對象節(jié)點是否為內(nèi)存節(jié)點參數(shù)樹根節(jié) 點,如果是內(nèi)存節(jié)點參數(shù)樹根節(jié)點,則轉(zhuǎn)步驟316 ;否則轉(zhuǎn)步驟314 ; 步驟314、判斷TR_object*parent指針指向的對象節(jié)點是否存在右兄弟節(jié)點,如果存 在,則轉(zhuǎn)步驟315 ;否則轉(zhuǎn)步驟311 ; 步驟315、將TR_object*next指針指向其當(dāng)前指向的對象節(jié)點的第一個右兄弟節(jié)點, 然后轉(zhuǎn)步驟303 ; 步驟316、設(shè)置XML讀寫標(biāo)志為寫狀態(tài),并判斷是否成功設(shè)置為寫狀態(tài),如果不成功,則 轉(zhuǎn)步驟321 ;否則轉(zhuǎn)步驟317 ; 步驟317、以寫入模式打開默認(rèn)XML配置文件,并判斷是否成功打開,如果打開失敗,則 轉(zhuǎn)步驟321 ;否則轉(zhuǎn)步驟318 ; 步驟318、將緩沖區(qū)字符流寫入XML配置文件,并判斷是否成功寫入,如果寫入不成功, 則轉(zhuǎn)步驟320 ;否則轉(zhuǎn)步驟319 ; 步驟319,設(shè)置XML配置文件讀寫標(biāo)志為寫狀態(tài); 步驟320,關(guān)閉XML配置文件; 步驟321,釋放緩沖區(qū); 步驟322,退出。
7.如權(quán)利要求1所述的方法,其特征在于,步驟400具體包括以下步驟: 步驟401、收到外部發(fā)送的配置管理命令并且解析檢查后,調(diào)用參數(shù)節(jié)點搜索接口判斷 當(dāng)前參數(shù)讀寫配置節(jié)點的全路徑是否存在于內(nèi)存節(jié)點參數(shù)樹中,若存在則轉(zhuǎn)步驟404;否 則轉(zhuǎn)步驟402 ; 步驟402、設(shè)置錯誤碼,同時返回NULL ; 步驟403、結(jié)束讀寫操作; 步驟404、判斷當(dāng)前需要進行的操作類型是否為讀操作,如果是讀操作,則轉(zhuǎn)步驟405 ; 否則是寫操作轉(zhuǎn)步驟408 ; 步驟405、調(diào)用通用讀配置接口讀取配置數(shù)據(jù); 步驟406、返回獲取得到的配置數(shù)據(jù); 步驟407、結(jié)束讀操作; 步驟408、調(diào)用通用寫配置接口設(shè)置配置數(shù)據(jù); 步驟409、調(diào)用通用設(shè)置接口; 步驟410、判斷當(dāng)前設(shè)置的參數(shù)是否已經(jīng)存在于參數(shù)修改記錄鏈表中,若存在則轉(zhuǎn)步驟 414 ;否則轉(zhuǎn)步驟413 ; 步驟411、在參數(shù)修改記錄鏈表中分配當(dāng)前參數(shù)設(shè)置節(jié)點空間; 步驟412、將需要設(shè)置的參數(shù)值寫入?yún)?shù)修改記錄鏈表; 步驟413、將參數(shù)修改記錄鏈表數(shù)據(jù)寫入?yún)?shù)設(shè)置記錄文件; 步驟414、結(jié)束寫操作。
【文檔編號】G06F17/30GK104158692SQ201410422845
【公開日】2014年11月19日 申請日期:2014年8月25日 優(yōu)先權(quán)日:2014年8月25日
【發(fā)明者】余仁春, 祝振東 申請人:烽火通信科技股份有限公司