ibeacon是什么
iBeacon是苹果公司2013年9月发布的移动设备用OS(iOS7)上配备的新功能。其工作方式是,配备有 低功耗蓝牙(BLE)通信功能的设备使用BLE技术向周围发送自己特有的ID,接收到该ID的应用软件会根据该ID采取一些行动。比如,在店铺里设置iBeacon通信模块的话,便可让iPhone和iPad上运行一资讯告知服务器,或者由服务器向顾客发送折扣券及进店积分。此外,还可以在家电发生故障或停止工作时使用iBeacon向应用软件发送资讯。
苹果 WWDC 14 之后,对 iBeacon 加大了技术支持和对其用于室内地图的应用有个更明确的规划。苹果公司公布了 iBeacon for Developers 和 Maps for Developers 等专题页面。
iBeacon技术作为利用低功耗蓝牙技术研发者,有不少团队对其进行研究利用。
BLE设备如何通信
BLE的通信包括两个主要部分:advertising(广告)和connecting(连接)。
广告(Advertising)是一种单向的发送机制。想要被搜索到的设备可以以20毫秒到10秒钟的时间间隔发送一段数据包。使用的时间间隔越短,电池消耗的越快,但设备被发现的速度也就会快。数据包长度最多47个字节,由以下部分组成:
1 byte preamble(1字节做报头)
4 byte access address(4字节做地址)
39 bytes advertising channel PDU(39个字节用于PDU数据包)
3 bytes CRC(3个字节用于CRC数据校验)
对于广告通信信道,地址部分永远都是0x8E89BED6。对于其它数据信道,地址部分由不同的连接决定。
返回的PDU数据也拥有自己的数据报头(2个字节:声明有效载荷数据的长度和类型——设备是否支持连接等等)和当前有效载荷数据(最多37个字节)。
最终,有效载荷数据中的头6个字节是设备的MAC地址,所以实际信息数据最高可占31个字节。
BLE设备可以运行在单一的不可连接的广告模式中(在这种模式下所有的信息都包含在广告数据包中),然而设备也是允许运行在可被连接的模式下(通常情况下都是这种模式)。
当设备被发现之后,一个连接就会被建立起来。之后就可以读取BLE设备提供的Service,以及每个Service的characteristic(属性,类似于GATT Profile实例)。每一个characteristic都会提供一些值,这些值可以被读取或者修改。例如,一个小型温控器可以开放一个service用于获取当前的温度或者湿度读数(相当于是service的characteristic),同时也可以开放其它的service和characteristic用于设置期望的温度。这里因为beacon不使用连接模式,我将会跳过这些细节。如果你想要了解更多关于连接BLE设备的内容,可以参考Apple‘s Core Bluetooth guide,尽管你可能不是一个IOS开发者。更多相关技术性的文章,可以参考Introduction to BLE,Making the most out of BLE Advertising mode。
beacon设备如何使用BLE
Beacon设备只使用了广告通信信道。正如beacon(信标、灯塔)的字面意思,这种设备以一定的时间间隔发送数据包,并且发送的数据被可以被像手机这样的设备获取。也就是说,iBeacon只是BLE广告模式的一种简单的使用,并在此基础上提供了对IOS的一些附加支持。
如果你试着拦截一段iBeacon广告数据包,例如下面从Estimote beacon截获的数据包:
[plain] view plaincopy02 01 06 1A FF 4C 00 02 15 B9 40 7F 30 F5 F8 46 6E AF F9 25 55 6B 57 FE 6D 00 49 00 0A C5
(截获以上数据,如果你使用的Mac设备,你可以参考additional XCode download为XCode添加蓝牙扫描和数据包打印工具。如果是Window设备,请参考这里)
以上的数据已经将广告数据包的报头、修正地址、广告PDU数据包的报头和其中的MAC地址部分都移除掉了,也就是说这部分数据只包含了实际信息数据——一共30个字节,符合实际信息数据最多31个字节的限制。
那么一个iBeacon设备的BLE广告数据是如何组成的?以下是Apple修正的数据格式,整理如下(也可以参考这里):
[plain] view plaincopy02 01 06 1A FF 4C 00 02 15: iBeacon prefix (fixed)
B9 40 7F 30 F5 F8 46 6E AF F9 25 55 6B 57 FE 6D: proximity UUID (here: Estimote’s fixed UUID)
00 49: major
00 0A: minor
C5: 2’s complement of measured TX power
根据这些原理,如果你想要实验beacon的功能,你不必需要一个真正的beacon设备。如果你有最新的手机(例如iPhone4S+,SG3+)或者配备蓝牙4的笔记本(例如Retina MacBook),你可以将这些设备转换成iBeacon发送设备和接收设备。以iPhone为例,你可以在AppStore上下载“Locate iB”应用。对于MacOS,可以参考这里。当然你可以可以使用树莓派。
Breaking down the iBeacon format(解析iBeacon的数据格式)
除了修正的iBeacon前缀数据(02 01 。。。 15),其它各部分数据各代表什么?
Proximity UUID(上面例子中的B9 。。。 6D部分):这是将你所有的beacon与其他人的beacon设备区别开的id!例如,目前在商店里某个区域分布着多个beacon形成一条“链带”,用于为顾客提供特定的服务,那么归属于同一条“链带”的beacon将分配到相同的proximity UUID。为这条“链带”设计的专用应用程序将会在后台使用这个UUID扫描到这条“链带”中的beacon设备。
major编号(2个字节,上面例子中为0x0049,也就是73):用于将相关的beacon标识为一组。例如,一个商店中的所有beacon将会分配到相同的major编号。通过这种方式,应用程序就能够知道顾客位于哪一家商店。
minor标号(也是2个字节,上面例子中为0x000A,也就是10):用于标识特定的beacon设备。例如一个商店中的每一个beacon设备都拥有唯一的minor编号,这样你才能够知道顾客位于商店中的哪个位置。
Measuring distance(测量距离)
最后一个值,TX power,用于确定你和beacon之间距离有多近。根据这个值不但可以获得粗略的信息(比如靠近/远离/不在范围内等),也可以获取精确到米的距离(当然你也可以转换为以步为单位的距离)。那么如何实现?
TX power(上面例子中为0xC5=197,根据2的补码测得256-197=-59dBm)是距离设备1米测得的信号强度值(RSSI- Received Signal Strength Indication,接收到的信号强弱指标)。假如接收到的信号强度减弱了,那么我们可能在远离。只要知道1米距离的RSSI,以及当前的RSSI(我们可以从接收到的信号中一块获取到这些信息),那么计算出当前的距离是可能的。IOS已经实现了个这个功能,对于其它平台需要自己手动编码计算,可以参考这里。
译注:Java代码粗略计算距离代码:
[java] view plaincopyprotected static double calculateAccuracy(int txPower, double rssi) {
if (rssi == 0) {
return -1.0; // if we cannot determine accuracy, return -1.
}
double ratio = rssi*1.0/txPower;
if (ratio 《 1.0) {
return Math.pow(ratio,10);
}
else {
double accuracy = (0.89976)*Math.pow(ratio,7.7095) + 0.111;
return accuracy;
}
}
然而,在实际应用中,由于人体或者其它通信阻碍物都有可能削弱信号,因此这个距离只是一个估算值。
IOS integration(IOS整合)
IOS已经整合了iBeacon。当你进入beacon的范围内,你的应用程序就可以接收到通知,即使你的应用程序处于在后台也能接收到。一个应用程序可以注册一个区域的进入或者退出事件,因此即使应用程序没有运行也可以被唤醒。为了响应这些事件,应用程序可以发送例如本地推送通知,提示用户打开应用程序查看商店的促销广告(这些促销广告可以从网络上面获取),或者是其它相关的内容。
更准确的说,当手机处于不活动状态时,也就是IOS进入了低电量监控模式的时候,只有iBeacon区域进入/退出事件能够被接收到。当手机和应用程序处于活动状态,你可以进入ranging模式,这个能够让你检测的信号强度和估算距离更加准确。
注意你的手机检测beacon需要花费一定的时间。首先,beacon设备是间隔一定的时间才发送一次广告。其次,如果你的手机处于非活动模式,它只在有些时候才会检测蓝牙信号。一个beacon设备要被检测到,上面两段工作时间就需要有交集。实践证明,它可能需要15分钟才能检测到一个beacon设备。
按步骤开发一个iOS iBeacon应用程序可以参考这里。Beacon的制造商通常也会提供SDK帮助开发Beacon应用程序。参考Estimote的iOS SDK 和Android SDK。
How can I get some beacons?(如何获取Beacon设备)
Beacon设备资源现在比较稀少,你通常需要等上几个星期才能拿到货,但可以肯定的是将来这种情况会改善。
因此,最快的选择就是创建一个Beacon模拟器:将iPhone/Android/MacBook/其它笔记本/树莓派转换成了Beacon模拟器。
第二种选择就是试着去订购一些Beacon设备了:
pre-order Estimote beacons; 3 for $99
Kontakt beacons come in a couple of packages; 4 for $99, 10 for $279
RaspberryPi kits from RadiusNetworks: 1 for $99
RedBearLab offers BLE shields for Arduino for $30
Bleu sells USB-iBeacon dongles. 1 for $40, 5 for $150
Alternatives(替代品)
iBeacon不是唯一一种基于BLE近距离技术开发的设备。高通同样正在开发自己的Beacon——Gimbal,并集合了iOS和Android SDK。它们提供的功能比较类似,但是BLE广告的数据格式可能不一样。我的开发工具还在运送途中,因此我还没有测试过,但是这种Beacon肯定很有趣,尤其是它的价格最低只有5美元。
下一步是什么?
现在还没有做的事情就是开发一些基于Beacon的应用程序。为了实现这个目的,记住SoftwareMill:我们经常寻找一些有趣的项目来开发。
扩展阅读>>>>>>>>>ibeacon室内定位原理
>>>>>>>>>ibeacon室内定位算法及代码
评论
查看更多