【问题标题】:iOS iBeacon: How to get all of proximityUUID programmatically?iOS iBeacon:如何以编程方式获取所有proximityUUID?
【发布时间】:2014-02-05 10:46:27
【问题描述】:

我想以编程方式查看所有广告数据包的proximityUUID。有些文章说在 iOS 上是不可能的,但在 Android 上是可能的。但我不敢相信,因为我发现了不起的应用程序“BLExplr”有这个功能。我需要在我的应用程序中实现该功能。有谁知道如何做到这一点或好的例子?任何帮助将不胜感激。

(2014 年 1 月 17 日更新)

我相信@davidgyoung 的回答是正确的。 Estimote 信标的接近UUID 是“B9407F30-F5F8-466E-AFF9-25556B57FE6D”,但在 BLExplr 应用程序上显示我的 Estimote 信标的 UUID 是另一个 ID。

【问题讨论】:

  • 我发现了另一个应用程序“浅蓝色”。这个应用程序具有相同的功能。但我仍然找不到可能的解决方案。我需要使用蓝牙框架读取 BLE 原始数据吗? (我不确定是否可能)

标签: ios ibeacon


【解决方案1】:

很遗憾,您无法在 iOS 上执行此操作。当您说 BLExplr 和 LightBlue 可以做到这一点时,您将蓝牙服务 UUID 与 iBeacon Proximity UUID 混淆了。这是两个非常不同的东西。

蓝牙服务 UUID 对 iOS 是可见的,但与 iBeacon 的标识符无关,对使用 iBeacon 毫无用处。每次看到蓝牙设备时,iOS 都会生成服务 UUID,并且仅在蓝牙设备处于范围内时保持不变。如果您将蓝牙设备带走并稍后将其带回来,它将具有不同的服务 UUID。

iBeacon 的标识符(ProximityUUID、Major、Minor)嵌入在蓝牙广告的主体中。 iOS 设备上的问题是 Apple 的 CoreBluetooth API 不允许访问原始广告正文,因此没有第三方应用程序能够读取这些标识符。 Apple 仅允许使用特殊的 iBeacon CoreLocation API 访问这些标识符,但这些 API 要求您预先知道 Proximity UUID。

对不起,我知道这不是你想听到的答案! (我也很抱歉!)不管怎样,您可以在 Android、OSX Mavericks 和 Linux 上执行此操作。

查看详情here

【讨论】:

  • 非常感谢!你说的对!我附上了 BLExplr 的屏幕截图。服务 UUID 与 Estimote 信标的 Proximity UUID 不同。
  • @davidgyoung 您能告诉我 AppStore 中的 Radius Networks 应用程序“定位”如何在没有我输入的情况下读取我的 UUID 和次要和主要值吗?我正在开发一个需要获取未知 UUID 以将它们与我在数据库中的内容进行比较的应用程序。干杯
  • 不能。该应用程序预先配置了十几个流行的 UUID。您的信标上必须有一个受欢迎的。
  • 好的,谢谢。我设法弄清楚如何进行。再次感谢您
  • @Estevex 你找到解决方案了吗?我也想知道如何在不知道 ios 中的 uuid 的情况下检测信标设备。
【解决方案2】:

davidgyoung 部分错误在于无法获取 iBeacon 信息。实际上,您可以在 OS X 上获得邻近 UUID,但在 iOS 上则不行

CBPeripheraladvertisingData中,应该有一个叫kCBAdvDataManufacturerData的键;它是一个NSData,代表 iBeacon 广告信息。 此密钥仅在 OS X 上可用

检查第二个字节等于0x02,第一个两个字节等于0x004c(十进制76),第四个字节(十进制)+4等于数据的长度(应该是25).

NSRange(对不起 Mac 语法)
接近 UUID:NSMakeRange(4, 16)
专业:NSMakeRange(20,2)
未成年人:NSMakeRange(22,2)

为确保您的操作正确,您可以将值记录为十六进制(使用格式字符串 %x)并确保它们与来自它们的 NSDatadescription 匹配。

【讨论】:

  • 你用什么 ibeacon 做这个的?它似乎不适用于估计信标。 advertisementData = { kCBAdvDataIsConnectable = 1; kCBAdvDataLocalName = estimote; kCBAdvDataServiceData = { "Device Information" = <0ec9686a 05d8b60e c9686a>; }; }
  • YarGnawh,我正在关注 iBeacon 配置文件的广告数据大纲。这就是 CoreBluetooth 的外设管理器的广告方式。可能还有其他使用信标做广告的方式。 Estimote 可能会查找 kCBAdvDataServiceData 并连接到信标,然后读取特征以获取主要和次要。
  • 此外,对提供正确信息以回答问题(尤其是当其他人只是忽略问题)的答案投反对票是愚蠢的。
  • 从上面继续,@NathanielSymer 应该添加一个简单的消息,例如“接近 UUID 可以在符合 iBeacon 蓝牙配置文件协议的设备上找到advertisementData 和 @ 987654337@ key”,您应该删除“davidyoung 完全错误...”,因为他不是,他只是部分错误部分正确。
  • 我相信这种技术适用于 OSX,但不适用于 iOS。我的测试表明上面提到的密钥在 iOS 上不存在 iBeacon 广告。见这里:developer.radiusnetworks.com/2013/10/21/…
【解决方案3】:
NSRange uuidRange = NSMakeRange(4, 16);
NSRange majorRange = NSMakeRange(20, 2);
NSRange minorRange = NSMakeRange(22, 2);
NSRange powerRange = NSMakeRange(24, 1);

Byte uuidBytes[16];
[data getBytes:&uuidBytes range:uuidRange];
NSUUID *uuid = [[NSUUID alloc] initWithUUIDBytes:uuidBytes];

int16_t majorBytes;
[data getBytes:&majorBytes range:majorRange];
int16_t majorBytesBig = (majorBytes >> 8) | (majorBytes << 8);

int16_t minorBytes;
[data getBytes:&minorBytes range:minorRange];
int16_t minorBytesBig = (minorBytes >> 8) | (minorBytes << 8);

int8_t powerByte;
[data getBytes:&powerByte range:powerRange];



return @{ @"uuid" : uuid,
          @"major" : @(majorBytesBig),
          @"minor" : @(minorBytesBig),
          @"power" : @(powerByte)
          };

但 uuid 是 DeviceUUID,而不是 ProximityUUID

【讨论】:

  • 这个data变量的数据类型是什么,我们可以在这里直接使用kCBAdvDataServiceData数组吗?
  • 是的,数据是[advertisingData objectForKey:kCBAdvDataServiceData]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
相关资源
最近更新 更多