2014-02-18 8 views
0

Я пишу консольное приложение, которое тянет точки данных smartserver, используя функцию Read, предоставляемую wsdl. Через пены я могу успешно подключиться к smartserver и распечатать клиентский wsdl, который дает мне список методов и типов. Как я могу использовать эти методы с помощью пены, чтобы вытащить данные? Ive попробовал print client.service.List(), который согласно документации программиста этого сервера должен давать мне данные, но это дает мне ошибку urlopen [Errno 13] Permission denied. В руководстве приведены примеры кодов, которые просто используют SOAP для вытягивания данных, но поскольку я использую пенопласты, этот код упрощается, и мне нужно делать только client.service.somemethod (параметр). Я привязал свой код до сих пор и список методов, которые я получаю при печати клиента.с использованием пены, чтобы вытащить точки данных через wsdl на Smartserver 2.0

спасибо.

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

я разобрался с проблемой. Вам нужно открыть wsdl, который вы просматриваете через мыло в формате xml, и прочитать раздел с именами служб wsdl, которые определяют местоположение. Определите это местоположение в конструкторе клиента для успешной связи с сервером. По какой-то причине suds не видел это местоположение в файле wsdl.

 Смежные вопросы

  • Нет связанных вопросов^_^