蓝牙的应用十分广泛,基于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。

服务端

usingMicrosoft.WindowsMobile.SharedSource.Bluetooth;privatevoidSetRadioMode()
{
    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进行以下的修改:

//It does not support Wince 5 since Wince 5 does not include bthutil.dll//[DllImport(BTHUTIL_DLL)]//public static extern int BthGetMode(ref BluetoothRadioMode mode);//[DllImport(BTHUTIL_DLL)]//public static extern int BthSetMode(BluetoothRadioMode mode);publicstaticintBthGetMode(refBluetoothRadioMode mode)
{
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!"给客户端后开始不停的接收,实际通信顺序由具体需求决定。

客户端

privatevoidPairedDevices()
{
    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属性。

//const string BT_DEVICE_KEY_NAME = "Software\\Microsoft\\Bluetooth\\Device";conststringBT_DEVICE_KEY_NAME="Software\\Microsoft\\Bluetooth\\Device\\pan";//wince 5

代码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下的蓝牙开发相关推荐

  1. Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)设备配对的开发

    在.NET Compact Framework下的Bluetooth开发 之 32feet.NET 里讲述了如何使用32feet.net库来进行Bluetooth的开发,天机 同学在使用过程发现设备配 ...

  2. Windows Mobile和Wince(Windows Embedded CE )下使用.NET Compact Framework下注册表导出工具的开发...

    简介 本文讲述了.NET Compact Framework下的注册表开发的基本概念,介绍在Windows Mobile和Wince下操作注册表的工具,同时使用C#实现了一个注册表导出工具. 背景 W ...

  3. .NET Compact Framework下SQL CE的使用

    在Wince和Windows Mobile下最常用的数据库为SQL CE,SQL CE也曾经叫做SQL Server for Windows CE和SQL Server Mobile Edition, ...

  4. .NET Compact Framework下的单元测试

    在 Wince和Windows Mobile下native C++的单元测试 里讲述了在Wince和Windows Mobile下native C++进行单元测试的方法,这篇将会讲述.NET Comp ...

  5. .NET Compact Framework下的进程间通信之Windows Message

    在Wince和Windows Moblie 下的进程间通信可以由以下几种技术实现. 1. Windows Message 2. Point-to-Point Message Queues 3. MSM ...

  6. win32下Qt5BLE蓝牙开发笔记

    BLE简介 BLE蓝牙是蓝牙2.0以上的蓝牙模块,经典蓝牙是蓝牙2.0以下的蓝牙.蓝牙分为客户端和服务器两端,经典蓝牙可以通过socket编程进行客户端与服务器之间的通信(与网络socket相似),B ...

  7. .NET Compact Framework下的串口通信

    在Wince和Windows Mobile下,很多设备以串口(Serial Port/Com Port)的方式提供访问接口,例如可以通过串口访问GPS的receiver,从而接收NMEA Data. ...

  8. Windows Moible, Wince 使用.NET Compact Framework进行蓝牙(Bluetooth)开发 之 32feet.NET

    上篇文章 .NET Compact Framework下的Bluetooth开发 之 Windows Embedded Source Tools for Bluetooth 讲述了Windows Em ...

  9. 在Windows Mobile和Wince(Windows Embedded CE)下如何使用.NET Compact Framework开发进程管理程序...

    在.NET Compact Framework 的进程管理需要调用win32的API,也就是P/Invoke,在msnd上提供了这一P/Invoke的源代码, Creating a Microsoft ...

最新文章

  1. Spring Boot 以 jar 包方式运行在后台
  2. Linux RCU机制详解[转]
  3. js 单引号和双引号的使用注意事项
  4. C++中的默认初始化
  5. Android activity-alias 的使用
  6. 剑指offer面试题40. 最小的k个数(sort函数)
  7. JSK-243 三角形的路径权【动态规划】
  8. 横空出世,比Visio快10倍的画图工具来了
  9. 水果常识大全【图文典藏版】
  10. 软件开发培训学校四大培训标准,引领行业标杆
  11. java jws web_基于Jws的WebService项目
  12. 给打算找技术工作的毕业生几点建议
  13. BufferedWriter详解
  14. 微信会员注册开发【带源码】:网页授权,得到code后在当前页面获取openid,js+php实现跨域请求
  15. java基础国庆作业_国庆JAVA作业
  16. python speed为0但是速度过快_python代码加速
  17. 讯鸿喜讯丨民建广州市委科技与信息化委员会莅临讯鸿
  18. 宅急送项目开发过程及问题?
  19. 判断手机号码是否合法
  20. Joplin常用插件说明与下载

热门文章

  1. vuex 源码分析_Vuex源码解析
  2. mysql 创建date,在MySQL中从DATE和TIME创建DATETIME?
  3. python 颜色空间转换_python实现色彩空间转换
  4. python一切皆对象的理解_Python中万物皆对象?的理解
  5. join为什么每个字符都分割了 js_JS截取与分割字符串常用技巧总结
  6. 洛谷P4206 聪聪与可可
  7. windows上配置jdk环境变量
  8. 面试小结之Elasticsearch篇
  9. 会话管理隐患与防御 总结
  10. PostgreSQL9.5:pg_rewind 快速恢复备节点