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

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

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

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

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

Solutions Collecting From Web of "Android 4.3 BTLE как сервер: как начать рекламу?"

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

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

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

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

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

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

Вам потребуется 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

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

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

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

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