在.Net Micro Framework中使用DPWS
在.Net Micro Framework中使用DPWS by Freesc Huang http://fox23.cnblogs.com/ 摘要:DPWS是Windows Rally技术的一个子集,主要用于在可接入网络的设备上提供对Web Service的支持. 本文介绍了DPWS及其在.Net Micro Framework v3.0上的支持库,以及如何利用Visual Studio 2008 sp1在.Net Micro Framework的Device上创建DPWS的host与client,并让它们在Windows Vista下得以运行. 关键词: DPWS,.Net Micro Framework,Web Service,Windows Vista ? 1.?????? 什么是DPWS ? DPWS,即Device Profile for Web Services,它定义了在资源有限的终端上使用的,用于实现安全的Web service的最小接口集. Windows Vista上内置了DPWS的客户端类库(WSDAPI),那些支持DPWS的设备(比如常见的某些支持DPWS的打印机)会自动出现在Windows Vista的Network Explorer中,一如Windows XP可以发现UPnP的设备一样. 从某种程度上说,DPWS是UPnP的Web Service实现. DWPS的架构如图所示: ? Tips更多关于DPWS的内容请参阅DPWS的手册,你可以在以下链接下载: http://schemas.xmlsoap.org/ws/2006/02/devprof/ ? 2.?????? .Net Micro Framework上的DPWS类库 DPWS Host类库 (
? DPWS 客户端类库(MFDpwsClient.dll)包含如下命名空间
? 3.?????? 构建一个基于.Net Micro Framework的DPWS应用 3.1?? 定义Web Service的WSDL文件 作为DPWS中对一切服务的统一描述方式,WSDL是创建服务的必须的文件. 当然你可以选择手动创建WSDL,不过那似乎有点麻烦 =. = ! 这里为了简便,我就直接从桌面版的Webservice生成好了. OK.首先打开Visual Studio 2008 sp1,创建一个asp.net webservice的项目: ? 我们就简单地定义一个叫Add的方法: ??? /// <summary> ??? /// 返回两个整型数的和 ??? /// </summary> ??? [WebService(Namespace = "http://fox23.cnblogs.com/")] ??? [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] ??? [System.ComponentModel.ToolboxItem(false)] ??? // To allow this Web Service to be called from script,using ASP.NET AJAX,uncomment the following line. ??? // [System.Web.Script.Services.ScriptService] ??? public class Service1 : System.Web.Services.WebService ??? { ??????? [WebMethod] ??????? public int Add(int a,int b) ??????? { ??????????? return a+b; ??????? } } ? Tips 事实上这里你可以不必写函数的具体实现,事实上后面也只用到了Service1中的这个函数签名而已. ? ?????????????????? 然后在浏览器里跑一下这个服务,并访问其描述文件,如图: ? 然后这里我将该网页另存为AddService.wsdl文件(后缀名是wsdl). ? 3.2?? 利用MfSvcUtil.exe创建辅助类 .Net Micro Framework 3.0 SDK中提供了一个叫MfSvcUtil的小工具,用于从wsdl文件生成对应的DWPS辅助类,它在$MF安装路径$"Microsoft .NET Micro Framework"v3.0"Tools目录下可以找到. 为了方便,现在我们将之前保存的AddService.wsdl文件Copy到该目录下. 然后从命令行进入该目录,键入命令: MfSvcUtil AddService.wsdl 回车: ? 即开始生成以下三个辅助类: AddService.cs - 定义了客户端请求和服务器反应的数据类型的合同类 AddServiceHostedService.cs - 从DpwsHostedService获得的主机服务 AddServiceClientProxy.cs -从DpwsClient获得的客户端代理 ? Tips 注意这里默认情况下,生成的服务类名称为wsdl文件的名称. 你可以通过MfSvcUtil.exe的”/C”参数来修改这个名称. ? 3.3?? 构建一个Device Host Service 上面已经把需要的辅助类生成好,暂且不去谈那三个类的具体代码,我们还是先看看怎么把它们用起来. 现在我们不妨来定义一个用来host这个服务的设备. 新建一个.Net Micro Framework的控制台程序. 添加对以下程序集的引用: MFDpwsDevice.dll MFDpwsClient.dll MFDpwsExtentions.dll MFWsStack.dll 然后,将之前生成好的三个类添加到工程中来. 并添加如下引用目录:
? ? 我们先给设备指定一个GUID地址: ? ? Tips这个地址必须是urn:uuid这种GUID的格式,不过目前MSDN上的文档已经过时了,在http://msdn.microsoft.com/en-us/library/dd170121.aspx 中提到的诸如http://localhost:1234的地址格式现在是行不通的. ? 然后来配置一下这个DPWS Device,静态类Dpws.Device.Device 用于获取和配置设备自己的一些信息. Device.ThisModel类包括配置这个服务的一些特有信息,如:服务的名字,服务的号码。Device.ThisDevice类包含一些配置设备本身的参数,如序列号等: ? ? 创建好一个设备,我们还需要把服务添加到这个设备上,首先我们需要实现之前定义的服务借口,你在生成的AddService.cs文件中可以找到如下代码: ? ? 现在我们再添加一个AddServiceImplementation类到工程中,其用来实现这里的Add功能,代码很简单,如下: ? ? 然后回到Main函数中: ? OK,Host端就完成了. (不要急,完整的代码在后面有下载;-) ? 3.4?? 构建一个Device Service Consumer(Client) 为了测试这个服务,还需要做一个检测并使用这个服务的消费端. 我们再新建一个Micro Framework控制台程序,首先要找到DPWS设备. 就像在互联网我们根据IP查找目标机器一样,这里我们通过一个GUID来查找DPWS设备: ? 这个Resolve方法通过UDP在网路上multicast并返回一些DPWS的元数据,他们是一些ResolveMatches 的对象,包含了服务节点的信息和服务类型信息. 然后我们需要分析设备元数据,并查找我们需要的服务: ? 然后可以测试一下服务了: ? 3.5.?? RUN! 现在你可以在文章末尾下载这个程序来试着运行一次,开启两个Visual Studio,可以各自在模拟器进行调试,先运行Host,再运行Client,在VS的output窗口可以看到各自的运行信息: HOST: urn:uuid:587066b0-440f-4652-8395-ec20cca0ec91 Device started! CIENT: Device endpoint found: http://192.168.1.101:8084/587066b0-440f-4652-8395-ec20cca0ec91 Found device: ?ModelName: Freesc Dpws Test Device ?ModelNumber: 1.0 ?FirmwareVersion: alpha ?FriendlyName: Service1Soap ?SerialNumber: 12345678 Service endpoint found:http://192.168.1.101:8084/2c7ea8f1-d812-402d-afa8-6ca9fa03a2f0 mResponse.AddResult: 7 ? ? 这里要注意第一次运行时,Vista的防火墙也许会要询问你是否unblock这个应用程序,选择unblock即可 ? 4.总结 随着支持DPWS设备的不断增多,相信这项应用会越来越多样,越来越普及,目前.Net Micro Framework尚未与桌面的如WCF的服务实现良好的整合,不过.Net MF Team已经表示他们正在"work out". 那时各种设备与PC机构成的服务网络将会带来更多眩目的应用. 拭目以待吧. 参考资料:
完整代码在这里下载:DpwsSampleCode ? Happy new year to all? ;-) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |