? TR 069是DSL Fourm提出来的一种协议,即CWMP协议,主要是对 用户终端设备的管理。
其功能主要有两块组成ACS(Auto Config Server)和CPE(Customer Pression Equalment)。其具体功能请参考TR-069协议,网络上也有介绍,在此不再多说了。
???? 最近公司接到了一个项目,主要是对电信的AP(Access Point)设备进行性能监控和管理。我也是项目组的开发人员,主要是负责ACS的搭建。
??? 根据协议的描述 CPE会定时呼叫ACS,ACS也可以呼叫CPE。ACS呼叫CPE的时候,其实是
向CPE发送一个ConnectionRequest,经过授权认证等过程后,CPE会发个Inform给ACS,
其中包含了EventCode,根据EnventCode我们就可已知道是CPE主动呼叫的,还是ACS呼叫后,CPE才建立的连接。TR-069规定响应ACS的呼叫后的Inform Event Code是6 Connection Request。
???? 我也是第一次进行通信方面的开发,以前没有接触过的东西。首先得要下个协议,在这里我有个感受,就是要下个原版的TR-069协议,自己去慢慢的理解,不懂单词要查,虽然是全英文的,但是也是最权威的,也是原滋原味的。
??可 能看了协议后会觉得很蒙,很多代名词都不懂。SOAP,RPC。SOAP和PRC感觉有点像WebService,其实我也没有webservice的开 发经验,但是我觉得在TR-069协议中,ACS通过SOAP协议指定要调用CPE的哪些方法,以及需要的参数。然后通过RPC在CPE端执行指定的方 法,返回方法执行后的结果。然后在通过SOAP协议返回执行后的结果给CPE。
?????假如A系统有个查询手机号码的归属地的功能,那么B 系统中也要实现这个功能,那么两个系统可以通过通信的方式进行数据交互。B系统通过SOAP协议指定需要执行的功能(方法)和参数(手机号码),然后发送 给A系统。A系统接受了SOAP协议包含的XML,开始解析,然后调用自身的method,然后将执行后的结果封装成XML 格式的数据后发给B系统,B系统解析后获取执行的结果。总之,最重要的是通信。
???ACS和CPE都是支持HTTP协议, 所有ACS只需要有HTTP容器就可以了。所以很自然的,我们就想到了Servlet来实现。我也不知道是啥格式的XML,但是公司催的紧,所有赶紧开工 了。既然不知道怎么实现,但是CPE会定时呼叫的,所有先把它呼叫后的东西接收过来看看,到底是什么。
??
目前测试的CPE是H3C的AP。
第一,创建ACSServlet,准备接收消息。
代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.seahigh.tyt.acs.util.AcsUtil;
/**
?* ACS serverImp
?*
?* @author 汪心利
?* @Create Time 2009-1-4下午04:34:42 (c)copy right seahigh 2009
?*/
public class ACSServlet extends HttpServlet {
?private static final long serialVersionUID = 1L;
?public void doGet(HttpServletRequest request,HttpServletResponse response)
?? throws ServletException {
?}
?public void doPost(HttpServletRequest request,HttpServletResponse response)
?? throws ServletException,IOException {
? // session 记住已执行的method
?? InputStream in = request.getInputStream();
?? String ip = request.getRemoteAddr();
?? InputStreamReader ir = new InputStreamReader(request.getInputStream());
?? BufferedReader input = new BufferedReader(ir);
?? String line;
?? String xml = "";
?? while ((line = input.readLine()) != null) {
??????? if (line.trim().length() <= 0)
???????????? continue;
??????????? xml += line;
?? }
?? in.close();
?? input.close();
?? System.out.println(ip+"Post:"+xml);
????? }
}
然后在web.xml中配置Servlet了
<soap:Envelope 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"
????????????????????????????????????? xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
????????????????????????????????????? xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
??????? <soap:Header>
??????????? <cwmp:ID soap:mustUnderstand="1">1</cwmp:ID>
??????? </soap:Header>
??????? <soap:Body>
????????????????? <cwmp:Inform>
??????????? <DeviceId>
??????????????? <Manufacturer>H3C</Manufacturer>
??????????????? <OUI>000FE2</OUI>
??????????????? <ProductClass>Gateway</ProductClass>
??????????????? <SerialNumber>210235A32MC085003208</SerialNumber>
??????????? </DeviceId>
??????????? <Event soapenc:arrayType="cwmp:EventStruct[1]">
??????????????? <EventStruct>
????????????????? <EventCode>0 BOOTSTRAP</EventCode>
????????????????? <CommandKey></CommandKey>
??????????????? </EventStruct>
??????????? </Event>
??????????? <MaxEnvelopes>1</MaxEnvelopes>
??????????? <CurrentTime>2000-05-10T09:55:50</CurrentTime>
??????????? <RetryCount>0</RetryCount>
??????????? <ParameterList soapenc:arrayType="cwmp:ParameterValueStruct[8]">
??????????????? <ParameterValueStruct>
??????????????????? <Name>InternetGatewayDevice.DeviceSummary</Name>
??????????????????? <Value soap:type="soap:string">InternetGatewayDevice:1.0[](Baseline:1)</Value>
??????????????? </ParameterValueStruct>
??????????????? <ParameterValueStruct>
??????????????????? <Name>InternetGatewayDevice.DeviceInfo.SpecVersion</Name>
??????????????????? <Value soap:type="soap:string">1.0</Value>
??????????????? </ParameterValueStruct>
??????????????? <ParameterValueStruct>
??????????????????? <Name>InternetGatewayDevice.DeviceInfo.HardwareVersion</Name>
??????????????????? <Value soap:type="soap:string">Ver.A</Value>
??????????????? </ParameterValueStruct>
??????????????? <ParameterValueStruct>
??????????????????? <Name>InternetGatewayDevice.DeviceInfo.SoftwareVersion</Name>
??????????????????? <Value soap:type="soap:string">V100R001B47D011SP01</Value>
??????????????? </ParameterValueStruct>
??????????????? <ParameterValueStruct>
??????????????????? <Name>InternetGatewayDevice.DeviceInfo.ProvisioningCode</Name>
??????????????????? <Value soap:type="soap:string">ProvisioningCode</Value>
??????????????? </ParameterValueStruct>
??????????????? <ParameterValueStruct>
??????????????????? <Name>InternetGatewayDevice.ManagementServer.ConnectionRequestURL</Name>
??????????????????? <Value soap:type="soap:string">http://192.168.1.200:7547/cpe </Value>
??????????????? </ParameterValueStruct>
??????????????? <ParameterValueStruct>
??????????????????? <Name>InternetGatewayDevice.ManagementServer.ParameterKey</Name>
??????????????????? <Value soap:type="soap:string"></Value>
??????????????? </ParameterValueStruct>
??????????????? <ParameterValueStruct>
??????????????????? <Name>InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.1.ExternalIPAddress</Name>
??????????????????? <Value soap:type="soap:string">192.168.1.200</Value>
??????????????? </ParameterValueStruct>
??????????? </ParameterList>
????????? </cwmp:Inform>
??????? </soap:Body>
??? </soap:Envelope>
?
更多内容详见: http://www.tr069bbs.com