发表于:2007-12-04 20:05:00
楼主
在这里主要想说的就是:
开发XML-DA客户端实际上和开发普通Web的客户端没有多大区别,不需要借助其它工具就可以开发。在这里打上OPC的烙印,是因为您要了解提供那些Web服务(一共8个),您可以看OPC XML-DA 1.0的规范,而且您在访问这些Web服务的时候,实际上通过XML-DA GateWay会访问到具体的DA服务器(包括1.0、2.0和3.0)。开发客户端的人员不需要了解XML-DA GateWay的机理,您只要知道这个是提供Web服务的东西就可以了。
稍微解释一下:OPC XML-DA GateWay实际上就是WebService,只是开发的WebService是按照OPC基金会规定的8个服务:GetStatus 、Read 、Write、GetProperties 、Subscribe 、SubscriptionPolledRefresh 、SubscriptionCancel 和Browse 。
开发Web的客户端的方法有多少种,那么开发XML-DA的方法就有多少种。您可以使用VB、Java脚本、ASP、ASP.net、也可以使用VC++(前面这些实际上都最终调用SoapToolkit)和C#等等。大家不要怕,微软的东西就是概念多,概念理一理就好了。下面分别举例:
本来想都贴出来,东西太多,看来只能给VC++和C#的了。(呵呵,掉一下大家胃口,需要的话给我要,告诉单位和名字,发邮件到OPCFan@163.com)
1、C++的情况:
a、在stdafx.h头文件中添加下面代码:
#include <afxsock.h> // MFC socket extensions
#import "C:\\WINDOWS\\system32\\msxml.dll" rename("XMLHTTPRequest","MyXMLHTTPRequest")
b、在InitInstance虚函数下初始化Socket
BOOL CVC_PP_XML_OPCClientApp::InitInstance()
{
if (!AfxSocketInit())
{
AfxMessageBox("Windows sockets initialization failed!");
return FALSE;
}
......
}
C、使用命名空间
using namespace MSXML;
D、具体代码:
构造函数里初始化COM库,指定WebService的网址,在这里是本机建立的一个Web服务,并且指定访问Web服务的方法是POST,而不是Get。提个问题:Get和Post的方法的区别在哪里呢?另外指定本机的用户名和密码。
客户端通过这个WebService到底访问了本机的哪个服务器程序呢?这个服务器的ProgID是ICONICS.ModbusOPCServer3。假如,需要访问其它的服务器,就通过修改asmx文件的名称即可。这个属于部署OPC Web Service的范畴,有些跑题了。(本人已经开发好了XML-GateWay,等着给公司用呀,还不知道什么时候能发挥一下,我慢慢等着吧)
CVC_PP_XML_OPCClientDlg::CVC_PP_XML_OPCClientDlg(CWnd* pParent /*=NULL*/)
: CDialog(CVC_PP_XML_OPCClientDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CVC_PP_XML_OPCClientDlg)
m_strWebService = _T("http://localhost/ZGJCC/ICONICS.ModbusOPCServer3.asmx");
m_strResult = _T("");
m_strRequest = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
::CoInitialize(NULL);
m_strUserName = "Administrator";
m_vUser.vt = VT_BSTR;
m_vUser.bstrVal = m_strUserName.AllocSysString(); ;
m_strPass = "pass";
m_vPassword.vt = VT_BSTR;
m_vPassword.bstrVal = m_strPass.AllocSysString();
m_HTTPMethod = _bstr_t( "POST" );
m_noAsync = _variant_t( (bool)false );
}
通过下面的函数把一个GetStatus的Soap协议发出去,并且接收返回来的文本。在这里并没有解析回来的内容。
void CVC_PP_XML_OPCClientDlg::OnGetStatus()
{
UpdateData(TRUE);
IXMLHttpRequestPtr m_httpReq( _uuidof(MyXMLHTTPRequest));
m_httpReq->open(m_HTTPMethod ,m_strWebService.AllocSysString(),m_noAsync,m_vUser,m_vPassword);
m_httpReq->setRequestHeader("SOAPAction", "http://opcfoundation.org/webservices/XMLDA/1.0/GetStatus");
m_httpReq->setRequestHeader("Content-Type", "text/xml");
CString szRequest;
szRequest = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\
<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\&