将iBeacon蓝牙低功耗技术与Android 4.3相结合

39

我正在寻找一种从Android设备检测iBeacon(iOS 7.0功能)的方法。我阅读了Android文档,其中似乎iBeacon是一种发送其位置的GATT服务器。虽然Android文档说我不应该轮询这些数据,但对于检测来说这是必要的。

我搜索了很多,但这个主题还很新(我甚至创建了一个新标签 ),所以如果我能从iOS世界得到一些资源链接来描述实现,我会很高兴。此外,如果有一些我尚未发现的Android库也会很好。


我对iOS平台不是很熟悉,但它是否支持BTLE服务器或仅客户端?事实证明,尽管文档表明Android BTLE可以支持服务器,但它只支持客户端。实际上可以创建服务器,但无法进行广告推送。 - Brian Reinhold
iOS支持服务器。如果你查看WWDC 2013中现在公开的AirLocate示例(特别是ALConfigurationViewController),你可以看到他们如何设置广告服务器。实际的广告代码深入到苹果的专有代码中,因此在Android上复制会很困难,但是将任何iOS应用程序设置为iBeacon是完全可行的。 - DesignatedNerd
你用了哪些设备?这将非常有趣。 - MrningLemn
HTC One需要至少Android 4.3和低功耗蓝牙,详见http://developer.android.com/guide/topics/connectivity/bluetooth-le.html。请注意,这是答案部分,请删除此“评论”。 - rekire
我有一台Google Nexus 10。刚刚将其更新到Android 4.2.2,接下来是4.3。那也应该可以正常工作,对吧? - MrningLemn
4.2.2不可用,但4.3可以。 - rekire
3个回答

66

编辑:下面的库已经移动到这里:

https://github.com/AltBeacon/android-beacon-library


我已经将iOS7 iBeacon SDK移植到Android上,能够看到标准的iBeacons并估计它们的范围。这里提供了代码:

https://github.com/RadiusNetworks/android-ibeacon-service

为了使其工作,需要Android 4.3及以上版本,该版本引入了低功耗蓝牙API。您还需要一台带有低功耗蓝牙芯片组的设备。

如果您不想使用上面的完整库,您可以自己编写。iBeacons只是每秒钟传输一次BLE广告,并以已知字节序列开头。您只需告诉Android执行BLE扫描,获取每个广告,并查找以已知iBeacon字节序列开头的广告。然后,您可以解析出iBeacon字段。以下代码显示了如何完成此操作:

https://github.com/RadiusNetworks/android-ibeacon-service/blob/master/src/com/radiusnetworks/ibeacon/IBeacon.java#L177-L231


1
http://developer.samsung.com/ble适用于早期的Android版本吗?我会自己找出答案(希望尽快),但我想在这里也提出这个问题。 - Mark Peterson
不,三星BLE SDK是与Android 4.3本身不同的完全不同的实现。理论上可以创建一个版本的Android iBeacon库,使其与三星BLE SDK兼容,但这将涉及到大部分重写。考虑到在接下来的几个月内,大多数甚至所有搭载BLE的三星设备都可能会升级至Android 4.3,因此移植Android iBeacon库以适用于三星BLE SDK并不值得花费这种精力。 - davidgyoung
@MarkPeterson非常想知道您是否能够让它与早期版本一起正常工作。 - b-ryce
你知道在后台是否可以像iOS 7中那样搜索信标吗? - Yves
2
针对@MarkPeterson和其他在运行4.2.x的三星设备上寻求支持的用户,现在已经可以实现。请参见此处:https://github.com/davidgyoung/android-beacon-library/tree/samsung-ble-sdk - davidgyoung
显示剩余4条评论

2
这里唯一需要注意的是即使应用程序未运行也要检测信标。与iOS7不同,它不支持原生。在iOS7中,当您打开蓝牙时,它会在您进入注册iBeacon区域时自动通知您。
我使用IntentService加上AlarmManager在Android 4.3 API中实现了iBeacon。每30秒进行一次扫描(为了节省电池电量,时间间隔可以更长)。它对用户很有效。只有找到匹配的uuid/major/minor,它才会触发通知。否则,它将休眠并再次唤醒以进行扫描。
我认为这是您问题的解决方案。

我发现重复的扫描会干扰蓝牙音频。一定有比这更好的方法。 - Rich Ehmer
altbeacon 库有一个示例,其中包括启动一个应用程序。http://altbeacon.github.io/android-beacon-library/samples.html - Sofi Software LLC

0

我不太明白你的意思,能否提供文档链接说明为什么不应该轮询数据?

但在我看来,iBeacon好像是作为服务器工作的,这对我来说有点有趣。它不是用来查找其他设备而不是手机本身吗?

https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.position_quality.xml

这是它使用的特征。对我来说,听起来像你要找的设备是“信标”,而手机本身只是一个监听器。因此,您不应该轮询EHPE和EVPE数据,而应该实际上听取它的变化或“广播”。

我自己也有点新手,找不到任何真正具体的文档。

但请注意,在我提供的链接中,顶部角落有下载链接,可以为您提供完整的PDF格式文档。在那里,您可能会找到更多答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接