前面大致上已經交代過 TR-069、ACS與CPE之前是如何工作的? 同時也看過了 ACS 如何知道 CPE 有哪些參數可以提供的。所以這篇就要看如何讀取或設定這些參數。
四、ACS讀取CPE的資訊(GetParameterValues)
前面看過的是GetParameterNames,現在要看GetParameterValues,就是要讀出參數的值。先看例子,這是CPE對ACS的回應:
<soap:Body>
<cwmp:GetParameterValuesResponse>
<ParameterList soap-enc:arrayType="cwmp:ParameterValueStruct[1]">
<ParameterValueStruct>
<Name>Device.ManagementServer.URL</Name>
<Value xsi:type="xsd:string">http://someacs.tr69.com:9999/acs/</Value>
</ParameterValueStruct>
</ParameterList>
</cwmp:GetParameterValuesResponse>
</soap:Body>
CPE 要依照ACS要求的參數值,回傳Name/Value的對子給ACS。對子可以是完整(complete)、非完整(partial)或是混合的形式。
五、ACS設定CPE中的資訊 (SetParameterValues)
ACS用來對於設定CPE的參數。永遠都是完整路徑(Complete Path),ACS 發送設定如下:
<soap:Body>
<cwmp:SetParameterValues>
<ParameterList soap-enc:arrayType="cwmp:ParameterValueStruct[1]">
<ParameterValueStruct>
<Name>Device.ManagementServer.URL</Name>
<Value xsi:type="xsd:string">http://someacs.tr69.com:9999/acs/</Value>
</ParameterValueStruct>
</ParameterList>
</cwmp:SetParameterValuesResponse>
</soap:Body>
CPE 回應設定成功:
<soap:Body>
<cwmp:SetParameterValuesResponse>
<Status>0</Status>
</cwmp:SetParameterValuesResponse>
</soap:Body>
這裡回傳的Status Tag,在很多CPE回應ACS的呼叫當中 (諸如SetParameterValues, AddObject, DeleteObject與 Download) ,CPE Response的時候,都會用到“Status”這個參數。
<Status> = “0” 代表說改變將會立刻被執行。
Status如果是“1”代表說改變將會在CPE重新啟動之後,才會被執行生效。注意這裡,如果是Reboot才會生效,代表沒有Reboot,設定就會不會生效。所以CPE與ACS之間,最好透過Status做溝通,ACS要決定CPE要不要立刻Reboot。例如設定完成之後,如果CPE回應"1",ACS也許要發送"Rebbot"命令給CPE。
六、GetParameterAttributes與SetParameterAttributes
CWMP 的GetParameterAttributes/SetParameterAttributes都可以有兩個XML屬性(attributes):Notification 與 Access List。
SetParameterAttributes RPC用來設定參數,有五個參數,包含:
- Name :可以是完整路徑(Complete Path)或部分路徑(Partial Path)。
- NotificationChange
- Notification
- AccessListChange
- AccessList
直接看一下例子:
ACS 發送設定如下:
<soap:Body>
<cwmp:SetParameterAttributes>
<ParameterList soap-enc:arrayType="cwmp:SetParameterAttributes[1]">
<SetParameterAttributesStruct>
<Name>Device.WiFi.SSID.2.Name</Name>
<NotificationChange></NotificationChange>
<Notification></Notification>
<AccessListChange></AccessListChange>
<AccessList soap-enc:arrayType="cwmp:string[0]"></AccessList>
</SetParameterAttributesStruct>
</ParameterList>
</cwmp:SetParameterAttributes>
</soap:Body>
SetParameterAttributes RPC帶有5個參數。第一個是”NAME”,包含參數路徑,與GetParameterNames一樣,它可以是完整路徑(Complete Path)或部分路徑(Partial Path)。SetParameterAttributes中的Partial Path通常用於設置被動通知(Passive Notification)或刪除通知”Removing Notification)。如果裝置數量太多,又去設定Active Notification可能很危險,因此很多參數都會設成“canDeny”,意味著這些參數將會拒絕被設定為“Active Notification”,就是說設Active也沒有用。
接下來的參數是NotificationChange和Notification。 NotificationChange為true表示CPE應將Notification參數中的值進行設定;如果為false,則應該忽略Notification中的值。
“Notification”用於設定參數的通知規則。它是0到6的數字。0到2是基本通知機制,3到6是“輕量”通知。在TR-069中,當通過ACS以外的任何機制,更改用於通知的參數集時,將使用“4 VALUE CHANGE” 的事件代碼(Event code)。這些條件將使用SetParameterAttributes RPC來進行設置。
0到的基本通知機制,代表Active (2), Passive (1), or None (0)三個通知機制。說明如下:
0: 設定參數為None,“No” notification會移除任何之前所有通知設定,可以拒絕或忽略之前發出的“Forced Active”參數。後面還有詳細的討論。
1.設定參數為 Passive (被動):為“Passive”通知設置參數意味著,如果參數值更改,則CPE必須在其下一個通知ACS的RPC中,包括4 VALUE CHANGE事件和更改的參數值。它不會立即啟動連接,而是會在下一個最方便的時間(例如在定期通知期間或在連接請求之後)發送通知。
設置“Passive”(被動)通知,並不會拒絕任何參數,但是,對於為“Forced Inform(強制通知)” 或 “Forced Actiive(強制主動)”通知設置的參數,可以將其忽略。
2.設定參數為 Active (主動): 為“Active”通知設置參數意味著,如果參數值更改,則CPE必須立即啟動CWMP對話,以將更改通知ACS,包括4 VALUE CHANGE事件代碼和參數值,透過RPC通知CPE。根據CPE端的判斷,對於瞬態或經常更改的參數,可以拒絕激活通知的設置。例如,在“Uptime”參數上,設置”Active”通知,由於Uptime會不斷變化,將會導致無休止的CWMP會話!
這些參數不能更改或具有預設值的特性。在Data Model中定義的這些包括“Forced Inform”, “Forced Active”, 與 “Default Active” notification。
- ”Forced Inform”:參數是每個Inform RPC中,必須包含的參數。
- “Forced Active”:強制啟動通知參數,必須設定為”Active”通知,否則應忽略請求。
- “Default Active”:強制將屬性設為出廠時的預設值。
下兩個參數是AccessListChange和AccessList屬性。 AccessListChange具有與NotificationChange相同的目的。 CPE必須僅了解AccessList的“ Subscriber”的值,但是無論ACS設置了什麼,它都必須存儲該值。
CPE對於SetParameterAttributes Response 不包含任何參數。
GetParameterAttributes RPC非常簡單,並且像GetParameterValues一樣採用類似的ParameterNames參數。 GetParameterValuesResponse包含ParameterAttributeStruct對象的ParameterList數組,其中包括參數的名稱及其Notification和AccessList的值。
七、AddObject/DeleteObject
這個功能其實有些難以理解,雖然也找到例子,但還是不懂要如何運作? 我先隨便寫寫,以後如果弄得更清楚的時候,再來修改。
CPE數據模型中的“Object”是可以由ACS配置的功能性元素。使用SetParameterValues RPC配置對象的參數時,ACS可以使用AddObject RPC來創建一個Object到CPE中,並使用DeleteObject RPC將其刪除。
AddObject
下面是ACS發出AddObject的例子:
<soapenv:Body>
<cwmp:AddObject>
<ObjectName>InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.1.PortMapping.</ObjectName>
<ParameterKey>3544041</ParameterKey>
</cwmp:AddObject>
</soapenv:Body>
AddObject RPC具有兩個參數。第一個是Object名稱(Name),它必須包含一個Object的路徑;那是一個以“點”作為結尾的路徑。該Object自然必須是可以在CPE之中被創建的,並且在Data Model當中,已經開啟了允許寫入的權力。如果不是,則AddObject的要求,CPE會回應這是一個無效參數(Invalid Arguments)或無效參數名稱錯誤(Invalid Parameter Name error)。
就像SetParameterValues中一樣,第二個參數是ParameterKey,用於將此RPC與ACS內部關聯的策略相關聯。CPE收到此值後,必須要更新CPE中Device.ManagementServer.ParameterKey的值。
當Object創建時,所有相關的參數都必須設置為預設值。如果無法完成此操作,則AddObject RPC必須失敗。
下面是CPE的回應例子:
<SOAP-ENV:Body SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<cwmp:AddObjectResponse>
<InstanceNumber>4</InstanceNumber>
<Status>0</Status>
</cwmp:AddObjectResponse>
</SOAP-ENV:Body>
AddObjectResponse包含兩個參數。 InstanceNumber和Status。
Status參數的操作與SetParamterValues中的操作相同。如果將其設置為0,則可以認為Object已被添加並已經生效。如果將其設置為1,則CPE需要執行一些其他操作才能完成更改(通常是CPE重新啟動)。
上面例子中Object會回應一個數字(上例中是"4")的InstanceNumber。這是一個unsigned Int,可以採用1到2 ^ 32-1之間的值。這數字用於標識Object,指定後該編號就無法再更改,並且在該類型的現有Object List中必須唯一。刪除Object後,新的Object不應使用先前分配的標識符號。
DeleteObject
DeleteObject RPC使用與AddObject相同的兩個參數。但是,ObjectName中的參數路徑必須以特定的實例標識符結尾,後面用“點”來結尾。這表示要刪除的特定對象。
DeleteObjectResponse只有一個參數”Status”,使用方式與前面的規則類似。
八、Reboot
ACS使用Reboot RPC來要求CPE重新啟動。
Reboot RPC僅使用一個參數 CommandKey。 該CPE的回應則不包含任何參數。文件上說,基本上不應該強迫CPE升級軟體,又重新開機,但是在除錯的過程中,遠端重開機的確是常見的行為。
CPE重啟後,必須盡快啟動與ACS的對話(Session)。 該對話中的Inform RPC包含“1-BOOT” Event,還包含 “M Reboot” Event。 這告訴ACS會話是由於設備重新啟動,是由於ACS之前的Reboot要求而進行的(此重新啟動是由於ACS發出Reboot RPC所致)。
CPE開機後,所發出的訊息如下:
<soap:Body>
<cwmp:Inform>
<Event soap-enc:arrayType="cwmp:EventStruct[1]">
<EventStruct>
<EventCode>1 BOOT</EventCode>
</EventStruct>
</Event>
<EventStruct>
<EventCode>M Reboot</EventCode>
<CommandKey>123456</CommandKey>
</EventStruct>
</cwmp:Inform>
</soap:Body>
ACS另外一個讓CPE進入可以完全控制的狀態的是用FactoryReset。 這是一個Optional的RPC,Response 沒有參數,應謹慎使用,因為“FactoryReset”不是一個明確定義的狀態,通常只能在已經完整測試過的環境中才能使用。
九、Download
ACS要求CPE進行一個下載 (download),通常是因為
1. 新版本的Firmware更新。
2.某一個檔案需要跟新,或是管理網頁需要更新。
ACS的命令可以要求立刻執行或是等一下再執行。
更新完成之後,CPE要用“M Download” and “7 TRANSFER COMPLETE” events,回應ACS。
CPE必須要更新完成之後,才能通知ACS。
十、Faults
如果失敗的話,SOAP要負責處理,所有的失敗原因編號,可以參考A.5 of TR-069a2的A.5。
CPE的失敗代碼(fault codes)是9000系列。
ACS的失敗代碼(fault codes)是8000系列。
結尾
還有一些RPC我們沒有介紹:
- Upload – triggers an upload by the CPE to a specified location
- ScheduledInform – schedules a CWMP session for a particular time and triggers the “3 SCHEDULED” event
- FactoryReset
- GetAllQueuedTransfers – returns the current uploads/downloads waiting to complete
這大家可以自己找文件看一下;如果你有仔細看我這兩篇文章,再回頭看英文版本,應該就會非常清楚TR-069工作的原理。文件的位置在下面的URL,有了概念之後,再看這篇文章,真的不難。
https://www.broadband-forum.org/technical/download/TR-069_Amendment-5.pdf
此外,我也沒有介紹Data Model的部份。因為這部份的資料也是非常的多,但是就是把許多的CPE參數,依照不同的裝置特性,做了一個詳細的規範:
TR-098
Amendment 2
Internet Gateway Device Version 1.1 Data Model
for TR-069 (2008)
TR-106 Amendment 7 Data Model Template for TR-069-Enabled Devices (2013)
TR-181i2a9 Device Data Model for TR-069 (2014)
TR-143 Enabling Network Throughput Performance Tests and Statistical Monitoring (2015)
暫時就寫到這裡了!!!
沒有留言:
張貼留言