1、配置紫金橋WebService
首先運行想支持WebService功能的工程,然后在紫金橋安裝目錄下找到RealDbWebServic.exe程序,運行它,可以看到如下圖所示的運行界面。
程序運行后上方是菜單,中間詳細(xì)的列出了支持的各個函數(shù)被調(diào)用的次數(shù),以及響應(yīng)超時的次數(shù)。
顯示的信息的第一行為WebService在哪個端口提供服務(wù),第二行為響應(yīng)的詢問的次數(shù),超時的次數(shù),以及發(fā)生嚴(yán)重錯誤的次數(shù)。這里的超時是指的和Db數(shù)據(jù)庫通訊時的超時次數(shù),嚴(yán)重錯誤是指的和Db數(shù)據(jù)庫通訊時發(fā)生的嚴(yán)重錯誤次數(shù)。
選擇菜單,可以看到有文件和幫助兩個子菜單,其中幫助菜單用來顯示當(dāng)前程序的版本號。文件菜單又有“屬性設(shè)置”和“退出”兩個選項,其中退出選項用來退出當(dāng)前的WebService服務(wù),屬性設(shè)置用來更改Web服務(wù)所在的端口號。選擇屬性設(shè)置菜單,如下圖所示:
會彈出如下圖所示的設(shè)置端口號對話框:
可以在這里輸入新的端口號,值得注意的是,更改端口號之后,并不能馬上生效,只有當(dāng)RealDbWebServic程序重啟后,所做的更改才會生效。
2、紫金橋WebService發(fā)布的方法
1)取得實時數(shù)據(jù)
bool GetRealData(string[] names, out string[] datas);
調(diào)用此函數(shù)可以獲得相應(yīng)的位號的實時數(shù)據(jù),其中names是輸入?yún)?shù),為字符串?dāng)?shù)組,每一個字符串為位號的名稱比如“A1.PV”,注意這里需要包括參數(shù)名稱。
datas為輸出參數(shù),為字符串?dāng)?shù)組,它包含的字符串個數(shù)和輸入?yún)?shù)names包括的字符串個數(shù)相同。
如果函數(shù)返回true,那么就可以通過datas來獲得相應(yīng)位號的實時數(shù)據(jù)。
2)設(shè)置實時數(shù)據(jù)
bool SetRealData(string[] names, string[] datas);
調(diào)用此函數(shù)可以修改實時數(shù)據(jù)庫中相應(yīng)位號的實時數(shù)據(jù),names和datas都是輸入?yún)?shù),意義請參見GetRealData。
如果函數(shù)返回true,那么實時數(shù)據(jù)庫中的相應(yīng)位號的實時數(shù)據(jù)被成功修改。
3)取批量歷史數(shù)據(jù)
bool GetHisData(string name, DtTime startTime, double secondSpace, int nDataCount, out HisData[] datas);
其中name是需要取批量歷史數(shù)據(jù)的位號,比如“A1.PV”;startTime是取歷史的起始時間;secondSpace是讀取歷史數(shù)據(jù)的間隔,單位秒;nDataCount是讀取的歷史數(shù)據(jù)個數(shù);datas為輸出數(shù)組參數(shù),返回讀取的所有歷史數(shù)據(jù)。
其中HisData的定位如下:
public class DtTime
{
public DateTime time;
public short millsec;
}
public class HisData
{
public DtTime time;
public double data;
}
HisData由兩個成員構(gòu)成,一個為數(shù)據(jù)的時間time,一個為數(shù)據(jù)data
數(shù)據(jù)的時間DtTime也由兩個成員構(gòu)成,一個為DateTime類型,一個為時間的毫秒數(shù)。
4)取一段時間范圍內(nèi)的所有歷史數(shù)據(jù)
bool GetAllHisData(string name, DtTime startTime, int secondSpan, out HisData[] datas);
其中name是需要取批量歷史數(shù)據(jù)的位號,比如“A1.PV”;startTime是取歷史的起始時間;secondSpan是讀取歷史數(shù)據(jù)的時間跨度,單位秒;datas為輸出數(shù)組參數(shù),返回讀取的所有歷史數(shù)據(jù)。HisData的定義請參見GetHisData。
5)插入批量歷史數(shù)據(jù)
bool InsertHisData(string name, HisData[] datas);
其中name是需要取批量歷史數(shù)據(jù)的位號,比如“A1.PV”;datas為輸入數(shù)組參數(shù),傳入需要插入的所有歷史數(shù)據(jù)。HisData的定義請參見GetHisData。
6)取得實時報警信息
bool GetRealAlarm(int areaNo, int unitNo, out AlarmData[] alarms);
areaNo為獲取的實時報警的區(qū)域號,-1代表所有區(qū)域;unitNo為獲取的實時報警的單元號,-1表示所有單元。alarms返回當(dāng)前的符號條件的所有實時報警。AlarmData的定義如下:
public class AlarmData
{
public string name;
public string desc;
public int type;
public int prio;
public int ack;
public DtTime time;
public double data;
public double limit;
public string eu;
public int area;
}
其中參數(shù)的意義如下:
name表示位號名稱。
desc表示點說明。
type為報警的類型意義為0低低報,1低報,2高報,3高高報,4變化率,5偏差報警。
prio是報警的優(yōu)先級,0恢復(fù),1低級,2高級,3緊急
ack表示報警的確認(rèn)狀態(tài),0沒有確認(rèn),1確認(rèn),2恢復(fù)
time是報警的時間,DtTime的定義請參考GetHisData。
data是報警時刻的數(shù)據(jù)。
limit是報警發(fā)生時的限值。
eu是位號的工程單位。
area是位號所在的區(qū)域號。
7)取得歷史報警信息
bool GetHisAlarm(int areaNo, int unitNo, int day, out AlarmData[] alarms);
areaNo為獲取的實時報警的區(qū)域號,-1代表所有區(qū)域;unitNo為獲取的實時報警的單元號,-1表示所有單元。day表示獲取哪一天的報警歷史,0表示是當(dāng)天,-1表示前一天,其他類推。alarms返回當(dāng)前的符號條件的所有歷史報警信息。AlarmData的定義請參考GetRealAlarm。
8)進行Sql查詢
bool SqlQuery(string sql, out string[] types, out string[][] result);
參數(shù)sql是所查詢的sql命令,types返回result中每一列的類型,字符型為“string”,整型為“int”,浮點類型為“real”。result是一個二維數(shù)組,返回查詢的結(jié)果。
3、在C#下調(diào)用紫金橋WebService
使用C#調(diào)用紫金橋WebService的步驟主要有兩步:
1)根據(jù)WSDL文件產(chǎn)生調(diào)用WebService的接口
打開VS進入C#開發(fā)環(huán)境,選擇菜單“工具/Visual Studio Command Prompt”進入命令行模式:
在命令行鍵入:
wsdl /l:CS /o:x:/realDb.cs x:/realdb.wsdl
上面的X:為紫金橋提供的realdb.wsdl文件所在的目錄,也是輸出realDb.cs的目錄,可以根據(jù)具體情況靈活處理。
執(zhí)行命令后,就會生成realDb.cs文件,可以在C#項目中使用。
2)在C#下編寫代碼調(diào)用接口訪問WebService
把realDb.cs加入到C#項目中,并調(diào)用相應(yīng)的接口函數(shù)即可調(diào)用相應(yīng)的WebService功能。注意在realDb.cs的前面有如下的代碼:
this.Url = "http://localhost:1997";
這里是說當(dāng)前WebService所在的機器為本機,端口號為1997,這里可以根據(jù)需要修改成合適的地址。
取實時數(shù)據(jù)的示例代碼:
string[] names = new string[4];
names[0] = "A1.PV";
names[1] = "A2.PV";
names[2] = "A3.PV";
names[3] = "A4.DESC";
string[] datas;
Service s = new Service();
s.GetRealData(names, out datas);
int nCount = datas.GetUpperBound(0) + 1;
realData.Text = "";
for (int i = 0; i < nCount; ++i)
{
realData.Text += datas[i] + " ";
}
設(shè)置實時數(shù)據(jù)的示例代碼:
string[] names = new string[4];
names[0] = "A1.PV";
names[1] = "A2.PV";
names[2] = "A3.PV";
names[3] = "A4.DESC";
string[] datas = new string[4];
datas[0] = "1";
datas[1] = "2";
datas[2] = "3";
datas[3] = "設(shè)置成功";
Service s = new Service();
s.SetRealData(names, datas);
取歷史數(shù)據(jù)的示例代碼:
Service s = new Service();
DtTime dt = new DtTime();
dt.time = new System.DateTime(2013, 11, 29, 15, 36, 0);
dt.millsec = 0;
HisData[] datas;
s.GetHisData("A1.PV", dt, 1, 4, out datas);
int nCount = datas.GetUpperBound(0) + 1;
his_data_edit.Text = "";
for (int i = 0; i < nCount; ++i)
{
his_data_edit.Text += datas[i].time.time.ToString() + " " + datas[i].data.ToString() + "\r\n";
}
插入歷史數(shù)據(jù)的示例代碼:
Service s = new Service();
DtTime dt = new DtTime();
HisData[] datas = new HisData[4];
datas[0] = new HisData();
datas[0].time = new DtTime();
datas[0].time.time = new System.DateTime(2013, 11, 29, 15, 36, 0);
datas[0].data = 1;
datas[1] = new HisData();
datas[1].time = new DtTime();
datas[1].time.time = new System.DateTime(2013, 11, 29, 15, 36, 1);
datas[1].data = 12;
datas[2] = new HisData();
datas[2].time = new DtTime();
datas[2].time.time = new System.DateTime(2013, 11, 29, 15, 36, 2);
datas[2].data = 123;
datas[3] = new HisData();
datas[3].time = new DtTime();
datas[3].time.time = new System.DateTime(2013, 11, 29, 15, 36, 3);
datas[3].data = 1234;
s.InsertHisData("A1.PV", datas);
取得實時報警的示例代碼如下:
Service s = new Service();
AlarmData[] alarms;
s.GetRealAlarm(-1, -1, out alarms);
int nCount = alarms.GetUpperBound(0) + 1;
alarm_edit.Text = "";
for (int i = 0; i < nCount; ++i)
{
alarm_edit.Text += alarms[i].time.time.ToString() + " " + alarms[i].data.ToString() + " " + alarms[i].name + " " + alarms[i].desc + " " + alarms[i].eu + " " + alarms[i].data.ToString() + " " + alarms[i].limit.ToString() + "\r\n";
}
4、在Java下調(diào)用紫金橋WebService
在Java下可以使用Axis2來調(diào)用紫金橋的WebService,Axis2是Apache下的一個重量級WebService框架,準(zhǔn)確說它是一個Web Services / SOAP / WSDL 的引擎,是WebService框架的集大成者,它能不但能制作和發(fā)布WebService,而且可以生成Java和其他語言版WebService客戶端和服務(wù)端代碼。
Axis2的下載地址為:
http://apache.dataguru.cn//axis/axis2/java/core/1.6.2/axis2-1.6.2-bin.zip
下面著重介紹在Java下如何通過Axis2 調(diào)用紫金橋Web Service。
使用Axis2調(diào)用紫金橋WebService的步驟主要有兩步:
1)根據(jù)WSDL文件產(chǎn)生調(diào)用WebService的接口
Axis2提供了一個wsdl2java.bat命令,可以根據(jù)WSDL文件自動產(chǎn)生調(diào)用WebService的接口代碼。在紫金橋安裝目錄下可以找到realdb.wsdl文件,通過wsdl2java.bat命令即可利用此文件生成相應(yīng)的調(diào)用WebService的接口代碼。
wsdl2java.bat命令可以在 /bin目錄中找到。在使用wsdl2java.bat命令之前需要設(shè)置AXIS2_HOME環(huán)境變量,該變量值是。
在Windows控制臺輸出如下的命令行來生成調(diào)用WebService的代碼:%AXIS2_HOME%\bin\wsdl2java -uri <紫金橋軟件安裝目錄>/realdb.wsdl -p realdb -s -o realdb
其中-url參數(shù)指定了wsdl文件的路徑,可以是本地路徑,也可以是網(wǎng)絡(luò)路徑。
-p參數(shù)指定了生成的Java類的包名,
-o參數(shù)指定了生成的一系列文件保存的根目錄。
在執(zhí)行完上面的命令后,在當(dāng)前目錄下多了個realdb目錄,在realdb\src\realdb目錄可以找到ServiceStub.java文件,該文件封裝了調(diào)用WebService的方法,在程序中直接使用這個類.
需要注意的是,wsdl2java.bat命令生成的ServiceStub類將WebService方法的參數(shù)都封裝在了相應(yīng)的類中,類名為方法名,例如,GetRealData方法的參數(shù)都封裝在了GetRealData類中,要想調(diào)用GetRealData方法,必須先創(chuàng)建GetRealData類的對象實例。
2)在java下調(diào)用接口訪問紫金橋WebServcie
下面將介紹通過Eclipse來編寫java調(diào)用WebService的方法,使用其他編輯環(huán)境類似。
解壓eclipse-jee-helios-SR1-win32.zip文件,運行eclipse.exe出現(xiàn)下圖界面:
設(shè)置工作目錄,這里采用默認(rèn)配置,直接“OK”按鈕,完成配置。
在eclipse中新建 Java Project,在Project Name輸入
RealDBServiceExample,點擊Finish按鈕完成工程創(chuàng)建。
在工程中新建 class 類,畫面如下圖所示:
輸入類名RealDBWebService,選中 public static void main(String[] args)選項,點擊Finish按鈕完成類創(chuàng)建。
將src目錄下的realdb文件夾拷貝到工程目錄下的src文件夾下。
在Eclipse中編寫Service調(diào)用代碼,具體代碼如下:
引入工程所需 package。具體如下所示:
import realdb.*;
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
在main函數(shù)中編寫代碼如下:
ServiceStub realdb = new ServiceStub();
ServiceStub.GetRealData getData = new ServiceStub.GetRealData();
//定義GetRealData方法所需參數(shù)
ServiceStub.ArrayOfString pointParameters
= new ServiceStub.ArrayOfString();
pointParameters.addString("A1.PV");
pointParameters.addString("A2.PV");
pointParameters.addString("A3.PV");
getData.setNames(pointParameters);
ServiceStub.ArrayOfString pointValues
= realdb.getRealData(getData).getDatas();
//輸出參數(shù)與所回值
String paraValue[] = pointValues.getString();
String paraName[] = pointParameters.getString();
for (int i = 0; i<3; ++i)
{
System.out.println(paraName[i] + " = " + paraValue[i]);
}
在Eclipse中加載axis2 libraries
進入Java Project屬性設(shè)置對話框,點擊Java Build Path,選擇Libraries標(biāo)簽頁,如下圖所示:
點擊 Add External JARs ... 對話框,在彈出對話框選擇axis2 libraries,完成axis2 libraries加載。
運行后結(jié)果如下圖所示:
A1.PV = 10000.990
A2.PV = 20000.330
A3.PV = 30000.230
注意事項:
Realdb.wsdl中的soap:address location和soap12:address location默認(rèn)為localhost,端口號默認(rèn)為1997。
如果想讓其他網(wǎng)絡(luò)機器可以訪問Web Service,需將localhost替換成本機IP,如本機IP為 192.168.0.1 替換后如下所示:
替換完畢后,重新運行wsdl2java即可重新生成調(diào)用WebService的接口代碼。