在扫描时检索Android BluetoothLE设备信息(主要/次要/标识符/ ProximityUUID)?

时间:2014-07-21 15:37:47

标签: android bluetooth-lowenergy ibeacon

我一直在四处寻找,不幸的是android ibeacon库已被弃用,所以我试图这样做。我已经实现了BluetoothAdapter.LeScanCallback和内置的onLeScan()方法,该方法将在拾取设备时触发。我想阅读该设备的ProximityUUID,主要和次要特征和标识符。我不确定如何从Android对象BluetoothDevice中获取该信息。

如何从Android BluetoothDevice中提取该信息(ProximityUUID,主要,次要和标识符特征),还是有其他方法可以做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以参考此post来完全理解 LeScanCallback 中这些字节的含义。 这是我解析所需信息的代码:

// an object with all information embedded from LeScanCallback data
public class ScannedBleDevice implements Serializable {
    // public BluetoothDevice BLEDevice;

    /**
    * Returns the hardware address of this BluetoothDevice.
    * <p>
    * For example, "00:11:22:AA:BB:CC".
    * 
    * @return Bluetooth hardware address as string
    */
    public String MacAddress;

    public String DeviceName;
    public double RSSI;
    public double Distance;

    public byte[] CompanyId;
    public byte[] IbeaconProximityUUID;
    public byte[] Major;
    public byte[] Minor;
    public byte Tx;

    public long ScannedTime;
}

// use this method to parse those bytes and turn to an object which defined proceeding.
// the uuidMatcher works as a UUID filter, put null if you want parse any BLE advertising data around.
private ScannedBleDevice ParseRawScanRecord(BluetoothDevice device,
        int rssi, byte[] advertisedData, byte[] uuidMatcher) {
    try {
        ScannedBleDevice parsedObj = new ScannedBleDevice();
        // parsedObj.BLEDevice = device;
        parsedObj.DeviceName = device.getName();
        parsedObj.MacAddress = device.getAddress();
        parsedObj.RSSI = rssi;
        List<UUID> uuids = new ArrayList<UUID>();
        int skippedByteCount = advertisedData[0];
        int magicStartIndex = skippedByteCount + 1;
        int magicEndIndex = magicStartIndex
                + advertisedData[magicStartIndex] + 1;
        ArrayList<Byte> magic = new ArrayList<Byte>();
        for (int i = magicStartIndex; i < magicEndIndex; i++) {
            magic.add(advertisedData[i]);
        }

        byte[] companyId = new byte[2];
        companyId[0] = magic.get(2);
        companyId[1] = magic.get(3);
        parsedObj.CompanyId = companyId;

        byte[] ibeaconProximityUUID = new byte[16];
        for (int i = 0; i < 16; i++) {
            ibeaconProximityUUID[i] = magic.get(i + 6);
        }

        if (uuidMatcher != null) {
            if (ibeaconProximityUUID.length != uuidMatcher.length) {
                Log.e(LOG_TAG,
                        "Scanned UUID: "
                                + Util.BytesToHexString(
                                        ibeaconProximityUUID, " ")
                                + " filtered by UUID Matcher "
                                + Util.BytesToHexString(uuidMatcher, " ")
                                + " with length requirment.");
                return null;
            }

            for (int i = 0; i < 16; i++) {
                if (ibeaconProximityUUID[i] != uuidMatcher[i]) {
                    Log.e(LOG_TAG,
                            "Scanned UUID: "
                                    + Util.BytesToHexString(
                                            ibeaconProximityUUID, " ")
                                    + " filtered by UUID Matcher "
                                    + Util.BytesToHexString(uuidMatcher,
                                            " "));
                    return null;
                }
            }

        }

        parsedObj.IbeaconProximityUUID = ibeaconProximityUUID;

        byte[] major = new byte[2];
        major[0] = magic.get(22);
        major[1] = magic.get(23);
        parsedObj.Major = major;

        byte[] minor = new byte[2];
        minor[0] = magic.get(24);
        minor[1] = magic.get(25);
        parsedObj.Minor = minor;

        byte tx = 0;
        tx = magic.get(26);
        parsedObj.Tx = tx;

        parsedObj.ScannedTime = new Date().getTime();
        return parsedObj;
    } catch (Exception ex) {
        Log.e(LOG_TAG, "skip one unknow format data...");
        // Log.e(LOG_TAG,
        // "Exception in ParseRawScanRecord with advertisedData: "
        // + Util.BytesToHexString(advertisedData, " ")
        // + ", detail: " + ex.getMessage());
        return null;
    }
}

答案 1 :(得分:0)

  1. 应将广告数据包的有效负载解析为 AD结构的列表。
  2. iBeacon是一种AD结构。
  3. 参见&#34; iBeacon as a kind of AD structures&#34;详情。另请参阅answer类似的问题。