各位大神,我现在遇到一个项目,设备提供有北向接口的wsdl文件和一个chm的说明文档,想通过php写代码根据wsdl文件对设备进行访问,刚接触webservice,学习了各种,弄了快2周了,不太了解到底需要怎么操作才能访问到设备。在chm里有soap协议的具体说明,感觉就是说明书,现在尝试的用php可以做天气预报和手机查询功能,照猫画虎的在项目中使用,程序中没有反应,因为像天气预报之类的都是在网页中输入http://xx.?wsdl的网页会打开xml文件,而在php程序中直接
$client = new SoapClient('http://xx?wsdl')
print_r($client->__getFunctions())
会有返回可调用的函数
现在遇到的问题是把网址按照chm文件要求的https://xx.xx.xx.xx:8080/spg?wsdl的方式进行改动后没有可以返回的函数,如果把这个网址直接在页面中输入不通过Php调用会返回一个soap报文,写的faultcode 和faultstring" 接收到的消息类型非post,该消息类型为get”,而如果我这里把这个改成wsdl文件的路径可以看到有返回的函数值
我现在就希望能实现和设备的通信,soap协议里面写的每台设备操作使用soap协议时会有header,里面写有账号密码,难道我直接用本地的wsdl文件就可以直接传输数据?不需要再header中写入账号密码,或者也不需要指定https://xx.xx.xx.xx:8080/spg这个路径?这些东西都是在wsdl文件中么?或者说如何通过php给设备发送soap报文呢?
我现在如何能够通过Php来进行对设备的操作呢,请各位大神指点一二。

解决方案 »

  1.   

    参考:http://blog.csdn.net/rrr4578/article/details/24451943
      

  2.   

    1#版主您好,我现在手上有chm文件我截取其中一个功能的soap
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:m="http://www.xxxx.com/SPG">
      <SOAP-ENV:Header>
        <m:Authentication>
          <m:Username>xxxxx</m:Username>
          <m:Password>xxxxxxxxx</m:Password>
        </m:Authentication>
        <m:MessageID>1</m:MessageID>
      </SOAP-ENV:Header>
      <SOAP-ENV:Body>
        <m:LST_SBR>
          <m:IMPU>tel:+xxxxxxx</m:IMPU>
          <m:DSPMODE>1</m:DSPMODE>
          <m:DSPOPTIMIZE>1</m:DSPOPTIMIZE>
        </m:LST_SBR>
      </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    技术文件中写道SOAP消息请求的URL格式为:https://[IP]:[Port]/spg,需要注意的是,URI必须是/spg。通信端口默认是8xxx。
    需要wsdl文件么?
    其中我先截取片段
    <?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions targetNamespace="http://www.1234.com/SPG" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:spg="http://www.huawei.com/SPG">
    <wsdl:import namespace="http://www.1234.com/SPG" location="spg_schema.xsd"/>
    <wsdl:types>
    <xs:schema targetNamespace="http://new.webservice.namespace" elementFormDefault="qualified"/>
    </wsdl:types><wsdl:binding name="SPG2800Binding" type="spg:SPG2800Port">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="LST_SBR">
    <soap:operation soapAction="urn#LST_SBR"/>
    <wsdl:input>
    <soap:body use="literal"/>
    <soap:header message="spg:MessageIDHeader" part="header" use="literal"/>
    <soap:header message="spg:GenericHeader" part="header" use="literal"/>
    <soap:header message="spg:ResendFlagHeader" part="header" use="literal"/>
    </wsdl:input>
    <wsdl:output>
    <soap:body use="literal"/>
    <soap:header message="spg:MessageIDHeader" part="header" use="literal"/>
    </wsdl:output>
    <wsdl:fault name="OperationFault">
    <soap:fault name="OperationFault" use="literal"/>
    </wsdl:fault>
    </wsdl:operation>
    <wsdl:service name="SPG2800Service">
    <wsdl:port name="SPG2800Port" binding="spg:SPG2800Binding">
    <soap:address location="http://www.1234.com/spg"/>
    </wsdl:port>
    </wsdl:service>
      

  3.   

    不用wsdl都可以,参考:http://blog.csdn.net/fdipzone/article/details/21810347?locationNum=1&fps=1
      

  4.   

    我刚才看了下这篇博文,如果采用no_wsdl方式,我怎么感觉和写那个soap报文不太一样呢,比如按照我的wsdl文件中的说url应该填写什么呢,location又填写什么呢,因为看见博文中服务器端是用php编写的,我也不清楚我这的服务器接口用的是什么编写,而我只有wsdl文件和每个接口的soap报文说明,在学习天气预报的时候使用java语言可以发送soap报文,使用的是httpclient类,而其中发送的data和报文的格式基本一样,而这篇博文看完后感觉和那个不太一样,能否请教下使用wsdl文件和不使用wsdl文件分别该如何进行编码