我在OSX下遵循这个示例项目BeaconEmitter来生成样本iBeacons,用于在iPhone上开发应用程序.BeaconEmitter应用程序基于Matthew Robinson的教程,直到Apple决定在OSX的Core Location上引入iBeacon支持,生成iBeacon的唯一机会是使用IO Bluetooth Framework从头开始构建广告数据包.
但是......那不起作用!
我当然也尝试过iOS上的Apple的AirLocate教程代码,以及可以正常使用的iOS设备之间的代码.但是,如果您尝试使用OSX(BeaconEmitter)生成iBeacon并使用不起作用的iOS设备(AirLocate)接收它.
我有一个基于CC2540 TI芯片的BLE RF嗅探器,以及Windows上的TI嗅探器软件.所以我观察到从AirLocate和BeaconEmitter生成的iBeacons数据包有点不同.
这是使用AirLocate生成的iBeacon:
Thah是使用BeaconEmitter生成的ibeacon:
继这篇文章中的逆向工程师(因为Apple尚未发布iBeacons规范)之后,可以看出Adv PDU Header与两种情况不同.在OSX中,Type = 2且TxAdd = 0,在iOS中Type = 0且TxAdd = 1.
为何如此区别?
以女巫的方式可以强制OSX发送iOS的相同Adv PDU Header?
似乎在AdvData的前5个字节中,两个数据包不等于:
OSX:02 01 06 1A FF
iOS:02 01 1A 1A FF
AdvData有效负载的其余部分与上面链接的逆向工程师帖子一致.
再次,为什么这个字节不同?
我没有找到OSX示例中依赖于哪些代码部分.
更新:它的工作原理
因为BeaconEmitter生成的iBeacon未被AirLocate识别的主要原因是我的错.我不明白AirLocate过滤UUID的一些具体示例,即:E2C56DB5-DFFB-48D2-B060-D0F5A71096E0或5A4BCFCE-174E-4BAC-A814-092E77F6B7E5或74278BDA-B644-4520-8F0C-720EAF059935并非每个UUID值.
因此,BeaconEmitter生成的随机UUID肯定与AirLocate中预先写好的UUID不匹配.
如果您可以从BeaconEmitter"强制"使用具有良好值的UUID,则AirLocate可以识别它:
所以这是iOS AirLocate示例应用程序中的成功测试:
保持上述相同字节的差异......只有嗅探器可以看到:).