Android BLE. Можно ли использовать регулярное выражение в качестве фильтра для сканирования Ma c Address? - PullRequest
1 голос
/ 05 февраля 2020

Мне нужно создать приложение, которое сканирует устройства BLE и возвращает его данные. Устройства не будут отображаться при сканировании, если я не использую фильтр.

UUID не является опцией, и устройство не передает свое имя (при сканировании с nrfConnect. * 1004 оно не отображается. *

Я пытаюсь сканировать его по адресу MA C. НО я не знаю адресов MA C, так как это может быть любое устройство такого рода, поэтому приложение ранее не будет знать MA C Адрес устройства.

Я уже знаю, что у устройства есть префикс для его адреса, который равен F8:36:9B. Дело в суффиксе. Как я могу (и если это возможно) сделать регулярное выражение для передачи в качестве параметра для поиска всех возможных совпадений устройства MA C Address?

Регулярное выражение само по себе, ([A-Fa-f0-9]{2}:){2}[A-Fa-f0-9]{2}, которое я получил от Android Bluetooth ScanFilter Partial String Matching .

Я просто не знаю, как реализовать это на scanFilter.

ScanFilter filterMac = new ScanFilter.Builder().setDeviceAddress(/**THE_SUFIX_AND_REGEX*/).build();

Возможно ли это? Если да, то как?

Все, что я пытался, я получаю эту ошибку:

Ошибка: неверный адрес устройства

* 102 6 * Я попытался сгенерировать все возможные совпадения с использованием циклов for и сохранить его в ArrayList, а затем добавить его в список фильтров, но я получаю OutOfMemoryException, поскольку в результате получается более 16 миллионов возможностей.

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Не возможно с фильтрами. Вы должны фильтровать себя ... как вы уже сделали

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

После долгой борьбы я нашел решение своей проблемы. Он не отвечает на вопрос сам по себе, т. Е. Если возможно использовать регулярное выражение в качестве фильтра для поиска адреса MA C. Но мне удалось правильно отыскать нужные мне устройства. Вот что я сделал:

Прежде всего, я сделал фильтр по имени. Да, имя, устройство не имеет имени. Поэтому мне пришлось подумать ... А что, если я отфильтрую по имени, чтобы найти устройства, у которых 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 (который одинаков для моих устройств).

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());
        }
    }
};

И вуаля, я получил сканирование только с необходимыми мне устройствами. Я все еще хочу знать, возможен ли основной вопрос, т. Е. Можем ли мы использовать регулярное выражение в scanFilter(), чтобы отфильтровать диапазон чего-либо (в данном случае MA C Address). Так что, если у кого-то есть решение, пожалуйста, не стесняйтесь отвечать. Спасибо!

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