Разделы презентаций


BLE и с чем его едят

Содержание

Bluetooth с низким энергопотреблением или Bluetooth 4.Android 5.0+iOS 9.0+Не нужна лицензия MFI от AppleНе нужна регистрация в GameCenter

Слайды и текст этой презентации

Слайд 1BLE и с чем его едят
Гончаров Даниил Software Team Lead  Finch Technologies Ltd. Уфа

BLE и с чем его едятГончаров Даниил Software Team Lead  Finch Technologies Ltd. Уфа

Слайд 2Bluetooth с низким энергопотреблением или Bluetooth 4.
Android 5.0+

iOS 9.0+
Не нужна

лицензия MFI от Apple
Не нужна регистрация в GameCenter

Bluetooth с низким энергопотреблением или Bluetooth 4.Android 5.0+iOS 9.0+Не нужна лицензия MFI от AppleНе нужна регистрация в

Слайд 3Для чего нам BLE?

Для чего нам BLE?

Слайд 4Два стека

Два стека

Слайд 5Android vs

iOS
3898 строк кода
60 дней отладки
1124 строк кода
10 дней отладки

Android     vs     iOS3898 строк кода60 дней отладки1124 строк кода10

Слайд 6BLE Device

BLE Device

Слайд 7BLE flow

BLE flow

Слайд 8Advertising and Scan

Advertising and Scan

Слайд 9Scan
private void scanLeDevice(final boolean enable) { if (enable) {

ParcelUuid uuid = ParcelUuid.fromString("UUID");

ScanFilter scanFilter = new ScanFilter.Builder().setServiceUuid(uuid).build(); ScanSettings settings = new ScanSettings.Builder() .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) .setReportDelay(0) .build(); if (Build.VERSION.SDK_INT < 21) { mBluetoothAdapter.startLeScan(mLeScanCallback); } else { mLEScanner.startScan(Collections.singletonList(scanFilter), settings, mScanCallback); } } else { if (Build.VERSION.SDK_INT < 21) { mBluetoothAdapter.stopLeScan(mLeScanCallback); } else { mLEScanner.stopScan(mScanCallback); } } }
Scanprivate void scanLeDevice(final boolean enable) {   if (enable) {     ParcelUuid uuid

Слайд 11Connect №1
bluetoothGatt = device.connectGatt(context, autoConnect, gattCallback);

Connect №1bluetoothGatt = device.connectGatt(context, autoConnect, gattCallback);

Слайд 12GattCallback
onConnectionStateChange(BluetoothGatt gatt, int status, int newState)
onServicesDiscovered(BluetoothGatt gatt, int status)
onCharacteristicRead(BluetoothGatt gatt,

BluetoothGattCharacteristic characteristic, int status)
onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status)
onCharacteristicChanged(BluetoothGatt gatt,

BluetoothGattCharacteristic characteristic)

GattCallbackonConnectionStateChange(BluetoothGatt gatt, int status, int newState)onServicesDiscovered(BluetoothGatt gatt, int status)onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status)onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic,

Слайд 13Особенности Android BLE #1
Необходима синхронизировать работу с GATT
GATT операции должны

быть выполнены в одном потоке
Если устройство BLE необходима создавать GATT

в режиме BLE
Всегда следует проверять статус GATT
В случае ошибок/крашей калбеки GATT могут не придти. Вам следует проверять таймаут самостоятельно.
Characteristic reads and notifications могут возвращать статус “successfully” но в значениях будет null.


Особенности Android BLE #1Необходима синхронизировать работу с GATTGATT операции должны быть выполнены в одном потокеЕсли устройство BLE

Слайд 14Особенности Android BLE #2
ArrayBlockingQueue
+
Semaphore
+
BleDeviceThread
=
No GATT FAIL?

Особенности Android BLE #2ArrayBlockingQueue+Semaphore +BleDeviceThread =No GATT FAIL?

Слайд 15Connect №2
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { bluetoothGatt = device.connectGatt(context,

autoConnect, gattCallback, BluetoothDevice.TRANSPORT_LE); } else { bluetoothGatt = device.connectGatt(context, autoConnect,

gattCallback); }

public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { if (newState == BluetoothProfile.STATE_CONNECTED) { gatt.discoverServices();
}

if (!operationSemaphore.tryAcquire(CONNECT_TIMEOUT)) { … }

Connect №2if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {   bluetoothGatt = device.connectGatt(context, autoConnect, gattCallback, BluetoothDevice.TRANSPORT_LE); } else {

Слайд 16OnConnected
Работу с девайсом можно начать после onServicesDiscovered
Если не удалось подключиться,

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

пробуем заново
При нештатном отключение девайса, таймаут обновления статуса подключения занимает 20+ сек.
Не подключайте девайс с autoConnect=true
OnConnectedРаботу с девайсом можно начать после onServicesDiscoveredЕсли не удалось подключиться, пробуем зановоЕсли не удалось найти сервисы, сбрасываем

Слайд 17Android is hardcoded

Android is hardcoded

Слайд 18Read Characteristic
characteristi = gatt.getService(...).getCharacteristic(…)
gatt.readCharacteristic(characteristic)
onCharacteristicRead -> characteristic.getValue()

Read Characteristiccharacteristi = gatt.getService(...).getCharacteristic(…)gatt.readCharacteristic(characteristic)onCharacteristicRead -> characteristic.getValue()

Слайд 19Write Characteristic
characteristic = gatt.getService(...).getCharacteristic(…)
haracteristic.setValue(value)
gatt.writeCharacteristic(characteristic)
onCharacteristicWrite -> подтверждение (Device)

Write Characteristiccharacteristic = gatt.getService(...).getCharacteristic(…)haracteristic.setValue(value)gatt.writeCharacteristic(characteristic)onCharacteristicWrite -> подтверждение (Device)

Слайд 20Write with no response
characteristic = gatt.getService(...).getCharacteristic()
haracteristic.setValue(value)
characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE)
gatt.writeCharacteristic(characteristic)
onCharacteristicWrite -> подтверждение (Android)

Write with no responsecharacteristic = gatt.getService(...).getCharacteristic()haracteristic.setValue(value)characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE)gatt.writeCharacteristic(characteristic)onCharacteristicWrite -> подтверждение (Android)

Слайд 21Notification
characteristic gatt.getService(...).getCharacteristic()
gatt.setCharacteristicNotification(characteristic, enable)
onCharacteristicChanged -> characteristic.getValue()

Notificationcharacteristic gatt.getService(...).getCharacteristic()gatt.setCharacteristicNotification(characteristic, enable)onCharacteristicChanged -> characteristic.getValue()

Слайд 22Особенности Android BLE #3
If (NOT_WORK)
{
RETRY();
}

Особенности Android BLE #3If (NOT_WORK){	RETRY();}

Слайд 23Disconnect с стороны Android
gatt.disconnect()

onConnectionStateChange -> gatt.close()

НЕ вызывайте disconnect а затем

сразу close. Одного close будет достаточно.



Disconnect с стороны Androidgatt.disconnect()onConnectionStateChange -> gatt.close()НЕ вызывайте disconnect а затем сразу close. Одного close будет достаточно.

Слайд 24Disconnect с стороны Device
status == 0 –> девайс отключится в

штатном режиме -> gatt.close()
status == 133 -> wait 500ms ->

refreshDeviceCache, gatt.close() -> wait 500ms (133 is a generic error and means nothing)
Disconnect с стороны Devicestatus == 0 –> девайс отключится в штатном режиме -> gatt.close()status == 133 ->

Слайд 25Что там на iOS?


didUpdateState
didDisconnectPeripheral
didDiscoverServices
didUpdateValueForCharacteristic
etc

convenience init(delegate: CBCentralManagerDelegate?,
queue: DispatchQueue?)

Что там на iOS?didUpdateStatedidDisconnectPeripheraldidDiscoverServicesdidUpdateValueForCharacteristicetcconvenience init(delegate: CBCentralManagerDelegate?,			 queue: DispatchQueue?)

Слайд 26Спасибо за внимание!
Контакты:
dg@finch-vr.com
telegram @neargye
Finch companion library for the Android BLE:

https://github.com/FinchTechnologies/FinchBle

Спасибо за внимание!Контакты:dg@finch-vr.comtelegram @neargyeFinch companion library for the Android BLE: https://github.com/FinchTechnologies/FinchBle

Обратная связь

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

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика