当前位置: 首页 > 知识库问答 >
问题:

iOS iBeacon:如何以编程方式获取所有ProximityUID?

狄睿
2023-03-14

我想以编程方式查看广告包的所有ProximityUID。一些文章说这在iOS上是不可能的,但Android是可能的。但我不敢相信,因为我发现神奇的应用程序“BLExplr”有这个功能。我需要在我的应用程序中实现该功能。有人知道怎么做吗?或者有好的例子吗?任何帮助都将不胜感激。

(更新日期2014/1/17)

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

共有3个答案

东方弘壮
2023-03-14
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是设备uuid,而不是ProximityUID

曾航
2023-03-14

DavidYoung关于无法获取iBeacon信息的说法有部分错误。实际上,您可以在OSX上获得接近UUID,但不能在iOS上获得。

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

检查第二个字节等于0x02,第一个两个字节等于0x004c76以十进制表示),第四个字节(以十进制表示)4等于数据长度(应该是25)。

NSRanges(对不起Mac语法)
接近UUID:NSMakeRange(4,16)
主要:NSMakeRange(20,2)
次要:NSMakeRange(22,2)

为了确保操作正确,可以将值记录为十六进制(使用格式字符串%x),并确保它们与NSData说明匹配。

梁福
2023-03-14

不幸的是,你不能iOS。当你说BLExplr和LightBlue可以做到这一点时,你混淆了蓝牙服务UUID和iBeacon接近UUID。这是两件非常不同的事情。

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

iBeacon的标识符(ProximityUID、Major、Minor)嵌入在蓝牙广告的主体中。iOS设备上的问题是,苹果的核心蓝牙API不允许访问原始广告正文,因此任何第三方应用程序都无法读取这些标识符。Apple只允许使用特殊的iBeacon CoreLocation API访问这些标识符,但这些API要求您事先知道UUID。

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

请参见此处的详细信息。

 类似资料:
  • 问题内容: 如何以编程方式在Maven执行环境之外获取Maven模块的所有依赖关系? 到目前为止,我有: 通过maven-core: 并通过jcabi-aether: 到目前为止,这通常正确吗? 现在的问题是,我得到了NullPointerException: 因为mavenProject.getRemoteProjectRepositories()返回null。 如何在考虑settings.xm

  • 问题内容: 我想从受监视的应用程序内部以编程方式获得等效的输出。我看到可以通过HotSpot诊断Bean触发二进制堆转储,但是我看不到如何获取直方图数据。可能吗 ? 问题答案: 这可能是不是最好的例子/代码,但看看这个 (我认为这仅适用于Hotspot JVM)

  • 问题内容: 基本上,我想获取python解释器的句柄,以便可以传递脚本文件来执行(从外部应用程序执行)。 问题答案: 这适用于Linux和Windows: Python 3.x Python 2.x

  • 问题内容: 我可以用反射之类的方法做到吗? 问题答案: 我已经搜索了一段时间,似乎有不同的方法,这里是一个摘要: 如果你不介意添加依赖项,则反射库非常受欢迎。它看起来像这样: 请注意,要使其正常工作,你需要定义为并声明其实现。你这样做,通过创建一个文件的名称和声明的所有实现Pet它 包级注释。这是一个例子: 和注释定义: 并且你必须在该包内名为的文件中声明包级注释。以下是示例内容: 请注意,只有那

  • 问题内容: 如何从包含证书和私钥的PEM文件中以编程方式获取KeyStore?我试图在HTTPS连接中向服务器提供客户端证书。我已经确认,如果我使用openssl和keytool来获取jks文件(该文件是动态加载的),则客户端证书可以使用。我什至可以通过动态读取p12(PKCS12)文件来使其工作。 我正在考虑使用BouncyCastle的PEMReader类,但无法克服一些错误。我正在使用-Dj

  • 问题内容: 我有以下目录布局: src main Java resources SQL (database script) Spring (configuration) network application 在ServletContextListener类中,我想访问SQL目录下的文件并列出它们。基本上我的问题是路径,因为我知道简而言之列出目录下的文件是: 也许我可以使用Object尝试建立路径