key words:DPWS,嵌入式設備,WebService,Http,嗅探,Micro Framework。。
為了實現一個嵌入式設備和一個host在IIS server上面的WebService交互,使用了MF3.0裡面的DPWS方法。不過這個東西實在是Hard to use。今天就記錄下使用的過程中的第一步,首先分析一個Client和一個Webservice是如何交互的,發送的數據流的格式,然後在Device裡面封裝一下Soap頭用httpClient發送出去。
這裡用到了WireShark來分析網絡交互的數據包。
首先定義一個運行在IIS上面的簡單的WebService:
namespace Cashfree.Vending.Web.WebService
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class IISWS : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello Robin";
}
[WebMethod]
public int add(int a, int b)
{
return a + b;
}
}
}
然後定義一個Client來訪問這個Webservice:
namespace Cashfree.Vending.IISWSInvoke
{
class Program
{
static void Main(string[] args)
{
ISWSSoapClient isClient = new ISWSSoapClient();
Console.WriteLine(isClient.add(2, 3));
}
}
}
接著,發布好Webservice之後,編譯Client文件,然後找到Client的exe文件。
這個時候打開WireShark,監視網卡上面發送的數據流,設置過濾,格式如下:
(ip.addr eq 10.10.20.33 and ip.addr eq 192.168.0.100) and (tcp.port eq 1795 and tcp.port eq 8088)
雙擊Client端訪問IIS上面的Webservice,然後得到下面的一個數據包列表:
這就得到了一個完整的交互過程,從下往上,最左邊的一列是frame id。
我把著幾個frame,199到122解析出來得到了下面的格式:
首先是客戶端發送一個請求到iis的服務器上面,請求的地址是:/WebService/IISWS.asmx,這裡是支持http1.1的。
然後連接類型是一直保持連接。
這是Server回的一個ACK到Client來保持連接。同時標識連接通了。
然後Client端開始發送請求調用IIS上面的服務了,傳遞了兩個參數:
a=2,b=3;
封裝之後,有一個頭部和一個body。Envelope在MF2.5的時候,有類庫直接對應SOAP的頭和Body。3.0的時候找XMLDocument找了N久沒找到,MDSN上面明明寫的是有的。但是這個地方如果使用MF來解析的話,可以調用XMLReader來實現。只不過比較麻煩,只是提供了最基礎的XML訪問的方法,需要一個節點一個節點的找。
服務器端首先回一個ACK,然後跟著一個XMl文件表示調用的結果:
<addResult>5</addResult>
這裡,俺們知道了傳輸的數據格式之後,就可以把Soap message封裝好了之後直接傳輸給Server了。