我想以编程方式查看广告包的所有proximityUUID。有些文章说,这在iOS上是不可能的,但Android是可能的。但我不敢相信,因为我发现奇妙的应用程序“BLExplr”有这个功能。我需要在我的应用程序中实现该功能。有没有人知道怎么做或者有好的例子?任何帮助将不胜感激。
(更新2014/1/17)
我相信@davidgyoung的回答是正确的。Estimote beacon的proximityUUID是“B 9407 F30-F5 F8 - 466 E-AFF 9 - 25556 B57 FE 6D”,但在BLExplr应用程序上显示的Estimote beacon的UUID是另一个ID。
3条答案
按热度按时间zzoitvuj1#
不幸的是,你不能在iOS上这样做。当你说BLExplr和LightBlue可以做到这一点时,你将蓝牙服务UUID与iBeacon Proximity UUID混淆了。这是两件完全不同的事情。
蓝牙服务UUID对iOS可见,但与iBeacon的标识符无关,并且对于使用iBeacon毫无用处。服务UUID由iOS在每次看到蓝牙设备时生成,并且仅在蓝牙设备处于范围内的持续时间内保持不变。如果您将蓝牙设备带走,然后再将其带回来,它将具有不同的服务UUID。
iBeacon的标识符(ProximityUUID、Major、Minor)嵌入在蓝牙通告的主体内。iOS设备上的问题是,苹果的CoreBluetooth API不允许访问原始广告正文,因此没有第三方应用程序能够读取这些标识符。Apple只允许使用特殊的iBeacon CoreLocation API访问这些标识符,但这些API要求您预先知道Proximity UUID。
对不起,我知道这不是你想听到的答案!(我也很抱歉!)值得一提的是,你可以在Android、MacOS、Linux和Windows上做到这一点。
查看详情here。
2g32fytz2#
在一个
CBPeripheral
的advertisingData
中,应该有一个名为kCBAdvDataManufacturerData
的键;它是一个NSData
,代表iBeacon广告信息。此密钥仅在OS X上可用。检查第2个字节是否等于
0x02
,前两个字节是否等于0x004c
(十进制为76
),第4个字节(十进制)+ 4是否等于数据长度(应为25)。NSranges(抱歉Mac语法)
接近UUID:
NSMakeRange(4, 16)
主要:
NSMakeRange(20,2)
次要:
NSMakeRange(22,2)
为了确保正确,您可以将值记录为十六进制(使用格式字符串
%x
),并确保它们与NSData
的description
匹配。gwbalxhn3#
但uuid是DeviceUUID,而不是ProximityUUID