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 для сканирования.
Итак, как мне вызывать рекламные объявления, когда все мои службы, характеристики и дескрипторы на месте?
Ответы
Ответ 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 периферийного режима.
Думаю, мы скоро узнаем.