《基于Windows CENET实现蓝牙通讯模块的几种方法.docx》由会员分享,可在线阅读,更多相关《基于Windows CENET实现蓝牙通讯模块的几种方法.docx(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、基于WindowsCE.NET实现蓝牙通讯模块的几种方法基于WindowsCE.NET实现蓝牙通讯模块的几种方法lvjing导语:蓝牙通讯技术在嵌入式产品中的应用具有极为广阔的前景,微软公司的WindowsCENET已经成为了主流的嵌入式操作系统之一。摘要:蓝牙通讯技术在嵌入式产品中的应用具有极为广阔的前景,微软公司的WindowsCE.NET已经成为了主流的嵌入式操作系统之一。论文给出了在VisualStudio2005中利用托管码并分别采用P/Invoke技术、微软蓝牙嵌入式工具包、OpenNETCF类库和利用本机码来开发WindowsCE.NET操作系统下蓝牙通讯模块的几种方法,并在其中
2、对P/Invoke技术、托管码开发、本机码开发等几个关键技术进展了阐述。最后给出了利用托管码和本机码开发蓝牙通讯模块这几种方法的优劣比拟和分析。其内容对于在Windowsmobile平台下开发蓝牙设备间的通讯具有一定实用价值。关键词:蓝牙WindowsmobileP/Invoke托管码本机码0引言自1998年度,世界九大电子产业巨头共同提议蓝牙特殊利益集团SIG后,在短短不到十年度之内,蓝牙技术已经被应用到如信息家电、电子商务、汽车、航空、医疗、交通等多个领域。在挪动计算方面,蓝牙技术采用了一种极为经济的形式解决了无线通讯最后10m的问题,进而替代了各种挪动信息电子设备之间的电缆。因此,蓝牙技
3、术在挪动计算领域的应用将特别广阔,它的应用开发也就有很大的实际意义。微软公司从1996年度起开发了嵌入式操作系统WindowsCE1.0开场,凭借着其在PC市场上的成功经历和WindowsCE类似于PC机上操作系统的作者简介:白炜1980-,男,硕士研究生,研究方向为嵌入式系统。导师简介:白万民,教授,研究方向为嵌入式系统、计算机应用。友好熟悉的界面逐渐扩大着自己在嵌入式操作系统市场的份额。Windowsmobile平台是微软公司针对嵌入式环境下开发的一套嵌入式操作系统,其主要是指WindowsCE.NET,WindowsCE.NET的最新版本为WindowsCE5.0,其中包括3个版本:以数
4、据为中心的掌上电脑PocketPC;以语音为中心的智能手机SmartPhone;以娱乐为中心的便携式媒体中心PortableMediaCenters。而在这3个版本中都可能涉及到蓝牙应用的开发。在WindowsCE.NET的开发上,目前采用微软公司2005年度年度底推出的VisualStudio2005是最理想的选择。用VisualStudio2005可以进展利用C#,或者VB.NET等语言开发基于.NETCompactFramework2.0或者1.0的托管码WinCE程序,可以以利用C+语言来开发基于MFC,ATL或者Win32API的本机码WinCE程序。因为在微软最新的.NETComp
5、actFramework2.0的类库中还未包含针对蓝牙通讯模块的类库,而且目前关于在WindowsCE中开发蓝牙通讯模块应用程序的介绍还很少,同时开发蓝牙通讯技术的应用需要特别广泛,所以本文将就此进展一些讨论。1基于托管码开发蓝牙通讯模块基于托管码的开发就是使用一套运行时环境run-timeenvironment的应用程序接口来开发。一般情况下,托管码应用程序的开发会比拟简单和快速,并且可跨软件平台和处理器来运行,所以开发出的托管码也能重新使用并有较高的可移植性。另外,内存管理、资源管理、资源采集、平安性管理等琐碎工作都由运行时环境来处理。应用程序开发工程师不必费心处理。托管应用程序在目的机器
6、上运行,是通过目的机器端的实时编译器来实时把托管码编译成目的机器码后在目的机器上执行。由于在.NET平台下,采用CLR公共语言运行时可以用不同的语言来调用.NETCompactFramework来开发一样功能的应用程序,所以本文托管码局部仅采用C#语言为例来介绍蓝牙通讯模块开发。1.1利用P/Invoke方法编写蓝牙通讯模块蓝牙通讯模块是一个涉及到驱动硬件的应用程序开发,而.NETCompactFramework并不是一个对Win32API进展了完好封装的类库。所以在基于托管码开发蓝牙通讯模块中必须利用到托管代码怎样与非托管代码交互技术。P/Invoke全称为PlatformInvoke,是.
7、NET开发平台下允许托管代码调用DLL库的本地代码函数的效劳,类似于JA-VA中的GNI的概念。图1讲明了P/Invoke方法的工作原理。首先用相应语言的编译器将托管的源代码编译成Assembly的形式,其中包括元数据和中间语言代码。而此时P/Invoke的声明会以元数据的形式存在于Assembly中,当Assembly被CLR调用的时候,CLR会根据元数据的声明在对应的DLL函数中查找DLL的实现。假如找到,就将其加载到内存中,并定位此DLL函数的人口点。将托管的参数人栈,并将函数的人口点指向对应的nativedll,进而完成了托管代码调用非托管代码的DLL。利用P/Invoke方法编写蓝牙
8、通讯模块,DllI-port属性非常有用。下面的代码将用例子讲明此通用方案,例中托管程序将调用MessageBox位于User32.lib中:usingusingnamespaceSystem:Runtime:InteropSer-vices;namespaceSysWin32DllImportuser32.dll,EntryPoint=MessageBox,CharSet=UnicodeintMessageBoxvoidhWnd,wchar_tlpText,wchar_tlpCaption,unsignedintuType;intmainSysWin32:MessageBox0,LHello
9、world!,LGreetings,0注意包含DllImport的代码行。此代码行根据参数值通知编译器,使之声明位于User32.dll中的函数,并将签名中出现的所有字符串如参数或者返回值视为Unicode字符串。假如缺少EntryPoint参数,那么默认值为函数名。另外,由于CharSet参数指定Unicode,因此公共语言运行库将首先查找称为MessageBoxW的函数。假如运行库未找到此函数,它将根据调用约定查找MessageBox和相应的修饰名。当调用用户定义的DLL中所包含的函数时,有必要将externC添加在DLL函数声明之前,如下所示:externCSAMPLEDLL_APIin
10、tfnSam-pleDLLvoid;在调用非本机码时,需要注意的是要将非构造化参数由托管封送处理为本机码形式。可以利用CharSet参数值的作用,将参数中字符串string类型都自动转换为wchar_t。同样,所有Int32参数类型转换为非托管int,UInt32参数类型转换为非托管unsignedint,而Intl6参数类型转换为了shortint。char用于in参数的为StringCharSetAnsi,用于out参数或者返回值的为Text:StringBuilder。wchar-t用于in参数为StringCharSetUnicode,用于out参数或者返回值的为Text:String
11、Builder。需要注意的是函数指针必须具有_stdcall调用约定,这是因为这是DllImport支持的唯一类型。对于数组来讲数组如wchar_t,CharSet参数仅应用于函数参数的根类型。因此,无论CharSet的值是什么,String_gc将被封送处理为wchar_t。除简单类型外,运行库还提供了一种机制,可以将简单构造由托管上下文封送处理为非托管上下文。简单构造不包含任何内部数据成员指针、构造化类型的成员或者其他元素。在做一个关于蓝牙通讯程序前,还需要一些关于蓝牙的根底知识。一个蓝牙模块程序需要包含开启蓝牙,配对,连接,建立串行通道,然后开启通讯经过,还需要在应用程序中设置串行端口。
12、因为蓝牙技术有平安方面的设置,所以需要对蓝牙设备进展配对。蓝牙的工作状态总共有3种,分别为开启、关闭、可发现。并且所有的通讯设备都必须有一个对应的DeviceID,蓝牙也不例外,蓝牙的DeviceID是一串以:分隔的16进制的数字。有了上述知识,就可以在托管码中利用P/Invoke方法开场编写蓝牙通讯模块了。对应的每一步需要调用的根本函数如下:获取本地设备的IDDllImportBtdrt.dll,SetLastError=truepublicstaticexternintBthReadLocalAddrbytePBa获取远程设备的IDDllImportws2.dll,EntryPoint=W
13、SALook-upServiceBegin,SetLastError=truepublicstaticexternintCeLookupServiceBeginbytepQuerySet,LookupFlagsdwFlags,refintlphLookup监听效劳DllImportws2.dll,EntryPoint=WSASetSer-vice,SetLastError=truepublicstaticexternintCeSetServicebytepQuerySet,RNRSERVICE_REGISTER,LookupFlagsdwFlags连接DllImportmscoree,Entr
14、yPoint=339publicstaticexternintconnectints,bytename,intnamelen蓝牙的平安设置获取配对码恳求DllImportBtdrt.dll,SetLastError=truepublicstaticexternintBthGetPINRequestbytepba设置配对码DllImportbtdrt.dll,SetLastError=truepublicstaticexternintBthSetPINbytepba,intcPinLength,byteppin创立ACL连接:DllImportBtdrt.dll,SetLastError=tru
15、epublicstaticexternintBthCreateACLConnectionbytepbt,refushortphandle;然后是配对码验证:DllImportBtdrt.dll,SetLastError=truepublicstaticexternintBthAuthenticatebytepbt;然后一定要关闭连接:DllImportBtdrt.dll,SetLastError=truepublicstaticexternintBthCloseConnectionushorthandle;设置蓝牙无线电状态DllImportBthUtil.dll,SetLastError=t
16、ruepublicstaticexternintBthSetModeRadioModedwMode在建立好蓝牙设备的连接后,就可以进展两个蓝牙设备之间的通讯了。由于可以将蓝牙通信当作一个虚拟的串行通信来处理,所以在建立通讯的经过中可以采用类似于串口之间的通讯方式。而关于串口通讯这方面资料很多,本文就不详细详述了。1.2利用微软蓝牙嵌入式工具包编写蓝牙通讯模块微软蓝牙嵌入式工具包是微软公司新推出来基于.NETCompactFramework2.0的一款专门用来快速开发蓝牙应用程序的工具包,直接在.NET平台下直接调用其中类库,可以快速,简单的开发一般的蓝牙应用程序。不过该工具包只能在Window
17、sCE5.0下使用。利用工具包可以完成:启动一个蓝牙效劳,寻找周边蓝牙设备,连接已存在的蓝牙设备或效劳。工具包可以在微软网站下载。利用此工具做两个蓝牙设备间进展简单文本传输的程序局部代码如下:Server端:GuidserviceGuid=newGuid81553B2B-FFOB-4415-86C9-22B799058B81;ServerHandlesh=btseore.CreateServiceser-viceGuid;NetworkStreamns=sh.AceeptConnectionStingdataToSend=Hello;BytedataBuffer=System.Text.ASC
18、IIEncoding.ASCII.GetBytesdataToSend;ns.WritedataBuffer,0,dataBuffer.Length;ns.Flush;ns.Close;Client端:PairedDevices=btsCore.GetPairedDevices;ForeachBluetoothDevicedeviceinpairedDevicespairedDevicesListBox.Item.Adddevice.deviceName;GuidserviceGuid=newGuid01550D2D-FF0D-4415-86C9-22B799058B81;IfpairedDe
19、vicesListBox.SelectedIndex=0;BluetoothDevicedeviceToConnect=BluetoothDevicepairedDevicespairedDevicesListBox.Selected;NetworkStreamns=btsCore.ConnectdeviceTo-Connect,serviceGuid;bytebuffer=newbyte2000ns.Readbuffer,0,50;charbufferAsChars=System.Text.ASCII.GetCharsbufferSystem.Strings=System.Text.Enco
20、ding.ASCIIGetStringbuffer,0,buffer,length;Message.Showsns.Close;1.3利用OpenNETCF编写蓝牙通讯模块OpenNETCF是一个可以有效进步WindowsMobile开发效率的第三方开源类库。是一帮WindowsMobile爱好者共同编写的,里面提供了很多在NETCompactFramework2.0中未能包含的类库。有两种方式可以来使用它:一种是可以将其当作一个组件安装在VisualStudio2005中;另一种是可以将其原代码编辑拿来使用。在OpenNETCF开源类库中就包括有蓝牙方面的,所以可以以利用OpenNETCF来
21、编写蓝牙通讯模块。对应类库可在opennetcf网站下载。在类库中,可以利用命名空间OpenNETCF.IO.Ports下的Blue-toothSerialPort来建立蓝牙连接,利用命名空间OpenNETCF.IO.Serial中内容进展蓝牙程序的通讯。2基于本机码开发蓝牙通讯模块本机码应用程序是使用一套特定软件平台的应用程序开发接口来开发,并且被编译成一个特定处理器的目的码或者机器码。一般情况下,本机码提供较高的效能和最小的资源要求,但是被编译好的本机码或者是可执行文件却只能在此软件平台或者特定处理器上运行。此外,本机码应用程序常需要应用开发者自行处理类似内存管理、资源管理、平安性管理等。
22、在VisualStudio2005中已经可以利用C+语言来开发基于MFC,ATL或者Win32API的本机码WinCE程序。这就提供了类似于用eMbeddedVisualC+来开发windowsmobile设备的方法。而本文在利用P/Invoke方法编写蓝牙通讯模块时介绍的就是调用本机码开发蓝牙应用程序,方法类似,所以此处就不再进展详细的分析了。3完毕语本文讨论了在VisualStudio2005里分别利用托管码和本机码来开发Windowsmobile设备蓝牙通讯模块的几种方法。文中介绍的蓝牙通讯模块各种开发方法都有各自的优点和缺点,假如用户开发的蓝牙通讯设备需要较高的效能和最小的资源要求,一
23、定是采用本机码的方法来开发是最好的。因为采用本机码开发的程序是直接被编译成机器码来执行的,进而可以获得更高的性能。但是采用本机码来开发程序的最大缺点就是开发难度大,开发周期长,所以并不适用于一般要求的用户。而在对效能和资源要求并不是很高的产品中采用文中所述的托管码中的几种方法来开发蓝牙通讯模块那么是更好的选择,用托管码开发的程序会比拟的简单和快速,同时又由于其并不直接生成最终的机器代码,而是生成了中间代码来执行,所以用托管码开发的程序可以跨平台和处理器来运行,但是这是以牺牲一定的访问速度为代价的。在基于托管码开发蓝牙通讯设备中本文共介绍了3种方法,因为到.NETFRAMEWORK2.0的时候微软公司都没有开发针对蓝牙通讯模块的类库,所以利用P/Invoke方法编写蓝牙通讯模块是在托管码下开发蓝牙通讯模块比拟常见的选择。而微软蓝牙嵌入式工具包和OpenNETCF类库编写蓝牙通讯模块方法比拟类似,其都是类库对底层API的类封装,所以开提议来较为简单和快速,更合适于一般要求的蓝牙通讯模块的开发。蓝牙设备在嵌入式环境下的应用有着特别广阔的前景,目前还有很多工作尚需研究。解决怎样在Windowsmobile平台下开发更好更高效的蓝牙应用程序可以推动蓝牙技术在嵌入式产品上的更好利用。这一方面的开发将具有极强的实用性,将成为以后研究工作的重点。