Bluetooth low energy что это
Перейти к содержимому

Bluetooth low energy что это

  • автор:

Bluetooth low energy что это

Bluetooth Low Energy (BLE) — это технология беспроводной связи с низким энергопотреблением для обмена данными на небольших расстояниях. Она была создана для устройств, которым необходимо длительный период времени поддерживать между собой связь.

Обычный Bluetooth подходит для непрерывной обработки, передачи и обмена больших объемов данных (например, аудио). Однако он потребляет больше энергии и в конечном итоге стоит дороже. В BLE данные передаются короткими пакетами, после чего передатчик отключается — именно по такому принципу удается добиться низкого потребления энергии. И, в отличие от классического Bluetooth, устройства с BLE связываются друг с другом лишь для того, чтобы отправить или получить информацию.

Низкое энергопотребление — это основное преимущество Bluetooth Low Energy. Как правило, BLE потребляет в десятки раз меньше энергии, чем Bluetooth. Это значительно экономит заряд аккумуляторов устройств. Технология проста в развертывании и использует для работы тот же диапазон, что и обычный Bluetooth.

EPOS Sennheiser
IMPACT SC 60 USB

Проводная USB гарнитура, 2 динамика, микрофон с шумоподавлением, частотный диапазон динамиков: 50-10000 Гц, блок управления: кнопка ответа, громкость, отключение микрофона, материал амбушюр: поролон, вес: 66 грамм

Jabra
BIZ 2300 Duo USB MS

Микрофон с шумоподавлением на гибком держателе, разъем USB-A, два динамика, частотный диапазон: 300 — 3400 Гц, укрепленная конструкция, устойчивая к поломке вращающаяся на 360° штанга микрофона, кевларовый шнур, вес: 68 грамм, поролоновые прорезиненные амбушюры, кнопки ответа на вызов и контроля звука на шнуре

Jabra
Evolve2 65 USB-A, MS Stereo

Беспроводная Bluetooth гарнитура с USB-A адаптером Link 380a, время работы до 37 часов, дальность работы до 30 м, кнопки управления и индикатор занятости на гарнитуре, 3 цифровых MEMS микрофона, частотный диапазон 20-20000 Гц, поддержка MS Teams

EPOS Sennheiser
ADAPT 160 USB II

Проводная гарнитура для компьютера, разъем USB-A, 2 динамика, микрофон с системой шумоподавления, большие амбушюры из поролона, частотный диапазон динамиков: 20-20000 Гц, вес гарнитуры: 136 грамм

Jabra
Evolve 20 MS Stereo

Проводная гарнитура для VoIP и мультимедиа, 2 динамика, USB подключение, блок управления вызовами и громкость на шнуре гарнитуры, амбушюры из поролона, оптимизирована для Microsoft Lync

EPOS Sennheiser
ADAPT 260

Bluetooth гарнитура, 2 динамика, подключение к смартфону или компьютеру при помощи USB-A донгла, крепление: оголовье, дальность приема: до 20 метров, время работы в режиме разговора: до 27 часов, в режиме ожидания: до 300 часов, вес гарнитуры: 121 грамм

Poly
EncorePro EP320 USB-A

Гарнитура USB-A для офиса или колл-центра, подключение к компьютеру, прочная конструкция с гнущимся оголовьем, 2 динамика, ограничение уровня звука для защиты слуха от громких звуков, материал динамиков: поролон

© 2003-2024 Headset.ru
Телефонные гарнитуры, телефоны, конференц-связь
Копирование материалов сайта запрещено.

® HEADSET.RU является зарегистрированной торговой маркой.
Все права сохранены.

Проводные гарнитуры

Беспроводные гарнитуры DECT

Гарнитуры Bluetooth

Компьютерные гарнитуры

Телефоны с гарнитурой

Гарнитуры для смартфона

Адаптеры гарнитур

Аксессуары для гарнитур

Игровые гарнитуры

Спикерфоны

Bluetooth Low Energy в универсальная платформа Windows приложениях

В этом разделе представлен обзор Bluetooth LE в приложениях универсальная платформа Windows (UWP) (дополнительные сведения о Bluetooth LE см. в спецификации Bluetooth Core Specification версии 4.0).

Bluetooth с низким энергопотреблением (LE) является спецификацией, определяющей протоколы для обнаружения и обмена данными между энергоэффективными устройствами. Обнаружение устройств выполняется с помощью протокола Generic Access Profile (GAP). После обнаружения обмен данными между устройствами выполняется с помощью протокола Generic Attribute (GATT).

Роли GATT и GAP bluetooth LE

появились в Windows 10 версии 1703

Протоколы GATT и GAP можно внедрить в приложение UWP с помощью указанных ниже пространств имен.

  • Windows.Devices.Bluetooth.GenericAttributeProfile
  • Windows.Devices.Bluetooth.Advertisement

Центральное и периферийное устройство

Две основные роли обнаружения называются центральное устройство и периферийное устройство. Как правило, Windows работает в режиме центрального устройства и подключается к различным периферийным устройствам.

Атрибуты

Профиль cGeneric Attribute (GATT) определяет структуру данных и режимы работы, с помощью которых взаимодействуют два устройства Bluetooth LE. Атрибут является основным блоком построения GATT. К main типам атрибутов относятся службы, характеристики и дескрипторы. Эти атрибуты действуют по-разному между клиентами и серверами, поэтому полезнее обсудить их взаимодействие в соответствующих разделах.

Типичная иерархия атрибутов в общем профиле

Служба частоты сердечных сокращений выражается в форме API сервера GATT

Клиент и сервер

После установления подключения устройство, которое содержит данные (обычно небольшой датчик IoT или носимое устройство), называется сервером. Устройство, которое использует данные для выполнения функций, называется клиентом. Например, компьютер под управлением Windows (клиент) считывает данные с монитора частоты пульса (сервер) для отслеживания оптимальных тренировок пользователя. Дополнительные сведения см. в разделах Клиент GATT и Сервер GATT.

Наблюдатели и издатели (маяки)

Кроме ролей центрального и периферийного устройств, существуют роли наблюдателя и вещателя. Вещатели обычно называются маяками, они не взаимодействуют через GATT, поскольку используют ограниченное пространство, предоставленное в пакете объявления для передачи данных. Аналогично наблюдатель не должен устанавливать подключения для получения данных, он сканирует ближайшие рекламные объявления. Чтобы настроить Windows для отслеживания ближайших рекламных объявлений, используйте класс BluetoothLEAdvertisementWatcher. Чтобы транслировать полезные данные маяка, используйте класс BluetoothLEAdvertisementPublisher. Дополнительные сведения см. в разделе Объявления Bluetooth LE.

См. также:

  • Windows.Devices.Bluetooth.GenericAttributeProfile
  • Windows.Devices.Bluetooth.Advertisement
  • Основные характеристики Bluetooth

Bluetooth Low Energy

Bluetooth Low Energy (BLE) — это цифровой радио протокол передачи данных от одного устройства к другому. Принцип работы BLE описан уже в его названии: Low Energy. Протокол подразумевает передачу данных короткими пакетами по необходимости, затем – выключение передатчика. Низкое энергопотребление частично достигается применением именно этого принципа. Вместо классического тандема в обычном Bluetooth, устройства BLE связываются друг с другом лишь при необходимости отправки или получения информации.

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

У центрального устройства есть два режима: сканирование и соединение. Периферия имеет другие два режима: объявление и соединение.

Протокол BLE строго структурирован по принципу своей коммуникации с другими устройствами. Вначале девайсы изучают доступные сервисы для отправки/принятия данных; неотъемлемая часть этих сервисов – их характеристики (characteristics), определяющие тип данных для будущей передачи. Характеристики, из соображений наглядности, могут иметь в своём составе описания-дескрипторы (descriptors), которые помогают определить тип данных. К примеру, разберём сервис под названием «Heart Rate Monitor» (монитор частоты сердцебиения) – среди его характеристик присутствуют такие, как «измерение пульса».

Большинство API для Bluetooth LE позволяют искать локальные устройства и определять доступные в них сервисы, характеристики и дескрипторы.

Далее перевод статьи Bluetooth Low Energy | Android Developers подготовил Антон Акимов.

ОС Android 4.3 (API 18) представляет встроенную поддержку Bluetooth Low Energy и API, при помощи которого приложения могут использовать поиск устройств, запрос услуг и чтение/запись характеристик. В отличие от классического Bluetooth, BLE призван обеспечить существенно меньшее энергопотребление. Это позволяет приложениям для Android общаться с BLE-устройствами, которые имеют низкие требования к питанию, таких как датчики, мониторы сердечного ритма, фитнес-устройства и так далее.

Ключевые термины и понятия

Generic Attribute Profile (GATT) – профиль GATT является общей спецификацией для отправки и получения коротких фрагментов данных, известных как «атрибуты» через BLE-соединение. Все текущие LE-профили приложений основаны на GATT. Создатели BLE определили множество профилей для низкоэнергетических устройств. Профиль представляет собой определение того, как устройство работает в конкретном приложении. Обратите внимание, что устройство может реализовывать более одного профиля. Например, устройство может содержать профили пульсометра и датчика уровня заряда батареи.

Attribute Protocol (ATT) – GATT строится на основе протокола атрибутов АТТ. Это также относится к GATT/ATT. АТТ оптимизирован для работы на BLE-устройствах. Для этого он использует настолько мало байтов, насколько возможно. Каждый атрибут идентифицируется уникальным универсальным идентификатором (UUID), который представляет собой стандартизированный 128-битный строковый идентификатор используемый для однозначной идентификации информации. Атрибуты переносятся с помощью АТТ в виде характеристик и услуг.

Характеристика (Characteristic) – содержит одно значение, и от 0 до N дескрипторов, описывающих значение характеристики. Характеристика может рассматриваться как тип, аналог класса.

Дескриптор (Descriptor) может содержать удобочитаемое описание, приемлемый диапазон значений или единицу измерения, конкретные значения характеристики.

Услуга (Service) – это набор характеристик. Например, вы можете иметь услугу под названием «пульсометр», что включает в себя такую характеристику, как «Измерение пульса». Вы можете найти список существующих на основе GATT профилей и услуг на bluetooth.org.

Роли и обязанности при взаимодействии Android с BLE-устройством

Центральная/периферическая роль. Это относится к самому BLE-соединению. Устройство в центральной роли сканирует, ищет объявления, а устройства в периферийной роли создаёт объявления.

GATT-сервер/GATT-клиент. Это определяет, каким образом два устройства общаются друг с другом, когда они установили связь.

Чтобы понять разницу, представьте, что у вас Android-телефон и фитнес-трекер, который представляет собой BLE-устройство. Телефон поддерживает центральную роль; трекер активности поддерживает периферийную роль. Чтобы установить BLE-соединение, вам нужно по одному устройству, поддерживающему каждую из ролей; два периферийных устройства не смогут общаться друг с другом, также как и два центральных.

Как только телефон и трекер активности наладили связь, они начинают передачу метаданных GATT друг другу. В зависимости от того, какие данные они передают, тот или другой может выступать в качестве сервера. Например, если трекер хочет сообщить данные датчика телефону, трекеру имеет смысл работать в качестве сервера. Если трекер активности хочет получать обновления с телефона, то в качестве сервера имеет смысл использовать телефон.

В качестве примера в данном документе представлено Android-приложение, являющееся GATT-клиентом. Приложение получает данные от GATT-сервера на BLE-пульсометре. Но вы можете также спроектировать ваше приложение так, чтобы оно играло роль сервера.

BluetoothAdapter является обязательным для любых действий с Bluetooth. BluetoothAdapter представляет собственный Bluetooth-адаптер устройства (Bluetooth-приёмник). Есть один Bluetooth-адаптер для всей системы, и ваше приложение может взаимодействовать с ним, используя этот объект.

Подключение к GATT-серверу

Первым шагом во взаимодействии с BLE-устройством станет подключение к нему – точнее, подключение к GATT-серверу на устройстве. Для подключения к GATT-серверу на BLE-устройстве нужно использовать метод connectGatt(). Этот метод принимает три параметра: объект контекста, автосоединение (логическое значение, указывающее, следует ли автоматически подключиться к BLE-устройству, как только оно станет доступным), и ссылку на BluetoothGattCallback:

 mBluetoothGatt = device.connectGatt(this, false, mGattCallback); 

Оно подключается к GATT-серверу, находящемуся на BLE-устройстве, и возвращает экземпляр BluetoothGatt, который затем можно использовать для проведения клиентских операций GATT. Приложение для Android является GATT-клиентом. BluetoothGattCallback используется для получения результатов клиентом, таких как статус подключения, а также любые дополнительные клиентские операции GATT.

В этом примере BLE-приложение предоставляет активности (DeviceControlActivity) отображение данных о подключении, GATT-услугах и характеристиках, поддерживаемых устройством. На основе ввода пользователя, эта активность связывается со службой под названием BluetoothLeService, который взаимодействует с BLE-устройством через Android BLE API-интерфейс:

 // Служба, которая взаимодействует с BLE-устройством через Android BLE API public class BluetoothLeService extends Service < private final static String TAG = BluetoothLeService.class.getSimpleName(); private BluetoothManager mBluetoothManager; private BluetoothAdapter mBluetoothAdapter; private String mBluetoothDeviceAddress; private BluetoothGatt mBluetoothGatt; private int mConnectionState = STATE_DISCONNECTED; private static final int STATE_DISCONNECTED = 0; private static final int STATE_CONNECTING = 1; private static final int STATE_CONNECTED = 2; public final static String ACTION_GATT_CONNECTED = "com.example.bluetooth.le.ACTION_GATT_CONNECTED"; public final static String ACTION_GATT_DISCONNECTED = "com.example.bluetooth.le.ACTION_GATT_DISCONNECTED"; public final static String ACTION_GATT_SERVICES_DISCOVERED = "com.example.bluetooth.le.ACTION_GATT_SERVICES_DISCOVERED"; public final static String ACTION_DATA_AVAILABLE = "com.example.bluetooth.le.ACTION_DATA_AVAILABLE"; public final static String EXTRA_DATA = "com.example.bluetooth.le.EXTRA_DATA"; // Устанавливаем UUID, который используется для услуг измерения пульса public final static UUID UUID_HEART_RATE_MEASUREMENT = UUID.fromString(SampleGattAttributes.HEART_RATE_MEASUREMENT); // Различные методы обратного вызова, определённые в BLE API private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() < @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) < String intentAction; if (newState == BluetoothProfile.STATE_CONNECTED) < intentAction = ACTION_GATT_CONNECTED; mConnectionState = STATE_CONNECTED; broadcastUpdate(intentAction); Log.i(TAG, "Connected to GATT server."); Log.i(TAG, "Attempting to start service discovery:" + mBluetoothGatt.discoverServices()); >else if (newState == BluetoothProfile.STATE_DISCONNECTED) < intentAction = ACTION_GATT_DISCONNECTED; mConnectionState = STATE_DISCONNECTED; Log.i(TAG, "Disconnected from GATT server."); broadcastUpdate(intentAction); >> @Override // При обнаружении нового сервиса public void onServicesDiscovered(BluetoothGatt gatt, int status) < if (status == BluetoothGatt.GATT_SUCCESS) < broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED); >else < Log.w(TAG, "onServicesDiscovered received: " + status); >> @Override // Результат чтения характеристики public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) < if (status == BluetoothGatt.GATT_SUCCESS) < broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); >> . >; . > 

Когда срабатывает конкретный обратный вызов, он вызывает соответствующий вспомогательный метод broadcastUpdate() и передает ему действие. Обратите внимание, что извлечение данных в этот раздел выполняется в соответствии с профилем пульсометра.

 private void broadcastUpdate(final String action) < final Intent intent = new Intent(action); sendBroadcast(intent); >private void broadcastUpdate(final String action, final BluetoothGattCharacteristic characteristic) < final Intent intent = new Intent(action); // Это специальная обработка для пульсометра // Извлечение данных осуществляется согласно спецификации профиля if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) < int flag = characteristic.getProperties(); int format = -1; if ((flag & 0x01) != 0) < format = BluetoothGattCharacteristic.FORMAT_UINT16; Log.d(TAG, "Heart rate format UINT16."); >else < format = BluetoothGattCharacteristic.FORMAT_UINT8; Log.d(TAG, "Heart rate format UINT8."); >final int heartRate = characteristic.getIntValue(format, 1); Log.d(TAG, String.format("Received heart rate: %d", heartRate)); intent.putExtra(EXTRA_DATA, String.valueOf(heartRate)); > else < // For all other profiles, writes the data formatted in HEX. final byte[] data = characteristic.getValue(); if (data != null && data.length >0) < final StringBuilder stringBuilder = new StringBuilder(data.length); for(byte byteChar : data) stringBuilder.append(String.format("%02X ", byteChar)); intent.putExtra(EXTRA_DATA, new String(data) + "\n" + stringBuilder.toString()); >> sendBroadcast(intent); > 

Ещё в DeviceControlActivity, эти события обрабатываются в BroadcastReceiver:

 // Обрабатывает различные события, запущенные службы // ACTION_GATT_CONNECTED: подключение к серверу GATT // ACTION_GATT_DISCONNECTED: отключён от сервера GATT // ACTION_GATT_SERVICES_DISCOVERED: обнаружена услуга GATT // ACTION_DATA_AVAILABLE: получил данные от устройства. Это может быть // результатом чтения или операцией уведомления private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() < @Override public void onReceive(Context context, Intent intent) < final String action = intent.getAction(); if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) < mConnected = true; updateConnectionState(R.string.connected); invalidateOptionsMenu(); >else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) < mConnected = false; updateConnectionState(R.string.disconnected); invalidateOptionsMenu(); clearUI(); >else if (BluetoothLeService. ACTION_GATT_SERVICES_DISCOVERED.equals(action)) < // Показать в UI все поддерживаемые услуги и характеристики displayGattServices(mBluetoothLeService.getSupportedGattServices()); >else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) < displayData(intent.getStringExtra(BluetoothLeService.EXTRA_DATA)); >> >; 

Чтение BLE-атрибутов

Как только ваше Android-приложение подключается к GATT-серверу и обнаруживает услуги, оно может читать и писать атрибуты, где это поддерживается. Например, этот фрагмент перебирает услуги и характеристик сервера и отображает их в интерфейсе:

 public class DeviceControlActivity extends Activity < . // Демонстрирует, как перебрать поддерживаемые GATT-услуги/характеристики. // В этом примере мы заполняем структуру данных, которая привязана к ExpandableListView // в интерфейсе пользователя. private void displayGattServices(ListgattServices) < if (gattServices == null) return; String uuid = null; String unknownServiceString = getResources(). getString(R.string.unknown_service); String unknownCharaString = getResources(). getString(R.string.unknown_characteristic); ArrayList> gattServiceData = new ArrayList>(); ArrayList> gattCharacteristicData = new ArrayList>(); mGattCharacteristics = new ArrayList>(); // Перебирает доступные GATT-услуги for (BluetoothGattService gattService : gattServices) < HashMapcurrentServiceData = new HashMap(); uuid = gattService.getUuid().toString(); currentServiceData.put( LIST_NAME, SampleGattAttributes. lookup(uuid, unknownServiceString)); currentServiceData.put(LIST_UUID, uuid); gattServiceData.add(currentServiceData); ArrayList> gattCharacteristicGroupData = new ArrayList>(); List gattCharacteristics = gattService.getCharacteristics(); ArrayList charas = new ArrayList(); // Перебирает доступные GATT-характеристики for (BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) < charas.add(gattCharacteristic); HashMapcurrentCharaData = new HashMap(); uuid = gattCharacteristic.getUuid().toString(); currentCharaData.put( LIST_NAME, SampleGattAttributes.lookup(uuid, unknownCharaString)); currentCharaData.put(LIST_UUID, uuid); gattCharacteristicGroupData.add(currentCharaData); > mGattCharacteristics.add(charas); gattCharacteristicData.add(gattCharacteristicGroupData); > . >. > 

Получение GATT-уведомлений

Это общие для BLE-приложений запросы для получения уведомлений об изменении отдельных характеристик на устройстве. Этот фрагмент показывает, как настроить уведомление для какой-либо характеристики с помощью метода setCharacteristicNotification():

 private BluetoothGatt mBluetoothGatt; BluetoothGattCharacteristic characteristic; boolean enabled; . mBluetoothGatt.setCharacteristicNotification(characteristic, enabled); . BluetoothGattDescriptor descriptor = characteristic.getDescriptor( UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG)); descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); mBluetoothGatt.writeDescriptor(descriptor); Когда уведомления включены для характеристики, вызов onCharacteristicChanged() срабатывает, если характеристика была изменена на удаленном устройстве: @Override // Описание характеристики public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic)

Закрытие клиента приложения

Когда приложение завершено с помощью BLE-устройства, оно должно вызывать close(), чтобы система могла должным образом освобождать ресурсы:

 public void close() < if (mBluetoothGatt == null) < return; >mBluetoothGatt.close(); mBluetoothGatt = null; > 

BluetoothManager

Менеджер высокого уровня, используемый для получения экземпляра BluetoothAdapter и общего управления Bluetooth. Используйте getSystemService(java.lang.String) с BLUETOOTH_SERVICE чтобы создать BluetoothManager; после этого вызывайте getAdapter() для получения экземпляра BluetoothAdapter. Кроме того, можно просто вызвать BluetoothAdapter.getDefaultAdapter().

BluetoothAdapter getAdapter() [Добавлено в API 18] Получить стандартный Bluetooth-адаптер данного устройства. Возвращает: Стандартный Bluetooth-адаптер данного устройства. List getConnectedDevices (int profile) [Добавлено в API 18] Получить подключённые устройства указанного профиля. Возвращает набор устройств, которые находятся в состоянии STATE_CONNECTED. Это не относится к любой конфигурации приложения, но отображает состояние Bluetooth-подключения данного профиля. Это может использоваться в приложениях как строка состояния, которая просто хотела бы знать состояние Bluetooth. Требуется разрешение BLUETOOTH. Параметры: GATT или GATT_SERVER Возвращает: Список устройств. При ошибке список будет пуст. int getConnectionState (BluetoothDevice device, int profile) [Добавлено в API 18] Получить текущее состояние подключения профиля к удаленному устройству. Это не относится к любой конфигурации приложения, но отображает состояние Bluetooth-подключения данного профиля. Это может использоваться в приложениях как строка состояния, которая просто хотела бы знать состояние Bluetooth. Требуется разрешение BLUETOOTH. Параметры: Удалённое Bluetooth-устройство; GATT или GATT_SERVER. Возвращает: Состояние соединения профиля, одно из: STATE_CONNECTED, STATE_CONNECTING, STATE_DISCONNECTED, STATE_DISCONNECTING. List getDevicesMatchingConnectionStates (int profile, int[] states) [Добавлено в API 18] Получить список устройств, которые соответствуют любому из указанных состояний соединения. Если ни одно из устройств не соответствует ни одному из указанных состояний, будет возвращён пустой список. Это не относится к любой конфигурации приложения, но представляет состояние подключения локального адаптера Bluetooth для этого профиля. Это может использоваться в приложениях, как в строке состояния, который просто хотел бы знать состояние локального адаптера. Требуется разрешение BLUETOOTH. Параметры: GATT или GATT_SERVER; массив состояний: STATE_CONNECTED, STATE_CONNECTING, STATE_DISCONNECTED или STATE_DISCONNECTING. Возвращает: Список устройств. При ошибке список будет пуст. BluetoothGattServer openGattServer (Context context, BluetoothGattServerCallback callback) [Добавлено в API 18] Открывает GATT-сервер. Обратный вызов используется для получения результатов, такие как состояние подключения, а также результаты любых других серверных операций в рамках GATT. Метод возвращает экземпляр BluetoothGattServer. Вы можете использовать BluetoothGattServer для проведения операций на сервере в рамках GATT. Параметры: Контекст; обработчика обратных вызовов GATT-сервера, который будет получать асинхронные обратные вызовы. Возвращает: Экземпляр GATT-сервера.

BluetoothGatt

Открытый API для Bluetooth-профидля GATT.

Этот класс обеспечивает функциональность Bluetooth GATT для взаимодействия со смарт-устройствами.

Чтобы подключиться к удалённому периферийному устройству, создайте BluetoothGattCallback и вызовите метод connectGatt(Context, boolean, BluetoothGattCallback), чтобы получить экземпляр этого класса. Устройства, поддерживающие GATT, могут быть найдены с помощью обычного обнаружения Bluetooth-устройств или с помощью сканирования BLE.

Константы

int CONNECTION_PRIORITY_BALANCED (приоритет соединения: сбалансированный)
[Добавлено в API 21]
Обновление параметра соединения: использовать параметры подключения, рекомендованные Bluetooth SIG. Это параметр по-умолчанию, если обновление параметров соединения не требуется. Значение константы: 0 (0x00000000)

int CONNECTION_PRIORITY_HIGH (приоритет соединения: высокий)
[Добавлено в API 21]
Обновление параметра соединения: запрос высокого приоритета, низкой задержки подключения. Приложение должно запрашивать высокий приоритет соединения только для передачи больших объемов данных через BLE. Когда передача будет завершена, приложение должно запросить параметр CONNECTION_PRIORITY_BALANCED для снижения энергопотребления. Значение константы: 1 (0x00000001)

int CONNECTION_PRIORITY_LOW_POWER (приоритет соединения: низкая энергия) [Добавлено в API 21]
Обновление параметра соединения: запрос низкой мощности, снижения скорости передачи данных.
Значение константы: 2 (0x00000002)

int GATT_CONNECTION_CONGESTED
[Добавлено в API 21]
Соединение с удалённым устройством перегружено.
Значение константы: 143 (0x0000008f)

int GATT_FAILURE
[Добавлено в API 18]
Операция с GATT не удалась. Произошла неизвестная ошибка, отличная от указанных выше.
Значение константы: 257 (0x00000101)

int GATT_INSUFFICIENT_AUTHENTICATION
[Добавлено в API 18]
Неподходящая аутентификация для данной операции. Значение константы: 5 (0x00000005)

int GATT_INSUFFICIENT_ENCRYPTION
[Добавлено в API 18]
Неподходящее шифрование для данной операции.
Значение константы: 15 (0x0000000f)

int GATT_INVALID_ATTRIBUTE_LENGTH
[Добавлено в API 18]
Операция записи превышает максимальную длину атрибута.
Значение константы: 13 (0x0000000d)

int GATT_INVALID_OFFSET
[Добавлено в API 18]
Для операции чтения или записи было запрошено недопустимое смещение.
Значение константы: 7 (0x00000007)

int GATT_READ_NOT_PERMITTED
[Добавлено в API 18]
Операция чтения не разрешена.
Значение константы: 2 (0x00000002)

int GATT_REQUEST_NOT_SUPPORTED
[Добавлено в API 18]
Данный запрос не поддерживается.
Значение константы: 6 (0x00000006)

int GATT_SUCCESS
[Добавлено в API 18]
Операция успешно выполнена.
Значение константы: 0 (0x00000000)

int GATT_WRITE_NOT_PERMITTED
[Добавлено в API 18]
Операция записи не разрешена.
Значение константы: 3 (0x00000003)

Общедоступные методы

void abortReliableWrite (BluetoothDevice mDevice) [Добавлено в API 18] Внимание: Этот метод является устаревшим для API уровня 19. Используйте метод abortReliableWrite().

void abortReliableWrite () [Добавлено в API 19] Отменяет надежную транзакцию записи для данного устройства. Вызов этой функции приведет к отклонению всех находящихся в очереди операций записи характеристик для данного удалённого устройства. Требуется разрешение BLUETOOTH.

boolean beginReliableWrite () [Добавлено в API 18] Инициирует надежную транзакцию записи для данного удалённого устройства. После того, как надёжная транзакция записи была начата, все вызовы writeCharacteristic(BluetoothGattCharacteristic) отправляются на удалённое устройство для проверки и выстраиваются в очередь на исполнение. Приложение получает результат в обратном вызове onCharacteristicWrite(BluetoothGatt, BluetoothGattCharacteristic, int) в ответ на каждый вызов writeCharacteristic(BluetoothGattCharacteristic). В этом обратном вызове производится проверка, было ли значение передано точно. После того, как все характеристики в очереди были проверены, executeReliableWrite() выполнит их запись. Если характеристика была записана неправильно, вызов abortReliableWrite() отменит текущую транзакцию без изменения каких-либо значений на удалённом устройстве. Требуется разрешение BLUETOOTH. Возвращает: true, если надёжная транзакция записи была начата.

void close () [Добавлено в API 18] Закрыть Bluetooth GATT-клиент. Приложение должно вызвать этот метод как можно раньше после того, как это делается с текущим GATT-клиентом.

boolean connect () [Добавлено в API 18] Этот метод используется, чтобы повторно подключиться к удалённому устройству после того, как соединение было разорвано. Если устройство не находится в доступном диапазоне, повторное подключение будет произведено, как только устройство окажется доступно. Возвращает: true, если попытка подключения была успешно инициирована.

void disconnect () [Добавлено в API 18] Разрывает установленное соединение или отменяет попытку подключения, происходящую в настоящее время. Требуется разрешение BLUETOOTH.

boolean discoverServices () [Добавлено в API 18] Обнаруживает услуги на удалённом устройстве, а также их характеристики и дескрипторы. Это асинхронная операция. После завершения обнаружения услуг, срабатывает обратный вызов onServicesDiscovered(BluetoothGatt, int). Если обнаружение прошло успешно, удалённые услуги можно получить с помощью функции getServices(). Требуется разрешение BLUETOOTH. Возвращает: true, если обнаружение удалённых услуг было начато.

boolean executeReliableWrite () [Добавлено в API 18] Выполняет надежные транзакции записи для данного удалённого устройства. Эта функция позволяет фиксировать все характеристики, находящиеся в очереди операций записи для указанного удалённого устройства. Обратный вызов onReliableWriteCompleted(BluetoothGatt, int) срабатывает чтобы определить, правильно ли была выполнена операция. Требуется разрешение BLUETOOTH. Возвращает: true, если запрос на выполнение операции был отправлен.

List getConnectedDevices () [Добавлено в API 18] Не поддерживается. Пожалуйста, используйте BluetoothManager.getConnectedDevices(int) с BluetoothProfile.GATT в качестве аргумента. Возвращает: Список устройств. Список будет пустым при ошибке. Исключения: UnsupportedOperationException

int getConnectionState (BluetoothDevice device) [Добавлено в API 18] Не поддерживается. Пожалуйста, используйте BluetoothManager.getConnectionState (BluetoothDevice device, int profile). Параметры: Удалённое Bluetooth-устройство Возвращает: Состояние соединеня; одно из: STATE_CONNECTED, STATE_CONNECTING, STATE_DISCONNECTED, STATE_DISCONNECTING Исключения: UnsupportedOperationException

BluetoothDevice getDevice () [Добавлено в API 18] Возвращает удалённое устройство целевого GATT-склиента.

List getDevicesMatchingConnectionStates (int[] states) [Добавлено в API 18] Не поддерживается. Пожалуйста, используйте BluetoothManager.getDevicesMatchingConnectionStates (int profile, int[] states) с BluetoothProfile.GATT в качестве первого аргумента. Параметры: Массив состояний; одно из: STATE_CONNECTED, STATE_CONNECTING, STATE_DISCONNECTED, STATE_DISCONNECTING. Возвращает: Список устройств. Список будет пустым при ошибке. Исключения: UnsupportedOperationException

BluetoothGattService getService (UUID uuid) [Добавлено в API 18] Возвращает BluetoothGattService, если запрашиваемый идентификатор uuid поддерживается на удалённом устройстве. Эта функция требует, чтобы обнаружение услуг было выполнено для данного устройства. Если существует несколько экземпляров одной услуги (с таким же UUID), возвращается первый экземпляр службы. Требуется разрешение BLUETOOTH. Параметры: UUID запрашиваемой услуги. Возвращает: BluetoothGattService, если поддерживается, или NULL, если запрашиваемая услуга не предоставляется удаленным устройством.

List getServices () [Добавлено в API 18] Возвращает список GATT-услуг, предлагаемых удаленным устройством. Эта функция требует, чтобы обнаружение услуг было выполнено для данного устройства. Требуется разрешение BLUETOOTH. Возвращает: Список услуг удалённого устройства. Пустой список, если обнаружение услуг ещё не было выполнено.

boolean readCharacteristic (BluetoothGattCharacteristic characteristic) [Добавлено в API 18] Запрос на чтение характеристики с удалённого устройства. Это асинхронная операция. Результат операции чтения получает обратный вызов onCharacteristicRead(BluetoothGatt, BluetoothGattCharacteristic, int). Требуется разрешение BLUETOOTH. Параметры: Характеристика для чтения с удалённого устройства. Возвращает: true, если операция чтения была начата успешно.

boolean readDescriptor (BluetoothGattDescriptor descriptor) [Добавлено в API 18] Считывает значение дескриптора удалённого устройства. Как только операция чтения завершена, срабатывает обратный вызов onDescriptorRead(BluetoothGatt, BluetoothGattDescriptor, int), сигнализируя о результате операции. Требуется разрешение BLUETOOTH. Параметры: Дескриптор для чтения с удалённого устройства. Возвращает: true, если операция чтения была начата успешно.

boolean readRemoteRssi () [Добавлено в API 18] Считать RSSI подключённого удалённого устройства. (RSSI – это показатель уровня принимаемого сигнала). Обратный вызов onReadRemoteRssi(BluetoothGatt, int, int) срабатывает, когда значение RSSI было прочитано. Требуется разрешение BLUETOOTH. Возвращает: true, если операция чтения была начата успешно.

boolean requestConnectionPriority (int connectionPriority) [Добавлено в API 21] Запросить обновление параметра соединения. Эта функция отправит запрос на обновление параметра подключения к удалённому устройству. Параметры: Запрашиваемый статус соединения, один из: CONNECTION_PRIORITY_BALANCED, CONNECTION_PRIORITY_HIGH, CONNECTION_PRIORITY_LOW_POWER. Исключения: IllegalArgumentException, если параметры находятся за пределами указанного диапазона.

boolean requestMtu (int mtu) [Добавлено в API 21] Запросить размер MTU, используемого для данного подключения. (MTU – это размер одного неделимого блока данных, передаваемого в текущей сети за одну итерацию). При выполнении запроса на запись (запись без ответа), отправленные данные будут усечены до размера MTU. Эта функция может использоваться, чтобы запросить больший размер MTU, чтобы иметь возможность отправлять больше данных одновременно. Обратный вызов onMtuChanged(BluetoothGatt, int, int) будет указывать, прошла ли эта операция успешно. Требуется разрешение BLUETOOTH. Возвращает: true, если новое значение MTU было запрошено успешно.

boolean setCharacteristicNotification (BluetoothGattCharacteristic characteristic, boolean enable) [Добавлено в API 18] Включить или отключить уведомления/индикацию для данной характеристики. После включения уведомлений для характеристики, обратный вызов onCharacteristicChanged(BluetoothGatt, BluetoothGattCharacteristic) будет срабатывать, если удалённое устройство сообщит, что характеристика изменилась. Требуется разрешение BLUETOOTH. Параметры: Характеристика, для которой необходимо включить уведомления; true, если нужно включить уведомления. Возвращает: true, если запрашиваемое уведомление о был установлен успешно.

boolean writeCharacteristic (BluetoothGattCharacteristic characteristic) [Добавлено в API 18] Записывает указанную характеристику и её значение на удалённое связанное устройство. После того, как операция записи будет завершена, сработает обратный вызов onCharacteristicWrite(BluetoothGatt, BluetoothGattCharacteristic, int) с результатом операции. Требуется разрешение BLUETOOTH. Параметры: Характеристика для записи на удалённом устройстве. Возвращает: true, если операция записи была начата успешно.

boolean writeDescriptor (BluetoothGattDescriptor descriptor) [Добавлено в API 18] Записывает значение дескриптора на соединённое устройство. Обратный вызов onDescriptorWrite(BluetoothGatt, BluetoothGattDescriptor, int) срабатывает чтобы сообщить о результате операции. Требуется разрешение BLUETOOTH. Параметры: Дескрипотр для записи на удалённом устройстве. Возвращает: true, если операция записи была начата успешно.

BluetoothGattCallback

void onCharacteristicChanged (BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) [Добавлено в API 18] Обратный вызов инициируется в результате получения уведомления от удалённой характеристики. Параметры: GATT-клиент; характеристика, обновлённая в результате удалённого уведомления.

void onCharacteristicRead (BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) [Добавлено в API 18] Обратный вызов, сообщающий результат чтения удалённой характеристики. Параметры: GATT-клиент, вызвавший readCharacteristic; характеристика, чьё значение было прочитано; статус: GATT_SUCCESS, если операция чтения была успено завершена.

void onCharacteristicWrite (BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) [Добавлено в API 18] Обратный вызов с указанием результата операции записи характеристики. Если этот обратный вызов срабатывает в то время, как надёжная транзакция записи находится в процессе, то значение характеристики представляет собой значение, указанное удалённым устройством. Прикладная программа должна сравнить эту величину с требуемым значением для записи. Если значения не совпадают, то приложение должно прервать транзакцию надежной записи. Параметры: GATT-клиент, вызвавший writeCharacheristic; записываемая характеристика; статус: GATT_SUCCESS, если операция записи была проведена успешно.

void onConnectionStateChange (BluetoothGatt gatt, int status, int newState) [Добавлено в API 18] Обратный вызов, срабатывающий при подключении к удалённому GATT-серверу или отключении от него. Параметры: GATT-клиент, вызвавший подключение/отключение; статус: GATT_SUCCESS, если операция подключения/отключения прошла успешно; новое состояние соединения: STATE_CONNECTED или STATE_DICONNECTED.

void onDescriptorRead (BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) [Добавлено в API 18] Обратный вызов, сообщающий о результате операции прочтения дескриптора. Параметры: GATT-клиент, вызвавший readDescriptor; дескриптор, прочитанный на удалённом устройстве; статус: GATT_SUCCESS, если операция записи была проведена успешно.

void onDescriptorWrite (BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) [Добавлено в API 18] Обратный вызов, сообщающий о результате операции записи дескриптора.

Параметры: GATT-клиент, вызвавший readDescriptor; дескриптор, прочитанный на удалённом устройстве; статус: GATT_SUCCESS, если операция записи была проведена успешно.

void onMtuChanged (BluetoothGatt gatt, int mtu, int status) [Добавлено в API 21] Обратный вызов, сообщающий об изменении MTU для данного соединения. Этот обратный вызов срабатывает в ответ на функцию requestMtu(int) или в ответ на событие соединения. Параметры: GATT-клиент, вызвавший requestMtu; новый размер MTU; статус: GATT_SUCCESS, если операция записи была проведена успешно.

void onReadRemoteRssi (BluetoothGatt gatt, int rssi, int status) [Добавлено в API 18] Обратный вызов, сообщающий RSSI для данного соединения. Этот обратный вызов срабатывает при вызове readRemoteRssi(). Параметры: GATT-клиент, вызвавший readRemoteRssi(); значение RSSI удалённого устройства; статус: GATT_SUCCESS, если операция записи была проведена успешно.

void onReliableWriteCompleted (BluetoothGatt gatt, int status) [Добавлено в API 18] Обратный вызов, срабатывающий при завершении транзакции надёжной записи. Параметры: GATT-клиент, вызвавший executeReliableWrite(); статус: GATT_SUCCESS, если операция записи была проведена успешно.

void onServicesDiscovered (BluetoothGatt gatt, int status) [Добавлено в API 18] Обратный вызов, срабатывающий когда список удалённых услуг, характеристик и дескрипторов удалённого устройства был обновлён, т.е. были обнаружены новые услуги. Параметры: GATT-клиент, вызвавший discoverServices(); статус: GATT_SUCCESS, если операция записи была проведена успешно.

HackWare.ru

Этичный хакинг и тестирование на проникновение, информационная безопасность

Что такое Bluetooth Low Energy (BLE) и как его взламывают

Чтобы вы не ушли пока читаете скучную теорию — в этой статье я буду взламывать свою зубную щётку…

Bluetooth, как мы знаем, является одной из самых популярных и широко используемых беспроводных технологий в современном мире. В связи с быстрым ростом IoT, ускоряющим развитие технологии Bluetooth, Специальная группа по интересам Bluetooth (Bluetooth Special Interest Group (SIG)) предпринимает постоянные усилия по увеличению скорости передачи с максимальным акцентом на маяки, развлечения, сферу здравоохранения и фитнес.

Примечание: IoT — «Интернет вещей», термин относится к совокупности разнообразных устройств, обычно более простых, чем персональный компьютер, которые подключены к Интернету.

Bluetooth Low Energy (BLE) является частью спецификации Bluetooth 4.0, которая также включает протоколы классического Bluetooth и протокол высокоскоростного Bluetooth (Classic Bluetooth and Bluetooth High Speed Protocols). По сравнению с классическим Bluetooth, BLE предназначен для использования меньшей мощности при сохранении аналогичного диапазона связи. BLE — это технология, которая всегда отключена и передаёт только короткие объёмы данных, когда это необходимо. Это значительно снижает энергопотребление, что делает его идеальным для использования в случаях, когда требуется постоянное долговременное соединение с низкой скоростью передачи данных. BLE идеально подходит для пульта дистанционного управления телевизором, но не для беспроводного устройства потоковой передачи мультимедиа, которому для передачи требуется большой объем данных.

Bluetooth Low Energy встроен во многие гаджеты, которые мы используем сегодня. От смартфонов, умных телевизоров, передовых технологий, таких как медицинское оборудование, до базовых устройств, таких как наши кофемашины, — все используют BLE.

Изначально Nokia разработала BLE для собственного проекта под названием «WIBREE», который впоследствии был передан Bluetooth SIG. BLE был задуман с акцентом на лучшую скорость сопряжения и энергоэффективность.

Что выделяет BLE?

  • Обеспечивает многоплатформенную связь: может легко общаться через большое количество устройств, работающих на Android, iOS, Linux, Windows Phone, Windows 8 и OS X
  • Лучшая скорость сопряжения
  • Помогает поддерживать связь в течение более длительных периодов времени
  • Значительно ниже затраты на внедрение
  • Энергоэффективный

На бумаге BLE выглядит хорошо, а как на практике?

Это хороший вопрос с точки зрения безопасности. Дело в том, что BLE — это просто протокол. Изготовители должны безопасно внедрить BLE в своё устройство. Известно, что даже самый сильный криптографический протокол не будет работать, если генератор случайных чисел не является «достаточно случайным». То же самое относится и к BLE. Таким образом, можно сказать, что безопасность BLE лежит в руках его исполнителей.

В то время как все устройства Bluetooth с низким энергопотреблением были разработаны с основной целью улучшения взаимодействия с пользователем, безопасность заняла последнее место во время процесса?

Давайте посмотрим на три основные уязвимости, которым BLE могут подвергать своих пользователей:

  1. Подслушивание: как следует из названия, подслушивание относится к стороннему устройству, прослушивающему данные, которыми обмениваются два сопряжённых устройства. Соединение между двумя сопряжёнными устройствами означает цепочку доверия. Цепь разрывается при удалении одного из устройств. Злоумышленник может использовать номер устройства для доступа к другим Bluetooth-устройствам. Даже если ключи шифрования/расшифровки должны были быть удалены, атакующий может офлайн брутфорсить ПИН, используя Bluetooth Sniffer (на основе идентификатора устройства). Как только PIN-код будет получен, устройство может быть легко взломано.
  2. Атаки «человек посередине» (MITM). Атаки «человек посередине» включают стороннее устройство, имитирующее законное устройство, обманывая два легитимных устройства, заставляя их поверить в то, что они связаны друг с другом, когда на самом деле законные устройства подключены к имитатору (посреднику). Этот тип атаки позволяет злоумышленнику/имитатору получить доступ ко всем данным, которыми обмениваются устройства, а также манипулировать данными, удаляя или изменяя их, прежде чем они достигнут соответствующего устройства.
  3. Отказ в обслуживании и Fuzzing атака. Поскольку большинство беспроводных устройств в наши дни работают на встроенных аккумуляторных батареях, эти устройства подвержены риску атак типа «отказ в обслуживании» (DoS). DoS-атаки подвергают систему частым сбоям, приводящим к полному истощению её батареи. Fuzzing атаки также приводят к сбою систем, поскольку злоумышленник может отправлять искажённые или нестандартные данные на радиомодуль устройства Bluetooth и проверять его реакцию, что в конечном итоге может сбить с толку устройство.

Итак, резюмируя, по своей задумке BLE это упрощённая версия Bluetooth, которая всегда не меняет каналы (частоты), что облегчает сниффинг и атаку человек-посередине. BLE не имеет встроенного протокола обеспечения безопасности. Реализация безопасности BLE возложена на производителей конечных устройств, которые не всегда подходят к этому добросовестно. По этой причине многие BLE устройства можно легко обнаружить практически в любое время их работы. При этом зачастую они не содержат каких-либо механизмов для ограничения чтения и даже записи на них, то есть открыты для подключения и модификации кому угодно.

Основные понятия в BLE

В BLE есть два основных понятия.

  • GAP — Generic Access Profile (общий профиль доступа)
  • GATT — Generic Attribute Protocol (протокол общих атрибутов)

Общий профиль доступа (GAP)

Он ответственен за подключение и распространения информации о наличии устройства BLE. GAP отвечает за видимость устройства во внешнем мире, а также играет важную роль в определении того, как устройство взаимодействует с другими устройствами.

Следующие две концепции являются неотъемлемой частью GAP:

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

Центральные устройства: в основном это мобильные телефоны или гаджеты с увеличенной памятью и вычислительной мощностью.

Advertising process (обеспечение видимости устройства)

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

Периферийное устройство будет отправлять «рекламные» данные каждые 2 секунды. Если центральное устройство готово прослушать рекламные пакеты, оно ответит запросом сканирования. В ответ на этот запрос периферийное устройство отправит данные ответа сканирования. Таким образом, центральное и периферийное устройства узнают друг о друге и связывается друг с другом.

Протокол общих атрибутов (GATT)

Используя общий протокол данных, известный как протокол атрибутов, GATT определяет, как два устройства BLE обмениваются данными друг с другом, используя понятия — сервис (service) и характеристика (characteristic). Этот протокол сохраняет все сервисы и характеристики в справочной таблице с использованием 16-битных идентификаторов, как указано в Bluetooth SIG. Важно отметить, что GATT инициируется только после того, как Advertising процесс, регулируемый GAP, завершён.

Две основные концепции, которые образуют GATT

  • Сервисы (service)
  • Характеристики (characteristic)

Сервисы

Сервисы можно представить просто как шкаф, в котором может быть много ящиков, которые в свою очередь называются характеристиками. Сервис может иметь много характеристик. Каждый сервис уникален сам по себе с универсально уникальным идентификатором (UUID), который может быть размером 16 бит для официальных адаптированных сервисов или 128 бит для пользовательских сервисов.

Характеристики

Характеристики являются наиболее фундаментальным понятием в рамках транзакции GATT. Характеристики содержат одну точку данных и схожи с сервисами, каждая характеристика имеет уникальный идентификатор или UUID, который отличается от другой характеристики.

Вот спецификации SIG для характеристик и сервисов для устройств BLE. Любое устройство BLE, которое официально приняло UUID от SIG, должно использовать идентификатор, указанный ими в своих приложениях.

Например, официальный UUID мощности передачи (TX power) в соответствии с мандатом SIG равен 0x1804.

Чтобы было наглядно, посмотрите на этот пример сервисов и характеристик конкретного устройства:

В нём «Generic Access (1800)» — это 16-битный сервис. Внутри этого сервиса, следующие 16-битные характеристики:

Device Name (2a00) Appearance (2a01) Peripheral Privacy Flag (2a02) Reconnection Address (2a03) Peripheral Preferred Connection Parameters (2a04)

Ещё один 16-битный сервис это «Generic Attribute (1801)», он содержит только одну 16-битную характеристику: Service Changed (2a05).

Далее идут три 128-битные сервиса, первый из них «a0f0fff050474d5382084f72616c2d42», содержит четыре 128-битных характеристики:

a0f0fff150474d5382084f72616c2d42 a0f0fff250474d5382084f72616c2d42 a0f0fff350474d5382084f72616c2d42 a0f0fff450474d5382084f72616c2d42

Имеется проблема в идентификации сервисов и характеристик. Для 16-битных сервисов и характеристик всё просто, ссылки на их значения даны выше. Что касается 128-битных сервисов и характеристик, то они у каждого производителя могут быть свои. То есть нужно приложит некоторые усилия, чтобы, к примеру, сопоставить что-то вроде d0611e78-bbb4-4591-a5f8-487910ae4366 с чем-то вроде Apple Continuity Service. Для сопоставления можно использовать как минимум два подхода:

  • анализ приложения для управления устройством (многие устройства имеют программы под Android)
  • фаззинг — ввод различных данных и наблюдение за устройством, что в нём поменялось

Как взломать Bluetooth Low Energy

Суть процесса взлома Bluetooth Low Energy можно описать следующими стадиями:

  1. Обнаружение устройства
  2. Считывание его сервисов и характеристик
  3. Обнаружение среди характеристик те, которые можно перезаписать
  4. Определение, за что отвечают характеристики
  5. Изменить значения характеристик

Четвёртый этап является творческим и самым сложным. Иногда роль характеристик можно найти в документации разработчиков для данного устройства. Иногда приходится перебирать значения и смотреть, что поменялось в устройстве. Самый сложный вариант — это обратная инженерия перехваченного Bluetooth трафика или приложения для управление устройством.

Я покажу пример изменения BLE параметров на устройстве с помощью bettercap.

sudo bettercap

Вводим команду для включения модуля по обнаружению BLE устройств:

ble.recon on

При обнаружении новых устройств и при потере видимости устройств будут выводиться примерно следующие сообщения:

192.168.1.0/24 > 192.168.1.53 » [06:46:17] [ble.device.lost] BLE device Oral-B Toothbrush C8:DF:84:1A:9F:26 (Texas Instruments) lost. 192.168.1.0/24 > 192.168.1.53 » [06:49:29] [ble.device.new] new BLE device JBL Flip 3 detected as B8:D5:0B:E2:21:88 (Sunitec Enterprise Co.,Ltd) -77 dBm. 192.168.1.0/24 > 192.168.1.53 » [06:50:02] [ble.device.lost] BLE device JBL Flip 3 B8:D5:0B:E2:21:88 (Sunitec Enterprise Co.,Ltd) lost. 192.168.1.0/24 > 192.168.1.53 » [06:50:35] [ble.device.new] new BLE device detected as 7C:F1:1F:E7:B1:C1 (Apple, Inc.) -82 dBm. 192.168.1.0/24 > 192.168.1.53 » [06:51:07] [ble.device.lost] BLE device 7C:F1:1F:E7:B1:C1 (Apple, Inc.) lost. 192.168.1.0/24 > 192.168.1.53 » [06:57:55] [ble.device.new] new BLE device Oral-B Toothbrush detected as C8:DF:84:1A:9F:26 (Texas Instruments) -64 dBm.

Чтобы вывести устройства, которые в данный момент в пределах досягаемости, выполните команду:

ble.show

Для показа характеристик конкретного устройства, запустите команду следующего вида, где вместо MAC укажите MAC-адрес устройства:

ble.enum MAC

К примеру, меня интересует устройство C8:DF:84:1A:9F:26:

ble.enum C8:DF:84:1A:9F:26

В столбце Properties вы увидите свойства данной характеристики, они могут быть:

  • READ (чтение)
  • WRITE (запись) — то есть возможно изменение данной характеристики
  • NOTIFY (уведомление)
  • INDICATE (индикатор)

В колонке Data присутствует текущее значение характеристики, либо дополнительная информация, например:

insufficient authentication (недостаточная аутентификация)

Для записи данных HEX_DATA в BLE устройство с указанным MAC адресом, в характеристику с идентификатором UUID:

ble.write MAC UUID HEX_DATA
ble.write C8:DF:84:1A:9F:26 a0f0ff2350474d5382084f72616c2d42 11

Чтобы знать, что именно записывать, нужно понимать, за что отвечают характеристики. Вот пример значений для моего устройства — это электрическая зубная щётка Oral-B Genius 9000 (кстати, рекомендую). Значение характеристик я нашёл в Интернете.

Сервис a0f0fff050474d5382084f72616c2d42 a0f0fff150474d5382084f72616c2d42 (Command) — команда свойства read, write, notify значение 00 | '' a0f0fff250474d5382084f72616c2d42 (Data) — данные свойства read, write значение 00000000 | '' a0f0fff350474d5382084f72616c2d42 (Auth) — аудентификация свойства read, write значение 00 | '' a0f0fff450474d5382084f72616c2d42 (Secret) — пароль свойства read, write значение 00000000 | '' Сервис a0f0ff0050474d5382084f72616c2d42 a0f0ff0150474d5382084f72616c2d42 (Handle ID) — идентификатор щётки свойства read значение 00000000 | '' a0f0ff0250474d5382084f72616c2d42 (Handle Type) — тип щётки свойства read значение 01 | '' a0f0ff0350474d5382084f72616c2d42 (User Account) — аккаунт пользователя свойства read значение 01 | '' a0f0ff0450474d5382084f72616c2d42 (Device State) — состояние устройства свойства read, notify значение 0200 | '' a0f0ff0550474d5382084f72616c2d42 (Battery Level) — уровень батареи свойства read, notify значение 34 | '4' a0f0ff0650474d5382084f72616c2d42 (Button State) — состояние кнопки свойства read, notify значение 00000000 | '' a0f0ff0750474d5382084f72616c2d42 (Brushing Mode) — решим чистки свойства read, notify значение 01 | '' a0f0ff0850474d5382084f72616c2d42 (Brushing Time) — время чистки свойства read, notify значение 0000 | '' a0f0ff0950474d5382084f72616c2d42 (Quadrant) — сектор очистки свойства read, notify значение 00 | '' a0f0ff0a50474d5382084f72616c2d42 (Smiley) свойства read, notify значение 00 | '' a0f0ff0b50474d5382084f72616c2d42 (Pressure Sensor) — сенсор давления свойства read, notify значение 00 | '' a0f0ff0c50474d5382084f72616c2d42 (Cache) — кэш свойства read, write, notify значение | '' Сервис a0f0ff2050474d5382084f72616c2d42 a0f0ff2150474d5382084f72616c2d42 (Status) — статус свойства read, write, notify значение 8200 | '' a0f0ff2250474d5382084f72616c2d42 (RTC) свойства read, write значение 8d15ac21 | ' a0f0ff2350474d5382084f72616c2d42 (Timezone) — временная зона свойства read, write значение a7 | ''' a0f0ff2450474d5382084f72616c2d42 (Brushing Timer) — таймер чистки свойства read, write значение 0f | '' a0f0ff2550474d5382084f72616c2d42 (Brushing Modes) — режимы чистки свойства read, write значение 0105020403060000 | '' a0f0ff2650474d5382084f72616c2d42 (Quadrant Times) — время зон чистки свойства read, write значение 1e001e001e001e000000000000000000 | '' a0f0ff2750474d5382084f72616c2d42 (Tongue Time) — время для чистки языка свойства read, write значение 00 | '' a0f0ff2850474d5382084f72616c2d42 (Pressure) — давление свойства read, write значение 03 | '' a0f0ff2950474d5382084f72616c2d42 (Data) — данные свойства read значение 4ef1a721800002010000046478801d00 | 'Nq'!dx' a0f0ff2a50474d5382084f72616c2d42 (Flight Mode) — режим полёта свойства read, write значение 00 | ''

Исследование и взлом Bluetooth Low Energy (BLE) с телефона

Поскольку на всех современных телефонах имеется Bluetooth, то вы можете использовать приложения для работы с Bluetooth Low Energy (BLE) окружающих устройств на телефоне.

Пример такого приложения — nRF Connect — бесплатная программа программа для Android, которая умеет сканировать для поиска BLE устройств, подключаться к ним и менять значение характеристик. Программа поддерживает макросы и другие продвинутые функции.

Просмотр сервисов устройства:

Просмотр свойств характеристик:

Редактирование значений характеристик:

Работа с Bluetooth Low Energy (BLE) в Linux

Конечно, в Linux можно работать с устройствами, поддерживающими BLE, напрямую, без таких программ как Bettercap.

К сожалению, этот аспект довольно запутанный. В Debian и производных программы для работы с Bluetooth Low Energy собраны в пакете bluez. В Arch Linux и производных, пакет bluez также имеется, но утилиты, которые нас интересуют, помещены в пакет bluez-utils. Но не это самая большая проблема.

После очередного обновления утилит bluez, авторы вдруг признали многие важные программы «устаревшими», а именно устаревшими объявлены:

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

Была составлена такая таблица замены:

Устаревший инструмент Самая подходящая замена
gatttool btgatt-client, D-Bus Gatt API
hciattach btattach
hciconfig btmgmt (и bluetoothctl?)
hcidump btmon (и btsnoop)
hcitool отсутствует, доступно в D-Bus Device API
rfcomm отсутствует, реализовано в D-Bus Profile1 API?
ciptool
sdptool отсутствует, кажется, что функциональность разбросана по разным объектам D-Bus: Profile, Advertising, и массивы UUIDs в device и adapter.

Слова «отсутствует» не вселяют уверенности. По этой причине для Debian и производных этот пакет компилируется с ключом —enable-deprecated, а на Arch Linux в дополнении к пакету bluez-utils, доступному в стандартных репозиториях, в AUR имеется пакет bluez-utils-compat, в котором тоже включены устаревшие инструменты.

В относительно свежих инструкциях, для взаимодействия с Bluetooth Low Energy используются утилиты:

Поскольку они устарели и однажды всё-таки будут удалены окончательно, рассмотрим несколько простых вариантов использования их замен для поиска BLE устройств и получения с них данных.

Если запустить программу btmgmt:

sudo btmgmt

И в ней выполнить команду:

find

То она выведет список обнаруженных устройств:

Будут выведены как BLE, так и обычные Bluetooth устройства.

sudo bluetoothctl

Также умеет искать BLE устройства, если ввести:

scan on

С помощью команды connect можно подключиться к устройству, для этого нужно указать его MAC-адрес:

connect C8:DF:84:1A:9F:26

Информация по устройству:

info C8:DF:84:1A:9F:26

Если перейти в меню GATT:

menu gatt

То можно получить список характеристик:

list-attributes C8:DF:84:1A:9F:26

А также перезаписать характеристики устройства.

Для получения информации по отдельным характеристикам:

attribute-info 00002a05-0000-1000-8000-00805f9b34fb attribute-info a0f0ff03-5047-4d53-8208-4f72616c2d42

Ещё одна программа, которая выведет сразу все характеристики устройства — btgatt-client. Например, выполним подключение и посмотрим характеристики устройства с MAC C8:DF:84:1A:9F:26:

sudo btgatt-client -d C8:DF:84:1A:9F:26

В дополнении к рассмотренным программам, в отдельной консоли можно запустить Bluetooth monitor:

sudo btmon

Как и полагается программе-монитору, она будет выводить множество информации о происходящем с Bluetooth и об обнаруженных устройствах.

Заключение

Системные утилиты Linux для работы с Bluetooth заслуживают более внимательного изучения — с их помощью можно узнать более подробную информацию о своей системе и сделать тонкую настройку Bluetooth адаптера.

Также с помощью них можно реализовать сканеры BLE и Bluetooth устройств и/или написать или приспособить фаззеры для исследования назначения характеристик BLE устройств. Поэтому вполне возможно, что в одной из следующих статей будут более подробно рассмотрены программы для работы с BLE.

Смотрите также

Список источников

  • https://blog.attify.com/the-practical-guide-to-hacking-bluetooth-low-energy/ ( http://archive.fo/zfJwZ#selection-1419.0-1419.8 )
  • https://www.evilsocket.net/2017/09/23/This-is-not-a-post-about-BLE-introducing-BLEAH/
  • http://archive.fo/r776M
  • https://wiki.archlinux.org/index.php/Bluetooth#Troubleshooting
  • https://bbs.archlinux.org/viewtopic.php?id=223884
  • https://www.esp-forum.de/index.php/forum/hacking-und-tear-down/101-oral-b-zahnbuerste-auslesen-bluetooth-4-1-low-ene

Связанные статьи:

  • Новая версия bettercap 2.x: как установить и использовать в Kali Linux (100%)
  • Автоматический захват рукопожатий и PMKID от всех точек доступа (100%)
  • WiFite: программа для реализации комплексных (WPA / WPA2, WEP, WPS) автоматизированных атак на Wi-Fi в Kali Linux (58.9%)
  • Автоматизированный взлом Wi-FI WEP с Besside-ng и Wesside-ng (58.9%)
  • Взлом WPS с Reaver (58.9%)
  • Инструкция по использованию Bettercap (RANDOM — 46%)

факультете информационной безопасности от GeekBrains? Комплексная годовая программа практического обучения с охватом всех основных тем, а также с дополнительными курсами в подарок. По итогам обучения выдаётся свидетельство установленного образца и сертификат. По этой ссылке специальная скидка на любые факультеты и курсы!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *