Android BLE. Можно ли отправлять данные на устройства при сканировании? - PullRequest
1 голос
/ 22 января 2020

Я занимаюсь разработкой приложения с устройством BLE, которое отображается при сканировании только при отправке некоторых параметров при сканировании.

Приложение nrf Connect выполняет эту задачу очень хорошо (при фильтрации по необработанным данным и используйте 0x02010612435542 параметр необработанных данных).

Устройство не будет отображать свое имя, ни UUID, ни данные производителя. На nrf Connect единственное, что он делит, - это сырой доход, такой как: 0X020106124355420000080390BECB49400400CB500CF (что мне и нужно сейчас). И при сканировании по адресу Ma c (тестирование на одном устройстве) он получает только свой rssi)

Мой вопрос, как и nrfConnect, как я могу кодировать фильтр или что-то в этом роде? , что будет отправлено в качестве параметра при сканировании, чтобы я мог найти свои устройства? Устройства не имеют имен (при сканировании отображается N / A), и я не могу добавить список фильтров адресов Ma c, потому что, когда мое приложение будет завершено, будет множество устройств такого же типа.

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

        ScanFilter scanFilter = new ScanFilter.Builder().build();
        list.add(scanFilter);

        //What kind of filter do I use to send that data on scanning?

    return list;
}

Ответы [ 2 ]

1 голос
/ 22 января 2020

В вашем сканере BLE вы получаете ScanResult, содержащий экземпляр BluetoothDevice, то есть сканированное устройство. По крайней мере, вы должны быть в состоянии прочитать BLE-адрес устройства, то есть его аппаратный адрес. Используйте метод:

BluetoothDevice.getAddress(); 

Этот аппаратный адрес должен иметь предопределенный диапазон, например, начиная с «A3: B4», который включает фильтрацию scanRecords. Узнайте у производителя устройства, как генерируются эти аппаратные адреса.

Кроме того, если вы знаете идентификатор производителя поддерживаемых вами устройств, вы можете установить фильтр на основе данных производителя:

ScanFilter scanFilter = new ScanFilter.Builder()
                                .setManufacturerData(manufacturerId, manufacturerData)
                                .build();

Обратите внимание, что первые два байта массива ManufacturerData - это идентификаторId.

РЕДАКТИРОВАТЬ: Данные ManufacturerData являются частью массива байтов, возвращаемого

scanResult.getScanRecord().getBytes()

scanResult передается в ScanCallback вы дали BluetoothLESCanner.startScan(...)

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

Я наконец-то нашел решение своей проблемы.

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

Сначала я сделал фильтр по имени, в котором устройство 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;
}

Это дало мне огромный список с тоннами устройств. Поэтому я добавил еще один фильтр, но на этот раз на scanResult(). Этот другой фильтр по суффиксу MAC Address, как указывает @matdev, он одинаков для моих устройств.

private Set<String> btDeviceData = 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")) {

            btDeviceData.add(device.getAddress());
        }
    }
};

При этом я получил список (Set, чтобы указать c) только с теми устройствами, которые я искал.

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