Android bluedroid что это такое

Русские Блоги

Подробное объяснение разработки Android Bluetooth BLE

Подробное объяснение разработки Android Bluetooth BLE

Поскольку в начале года я занялся проектом Bluetooth BLE, я начал изучать Bluetooth. После долгого времени медленного обучения (слишком медленного, чтобы учиться слишком поздно) я наконец-то научился писать Bluetooth BLE. Поделитесь этим.

1. Понимание Bluetooth BLE

1. Что такое БЛЕ

Для начала давайте разберемся, что такое Bluetooth BLE.
Полное название BLE — Bluetooth Low Energy, что означает Bluetooth Low Energy и поддерживает устройства с API18 (Android 4.3) и выше.
Он отличается низкой стоимостью, коротким расстоянием и совместимостью.
Используйте протокол GATT для связи между устройствами BLE.

2. Преимущества BLE

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

3. Что в устройстве BLE

Затем давайте посмотрим, что находится внутри устройства Bluetooth.

Терминал BLE может содержать несколько сервисов

Сервис может содержать несколько характеристик (функций)

Характеристика содержит значение и несколько дескрипторов (дескрипторов), дескриптор содержит значение.

Среди них следует отметить, что у каждого Сервиса и Признака будет UUID, который является уникальным значением, и мы будем использовать его для следующей передачи данных. Каждая характеристика имеет значение, и мы взаимодействуем с устройством, изменяя это значение.

Небольшое резюме

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

Generic Attribute Profile (GATT)
Через соединение BLE общая спецификация профиля для чтения и записи небольших данных класса атрибутов. Теперь все профили приложений BLE основаны на GATT.

Attribute Protocol (ATT)
GATT основан на протоколе ATT. ATT провел специальную оптимизацию для устройств BLE, особенно используя как можно меньше данных во время передачи. Каждый атрибут имеет уникальный UUID, и атрибут будет передаваться в виде характеристик и услуг.

Characteristic
Характеристика может пониматься как тип данных, который включает в себя значение и 0 для нескольких описаний вторичных значений (дескриптор).
Описание характеристики дескриптора, например диапазон, единица измерения и т. д.

Service
Коллекция характеристик. Например, услуга, называемая «Монитор сердечного ритма», может содержать несколько характеристик, которые могут содержать характеристику, называемую «измерение сердечного ритма».

Читайте также:  2gis для android 4pda

Во-вторых, начните писать код

1. Открытые разрешения

Как и в обычном Bluetooth, нам также необходимо включить разрешения для BLE

В системах выше 6.0 нам нужно добавить разрешение на определение местоположения, в противном случае поиск устройства невозможно

В дополнение к Bluetooth-разрешениям, если вам нужна функция BLE, вам также нужно объявить use-feature:

Если значение «true» соответствует времени, приложение может быть установлено и запущено только на устройствах Android, которые поддерживают BLE, если «false» — «false», устройства Android могут устанавливаться и работать нормально. Необходимо определить, поддерживает ли устройство функцию BLE во время выполнения кода:

2. Получить BluetoothAdapter

Инициализируйте адаптер Bluetooth, получите справочный адаптер Bluetooth через менеджер Bluetooth

3. Определите, поддерживается ли Bluetooth, и предложите пользователю включить Bluetooth.

4. Предложите пользователю разрешить разрешение местоположения

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

Наша конечная цель — дать пользователям согласие на получение разрешений на местоположение. Конечно, есть много способов добиться этого, даже проще.

5. Поиск оборудования

Что ж, после долгого процесса мы пришли к поиску устройств.
Вызовите метод startLeScan () BluetoothAdapter, чтобы начать поиск. Этот метод должен передать параметр BluetoothAdapter.LeScanCallback. Найденные устройства Bluetooth вернутся через этот обратный вызов.
Примечание для установки времени поиска и прекращения поиска по истечении этого времени.

Соответствующий BluetoothAdapter.LeScanCallback выглядит следующим образом

6. Зарегистрируйтесь для трансляции

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

Зарегистрируйте трансляцию в методе onResume (). MGattUpdateReceiver используется для обработки полученной трансляции, которая является состоянием соединения.

7. Понимание BluetoothGatt

Перед реальным подключением нам нужно понять класс BluetoothGatt.
Класс BluetoothGatt является наиболее используемым и самым важным.
Основными методами этого класса являются следующие методы

connect (): подключиться к удаленному устройству.
DiscoverServices (): поиск служб, поддерживаемых подключенным устройством.
disconnect (): отключить соединение GATT с удаленным устройством.
close (): закрыть клиент GATT.
readCharacteristic (характеристика): считывание указанной характеристики.
setCharacteristicNotification (характеристика, включена): установка отправки уведомления при изменении указанного значения характеристики.
getServices (): получите службы, поддерживаемые удаленным устройством.

8. Подключить

При подключении мы можем подключиться, выполнив поиск по MAC-адресу.

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

9. Государственная обработка

Мы можем выполнить различные интерфейсы обновления и операции с данными здесь.

10. Управление устройствами

Прежде чем манипулировать, давайте посмотрим на то, что мы получили?
Посредством обхода мы можем получить Сервис и Характеристику, каждая Характеристика имеет уникальный uuid и соответствующие атрибуты, такие как читаемые, доступные для записи и напоминания.
Мобильный телефон для управления устройством BLE должен изменить значение в разделе «Характеристика» через записываемую характеристику и отправить характеристику устройству. После того, как устройство получит сигнал, оно может выполнить соответствующую операцию.

BluetoothGatt
Мы можем рассматривать его как конвейер для установления связи между телефоном Android и терминальным устройством BLE. Только с этим конвейером у нас может быть предпосылка связи.

BluetoothGattService
Служба устройства Bluetooth, здесь мы сравниваем BluetoothGattService с классом. Устройство Bluetooth сравнивают со школой. В школе может быть много классов, что означает, что каждое оконечное устройство BLE имеет несколько услуг, и классы (каждая услуга) различаются по UUID (уникальный идентификатор).

Читайте также:  Супер марио денди для андроида

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

Теперь, когда мы получили доступную для записи характеристику, мы знаем ее uuid.
В соответствующем интерфейсе управления мы можем использовать этот uuid для получения характеристики и вызвать mBluetoothGatt.writeCharacteristic (характеристику) для отправки данных.

Метод write () фактически устанавливает значение характеристики

3. Резюме

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

Прежде всего, мы должны оценить, поддерживает ли мобильный телефон BLE, и получить различные разрешения, чтобы наши последующие программы могли работать нормально.
Затем мы ищем устройство BLE и получаем его MAC-адрес.
Во-вторых, мы используем этот MAC-адрес для соединения. После того, как соединение установлено, мы переходим к получению UUID характеристики.
Когда нам нужно отправить данные, найдите характеристику с помощью этого uuid, установите ее значение и, наконец, отправьте данные с помощью метода writeCharacteristic (характеристика).
Если мы хотим узнать расстояние между мобильным телефоном и устройством BLE, мы можем получить значение rssi с помощью readRemoteRssi (), и расстояние можно преобразовать с помощью этого уровня сигнала.
Пока мы подключены, мы можем использовать различные методы BluetoothGatt для чтения данных и других операций.

Четыре, GitHub

Это недавний проект, который я написал об использовании BLE, и данные передачи были записаны.
https://github.com/Charon1997/BleCar

V. Вывод

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

Источник

B2G/Bluetooth-bluedroid

Contents

Switch Bluetooth stack bewteen bluez/bluedroid

For version JB 4.2, if you want to use bluez on JB, you need to modify some files. See [Bug 911038][1]

b2g bluedroid branch

Enable bluedroid on flame (JB-based)

  • Apply https://github.com/shuangMoz/b2g-manifest/commit/3d8d97a5d89366fd51a75755e4f8d045b41617fa into your .repo/manfiest.xml, this can make your gecko build choose to build bluedroid based
  • Apply patch replace-bluez-flame-gecko.patch and ./build.sh gecko && ./flash.sh gecko

Gecko bluetotoh will run bluedroid now.

How does GeckoBluetooth choose to use bluez or bluedroid?

In configure.in, it checks whether folder path external/bluetooth/bluez or external/bluetooth/bluedroid exists.

Bluetooth interfaces

  • bt_interface_t
    • Bluedroid implemented as bluetoothInterface in external/bluetooth/bluedroid/btif/src/bluetooth.c: System control BT adapter.
    • See: external/bluetooth/bluedroid/btif/src/bluetooth.c
    • You need to use |get_bluetooth_interface()| to access all avaiable GAP profile functions.
  • btav_interface_t
    • Bluedroid implemented as bt_av_interface in external/bluetooth/bluedroid/btif/src/btif_av.c: System control A2DP service
    • audio_hw_device and audio_stream_out: Bluedroid implemented in external/bluetooth/bluedroid/audio_a2dp_hw/audio_a2dp_hw.c: AudioFlinger uses A2DP client as audio output device.
    • tHCI_IF: Bluedroid implemented as hci_h4_func_table in external/bluetooth/bluedroid/hci/src/hci_h4.c: Bluedroid HCI interface (data/cmd/evt in/out)
    • bt_hc_interface_t: Bluedroid defined, Bluedroid implemented as bluetoothHCLibInterface in external/bluetooth/bluedroid/hci/src/bt_hci_bdroid.c:
Читайте также:  Как стать администратором андроида

Wrapper of tHCI_IF, has bt_hc_worker_thread to serialize downcoming HCI commands and read upcoming data/evt from HCI device.

  • HFP, A2DP profile interfaces, you need to call |get_profile_interface()| to access profile interfaces.

See |hardware/libhardware/include/hardware| header files

GeckoBluetooth for bluedroid

  • GAP: dom/bluetooth/bluedroid/gonk/BluetoothServiceBluedroid.cpp
  • HFP/A2DP/OPP Profiles under: dom/bluetooth/bluedroid

See also bluedroid metabug for more information Bug 876583 [2]

Some notes about gonk-jb bluedroid stack:

What do we care about?
HAL API all exposed in hardware/libhardware/include/hardware/, bluetooth.h defines all BluetoothAdapter needed. In general bluedroid apis are callback instead of dbus style programming.

GAP profile: external/bluetooth/bluedroid/btif/src/btif_dm.c

Important data structures: bt_property_t.

For «device found» callback, possible properties from device_found are:
properties[1]. type = BT_PROPERTY_BDNAME
properties[2]. type = BT_PROPERTY_BDADDR
properties[4]. type = BT_PROPERTY_CLASS_OF_DEVICE
properties[5]. type = BT_PROPERTY_TYPE_OF_DEVICE
properties[11]. type = BT_PROPERTY_REMOTE_RSSI

Adapter property maps to: sBluetoothInterface->get_adapter_property((bt_property_type_t) type) adapter_properties_callback

For adapter/remote device properties type, check btif/src/btif_storage.c, function cfg2prop.

Bluetooth Socket interface. bluedroid only provides two API, connect and listen. To receive connected or disconnected, you have to read connection signal. connection signal format as:

Debugging:

In /system/etc/bluetooth/bt_stack.conf defined logging level and logger output.

In /system/etc/bluetooth/bt_stack.conf defined
logging level, this effected what we saw in logcat
You can use Wireshark or frontline viewer to open it.

Log level

Another way to enable external runtime parse tool such as hcidump is to enable BTSNOOP_EXT_PARSER_INCLUDED. See hci/include/bt_hci_bdroid.h, by default the debugging port is port 4330.

Log tool

Grab offline tool from [3]

  • togglelog.sh: Enable/Disable bluedroid log
  • openlog.sh: Download bluedroid log and use wireshark to check

Customize bluedroid stack

There is one bdroid_buildcfg.h file under device/vendor_name/device_name/bluetooth. This header file is for override configuration during build time. For example, BTM_DEF_LOCAL_NAME is for changing local adapter name.

Gecko support

See configure.in, it is to check whether folder external/bluetooth/bluez or external/bluetooth/bluedroid exists.

Porting

Nexus 4 Porting: Make sure qct libbt-vendor had been compiled so you will see libbt-vendor.so in the device.
Path is /system/vendor/lib/libbt-vendor.so libbt-vendor source code is in: hardware/qcom/bt/libbt-vendor You need to make sure the following .so files are in Nexus 4.
/system/lib/libbt-hci.so, libbt-utils.so
/system/lib/hw/audio.a2dp.default.so, bluetooth.default.so
/system/vendor/lib/libbt-vendor.so
To build bluedroid library for your device with b2g project, please add a config like this: https://github.com/shuangMoz/device-mako/commit/58a9889b70f1c21b52386af8800d0e525cd4947c

For bcm chipset, source code in device/common/libbt (Vendor specific folder) which generates libbt-vendors.so.

device/common/libbt/include/vnd_machinename.txt , defines UART port and firmware patchram location.

For Qct chipsets, power on Bluetooth chipset still depends on «/sytem/etc/init.qcom.bt.sh». See hardware/qcom/bt/libbt-vendor/src/hardware.c , function hw_config(). You need to also make sure /sytem/etc/init.qcom.bt.sh can be executed. bluedroid config path:
/etc/bluetooth/bt_stack.conf
/etc/bluetooth/bt_did.conf
/etc/bluetooth/auto_pair_devlist.conf
bluedroid storage path:
All path stores in:
/data/misc/bluedroid
/data/misc/bluedroid/bt_config.xml
The format of bt_config.xml
Sample:

What remote_device_properties_callback returns records such as:

Источник

Оцените статью