Android BLE. Как отфильтровать сканирование по необработанным рекламным данным - PullRequest
1 голос
/ 06 февраля 2020

Мне нужно создать приложение Android, которое считывает информацию о типе устройства, которое отображается только при сканировании, когда оно отфильтровано (при обычном сканировании это не отображается). Устройство похоже на маяк, поэтому оно рекламирует только те данные, в которых есть информация, которую я хочу найти в рекламе (она не может быть подключена). Фильтр, который производитель дал мне, представляет собой необработанные данные. Что:

0x02010612435542

Я не могу отфильтровать его по имени, потому что устройство не объявляет его имя. Я также не могу сделать это с помощью MAC Address, потому что приложение ранее не будет знать адрес устройства (это будет много устройств такого типа).

Приложение nrfConnect делает это хорошо, как вы см. ниже:

nrfConnect does the filtering correctly

Имя фильтра в приложении:

Фильтр по необработанным рекламным данным

И, после фильтрации, вот как устройство отображается в приложении:

A device found on nrfConnect when filtered by raw data

Итак, вот в чем дело. Я не могу фильтровать ни по имени, ни по MAC Address.

Другие опции для фильтрации Java (стандартная библиотека Android / ble):

    ScanFilter scanFilter1 = new ScanFilter.Builder().setManufacturerData(manufacturerId, manufacturerData).build();
    ScanFilter scanFilter2 = new ScanFilter.Builder().setServiceData(serviceDataUuid, serviceData).build();
    ScanFilter scanFilter2 = new ScanFilter.Builder().setServiceUuid(serviceUuid).build();

У меня есть UUID, предоставленный производителем. Это

B54ADC00-67F9-11D9-9669-0800200C9A66

Но, как заявил производитель, UUID используется для сканирования на iOS, не будет работать на Android (проверил, это правда).

Итак, у меня осталось 2 варианта из ScanFilters выше.

У меня есть знания вроде: «Данные производителя публикуются в необработанные рекламные данные, которые можно найти через приложение nrfConnect. И первые два байта данных производителя - это идентификатор производителя для использования с фильтром setManufacturerData() ". Мне даже удалось получить необработанные объявленные производителем данные (используя фильтр setDeviceAddress() (для тестирования, с использованием тестового устройства, потому что, как я уже сказал, приложение не будет знать MAC-адреса ранее), и я получил что-то вроде этого :

0X020106124355420000080390BECB49400400CB500CF

Извините за длинный вопрос, но я постарался сделать его максимально полным.

Я попробовал все, что мог используя те методы scanFilter, но не смог заставить его работать.

Кто-то знает, как это реализовать? Я схожу с ума из-за МЕСЯЦА за это.

Заранее спасибо!

1 Ответ

0 голосов
/ 07 февраля 2020

Я наконец нашел решение. Он не отвечает на вопрос о сканировании фильтра по необработанным рекламным данным, но я могу сканировать устройства, которые мне нужны. Вот что я сделал:

Сначала я сделал фильтр по имени. Хотя у устройства нет имени, я фильтрую по имени, чтобы сканировать устройства, у которых name == null.

private List<ScanFilter> scanFilters() {
    List<ScanFilter> list = new ArrayList<ScanFilter>();

    ScanFilter scanFilterName = new ScanFilter.Builder().setDeviceName(null).build();

    list.add(scanFilterName);

    return list;
}

. После этого мне понадобился второй фильтр (которого не было в методе scanFilters () выше, это было на scanResult), потому что оно возвращало мне огромное количество устройств, и этот фильтр был с префиксом MA C Address (который одинаков для моих устройств).

private Set<String> btDevice = new LinkedHashSet<String>();

private ScanCallback scanCallback = new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {

        BluetoothDevice device = result.getDevice();

        ScanRecord record = result.getScanRecord();
        byte[] dataByteArray = record.getBytes();

        if (device.getAddress().startsWith("F8:36:9B")) {
            btDevice.add(device.getAddress());
        }
    }
};

И наконец Я должен сканировать только те устройства, которые мне нужны. Я все еще хочу знать главный вопрос, поэтому, если у кого-то есть решение, пожалуйста, не стесняйтесь отвечать. Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...