




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)开发 之 蓝牙虚拟串口 (Bluetooth Virtual Serial Port)在这篇文章讲述Bluetooth Virtual Serial Port的开发,所谓Bluetooth Virtual Serial Port,其实是从软件的角度看,把Bluetooth的通信转化成Serial Port(串口)。经过这样的转换后,使用Bluetooth的Client程序可以像使用串口一样操作Bluetooth。这个应用方式的出现是为了支持现有应用(Legacy system,遗产应用)。举个例子,在Bluetooth出现以前,大部分移动设备都是通过串口连接的GPS receiver的,基于GPS应用程序的开发也就通过的串口通信取出NMEA data。关于GPS NMEA data的开发可以参考.NET Compact Framework下的GPS NMEA data数据分析。串口的开发可以参考.NET Compact Framework下的串口通信。随着Bluetooth的普及,移动设备可以通过Bluetooth来连接GPS receiver了,那么原先基于GPS的应用程序需要重新开发通信部分去读取NMEA data,这为现有应用带来很多麻烦,所有的现有应用都需要重写通信部分,因此人们想出解决方法,把Bluetooth的通信转化成Serial Port(串口)。硬件上使用Bluetooth来进行通信,在软件上虚拟一个串口给应用程序,应用程序不需要任何的修改就可以支持Bluetooth的GPS Receiver了。这就像设计模式里面的Adapter模式,但是这里是为新设备提供原有的接口,使得原先的Client不需要更改。由于Bluetooth Virtual Serial Port的出现基于对现有系统(Legacy System)支持的需求,所以对于新的系统,MS不推荐使用Bluetooth Virtual Serial Port,而是直接使用Winsock进行通信。在使用Winsock进行Bluetooth通信需要指定服务,因此可以指定使用串口服务进行通信。Bluetooth Virtual Serial Port和Winsock的Bluetooth通信都是使用RFCOMM协议,所以两者等同。使用Winsock的Bluetooth通信比Bluetooth Virtual Serial Port更简单,不需要配置。而且更强壮(robust),因为使用Winsock的Bluetooth通信可以直接监听到蓝牙设备关闭或者离开通信范围,而Bluetooth Virtual Serial Port只能通过Timeout来检查。由于支持现有系统(Legacy System),Bluetooth Virtual Serial Port还是有存在的价值,下面讲述Bluetooth Virtual Serial Port的开发。在Windows Mobile下有两种方法可以建立Bluetooth Virtual Serial Port:调用API建立Bluetooth Virtual Serial Port和修改注册表建立Bluetooth Virtual Serial Port调用API建立Bluetooth Virtual Serial Port调用API建立Bluetooth Virtual Serial Port可以调用RegisterDeviceHANDLEh=RegisterDevice(LCOM,index,Lbtd.dll,(DWORD)&pp);建立服务端口,需要配置以下参数PORTEMUPortParamspp;memset(&pp,0,sizeof(pp);pp.flocal=TRUE;pp.channel=channel&0xff;服务端口flocal为true。channel可以使用RFCOMM_CHANNEL_MULTIPLE (0xfe),这样RFCOMM 会自动分配可用的信道。建立客户端口,需要配置以下参数PORTEMUPortParamspp;memset(&pp,0,sizeof(pp);pp.device=ba;pp.channel=channel&0xff;服务端口flocal为false。device为服务端地址。反注册端口使用以下APIDeregisterDevice(h);详细可以参考MSDN文章 Creating a Connection to a Remote Device Using a Virtual COM Port,链接见参考文献。在32里面,这些API封装在InTheHand.Net.Ports.BluetoothSerialPort,可以直接使用。但是32的作者提醒这些API是不是可信赖的(unreliable),所以在使用之前请要谨慎考虑和详细测试。我在wince 5下测试过,不能成功建立Bluetooth Virtual Serial Port。使用32建立服务端口publicstaticvoidCreateIncomingPort()BluetoothSerialPortport=BluetoothSerialPort.CreateServer(BluetoothService.SerialPort);Console.WriteLine(port.PortName);使用32建立客户端口publicstaticvoidCreateIncomingPort()BluetoothClientclient=newBluetoothClient();BluetoothDeviceInfodevices=client.DiscoverDevices();BluetoothDeviceInfodevice=null;foreach(BluetoothDeviceInfodindevices)if(d.DeviceName=BLUETOOTH_DEVICE)device=d;break;BluetoothEndPointendPoint=newBluetoothEndPoint(device.DeviceAddress,BluetoothService.SerialPort);BluetoothSerialPortport=BluetoothSerialPort.CreateClient(endPoint);Console.WriteLine(port.PortName);修改注册表建立Bluetooth Virtual Serial Port由于第一种方法不是很可靠,所以可以选择第二种方法,第二种方法其实就是修改注册表,把HKEY_LOCAL_MACHINESOFTWAREMicrosoftBluetoothSerialPorts的项进行修改。可是这个方法只是支持windows mobile5以上的系统,不支持wince5。同时,如果使用这个方法,需要重启系统。这是Windows Mobile的注册表,可以通过程序修改注册表的项目,通过程序修改后需要重启Windows Mobile。上图为Wince 5的注册表,结构不一样,在Wince5不能通过修改注册表的方式实现Bluetooth Virtual Serial Port。下面的代码来源自32的BluetoothDeviceInfo类里面的SetServiceState()方法。这里演示了如何修改注册表。if(state)/writeregistrysettingsforWM5SerialPortsupport/getavailableportsMicrosoft.Win32.RegistryKeyrkPorts=Microsoft.Win32.Registry.LocalMachine.OpenSubKey(SOFTWAREMicrosoftBluetoothSerialPorts,true);stringsupportedPorts=(string)rkPorts.GetValue(SupportedPorts);System.Collections.ArrayListalPorts=newSystem.Collections.ArrayList(supportedPorts);/checkavailabilityforeach(stringdeviceidinrkPorts.GetSubKeyNames()Microsoft.Win32.RegistryKeyrkDevice=rkPorts.OpenSubKey(deviceid);/removeportfromarraylistifunavailablestringport=rkDevice.GetValue(Port).ToString();intnullPos=port.IndexOf(0);if(nullPos-1)port=port.Substring(0,nullPos);if(alPorts.Contains(port)alPorts.Remove(port);rkDevice.Close();if(alPorts.Count=0)thrownewInvalidOperationException(Noportsavailable);/writeportdetailstoregistryMicrosoft.Win32.RegistryKeyrkNewPort=rkPorts.CreateSubKey(this.DeviceAddress.ToString(8);rkNewPort.SetValue(KeepDCB,0);rkNewPort.SetValue(RemoteDCB,0);rkNewPort.SetValue(Encryption,0);rkNewPort.SetValue(Authentication,0);rkNewPort.SetValue(Port,alPorts0);rkNewPort.SetValue(Server,0);rkNewPort.Close();rkPorts.Close();/tryopenportnowtryInTheHand.Net.Ports.BluetoothSerialPort.CreateClient(alPorts0.ToString(),newBluetoothEndPoint(this.DeviceAddress,BluetoothService.SerialPort);catchelse/findandremoveregistryentriesMicrosoft.Win32.RegistryKeyrkPorts=Microsoft.Win32.Registry.LocalMachine.OpenSubKey(SOFTWAREMicrosoftBluetoothSerialPorts,true);foreach(stringdeviceAddressinrkPorts.GetSubKeyNames()if(deviceAddress=this.DeviceAddress.ToString(8)rkPorts.DeleteSubKeyTree(deviceAddress);break;rkPorts.Close();当state为true时为注册,当state为false时为反注册。tbw淘宝网 taob
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 布匹购销合同(标准版)
- 电商直播营销合作协议
- 大理石切割刀具选择与管理方案
- (2025年标准)工厂铁屑处理协议书
- (2025年标准)个体工商分红协议书
- 三农村饮水安全工程实施方案
- (2025年标准)高职的实习协议书
- (2025年标准)钢筋制作合同协议书
- 2025年营养学生活方式干预方案设计评估试卷答案及解析
- 2025年企业宿舍安全协议书
- 《质量管理与可靠性》课件-第4章 质量检验
- 2025年财政部高层次财会人才选拔考试历年参考题库含答案详解(5套)
- 电子技术基础说课
- 医院科室主任年度目标责任书模板
- 2025年成考考试题目解析及答案
- 2025年足球裁判三级试题及答案
- 2025年秋期部编版四年级上册小学语文教学计划+教学进度表
- 2025年特种设备检验检测项目合作计划书
- 安全生产投入费用明细
- 2025年司机三力考试题库及答案
- 铁路动态设计管理办法
评论
0/150
提交评论