Подтвердить что ты не робот

Android 4.3 BTLE как сервер: как начать рекламу?

Я пытаюсь реализовать BTLE SERVER на Nexus 7 с новым BTLE API в 4.3. Я сталкиваюсь с несколькими проблемами. Во-первых, нет примеров с SDK. Единственный пример для клиента. Во-вторых, документация на самом деле говорит вам делать не то. В нем указано, что для получения объекта BluetoothGattServer необходимо использовать параметр BluetoothAdapter.getProfileProxy() with a BluetoothProfile.GATT_SERVER. Этот подход будет работать, но нельзя будет связать одну реализацию BluetoothGattServerCallback с стеком BLE. (Этот обратный вызов - это то, как каждый реагирует на запросы чтения и записи клиента среди прочего.) Однако после спотыкания на вопрос 58582 разработчик указал на новый метод BluetoothManager.openGattServer(), который принимает ваш обратный вызов как параметр и возвращает объект BluetoothGattServer. Ну, одна проблема решена.

Следующий вопрос более проблематичен. В документации BluetoothGattServer указано, что этот класс можно использовать для создания и рекламы услуг и характеристик Bluetooth LE. Создание сервисов и т.д. Не было проблемой, но они не указали, как начать рекламу. В самом классе или любом другом классе, который я могу найти, нет метода.

Кто-нибудь знает, как это сделать? На данный момент все, что я вижу, это использовать тот же подход, что и клиент, но этот подход включает в себя сканирование (которое не является рекламой). Вся документация далее предполагает, что BluetoothAdapter.startLeScan() IS действительно JUST для сканирования.

Итак, как мне вызывать рекламные объявления, когда все мои службы, характеристики и дескрипторы на месте?

4b9b3361

Ответ 1

Как я понимаю, реализация Android может действовать только как центральное устройство, а не как периферийное устройство. В Bluetooth Low Energy можно рекламировать только периферийные устройства. Центральное устройство может сканировать рекламные объявления с периферийных устройств и отправлять запросы на соединение в качестве ответов на (некоторые виды) рекламных объявлений, чтобы создать соединение с периферией.

В BLE существует различие между понятиями Central/Peripheral и Server/Client:

  • Центральное/периферийное устройство относится к сетевой архитектуре, где центральным является концентратор в звезде с одним или несколькими периферийными устройствами, подключенными к нему. Обычно это телефон, планшет или компьютер. Периферийное устройство может подключаться только к одному центральному за раз.

  • Сервер/клиент (сервер/клиент GATT) - это концепция более высокого уровня, связанная с данными, которые хранятся в устройствах и, возможно, передаются по соединению. Как центральные, так и периферийные устройства могут реализовывать сервер GATT и клиент GATT, но не обязательно иметь оба.

Итак, чтобы ответить на ваш вопрос: вы не можете вызывать рекламу. Вам нужно будет начать сканирование периферийных устройств, чтобы иметь возможность подключиться к одному или нескольким из них.

Надеюсь, что это поможет.

Ответ 2

Вам потребуется API уровня 21.

import android.bluetooth.le;
...
...
BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter myBluetoothAdapter = bluetoothManager.getAdapter();
BluetoothLeAdvertiser myBluetoothLeAdvertiser =  myBluetoothAdapter.getBluetoothLeAdvertiser ();
myBluetoothLeAdvertiser.startAdvertising (AdvertiseSettings settings, AdvertiseData advertiseData, AdvertiseCallback callback);

Полезная ссылка: https://developer.android.com/about/versions/android-5.0.html

Ответ 3

Кажется, что getProfileProxy не отвечает на запрос GATT или GATT_SERVER. API предлагает рекламную поддержку, но еще нет кода. (Android Issue Tracker)

Те же самые реализованные API на полпути были выпущены изначально, когда NFC был представлен, и Google повторил, добавив более хорошо округленные функциональные возможности с последующими релизами.

Ответ 4

Как я вижу, возможность рекламы BLE (ака периферийного режима) будет добавлена ​​в Android с предстоящей версией 4.4.3 Kitkat. Он должен быть выпущен на следующей неделе, но журнал изменений уже случайно просочился, см. Кэш Google или здесь в строке 2554: периферийный режим (3/4): добавьте API периферийного режима.

Думаю, мы скоро узнаем.