Noveo

Наш блог Работа с Beacon’ами в Android

Работа с Beacon’ами в Android

Биконы являются сегодня одной из самых многообещающих технологий: невысокая стоимость самих устройств в сочетании с практически неограниченной сферой их применения (от ритейла до социальных проектов) обеспечивают этой технологии большое будущее. Один из наших постоянных партнеров среди первых на европейском рынке осознал, насколько большие возможности предлагают эти маленькие датчики, и предложил нам реализацию своего долгосрочного мобильного бикон-проекта. Благодаря этому сотрудничеству мы накопили немало опыта работы с этой технологией и теперь по праву можем считаться в ней экспертами. Наш старший разработчик Александр делится некоторыми секретами применения биконов в Android:

Про Beacon

Beacon – это небольшой маячок, который транслирует при помощи Bluetooth Low Energy (Bluetooth LE, BLE) пакет со своим уникальным идентификатором (UUID, Major, Minor) и значениями (RSSI сила сигнала); при помощи этого пакета можно определить расстояние от принимающего устройства до маяка.

image

Для работы с биконами существует несколько протоколов – iBeacon, AltBeacon, Eddystone. Отличаются они параметрами, которые разрешено передавать при вещании.**
**

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

Bluetooth LE на Android

Платформа Android поддерживает работу с Bluetooth LE, начиная с версии 4.4 KitKat (API Level 19). Уже в Android 5.0 Lollipop (API Level 21) работа с Bluetooth LE претерпела значительные изменения. Если вы собираетесь разрабатывать приложение с использованием биконов – вам необходимо поддерживать оба варианта.

Для работы с любой версией вам потребуется BluetoothAdapter, получить его можно так:

/*Необходимо получить BluetoothAdapter из любого места, где доступен Context.*/
BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();

Пример поиска для Android 4.4:

/*создать слушателя и сохранить, он понадобится для остановки сканера*/
BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() {
    @Override
    public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
        handleScanRecordBytes(device, rssi, scanRecord);
    }
}
 
/*запустить скан используя BluetoothAdapter*/
bluetoothAdapter.startLeScan(leScanCallback);
 
/*остановить сканер можно при помощи BluetoothAdapter’а и сохраненного слушателя*/
bluetoothAdapter.stopLeScan(leScanCallback);

Пример поиска для Android 5.0:

/*Получить специальный сканер из BluetoothAdapter’а*/
BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner();
 
/*Создать слушателя*/
ScanCallback scanCallback = new ScanCallback() {
	public void onScanResult(int callbackType, ScanResult result) {}
	public void onBatchScanResults(List results) {}
	public void onScanFailed(int errorCode) {}
};
 
/*Настроить сканер*/
ScanSettings settings = new ScanSettings.Builder()
    	.setReportDelay(SCAN_DELAY_IN_MS)
    	.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
    	.build();       
List filters = new ArrayList<>();
 
/*запустить скан исползьуя BluetoothLeScanner*/
bluetoothLeScanner.startScan(filters, settings, scanCallback);
 
/*остановить сканер можно при помощи BluetoothLeScanner’а и сохраненного слушателя*/
bluetoothLeScanner.stopScan(scanCallback);

Как видно из примеров, Android 4.4 позволяет сканировать Bluetooth LE устройства, но управлять этим процессом не так легко. К тому же интенсивность сканирования нельзя настроить, а это чревато усиленным энергопотреблением. Используя возможности Android 5.0, вы можете настроить такие параметры, как:

  • Период сканирования перед возвратом данных.
  • Фильтры, например по UUID.
  • Режим сканирования. Доступны 3 варианта:
    1. Low Latency – частое сканирование,
    2. Low Power – энергосберегающее сканирование,
    3. Balanced – среднее между двумя предыдущими.
  • Кроме того, сканер умеет возвращать сгруппированные данные.

Кроме того, сканер умеет возвращать сгруппированные данные.

image

Сложности с Android 6.0

Казалось бы, все хорошо. Но с выходом Android 6.0 появляются дополнительные требования. Самое большое изменение – это Runtime Permissions. Разрешения в Android делятся на обычные и опасные. Пользователь может отключать опасные разрешения в настройках, а приложения должны запрашивать и проверять доступ в тех местах, где он требуется.

Немного про разрешения в Android:

К обычным разрешениям относится большая часть разрешений, например доступ к Wi-Fi или Bluetooth. Опасных разрешений немного, к ним относятся камера, контакты, местоположение, микрофон и т.д. Вроде бы все должно работать, ведь для сканирования биконов достаточно разрешений BLUETOOTH и BLUETOOTH_ADMIN — но оказывается, что нет. Для сканирования в фоне, например из сервиса, необходимы еще и разрешения ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION, а они относятся к группе опасных, и их необходимо проверять перед каждым сканированием.

Да-да! Доступ к местоположению устройства! К тому же службы определения местоположения должны быть включены как минимум в режиме энергосбережения, использование только GPS для биконов не подойдет. Режим высокой точности использует оба вышеуказанных источника, а потому также допустим.

Приложения в Android 6.0 не может читать Bluetooth MAC-адрес собственного устройства. Блокирование возможности чтения собственного Bluetooth MAC-адреса ‑ часть политики безопасности Google и связано с разрешениями местоположения.  Зная MAC адрес и SSID, можно идентифицировать окружающие устройства, а зная местоположения этих устройств, можно определить положение пользовательского девайса.

Заключение

Одних разрешений и сканирования недостаточно для написания качественного приложения, работающего с биконами. Вам также стоит следить за включением и выключением Bluetooth, останавливая или перезапуская при этом сканирования. Нелишним будет и запускать сканер в разных режимах для фоновой и активной работы – чтобы беречь заряд устройства. Все эти усилия окупятся хорошими отзывами довольных пользователей. А их количество, к слову, неуклонно растет — биконы незаметно завоевывают мир, стирая границы между офф- и онлайном, и можно с уверенностью говорить что за биконами если не все будущее, то как минимум часть его. И она уже становится настоящим!

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

НазадПредыдущий пост ВпередСледующий пост

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: