swift - 错误的接近 UUID
问题描述
我正在开发一个应用程序,我需要在其中显示我周围的蓝牙设备列表,其中邻近 UUID 包含某个子字符串。我克隆了回购https://github.com/mlwelles/BeaconScanner并在我的计算机上运行了该应用程序,它正确地找到了我拥有的两个信标。他们使用下面的代码来解析广告数据。
+(HGBeacon *)beaconWithManufacturerAdvertisementData:(NSData *)data {
if ([data length] != 25) {
return nil;
}
u_int16_t companyIdentifier,major,minor = 0;
int8_t measuredPower,dataType, dataLength = 0;
char uuidBytes[17] = {0};
NSRange companyIDRange = NSMakeRange(0,2);
[data getBytes:&companyIdentifier range:companyIDRange];
if (companyIdentifier != 0x4C) {
return nil;
}
NSRange dataTypeRange = NSMakeRange(2,1);
[data getBytes:&dataType range:dataTypeRange];
if (dataType != 0x02) {
return nil;
}
NSRange dataLengthRange = NSMakeRange(3,1);
[data getBytes:&dataLength range:dataLengthRange];
if (dataLength != 0x15) {
return nil;
}
NSRange uuidRange = NSMakeRange(4, 16);
NSRange majorRange = NSMakeRange(20, 2);
NSRange minorRange = NSMakeRange(22, 2);
NSRange powerRange = NSMakeRange(24, 1);
[data getBytes:&uuidBytes range:uuidRange];
NSUUID *proximityUUID = [[NSUUID alloc] initWithUUIDBytes:(const unsigned char*)&uuidBytes];
[data getBytes:&major range:majorRange];
major = (major >> 8) | (major << 8);
[data getBytes:&minor range:minorRange];
minor = (minor >> 8) | (minor << 8);
[data getBytes:&measuredPower range:powerRange];
HGBeacon *beaconAdvertisementData = [[HGBeacon alloc] initWithProximityUUID:proximityUUID
major:[NSNumber numberWithUnsignedInteger:major]
minor:[NSNumber numberWithUnsignedInteger:minor]
measuredPower:[NSNumber numberWithShort:measuredPower]];
return beaconAdvertisementData;
}
我采用了这段代码,进行了相应的调整,并包含在我的 iOS 代码中,但是找到的设备的 UUID 与 MacOS 应用程序上显示的完全不同。
有谁知道iOS和MacOS之间的广告数据是否有任何区别?
谢谢
解决方案
您在 iOS 上阅读的NSData
内容可能不是与您的信标相关的制造商广告数据。如果字节模式与 iBeacon 帧匹配,Apple 实际上会阻止在 iOS 上传输此数据。请在此处查看我的博客文章。
您确定这是您在 iOS 上运行的确切代码吗?因为如果是这样,我希望它永远找不到到达方法底部并解析 ProximityUUID 所需的 4c 02 15 字节序列。
如果不知何故你的代码绕过了 iOS 上的这些检查,可能是你正在解析一些其他任意数据包,而这些数据包根本不是 iBeacon 帧。
推荐阅读
- r - 从遵循正态分布但具有新均值的数据生成样本
- java - 杀死应用程序时,SharedPreferences 消失
- python - 有人可以解释这些行:X1, y1 = np.c_[np.random.normal(loc=new_center[0],
- page-tables - 页表在哪里?
- xpath - 如何使用 descendant-or-self:: 前缀在 XPath 中获取直接子级?
- c# - ASP.NET CORE 2.2 使用 dotConnect for MySQL 作为提供程序和实体框架扩展:无法解析提供程序
- mysql - 应该使用哪个查询?从 MySQL Explain 推导出来
- c# - 使用 ExifTool 覆盖现有标签
- c# - Firebase REST API - 使用 id 令牌验证请求不起作用
- terraform - 将变量添加到数据