2017-01-17 15 views
1

C#을 사용하여 AVM FritzBox 7270 라우터로 SOAP 요청을 보내는 방법을 배우고 있습니다.Tr064 요청을 AVM FritzBox로 전송 7270

private string Execute(string controlUrl, string serviceType, string action) 
    { 
     WebRequest webRequest = WebRequest.Create("http://fritz.box:49000" + controlUrl); 
     HttpWebRequest httpRequest = (HttpWebRequest)webRequest; 
     httpRequest.Method = "POST"; 
     httpRequest.ContentType = "text/xml; charset=utf-8"; 
     httpRequest.Headers.Add("SOAPACTION", string.Format("{0}#{1}", serviceType, action)); 
     httpRequest.ProtocolVersion = HttpVersion.Version11; 
     httpRequest.Credentials = new NetworkCredential("username", "password"); 
     Stream requestStream = httpRequest.GetRequestStream(); 

     StreamWriter streamWriter = new StreamWriter(requestStream, Encoding.ASCII); 

     streamWriter.Write(GetBody(serviceType, action)); 
     streamWriter.Close(); 
     //Get the Response  
     try 
     { 
      HttpWebResponse wr = (HttpWebResponse)httpRequest.GetResponse(); 
      StreamReader srd = new StreamReader(wr.GetResponseStream()); 
      return srd.ReadToEnd(); 
     } 
     catch (WebException) 
     { 
      return null; 
     } 
    } 

기능 또는 getBody :

다음은 라우터에 SOAP 요청을 보냅니다 내 방법을 인도 표준시

: 내가 인터넷에서 어디에서나 발견 매개 변수와 함께이 방법을 테스트
private string GetBody(string serviceType, string action) 
    { 
     const string fmt = @"<?xml version=""1.0"" encoding=""utf-8""?> 
<s:Envelope xmlns:s=""http://schemas.xmlsoap.org/soap/envelope/"" s:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/""> 
    <s:Body> 
    <u:{0} xmlns:u=""{1}"" /> 
    </s:Body> 
</s:Envelope> 
";   
      return string.Format(fmt, action, serviceType); 
     } 
    } 

controlUrl = "/upnp/control/WANIPConn1" 
serviceType = "urn:schemas-upnp-org:service:WANIPConnection:1" 
action = "GetExternalIPAddress" 

잘 작동합니다.

그러나, 나는 내 실제 라우터에 대한 올바른 매개 변수를 수신하기위한 요청

http://fritz.box:49000/tr64desc.xml 

를 보내 처음으로 공식적인 방법을 가서한다고 생각합니다. 나는 오류 500 (내부 서버 오류)를 얻을

<service> 
    <serviceType>urn:dslforum-org:service:WANIPConnection:1</serviceType> 
    <serviceId>urn:WANIPConnection-com:serviceId:WANIPConnection1</serviceId> 
    <controlURL>/upnp/control/wanipconnection1</controlURL> 
    <eventSubURL>/upnp/control/wanipconnection1</eventSubURL> 
    <SCPDURL>/wanipconnSCPD.xml</SCPDURL> 
</service> 

서비스 id와 controlUrl에 대한 이러한 값을 사용하여이 요청에 대한 응답에서 나는 다음과 같은 노드를 찾을 수 있습니다.

누가 나를 도와 드릴까요? 내 코드에서 무엇이 잘못 되었습니까?

이 Fritz.Box의 undocumeted 기능이 많이 될 것 같다, 내가 인터넷에서 발견 pararmeters는 oviously thease 기능의 일부입니다 :

+0

장치에 버그가있을 수 있지만 http://fritz.box:49000/tr64desc.xml은 사용해야하는 서비스 설명입니다. 어떻게 알 수 있습니까? 실제로 SSDP 발견에서 그것을 얻고 있습니까? – jku

답변

1

나는 문제가 해결된다 생각합니다.

<service> 
    <serviceType>urn:dslforum-org:service:WANPPPConnection:1</serviceType> 
    <serviceId>urn:WANPPPConnection-com:serviceId:WANPPPConnection1</serviceId> 
    <controlURL>/upnp/control/wanpppconn1</controlURL> 
    <eventSubURL>/upnp/control/wanpppconn1</eventSubURL> 
    <SCPDURL>/wanpppconnSCPD.xml</SCPDURL> 
</service> 

나는 문제없이

GetExternalIPAddress 

를 호출 할 수 있습니다.