如何在安卓设备上读取beacon的UDID、Major和Minor?

4

我正在尝试开发一款Android BLE应用程序。

是否有任何方法可以在Android设备上检测和读取信标的UDID、Major和Minor?

我已经阅读了RadiusNetworks的android-ibeacon-service,但我不明白为什么:

major = (256 * (0xFF & paramArrayOfByte[(i + 20)]) +
 (0xFF & paramArrayOfByte[(i + 21)]));

paramArrayOfByteLeScanCallback byte[] scanRecord中的字节数组。

2个回答

5
  1. scanRecord 应该被解析为一系列 广告结构 的列表。
  2. iBeacon 是一种广告结构

使用 nv-bluetooth,你可以像下面这样提取 iBeacon。

public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)
{
    // Parse the payload of the advertising packet.
    List<ADStructure> structures =
        ADPayloadParser.getInstance().parse(scanRecord);

    // For each AD structure contained in the advertising packet.
    for (ADStructure structure : structures)
    {
        if (structure instanceof IBeacon)
        {
            // iBeacon was found.
            IBeacon iBeacon = (IBeacon)structure;

            // Proximity UUID, major number, minor number and power.
            UUID uuid = iBeacon.getUUID();
            int major = iBeacon.getMajor();
            int minor = iBeacon.getMinor();
            int power = iBeacon.getPower();

            ........

请查看 "iBeacon作为一种广告结构" 以获取详细信息。

5
当你从BluetoothAdapter.LeScanCallback获取byte[] scanRecord时,它将包含蓝牙LE头,这取决于iBeacon的类型,可能是可变长度。
由于可变长度头部,指示iBeacon广告(4c 00 02 15)的四个字节可能从第三个字节(scanRecord [2])开始到第六个字节(scanRecord [5])结束。在最新代码中,Android iBeacon Library查找scanRecord4c 00 02 15的索引位置并称之为startByte。其他所有内容都与该startByte相对固定位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接