2014-02-18 1 views
0

wsdl에서 제공하는 읽기 기능을 사용하여 smartserver 데이터 포인트를 가져 오는 콘솔 응용 프로그램을 작성합니다. suds를 통해 나는 smartserver에 성공적으로 연결하여 메서드와 유형 목록을 제공하는 클라이언트 wsdl을 인쇄 할 수 있습니다. 어떻게 suds를 통해 이러한 방법을 사용하여 데이터를 가져올 수 있습니까? 필자는이 서버의 프로그래머 문서에 따라 데이터 포인트를 주어야하는 print client.service.List()를 시도했지만이 URL은 urlopen 오류를 발생시킵니다. [Errno 13] 권한이 거부되었습니다. 설명서는 데이터를 가져 오기 위해 SOAP를 사용하는 예제 코드를 제공하지만이 코드를 suds로 많이 사용하고 있으므로 간소화되었으며 client.service.somemethod (매개 변수) 만 수행해야합니다. 지금까지 내 코드를 첨부했으며 목록 클라이언트를 인쇄 할 때 얻을 수있는 메소드 중 하나입니다.suds를 사용하여 Smartserver 2.0에서 wsdl을 통해 데이터 포인트를 가져옴

대단히 감사합니다.

import suds 
from suds.client import Client 
from suds.transport.http import HttpAuthenticated 
url = "http://example/WSDL/v4.0/foo.WSDL" 
client = Client(url, username='foo', password='bar') 

myheaders = dict(userid='foo', passwd='bar') 
client.set_options(soapheaders=myheaders) 
name = client.factory.create('ns0:E_xSelect') 
print name 
name['xSelect'] = """//Item[UCPTpointName = "Net/MB485/MAIN POWER/Fb/PowerSum"]""" 
print client.service.Read(name) 

내가 콘솔에서 무엇을 얻을 설명서의

Ports (1): 
(iLON100httpPort) 
Methods (8): 
Clear(ns0:Item_Coll iLonItem,) 
Delete(ns0:Item_Coll iLonItem,) 
Get(ns0:Item_Coll iLonItem,) 
InvokeCmd(ns0:Item_Coll iLonItem,) 
List(ns0:E_xSelect iLonItem,) 
Read(ns0:Item_Coll iLonItem,) 
Set(ns0:Item_CfgColl iLonItem,) 
Write(ns0:Item_DataColl iLonItem,) 

예제 코드는 당신에게 내가 문제를 알아 낸 아이디어

static void Main(string[] args) 
    { 
    iLON_SoapCalls.BindClientToSmartServer(); iLON_SmartServer.iLON100portTypeClient SmartServer = iLON_SoapCalls._iLON; 
    // -------------- READING A DATA POINT VALUE -------------- 
    try 
    { 
    // instantiate the member object 
    iLON_SmartServer.Item_Coll itemColl = new iLON_SmartServer.Item_Coll(); itemColl.Item = new iLON_SmartServer.Item[1]; 
    itemColl.Item[0] = new iLON_SmartServer.Dp_Data(); 
    // set the DP name 
    itemColl.Item[0].UCPTname = "Net/LON/iLON App/Digital Output 1/nviClaValue_1"; 
    // set maxAge to get the updated DP value in case it has been cached for more than 10   // seconds on the Data Server (see section 4.3.4.1 for more information)  ((iLON_SmartServer.Dp_Data)(itemColl.Item[0])).UCPTmaxAge = 10; ((iLON_SmartServer.Dp_Data)(itemColl.Item[0])).UCPTmaxAgeSpecified = true; 
    //call the Read Function 
    iLON_SmartServer.Item_DataColl dataColl = SmartServer.Read(itemColl); 
    if (dataColl.Item == null) 
    { 
     // sanity check. this should not happen 
     Console.Out.WriteLine("No items were returned"); 
    } 
    else if (dataColl.Item[0].fault != null) 
    { 
     // error 
     Console.Out.WriteLine("An error occurred. Fault code = " + 
     dataColl.Item[0].fault.faultcode + 
     ". Fault text = %s." + 
     dataColl.Item[0].fault.faultstring); 
    } 
    else 
    { 
    // success 
    Console.Out.WriteLine("Read is successful"); 
    Console.Out.WriteLine(((iLON_SmartServer.Dp_Data)dataColl.Item[0]).UCPTname + " = " +  ((iLON_SmartServer.Dp_Data)dataColl.Item[0]).UCPTvalue[0].Value + "\n"); 
    } 

답변

0

을 제공합니다. 비누를 통해 XML 형식으로 액세스하는 wsdl을 열고 위치를 지정하는 wsdl 서비스 섹션을 읽어야합니다. 서버와 성공적으로 통신하려면 클라이언트 생성자에서 해당 위치를 정의하십시오. 어떤 이유로 suds는 wsdl 파일에서이 위치를 보지 못했습니다.

관련 문제