Bluetooth LE ScanResult возвращает ноль, но я знаю, что мое периферийное устройство передает UUID службы сердечного ритма (как проверено приложением BLE стороннего производителя). Почему? - PullRequest
1 голос
/ 12 марта 2020

Я разочарован тем, что сканирование BLE не возвращает UUID службы GATT (т. Е. scanRecord.getServiceUUIDs() возвращает null). Тем не менее, я знаю, что мое периферийное устройство для измерения пульса работает и правильно рекламирует, потому что служба LightBlue обнаруживает (и может читать) приложение. Вот моя функция в моем ScanCallback объекте:

override fun onScanResult(callbackType: Int, result: ScanResult?) {
    super.onScanResult(callbackType, result)
    // This log shows that result.mServiceUuids is null
    Log.i(TAG, "BLEDeviceManager.ScanCallback.onScanResult: ${result.toString()}")

    // TODO: handle null ScanResult
    val parcelUuids = if (result.getScanRecord() != null) result.getScanRecord()!!.getServiceUuids() else null
    if (parcelUuids == null) {
        Log.i(TAG, "parcelUUids was null for scanRecord = ${result.getScanRecord()!!.toString()}")
        return
    }
    val serviceList = ArrayList<UUID>()
    for (i in parcelUuids.indices) {
        val serviceUUID = parcelUuids.get(i).getUuid()
        if (!serviceList.contains(serviceUUID))
            serviceList.add(serviceUUID)
    }
    Log.i(TAG, "Here is a list of the service UUIDs: $serviceList")
}

Вот журнал:

I / BLEDeviceManager: parcelUUids был нулевым для scanRecord = ScanRecord [mAdvertiseFlags = 6, mServiceUuids = null, mServiceSolicitationUuids = null, mManufacturerSpecificData = {}, mServiceData = {}, mTxPowerLevel = 3, mDeviceName = blehr_sensor_1.0]

Что я делаю неправильно, так что mServiceUuids всегда равно нулю

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Согласно выводу ScanRecord, ваше устройство не рекламирует ЛЮБОЙ сервис UUID. Это не значит, что у него нет этой службы ... она просто не афиширует ее.

Возможно, вы захотите подключиться к ней, а затем вызвать DiscoverServices (), чтобы получить список ее услуг. действительно имеет ...

0 голосов
/ 12 марта 2020

Скорее всего, ваше устройство объявляет недействительные данные. Если это так, Android вернет пустой список услуг, даже если неверные данные были в несвязанном поле.

Поэтому проанализируйте рекламные данные и проверьте их на наличие UUID, который вы ищете. Как только вы поймете, что происходит, вы можете самостоятельно проанализировать данные.

(код ниже Java вместо Kotlin. Но Android Studio должна преобразовать их автоматически.)

@Override
public void onScanResult(int callbackType, ScanResult result) {
    super.onScanResult(callbackType, result);
    ScanRecord scanRecord = result.getScanRecord();
    byte[] advertisementData = scanRecord.getBytes();
    Log.i(TAG, "advertisement data: " + bytesToHex(advertisementData));
}

private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();

public static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for (int j = 0; j < bytes.length; j++) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = HEX_ARRAY[v >>> 4];
        hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
    }
    return new String(hexChars);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...