背景介紹
隨著資訊產業的飛速發展,廣域網路上承載的業務種類和業務量在不斷增大,規模也不斷在擴大,大量的終端接入裝置被廣泛應用,需要對這些使用者側裝置(CPE)進行有效管理。
傳統上,使用者測裝置無論是在最開始安裝的時候,還是在後期運行中的業務配置變更,或是出現故障需要維護的時候,都需要通過管理介面對裝置進行配置或是診斷。裝置大都提供在LAN側的管理配置介面和介面,因此傳統的做法是電訊廠商的維護人員上門進行安裝或調試裝置,通過LAN側管理介面做一些裝置配置或故障診斷的工作。但是,這種一對一的人工服務方式顯然運行效率不高而且需要花費大量的人力。隨著業務的開展,將會有大量的裝置需要安置在使用者家中,採用人工方式對這些裝置進行維護和管理將會成為一個巨大的負擔。而廣域網路的分支裝置一般位置比較分散,Telnet、SSH、SNMP(簡易網路管理通訊協定)、遠程Web登入等傳統的遠端管理方式具有很多的局限性:如多廠商的裝置命令列、SNMP不一致,裝置地址經常變化,終端位於NAT Gateway之後,SNMP基於UDP協議導致傳輸不可靠,不同裝置的Web介面及配置方式各異,無法對大量的CPE進行批量自動化管理,等等。
在這樣的背景下,DSL論壇(Digital Subscriber Line數字使用者環路,現已更名為Broadband論壇)於2004年5月推出TR069協議,通常被稱為使用者終端裝置廣域網路管理協議(CWMP,CPE WAN Management Protocol)。TR069協議和其他相關協議一起定義了一套全新的網管體繫結構,包括管理模型、互動介面及基本的管理參數。 TR069主要功能
TR069協議描述了一種機制,建立ACS對CPE進行安全的自動化組態管理的架構,同時將它的CPE管理功能添加到這個架構中。目的是要實現以下多種功能,從而能夠管理一個CPE或者CPE的集合。 提供自動設定和動態服務: 該機制涉及到的參數既有一般規定的參數,也可以包含使用者自訂的參數,為軟體實現留有更大的自主空間。 軟體和韌體鏡像檔案管理: CPE可以下載和上傳檔案,協議提供了檢查軟體或者韌體的版本的方法,還可以對簽名資料檔案進行處理。在檔案傳輸結束後,通知ACS,返回成功或者失敗。 診斷: TR069協議為CPE產生有效診斷資訊提供支援,ACS可以使用這些資訊來診斷和解決連通或業務問題,同時提供執行預先定義好的診斷測試能力。 警示: CPE主動發送附隨報告來實現裝置的即時警示。 穿越NAT串連: TR069本身允許ACS管理NAT後的裝置,但限制了ACS不能主動發起會話。TR111的機制則是對TR069這部分的補充,可以使ACS主動發起會話。初始安裝時,CPE會自動尋找ACS伺服器(CPE出廠時配置一個預設的URL地址,使用者將該地址指向ACS伺服器),建立串連後即可與ACS通訊、下載配置等,可完美解決NAT Gateway之後的管理難題。 TR069協議介紹 TR-069網路架構
在TR069定義的管理模型中,主要包括兩類邏輯裝置:受管理的使用者裝置(CPE,Customer Premises Equipment)和自動設定伺服器(ACS,Auto-Configuration Servers)。TR069的核心思想是通過定義一套ACS和CPE之間自動協商互動協議,實現終端的自動設定過程。下圖描述了TR069協議在自動設定網路構架中的定位。ACS與CPE之間的介面為南向介面,ACS與第三方網管系統、業務管理系統之間的介面為北向介面。TR069協議主要定義了南向介面標準。
協議棧結構
協議層 |
描述 |
CPE/ACS Management Application |
應用可以在CPE和ACS端分別實現CWMP協議,應用可以進行本地的定義,而不必是CWMP的一部分 |
RPC Methods |
在CWMP中定義的各種RPC方法,實現ACS與CPE之間的互動 |
SOAP |
編碼遠端程序呼叫的基於XML文法的標準,避免了與防火牆的衝突 |
HTTP |
HTTP 1.1 |
SSL/TLS |
標準的互連網傳輸層安全性通訊協定(可選) |
TCP/IP |
標準的TCP/IP |
- RPC:遠端程序呼叫是一種通過網路從遠端電腦程式上請求服務,而不需要瞭解底層網路技術的協議。TR069為CPE定義了9種基本RPC方法,6種可選RPC方法;為ACS定義了2種基本RPC方法,2種可選的的RPC方法(CPE方法,CPE裝置支援,可以被ACS調用;ACS方法,ACS裝置支援,可以被CPE調用)。此外,TR069還對RPC方法中使用的資料類型做了定義,只能使用SOAP定義的的資料類型中的部分。
- SOAP、HTTP:在Internet環境下實現分布式組件互操作有一個很重要的問題需要解決,那就是所謂的防火牆問題。大多數的防火牆都是基於連接埠掃描的,而基於CORBA的RPC使用的都不是常用的連接埠。如果不經過特殊配置,基於CORBA分布式組件調用將被作為惡意訪問而拒絕。所以,TR069使用SOAP簡易物件存取通訊協定 (SOAP)作為RPC報文的封裝,利用標準HTTP協議來傳送的方式。TR069規定將SOAP與HTTP綁定,以RPC方法調用來實現裝置的管理。把SOAP綁定到HTTP提供了同時利用SOAP的分散性、靈活性的特點以及HTTP豐富的特徵庫的優點。在HTTP上傳送SOAP並不是說SOAP會覆蓋現有的HTTP語義,而是HTFP上的SOAP語義會自然的映射到HTTP語義。在使用HTTP作為綁定協議時,一個RPC調用自然地映射到一個HTTP請求,RPC應答同樣映射到HTTP應答。一般情況下,一個完整的SOAP包的結構包括:一個信封(Envelope)、一個頭部(Header)(可選)、一個SOAP體(Body)(必需)。SOAP協議中未說明一個SOAP包中可以包含多個Envelope,TR069採用了多個信封機制,這樣增加了一次交換所帶的資訊量,減少了網路裝置之間的資料交換次數。
SSL:SSL協議指定了一種在應用程式協議和TCP/IP協議之間提供資料安全性分層的機制,它為TCP/IP串連提供資料加密、伺服器人證、訊息完整性以及可選的客戶機人證,確保資料在傳送中不被改變。TR069協議實現的是遠端管理,安全的資訊交換是必需的。採用128bit密碼編譯演算法、數字認證機制,實現CPE和ACS之間的安全資訊交換 商務程序
軟體架構以及協議的具體解析過程
通訊過程
我們來看一個tr069協議完整的通訊過程.
一次GetParameterValues首先由CPE主動發送INFORM訊息.
POST /openacs/acs HTTP/1.1 Host: 192.168.7.1:9090 User-Agent: BCM_TR69_CPE_04_00 Connection: keep-alive SOAPAction: Content-Type: text/xml Content-Length: 2452<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cwmp="urn:dslforum-org:cwmp-1-0"> <SOAP-ENV:Header> <cwmp:ID SOAP-ENV:mustUnderstand="1">2044897763</cwmp:ID> </SOAP-ENV:Header> <SOAP-ENV:Body> <cwmp:Inform> <DeviceId> <Manufacturer>Bellmann</Manufacturer> <OUI>001F8F</OUI> <ProductClass>HA930e</ProductClass> <SerialNumber>27FD6001F8F748602</SerialNumber> </DeviceId> <Event SOAP-ENC:arrayType="cwmp:EventStruct[1]"> <EventStruct> <EventCode>8 DIAGNOSTICS COMPLETE</EventCode> <CommandKey/> </EventStruct> </Event> <MaxEnvelopes>1</MaxEnvelopes> <CurrentTime>2012-12-10T13:21:37+00:00</CurrentTime> <RetryCount>0</RetryCount> <ParameterList SOAP-ENC:arrayType="cwmp:ParameterValueStruct[0008]"> <ParameterValueStruct> <Name>InternetGatewayDevice.DeviceSummary</Name> <Value xsi:type="xsd:string">InternetGatewayDevice:1.1[](Baseline:1, EthernetLAN:1, USBLAN:1, WiFiLAN:1, EthernetWAN:1, Time:1, IPPing:1, DeviceAssociation:1), VoiceService:1.0[1](Endpoint:1, SIPEndpoint:1)</Value> </ParameterValueStruct> <ParameterValueStruct> <Name>InternetGatewayDevice.DeviceInfo.SpecVersion</Name> <Value xsi:type="xsd:string">1.0</Value> </ParameterValueStruct> <ParameterValueStruct> <Name>InternetGatewayDevice.DeviceInfo.HardwareVersion</Name> <Value xsi:type="xsd:string">HA930e_N_V2.0</Value> </ParameterValueStruct> <ParameterValueStruct> <Name>InternetGatewayDevice.DeviceInfo.SoftwareVersion</Name> <Value xsi:type="xsd:string">HA930e_N_V1.00S</Value> </ParameterValueStruct> <ParameterValueStruct> <Name>InternetGatewayDevice.DeviceInfo.ProvisioningCode</Name> <Value xsi:type="xsd:string"/> </ParameterValueStruct> <ParameterValueStruct> <Name>InternetGatewayDevice.ManagementServer.ConnectionRequestURL</Name> <Value xsi:type="xsd:string">http://192.168.7.143:30005/</Value> </ParameterValueStruct> <ParameterValueStruct> <Name>InternetGatewayDevice.ManagementServer.ParameterKey</Name> <Value xsi:type="xsd:string">unsetCommandKey</Value> </ParameterValueStruct> <ParameterValueStruct> <Name>InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.ExternalIPAddress</Name> <Value xsi:type="xsd:string">192.168.7.143</Value> </ParameterValueStruct> </ParameterList> </cwmp:Inform> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
ACS端回應INFORM Response.
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 X-Powered-By: Servlet 2.4; JBoss-4.2.3.GA (build: SVNTag=JBoss_4_2_3_GA date=200807181439)/JBossWeb-2.0 Set-Cookie: JSESSIONID=5CEB426075A42489AC3A7E6BAE004C61; Path=/ Content-Type: text/xml Content-Length: 574 Date: Sat, 01 Nov 2014 07:53:48 GMT<SOAP-ENV:Envelope xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cwmp="urn:dslforum-org:cwmp-1-0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Header> <cwmp:ID SOAP-ENV:mustUnderstand="1">2044897763</cwmp:ID> <cwmp:NoMoreRequests>0</cwmp:NoMoreRequests> </SOAP-ENV:Header> <SOAP-ENV:Body> <cwmp:InformResponse xmlns:cwmp="urn:dslforum-org:cwmp-1-0"><MaxEnvelopes>1</MaxEnvelopes> </cwmp:InformResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope>
然後CPE端回應一個空的HTTP POST請求.
HTTP/1.1 Host: 192.168.7.1:9090 User-Agent: BCM_TR69_CPE_04_00 Connection: keep-alive SOAPAction: Cookie: JSESSIONID=5CEB426075A42489AC3A7E6BAE004C61 Content-Type: text/xml Content-Length: 0
下面開始進入RPC階段.由ACS發送RPC REQUEST,這裡就是GetParameterValues, 目的是獲得InternetGatewayDevice.DeviceSummary的值.
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 X-Powered-By: Servlet 2.4; JBoss-4.2.3.GA (build: SVNTag=JBoss_4_2_3_GA date=200807181439)/JBossWeb-2.0 Content-Type: text/xml Content-Length: 722 Date: Sat, 01 Nov 2014 07:53:48 GMT<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:cwmp="urn:dslforum-org:cwmp-1-0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Header> <cwmp:ID SOAP-ENV:mustUnderstand="1">ID:intrnl.unset.id.GetParameterValues1414832028729.539118694</cwmp:ID> <cwmp:NoMoreRequests>0</cwmp:NoMoreRequests> </SOAP-ENV:Header> <SOAP-ENV:Body> <cwmp:GetParameterValues> <ParameterNames SOAP-ENC:arrayType="xsd:string[1]"> <string>InternetGatewayDevice.DeviceSummary</string> </ParameterNames> </cwmp:GetParameterValues> </SOAP-ENV:Body></SOAP-ENV:Envelope>
CPE調用背景指令碼尋找到InternetGatewayDevice.DeviceSummary的值, 然後回應ACS.
POST /openacs/acs HTTP/1.1 Host: 192.168.7.1:9090 User-Agent: BCM_TR69_CPE_04_00 Connection: keep-alive SOAPAction: Cookie: JSESSIONID=5CEB426075A42489AC3A7E6BAE004C61 Content-Type: text/xml Content-Length: 941<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cwmp="urn:dslforum-org:cwmp-1-0"> <SOAP-ENV:Header> <cwmp:ID SOAP-ENV:mustUnderstand="1">ID:intrnl.unset.id.GetParameterValues1414832028729.539118694</cwmp:ID> </SOAP-ENV:Header> <SOAP-ENV:Body> <cwmp:GetParameterValuesResponse> <ParameterList SOAP-ENC:arrayType="cwmp:ParameterValueStruct[0001]"> <ParameterValueStruct> <Name>InternetGatewayDevice.DeviceSummary</Name> <Value xsi:type="xsd:string">InternetGatewayDevice:1.1[](Baseline:1, EthernetLAN:1, USBLAN:1, WiFiLAN:1, EthernetWAN:1, Time:1, IPPing:1, DeviceAssociation:1), VoiceService:1.0[1](Endpoint:1, SIPEndpoint:1)</Value> </ParameterValueStruct> </ParameterList> </cwmp:GetParameterValuesResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
這個值是:InternetGatewayDevice:1.1[](Baseline:1, EthernetLAN:1, USBLAN:1, WiFiLAN:1, EthernetWAN:1, Time:1, IPPing:1, DeviceAssociation:1), VoiceService:1.0[1](Endpoint:1, SIPEndpoint:1.
最後, ACS結束這次會話.
HTTP/1.1 204 No Content Server: Apache-Coyote/1.1 X-Powered-By: Servlet 2.4; JBoss-4.2.3.GA (build: SVNTag=JBoss_4_2_3_GA date=200807181439)/JBossWeb-2.0 Date: Sat, 01 Nov 2014 07:53:53 GMT
整個通訊過程我們需要注意以下幾點. 什麼時候Inform以及EventCode
每次Inform上報代表一次會話的開始, 因此Inform的時機很重要.我們至少需要實現: CPE初次安裝使用的時候. EventCode為BOOTSTRAP. 上電或者重啟的時候. EventCode為BOOT. 每一個PeriodicInformInterval周期到來的時候. EventCode為PERIODIC. ACS通過CPE的Httpd服務向CPE請求CONNECTION REQUEST的時候. EventCode為CONNECTION REQUEST. Monitor的值發生改變的時候. EventCode要包含VALUE CHANGE.
更詳細的支援需要查看手冊. Cookie的作用
我們注意到Inform完成後, ACS和CPE使用同一個Cookie通訊, 直到本次會話結束. 事實上由於HTTP協議是無狀態協議, 為了能夠建立通訊過程的順序,維持狀態機器的正常工作,兩邊都是通過Cookie來進行的. XML節點的type
我們注意到在SOAP訊息中,XML節點是包含類別的.比如xsi:type=”xsd:string”, 說明這個Value值是String類型. 雖然在某些ACS上即使去掉這些值也能工作, 但是不同的ACS對參數的檢查嚴格程度不一樣, 建議一定要加上. RPC方法
我們上面的例子中提到了RPC方法, 並拿GetParameterValues來樣本, tr069協議規定了CPE可以支援的方法.
其中Optional為可選的, Required為必須實現的, 不過這個只能作為參考, 還得看各家裝置商的標準.
RPC統一了裝置的介面, 那RPC所操作的資料要如何統一呢, Tr069因此提出了Datamodel.
DataModel
Tr069把很多不同的裝置都抽象出了裝置模型, 掛到公用的裝置樹上面, 根節點叫做InternetGatewayDevice, 利用統一出來的RPC介面, 我們只需要操作這些裝置樹上的節點的Value以及Atribute, 就可以改變盒子的配置.
其實我覺得這樣的設計有些繁瑣, 我來舉個例子,我們看一下如何利用協議來測試裝置的Ping功能.
直觀來想, 如果我們要測試CPE是否能夠Ping得通其他的裝置地址, 一般我們會直接用ssh/telnet/UART登入上這個裝置, 然後直接敲擊ping命令.在tr069中我們得分兩部進行, 首先我們通過SetParameterValues設定Ping參數.
然後再用GetParameterValues查.
不過確實也想不出更好的辦法, 至於說為啥要用XML這麼重量級的協議格式, 我的解釋是XML足夠成熟, 可以很方便的定義Schema檔案,方便驗證.另外tr069協議出現的事情JSON格式並沒有流行起來, 恰恰是XML的年代. OpenSource ACS伺服器 OpenACS :一直我都是使用它測試CPE用戶端的,但是可惜作者把它刪除了, 有人Fork它的項目, 重新命名為Libreacs. Genieacs: 用Coffee Script寫的可以嘗試一下. Fusion ACS: 作者自己稱之為I believe this is the most complete open-source (MIT-license) ACS available, with web-interface, web-services interface, TR-111 support, etc. CPE用戶端 Easycwmp: 它從freecwmp演化而來.說自己是fully conform with the TR069 CWMP standard, 但是指令碼部分居然用Shell寫的又臭又長. Fishcorecpe: 這不是一個開源項目, 但在國內可以搜到一些關於它的測試, 讀者可以從我這裡下載一份副本, 方便你測試CPE的行為. Evcpe: 由於google code要關閉了, 我把它移到了github上面. CWMP Client Netcwmp
在github上cwmp的用戶端有很多,讀者可以自行搜尋,這裡推薦的是一些典型的,以及我自己參考的一些.
總結
用Lua開發主要是處於指令碼語言可以方便的處理文本,而Lua又是這裡面最輕量的,在效能關鍵的地方,也可以用C很好的最佳化, 目前來看效果還不錯.
tr069最大的工作量在於仔細實現每一個節點上具體的商務邏輯以及能夠通過不同ACS平台的測試.相比較與SNMP,TR069在安全性,可配置性,相容性等等方面都做的更好,應該相信它的應用前景會更廣.
本文只是簡要的把自己能夠想的起來的一些東西記載下來,還有很多方面沒有提到,如果讀者有什麼問題,歡迎通過評論提出,一起探討~
參考
BroadBand 規範都在這裡
tr069 central 一個寫Tr069的blogger.
(全文完)
更多
- fishcorecpe與openacs對接測試報告
- More Details about TR069 CPE WAN Management Protocol
本文轉載於: https://forestgump.me/2015/03/14/about-tr069/