代码之家  ›  专栏  ›  技术社区  ›  zono

iBeacon:如何将自定义数据放入advdata?

  •  1
  • zono  · 技术社区  · 10 年前

    我想将自定义数据,如用户ID,放入iBeacon包的advdata中。有可能吗?如果是,我如何获取数据。CLBeaconRegion似乎没有advdata属性。

    请看一下下面的iBeacon大样本。 https://github.com/suwa-yuki/BeaconSample/blob/master/BeaconSender/BeaconSender/BSViewController.m

    据我所见,我可以将自定义的measuredPower放入广告数据中。我可以将此属性用作自定义变量吗?我的意思是我想将UserId放入measuredPower属性。它是否影响RSSI或其他东西?

    谢谢

    1 回复  |  直到 10 年前
        1
  •  8
  •   Community Dai    7 年前

    您可以将任何字节放入iBeacon广告中,但iOS严重限制了您可以读取这些字节。如果您需要使用iOS读取这些数据,您只有四个字节的蓝牙advdata,您可以更改这些数据,这些数据将由iOS读取。如果您只关心用其他操作系统(OSX Mavericks、Android、Linux)读取字节,那么这不是问题。

    为了解释iOS的局限性,我们可以看看一个典型的iBeacon广告的广告数据,如下所示:

    4C 00 # Company identifier code (0x004C == Apple)
    02 15 # iBeacon advertisement indicator
    e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 # ProximityUUID
    00 00 # Major 
    00 00 # Minor 
    c5 # The 2's complement of the MeasuredPower
    

    iOS不允许您使用 CoreBluetooth API。(参见 here 了解更多详情。)如果您使用的iBeacon测距功能 CoreLocation ,您可以阅读 ProximityUUID (16字节), Major (2字节)和 Minor (2字节)。这个 MeasuredPower 在您提到的代码示例中设置的是 不是 可在iOS中直接读取。它简单地用作用于估计与RSSI的距离的算法的输入。(参见 here 详细信息。)更改 测量功率 广告中的距离会影响此距离估计,但您无法可靠地确定实际距离 测量功率 价值因此不能将其用作自定义变量。

    如上所述,iBeacon广告还包括16字节 接近UUID 。但iOS 核心位置 API不允许您看到任何iBeacon广告,除非您指定匹配 接近UUID 在前面。因此,它实际上没有任何作为自定义变量的用途。

    您可以使用什么作为自定义变量?你的两个价值观 可以 用于自定义变量的是 专业 字段和 少数的 领域。每个都是两个字节,如果你告诉iOS 核心位置 确定所有iBeacon 接近UUID ,您将获得测距更新,告诉您 专业 少数的 值,并且可以在这些字段中对任何数据进行编码。要访问这些值,只需如下读取值:

    -(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
        for (CLBeacon *iBeacon in iBeacons) {
            // write code here to do something with iBeacon.major and iBeacon.minor
            // which each will have values from 0-65535
        }        
    }
    

    以上所有内容仅限于iOS。其他平台允许您查看advdata的完整字节,因此您可以将所需的任何字节用作自定义变量。然而,如果您仍然希望它们被识别为iBeacon,则应保留第二个字节(iBeacon广告指示符)。

    对于自定义变量,最佳做法是使用查找表来绑定标准iBeacon标识符( 接近UUID , 专业 , 少数的 )到数据字段。此查找表可以嵌入到您的应用程序中,也可以使用诸如Radius Networks之类的web服务 ProximityKit 自动执行此操作。

    完整披露:我是Radius Networks的总工程师。