Windows 8.1 低功耗蓝牙开发
1. 概述
在蓝牙4.0发布以前,给大家的直观印象就是蓝牙耳机,它就是用来满足短距离内中等带宽的音频通信需求。然而蓝牙4.0发布之后,用途就大不一样了,特别是现在物联网和可穿戴之风盛行的年代,很多小玩意都使用了它,如心率计、手环、钥匙扣等等物件,最终它能够和用户的手机、Pad以及PC等设备连接,实现五花八门的功能。为什么蓝牙4.0的用途广泛了呢?首先归功于低功耗,运行Bluetooth Low Energy的设备,一节纽扣电池可以支持其半年的时间;其次是低成本,如TI公司的CC2540蓝牙SoC售价是1美元。自iOS和Android支持蓝牙4.0 BLE以后,在今年4月份微软的BUILD 2014大会上,终于官方宣布在Windows 8.1和Windows Phone 8.1中支持蓝牙4.0 BLE,值得注意的是,目前为止,Windows 8.1 只支持GATT Client模式,而不支持GATT Server模式。下面我们就一起来了解一下如何在Windows 8.1平台上开发蓝牙 4.0 BLE的应用。
2. 设备
首先是配有蓝牙4.0的Windows 8.1系统的PC或者平板,以Surface Pro 2为例,可以打开“设备管理器”->蓝牙,查看下面的列表,如果里面有“Microsoft Bluetooth LE 枚举器”的话,如下图1所示,就说明是支持蓝牙4.0 LE的,如果没有的话,是无法搜索到蓝牙4.0 LE设备的,这时候就需要去更新系统和蓝牙驱动了。

图1
注意,在进行这一步以前,最好先去“设置”->“更改电脑设置”->“电脑和设备”->“蓝牙”中,把蓝牙打开。因为在我测试的时候发现,Surface Pro 2在蓝牙关闭的时候,不会出现“Microsoft Bluetooth LE 枚举器”这一项,如下图2所示,只有在蓝牙打开的情况下才会出现。

图2
其次,就是蓝牙4.0 BLE设备了,目前最流行的应该就是TI的CC2541 Sensor Tag,淘宝上都有卖,价格在200以内。Sensor Tag内部包含了6种传感器:IR temperature Sensor, Humidity Sensor, Pressure Sensor, Accelerometer, Gyroscope, Magnetometer。
3. 准备
如果在Windows设备上第一次使用Sensor Tag,我们还需要手动进行配对工作,这也是在Windows平台上使用蓝牙一贯以来的风格,包括以前的Windows Mobile,Windows CE,也包括现在的Windows Phone。当然,第一次使用配对成功以后,后面就不需要再配对了。首先,需要打开蓝牙开关,等待TI BLE Sensor Tag的出现,然后点击它,首次配对的PIN码为0000。如下图3所示。


图3
之后,系统会自动配置GATT服务,配置完成以后,可以去“设备管理器”->蓝牙那一项看看,你会发现里面多了很多GATT Services。如下图4所示。

图4
有关Sensor Tag提供的服务和对应的UUID,可以参考TI官方的文档:TI Development KIT。
其中用的典型的UUID包括:
Thermometer "f000aa00-0451-4000-b000-000000000000"
Accelerometer "f000aa10-0451-4000-b000-000000000000"
Humidity "f000aa20-0451-4000-b000-000000000000"
Magnetometer "f000aa30-0451-4000-b000-000000000000"
Barometer "f000aa40-0451-4000-b000-000000000000"
Gyroscope "f000aa50-0451-4000-b000-000000000000"
Key Service "0000ffe0-0000-1000-8000-00805f9b34fb"
Generic Access: 00001800-0000-1000-8000-00805f9b34fb
Generic Attribute: 00001801-0000-1000-8000-00805f9b34fb
Device Information: 0000180A-0000-1000-8000-00805f9b34fb
4. 创建应用
创建一个Windows Store应用,然后使用记事本或者在下编辑Package.appxmanifest文件,加入以下Capabilities:
<Capabilities>
<Capability Name="internetClient" />
<m2:DeviceCapability Name="bluetooth.genericAttributeProfile">
<m2:Device Id="any">
<m2:Function Type="serviceId:f000aa00-0451-4000-b000-000000000000"/>
<m2:Function Type="serviceId:F000AA10-0451-4000-B000-000000000000"/>
<m2:Function Type="serviceId:F000AA20-0451-4000-B000-000000000000"/>
<m2:Function Type="serviceId:F000AA30-0451-4000-B000-000000000000"/>
<m2:Function Type="serviceId:F000AA40-0451-4000-B000-000000000000"/>
<m2:Function Type="serviceId:F000AA50-0451-4000-B000-000000000000"/>
<m2:Function Type="serviceId:0000ffe0-0000-1000-8000-00805f9b34fb"/>
<m2:Function Type="serviceId:00001800-0000-1000-8000-00805f9b34fb"/>
<m2:Function Type="serviceId:00001801-0000-1000-8000-00805f9b34fb"/>
<m2:Function Type="serviceId:0000180A-0000-1000-8000-00805f9b34fb"/>
</m2:Device>
</m2:DeviceCapability>
</Capabilities>
然后,使用Generic Access Service来读取Sensor Tag的Device Name,代码如下:
//Find the devices that expose the service
var devices = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(GattDeviceService.GetDeviceSelectorFromUuid(GattServiceUuids.GenericAccess));
if (devices.Count==0)
return;
//Connect to the service
var service = await GattDeviceService.FromIdAsync(devices[0].Id);
if (service == null)
return;
//Obtain the characteristic we want to interact with
var characteristic = service.GetCharacteristics(GattCharacteristic.ConvertShortIdToUuid(0x2A00))[0];
//Read the value
var deviceNameBytes=(await characteristic.ReadValueAsync()).Value.ToArray();
//Convert to string
var deviceName=Encoding.UTF8.GetString(deviceNameBytes,0,deviceNameBytes.Length);
接着,我们来看看如何读取加速度传感器等数据:
//Find the devices that expose the service
var devices = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(GattDeviceService.GetDeviceSelectorFromUuid(new Guid("F000AA10-0451-4000-B000-000000000000")));
if (devices.Count==0)
return;
//Connect to the service
var accService = await GattDeviceService.FromIdAsync(devices[0].Id);
if (accService == null)
return;
//Get the accelerometer data characteristic
var accData = accService.GetCharacteristics(new Guid("F000AA11-0451-4000-B000-000000000000"))[0];
//Subcribe value changed
accData.ValueChanged += accData_ValueChanged;
//Set configuration to notify
await accData.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);
//Get the accelerometer configuration characteristic
var accConfig = accService.GetCharacteristics(new Guid("F000AA12-0451-4000-B000-000000000000"))[0];
//Write 1 to start accelerometer sensor
await accConfig.WriteValueAsync((new byte[]{1}).AsBuffer());
订阅数据变更的notifications,加速度传感器默认的数据更新频率是1秒,这个值我们也可以进行修改。
async void accData_ValueChanged(GattCharacteristic sender, GattValueChangedEventArgs args)
{
var values = (await sender.ReadValueAsync()).Value.ToArray();
var x = values[0];
var y = values[1];
var z = values[2];
}
5. 使用第三方库
大家知道,按照上面的步骤来做,自己需要写很多数据交互的代码。如果你想偷懒,可以参考一下第三方库,SebastianL在codeplex上给出了TI Sensor Tag的开源库,链接地址为:Link。目前的版本是1.2,支持Windows 8.1,据作者说支持Windows Phone 8.1的版本会很快到来。使用这个库很简单:
第一步,在新建Store应用中加入应用的Capabilities,步骤与上面第4节中的一样。
第二步,下载X2CodingLab.SensorTag库,并在项目中添加对X2CodingLab.SensorTag的引用,如下图5所示。

图5
第三步,在需要使用Sensor Tag的页面后台文件中,实例化相应的传感器,以加速度传感器为例:
Accelerometer accelerometer = new Accelerometer();
第四步,初始化传感器,调用封装好的Initialize()方法:
await accelerometer.Initialize();
如果没有配对的Sensor Tag,这里会抛出异常DeviceNotFoundException。
第五步,获取传感器数据,使用EnableSensor和DisableSensor方法来打开获取数据的开关,另外,如果获取数据结束了,最好调用DisableSensor来节省Sensor Tag的功耗。
await accelerometer.EnableSensor();
await accelerometer.DisableSensor();
使用EnableNotifications() 和 DisableNotification()来允许或者禁止数据通知:
private async void Notify()
{
await accelerometer.DisableNotifications();
await accelerometer.EnableNotifications();
accelerometer.SensorValueChanged += accelerometer_SensorValueChanged;
}
void accelerometer_SensorValueChanged(object sender, X2CodingLab.SensorTag.SensorValueChangedEventArgs e)
{
byte[] sensorData = e.RawData;
}
下面是应用运行界面图。

图6
再给出实物的图片吧,红色的是Sensor Tag。

最后,还是给出源代码工程的下载链接:Link。最近OneDrive不能用,用微盘代替一下。
Windows 8.1 低功耗蓝牙开发的更多相关文章
- Windows Phone 8.1低功耗蓝牙开发-Nokia Treasure Tag
1. 引言 上一篇文章<Windows 8.1 低功耗蓝牙开发>讲述了如何在Windows 8.1平台上创建低功耗蓝牙应用,并且以TI的Sensor Tag为例,给出了代码步骤和演示.其实 ...
- 物联网安全拔“牙”实战——低功耗蓝牙(BLE)初探
物联网安全拔“牙”实战——低功耗蓝牙(BLE)初探 唐朝实验室 · 2015/10/30 10:22 Author: FengGou 0x00 目录 0x00 目录 0x01 前言 0x02 BLE概 ...
- NRF52833蓝牙5.1可用于105℃环境温度的Nordic蓝牙5.1 SoC能实现更广泛的并发多协议低功耗蓝牙、mesh和Thread应用
Nordic Semiconductor宣布推出nRF52833先进多协议系统级芯片(SoC),这是其广受欢迎且验证通过的nRF52系列的第五个新成员.nRF52833是一款功耗超低的低功耗蓝牙 (B ...
- 低功耗蓝牙4.0BLE编程-nrf51822开发(9)
Android 4.3以后的系统自动支持蓝牙4.0规范的低功耗蓝牙(BLE).在android4.3之前,蓝牙4.0支持是由手机厂家加入支持的,接口各异,导致开发一个支持蓝牙4.0程序支持市面上的手机 ...
- Android低功耗蓝牙(BLE)开发的一点感受
最近一段时间,因为产品的需要我做了一个基于低功耗蓝牙设备的Android应用,其中碰到了一些困难,使我深深体会到Android开发的难处:不同品牌,不同型号和不同版本之间的差异使得Android应用适 ...
- 使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发具体解释
转载请注明来源: http://blog.csdn.net/kjunchen/article/details/50909410 使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发具体 ...
- Android 低功耗蓝牙BLE 开发注意事项
基本概念和问题 1.蓝牙设计范式? 当手机通过扫描低功耗蓝牙设备并连接上后,手机与蓝牙设备构成了客户端-服务端架构.手机通过连接蓝牙设备,可以读取蓝牙设备上的信息.手机就是客户端,蓝牙设备是服务端. ...
- Android低功耗蓝牙(蓝牙4.0)——BLE开发(上)
段时间,公司项目用到了手机APP和蓝牙设备的通讯开发,这里也正好对低功耗蓝牙(蓝牙4.0及以后标准)的开发,做一个总结. 蓝牙技术联盟在2010年6月30号公布了蓝牙4.0标准,4.0标准在蓝牙3.0 ...
- 【转】Android低功耗蓝牙应用开发获取的服务UUID
原文网址:http://blog.csdn.net/zhangjs0322/article/details/39048939 Android低功耗蓝牙应用程序开始时获取到的蓝牙血压计所有服务的UUID ...
随机推荐
- ASP.NET MVC 6 一些不晓得的写法
今天在看 Scott Guthrie 的一篇博文<Introducing ASP.NET 5>,在 MVC 6 中,发现有些之前不晓得的写法,这边简单记录下,算是对自己知识的补充,有些我并 ...
- 学习总结之 WebApi 用户登录和匿名登录,及权限验证
近些天,看了一些博客园大牛关于webApi项目的的文章,也有请教师兄一些问题,自己做了个Demo试了试,收获甚多.感谢感谢,下面是我一些学习的总结,如若有错的地方请多多指教!! WebApi登陆与身份 ...
- objective-c 语法快速过(1)
有一定 c++或者 java 基础,过一遍 oc 语法即可,都是相通的,个人认为难点是 oc 的内存管理,虽然有了 ARC,但是也需要学习下,因为有旧软件的维护. 建立在C语言的基础上,增加了一层小范 ...
- css截断长文本显示
实现 截断长文本显示处理,以前是通过后台的截取,但这种方法容易丢失数据,不利于SEO. 而通过前端css的截断,则灵活多变,可统一运用与整个网站. 这项技术主要运用了text-overflow属性,这 ...
- ssh整合问题总结--使用HibernateTemplate实现数据分页展示
在进行大量的数据展示时,必须要使用分页查询,第一次使用在SSH框架整合中使用分页查询,遇到了一些问题,下面以我练习的项目为例详细介绍,如何在Spring+hibernate(+action)的环境下完 ...
- iOS_UIImage_毛玻璃效果
效果图: 核心方法: // 出入UIImage 和 blur模糊成度 (0-1) - (UIImage *)blurryImage:(UIImage *)image withBlurLevel:(CG ...
- WebGIS中兴趣点简单查询、基于Lucene分词查询的设计和实现
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 兴趣点查询是指:输入框中输入地名.人名等查询信息后,地图上可 ...
- ASP.NET的session操作方法总结
在开发ASP.NET程序时,需要对相关数据进行缓存,缓存较多的主要是用户的身份信息,现提供几个对session操作较为常用的方法: 1.添加session,对设置对应的时间: /// <summ ...
- 我的angularjs源码学习之旅1——初识angularjs
angular诞生有好几年光景了,有Google公司的支持版本更新还是比较快,从一开始就是一个热门技术,但是本人近期才开始接触到.只能感慨自己学习起点有点晚了.只能是加倍努力赶上技术前线. 因为有分析 ...
- .NET编码解码(HtmlEncode与HtmlEncode)
编码代码: System.Web.HttpUtility.HtmlEncode("<a href=\"http://hovertree.com/\">何问起& ...