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

如何解析MacOS上的iBeacon(Swift)

云京
2023-03-14

我在项目中使用iBeacons,需要从广告数据中提取主要、次要、UUID、txPower和信标类型的值。

我从CBCentralManagerDelegate获取广告数据

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber)

然后我得到主要,次要,uuid和txPower值:

var uuidBytes: [UInt8] = [0]
var majorBytes: UInt16 = 0
var minorBytes: UInt16 = 0
var txPower: UInt16 = 0

let uuidRange: NSRange = NSMakeRange(4, 16)
let majorRange: NSRange = NSMakeRange(20, 2)
let minorRange: NSRange = NSMakeRange(22, 2)
let powerRange: NSRange = NSMakeRange(24, 1)

data.getBytes(&uuidBytes, range: uuidRange)
let proximityUUID: NSUUID = NSUUID(uuidBytes: &uuidBytes)

data.getBytes(&majorBytes, range: majorRange)
let majorBytesBig: uint16 = (majorBytes >> 8) | (majorBytes << 8)

data.getBytes(&minorBytes, range: minorRange)
let minorBytesBig: UInt16 = (minorBytes >> 8) | (minorBytes << 8);

data.getBytes(&txPower, range: powerRange)

但我如何才能得到信标类型?(iBeacon规范中的0x02和0x15值)

更新:我在Obj-C中找到了下一个用于确定信标类型的函数

- (BOOL)advDataIsBeacon:(NSData *)data
{
    Byte expectingBytes [4] = { 0x4c, 0x00, 0x02, 0x15 };
    NSData *expectingData = [NSData dataWithBytes:expectingBytes length:sizeof(expectingBytes)];

    if (data.length > expectingData.length)
    {
        if ([[data subdataWithRange:NSMakeRange(0, expectingData.length)] isEqual:expectingData])
        {
            return YES;
        }
    }

    return NO;
}

但它在Swift中不起作用。

共有2个答案

仇迪
2023-03-14

0215可以在这里找到:

let beaconTypeCode: NSRange = NSMakeRange(2, 2)
邵刚洁
2023-03-14

此函数将帮助确定广告数据是否为iBeacon。

private func isBeacon(_ data: NSData) -> Bool {
    var beaconType: UInt16 = 0
    let beaconTypeRange = NSMakeRange(2, 1)
    data.getBytes(&beaconType, range: beaconTypeRange)

    if (beaconType != 0x02) {
        return false
    }

    var beaconTypeLength: UInt16 = 0
    let beaconTypeLengthRange = NSMakeRange(3, 1)
    data.getBytes(&beaconTypeLength, range: beaconTypeLengthRange)

    if (beaconTypeLength != 0x15) {
        return false
    }

    return true
}

另外,请参阅“近距离信标规范。R1版本”

 类似资料:
  • 当我试图运行我的项目时,我得到了这个错误。 线程“main”java.lang.nosuchmethoderror:com.typesafe.config.config.getduration(ljava/lang/string;)ljava/time/duration中出现异常; /library/java/javavirtualmachines/jdk1.8.0_102.jdk/content

  • 我已经用自制软件在新的macos10.11服务器上安装了MariaDB。当我手动启动时,服务器运行得很好,但我一直无法让它在引导时自动启动(而不是登录)。我使用在/library/launchdaemons中创建launchd脚本,但它不起作用。没有运行mariadb,没有mariadb错误日志。它似乎默默地失败了。一定有相关的日志,但我不知道在哪里。 当这不起作用时,我尝试创建自己的launch

  • 问题内容: Command “/usr/bin/python -u -c “import setuptools, tokenize;file=’/private/tmp/pip-build-J1I0ox/pymssql/setup.py’;f=getattr(tokenize, ‘open’, open)(file);code=f.read().replace(‘\r\n’, ‘\n’);f.cl

  • 当我做,与: 配置摘要: 调试级别:fastdebug HS调试级别:快速调试 JVM变体:服务器 JVM特性:服务器:'aot cds cmsgc编译器1编译器2 dtrace Epsilong C g1gc graal jfr jni检查jvmci jvmti管理nmt并行GC串行GC服务vm结构' OpenJDK目标:操作系统:macosx,CPU架构:x86,地址长度:64 版本字符串:1

  • 问题内容: 我想用Android上的任何键解析JSON。JSON数据包含任何键,数组或值。这是JSON数据和我的工作代码。我想通过使用JSON解析将JSON数据放入类中。 JSON数据: 我的代码: 请帮我。 问题答案: 是的,这是可能的。 将收到的JSON放在中。您可以循环通过并从中退出。 例: 我希望这就是你想要的

  • iBeacon规格说明: UUID、主值和次值提供iBeacon的标识信息。 主要值和次要值用于区分区域内的产品或元素。苹果公司的文档非常清楚如何做到这一点,商店的例子也非常好。 然而,只有当每个区域(或子区域)有一个元素类别时,所有这些都能很好地工作,但是如果我们希望应用程序能够区分同一区域内具有相同次要和主要元素的元素,这就不太好了。 是否有其他与iBeacon关联的唯一标识符可以被监视/检测