.NET Compact Framework下的蓝牙开发
蓝牙的应用十分广泛,基于Bluetooth的通信程序开发主要有以下几个步骤:
服务端
* 设置本设备为可发现。
* 公开服务给其他Bluetooth设备访问。
* 接受其他Bluetooth设备的链接。
* 与链接上的Bluetooth设备进行通信。
客户端
* 发现周边Bluetooth设备。
* 主动与被发现的设备发起连接。
* 与链接上的Bluetooth设备进行通信。
在.NET Compact Framework下进行Bluetooth开发有几个可选解决方案
* 可以P/Invoke直接调用Bluetooth的API(btdrt.dll)
* 使用MS的Windows Embedded Source Tools for Bluetooth
* 使用32feet.NET库
这篇文章讲述基于Windows Embedded Source Tools for Bluetooth的开发,点击 链接 下载Windows Embedded Source Tools for Bluetooth,安装后在目录 C:\Program Files\Microsoft\Windows Embedded Source Tools会找到源码以及编译后的DLL。
服务端
{
BluetoothRadio br=newBluetoothRadio();
WriteMessage("Radio Mode:"+br.BluetoothRadioMode);if(br.BluetoothRadioMode!=BluetoothRadioMode.Discoverable)
{
br.BluetoothRadioMode=BluetoothRadioMode.Discoverable;
WriteMessage("Radio Mode:"+br.BluetoothRadioMode);
}
}privatevoidStartService()
{
Guid guid=StandardServices.SerialPortServiceGuid;
service=newBluetoothService(guid);
service.Start();
WriteMessage("Service started!");
System.Net.Sockets.NetworkStream ns=service.AcceptConnection();//Warning: this is blocking codeWriteMessage("Got a request!");stringdataToSend="Hello from service!";//Convert dataToSend into a byte arraybyte[] dataBuffer=System.Text.ASCIIEncoding.ASCII.GetBytes(dataToSend);//Output data to streamns.Write(dataBuffer,0, dataBuffer.Length);byte[] buffer=newbyte[2000];while(service.Started&&!stop)
{if(ns.DataAvailable)
{
ns.Read(buffer,0,50);stringdata=System.Text.ASCIIEncoding.ASCII.GetString(buffer,0,50);
WriteMessage("Receiving data:"+data);
}
}//Clear and close streamns.Flush();
ns.Close();
}
代码1
SetRadioMode检查本端Bluetooth设备是否为可发现,如果不可发现就设置为可发现。本地Bluetooth设备的 状态分成三种:On,Off,Discoverable。在Windows Embedded Source Tools for Bluetooth库里面查询和设置设备RadioMode的函数有点问题,只能用在Windows Mobile里面,如果在Wince里使用,需要对SafeNativeMethods.cs进行以下的修改:
{intmask=0;intret=BthReadScanEnableMask(refmask);switch(mask)
{case0x0:
mode=BluetoothRadioMode.Off;break;case0x2:
mode=BluetoothRadioMode.On;break;case0x3:
mode=BluetoothRadioMode.Discoverable;break;
}returnret;
}publicstaticintBthSetMode(BluetoothRadioMode mode)
{intmask=0;switch(mode)
{caseBluetoothRadioMode.Off:
mask=0x0;break;caseBluetoothRadioMode.On:
mask=0x2;break;caseBluetoothRadioMode.Discoverable:
mask=0x3;break;
}returnBthWriteScanEnableMask(mask);
}
[DllImport(BTDRT_DLL)]
publicstaticexternintBthReadScanEnableMask(refintmask);[DllImport(BTDRT_DLL)]
publicstaticexternintBthWriteScanEnableMask(intmask);代码2
Wince里面没有bthutil.dll,所以不能直接使用BthGetMode和BthSetMode的APIs了。需要调用BthReadScanEnableMask和BthWriteScanEnableMask来实现。
StartService使用winsock启动一个服务的侦听,在启动服务端时候必须选择服务,例子里选择了串口服务。关于bluetooth的服务,可以参考 http://en.wikipedia.org/wiki/Bluetooth_profile。 注意当service启动后,使用service.AcceptConnection()会把线程挂起,如果在实际使用中,一般需要启动一个worker thread执行,否则程序没办法处理其他任务,例如UI的响应。传输的数据是比特串(byte[]),所以可以传输任意类型的数据,在例子中传输的数据 为string。在例子中回应"Hello from service!"给客户端后开始不停的接收,实际通信顺序由具体需求决定。
客户端
{
BluetoothRadio br=newBluetoothRadio();
BluetoothDeviceCollection devices=br.PairedDevices;foreach(BluetoothDevice deviceindevices)
{
WriteMessage("ID:"+device.Address[5].ToString("X2")+"-"+device.Address[4].ToString("X2")+"-"+device.Address[3].ToString("X2")+"-"+device.Address[2].ToString("X2")+"-"+device.Address[1].ToString("X2")+"-"+device.Address[0].ToString("X2")+", Name:"+device.Name);
}
ConnectService(devices[0]asBluetoothDevice);
}privatevoidConnectService(BluetoothDevice device)
{
Guid guid=StandardServices.SerialPortServiceGuid;//Create network stream object//Connect to the device service (via the GUID)System.Net.Sockets.NetworkStream ns=device.Connect(guid);//Create storage for receiving databyte[] buffer=newbyte[2000];//Read Datans.Read(buffer,0,50);//Convert Data to Stringstringdata=System.Text.ASCIIEncoding.ASCII.GetString(buffer,0,50);
WriteMessage("Receiving data:"+data);inti=0;while(!stop)
{
WriteMessage("Writing:"+i.ToString());byte[] dataBuffer=System.Text.ASCIIEncoding.ASCII.GetBytes(i.ToString());
ns.Write(dataBuffer,
0, dataBuffer.Length);++i;if(i>=int.MaxValue){
i=0;
}
System.Threading.Thread.Sleep(500);
}//Close network streamns.Close();
}
代码3
Windows Embedded Source Tools for Bluetooth不支持自发现功能,所以在客户端的设备首先要和服务端的设备进行配对,所谓配对就是把对端的信息写入注册表里面。 PairedDevices()取出配对信息,其实就是从注册表里面取信息,Windows Embedded Source Tools for Bluetooth这个功能也写得不好,如果在wince下使用需要修改BluetoothRadio.cs文件的PairedDevices属性。
代码4
在wince下,注册表的位置取决于配对设备的类型,见下图。
图1
不同类型的配对设备放在不同的目录下。
但是在Windows Mobile下,所有配对信息存放于Software\\Microsoft\\Bluetooth\\Device下。
图2
ConnectService()的功能是链接服务端的设备。链接前同样选择串口服务,服务端和客户端需要使用统一的服务类型才能通信。在例子中连接后从服务端接收欢迎信息,然后不断往服务端发送数据。
从上面的例子看Windows Embedded Source Tools for Bluetooth的功能不是很完整,没有自动发现功能,也就是通信双方在通信之前需要配对成功,因此这样很不方便。而且Windows Embedded Source Tools for Bluetooth只是支持 Microsoft windows stack,不支持broadcom stack,后面文章会介绍另外一个的开源库32feet.NET。这个库支持自发现功能,同时部分支持broadcom stack。
转载 没有测试
转载于:https://www.cnblogs.com/TNTZWC/archive/2009/06/25/1511080.html
.NET Compact Framework下的蓝牙开发相关推荐
- Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)设备配对的开发
在.NET Compact Framework下的Bluetooth开发 之 32feet.NET 里讲述了如何使用32feet.net库来进行Bluetooth的开发,天机 同学在使用过程发现设备配 ...
- Windows Mobile和Wince(Windows Embedded CE )下使用.NET Compact Framework下注册表导出工具的开发...
简介 本文讲述了.NET Compact Framework下的注册表开发的基本概念,介绍在Windows Mobile和Wince下操作注册表的工具,同时使用C#实现了一个注册表导出工具. 背景 W ...
- .NET Compact Framework下SQL CE的使用
在Wince和Windows Mobile下最常用的数据库为SQL CE,SQL CE也曾经叫做SQL Server for Windows CE和SQL Server Mobile Edition, ...
- .NET Compact Framework下的单元测试
在 Wince和Windows Mobile下native C++的单元测试 里讲述了在Wince和Windows Mobile下native C++进行单元测试的方法,这篇将会讲述.NET Comp ...
- .NET Compact Framework下的进程间通信之Windows Message
在Wince和Windows Moblie 下的进程间通信可以由以下几种技术实现. 1. Windows Message 2. Point-to-Point Message Queues 3. MSM ...
- win32下Qt5BLE蓝牙开发笔记
BLE简介 BLE蓝牙是蓝牙2.0以上的蓝牙模块,经典蓝牙是蓝牙2.0以下的蓝牙.蓝牙分为客户端和服务器两端,经典蓝牙可以通过socket编程进行客户端与服务器之间的通信(与网络socket相似),B ...
- .NET Compact Framework下的串口通信
在Wince和Windows Mobile下,很多设备以串口(Serial Port/Com Port)的方式提供访问接口,例如可以通过串口访问GPS的receiver,从而接收NMEA Data. ...
- Windows Moible, Wince 使用.NET Compact Framework进行蓝牙(Bluetooth)开发 之 32feet.NET
上篇文章 .NET Compact Framework下的Bluetooth开发 之 Windows Embedded Source Tools for Bluetooth 讲述了Windows Em ...
- 在Windows Mobile和Wince(Windows Embedded CE)下如何使用.NET Compact Framework开发进程管理程序...
在.NET Compact Framework 的进程管理需要调用win32的API,也就是P/Invoke,在msnd上提供了这一P/Invoke的源代码, Creating a Microsoft ...
最新文章
- Spring Boot 以 jar 包方式运行在后台
- Linux RCU机制详解[转]
- js 单引号和双引号的使用注意事项
- C++中的默认初始化
- Android activity-alias 的使用
- 剑指offer面试题40. 最小的k个数(sort函数)
- JSK-243 三角形的路径权【动态规划】
- 横空出世,比Visio快10倍的画图工具来了
- 水果常识大全【图文典藏版】
- 软件开发培训学校四大培训标准,引领行业标杆
- java jws web_基于Jws的WebService项目
- 给打算找技术工作的毕业生几点建议
- BufferedWriter详解
- 微信会员注册开发【带源码】:网页授权,得到code后在当前页面获取openid,js+php实现跨域请求
- java基础国庆作业_国庆JAVA作业
- python speed为0但是速度过快_python代码加速
- 讯鸿喜讯丨民建广州市委科技与信息化委员会莅临讯鸿
- 宅急送项目开发过程及问题?
- 判断手机号码是否合法
- Joplin常用插件说明与下载
热门文章
- vuex 源码分析_Vuex源码解析
- mysql 创建date,在MySQL中从DATE和TIME创建DATETIME?
- python 颜色空间转换_python实现色彩空间转换
- python一切皆对象的理解_Python中万物皆对象?的理解
- join为什么每个字符都分割了 js_JS截取与分割字符串常用技巧总结
- 洛谷P4206 聪聪与可可
- windows上配置jdk环境变量
- 面试小结之Elasticsearch篇
- 会话管理隐患与防御 总结
- PostgreSQL9.5:pg_rewind 快速恢复备节点