- Русские Блоги
- Включение Bluetooth в bluedroid (на основе кода Android)
- BlueZ vs Bluedroid bluetooth stack
- Русские Блоги
- Android BlueDroid (1) (2) (3)
- Android BlueDroid (1): обзор BlueDroid
- Android BlueDroid (2): инициализация процесса запуска BlueDroid Bluetooth
- B2G/Bluetooth-bluedroid
- Contents
- Switch Bluetooth stack bewteen bluez/bluedroid
- b2g bluedroid branch
- Enable bluedroid on flame (JB-based)
- How does GeckoBluetooth choose to use bluez or bluedroid?
- Bluetooth interfaces
- GeckoBluetooth for bluedroid
- Some notes about gonk-jb bluedroid stack:
- Debugging:
- Log level
- Log tool
- Customize bluedroid stack
- Gecko support
- Porting
Русские Блоги
Включение Bluetooth в bluedroid (на основе кода Android)
Диапазон Bluetooth от уровня приложения до стека протоколов слишком велик. Легко потеряться, просто взглянув на код. Начнем с журнала.
01-18 18: 25: 31.570 D / BluetoothAdapterService (21885): onCreate () // адаптер адаптера запускается
01-18 18:25:31.570 I/BluetoothVendorJni(21885): classInitNative: succeeds
01-18 18:25:31.570 D/BluetoothAdapterState(21885): make() — Creating AdapterState
01-18 18:25:31.580 I/BluetoothAdapterState(21885): Entering OffState
01-18 18: 25: 31.580 I / bt_btif (21885): инициализация и вызов инициализации
01-18 18:25:31.580 D/bt_osi_allocation_tracker(21885): canary initialized
01-18 18:25:31.590 I/bt_osi_thread(21885): run_thread: thread id 21915, thread name stack_manager started
В файле AdapterService сначала вызывается метод classInitNative, определение которого содержится в файле JNI и определяется следующим образом:
Этот метод определит некоторые функции обратного вызова и инициализирует интерфейс sBluetoothInterface. Метод get_bluetooth_interface возвращает интерфейс метода, определенного в стеке протокола. Методы в стеке протокола следующие:
Вызовет метод init в протоколе.
Поток stack_manager создается в init, а затем используется метод thread_post для передачи функции обработки event_init_stack в поток stack_manager. Эта функция в основном используется для инициализации стека протоколов. В функции создаются функции btif_init_bluetooth, btif_init_bluetooth и функция обработки передается в этот поток. Это run_message_loop.
На этом этапе инициализация стека протоколов Bluetooth завершена, и процесс включения описан ниже.
01-18 18:25:31.760 I/bt_btif (21885): enable: start restricted = 0
01-18 18:25:31.760 I/bt_stack_manager(21885): event_start_up_stack is bringing up the stack
Метод enable передает функцию обработки event_start_up_stack в поток stack_manager, и поток bt_workqueue будет создан в функции event_start_up_stack. Метод обработки в этом потоке: btu_task_start_up
01-18 18:25:31.870 I/bt_osi_thread(21885): run_thread: thread id 21934, thread name bt_workqueue started
В методе btu_task_start_up инициализируются BTU, BTM, L2CAP, SDP, создается поток btu message_loop и функция обработки, передаваемая потоку
Функция btu_message_loop_run, эта функция отправляет сообщение о завершении инициализации в поток JNI.
Источник
BlueZ vs Bluedroid bluetooth stack
У BlueZ много документов и всего. И из того же, я понял, что BlueZ поддерживает поддержку A2DP. И в то же время устройство Android может быть сделано как приемник A2DP, изменив файл audio.conf внутри того же самого.
Я также узнал, что с android 4.2 и далее пакет BlueZ был заменен стеком Bluedroid от Broadcom. Я много искал о стеке Bluedroid. Но я не мог найти много деталей об этом.
Надеюсь, кто-то может помочь мне со следующими сомнениями.
1). Поддерживает ли Bluedroid поддержку приемника A2DP?
2). Будет ли файл audio.conf доступен для устройств, имеющих стек bluedroid?
3). Я собираюсь написать поддержку A2DP-приемника для устройства Android, напрямую вызвав API-интерфейс BlueZ-стека. Но мой последний вопрос заключается в том, можно ли использовать его также с стеклом Bluedroid? Надежда Bluedroid – это просто расширение BlueZ.
Bluedroid – это стек, предоставляемый Broadcom и теперь с открытым исходным кодом в Android. Bluedroid не имеет отношения к bluez в любом отношении, он имеет несколько преимуществ по сравнению с bluez (я отличаюсь этим).
[1]. В настоящее время у Bluedroid нет поддержки s2dp-приемника, так как в коде, доступном исходном коде, доступна только поддержка источника a2dp
[2]. Файл Audio.conf предназначен для стека bluez, он не является частью bluedroid
[3]. Прямо называя Bluez API – я думаю, вы будете использовать вызовы dbus, но bluedroid не поддерживает вызовы методов dbus, у него есть механизм обратного вызова, поэтому он не будет работать, bluedroid не является расширением bluez.
Роль A2DP Sink теперь поддерживается в Android Lollipop (5.0). Они модифицировали исходный код Bluedroid для поддержки того же. Чтобы полностью его поддерживать, вам необходимо изменить аудио HAL (audio.h), AudioPolicyManagerBase.cpp и audio_policy.conf, а также Audio Manager, A2DPStateMachine и т. Д.
Как сказал user987500, приемник A2DP поддерживается в android L, только незначительные изменения, вы можете изменить устройство с A2DP src, чтобы потопить его. Но убедитесь, что для одного устройства может поддерживаться только одна роль, которую можно настроить из XML-файла.
Добавляя к вышеуказанным ответам, поскольку Android L, поддержка приемника вводится, но все же часть аудиопотока кода не завершена. Тем не менее, я нашел этот список изменений, в котором реализована реализация раковины a2dp, и медиа можно воспроизводить через приемное устройство, как указано в сообщении фиксации списка изменений:
Источник
Русские Блоги
Android BlueDroid (1) (2) (3)
Спасибо первому автору за предоставленный доступ, перепечатка предназначена только для удобства
Android BlueDroid (1): обзор BlueDroid
1. Пояснение к термину: (добавляется полезная информация . )
BTI F: Bluetooth Interface
BTU : Bluetooth Upper Layer
BTM: Bluetooth Manager
BTE :Bluetooth embedded system
BTA :Blueetooth application layer
CO: call out\CI: call in
HF : Handsfree Profile
HH: HID Host Profile
HL: Health Device Profile
AV:audio\vidio
ag: audio gateway
ar: audio/video registration
gattc: GATT client
BLE:
Два.BlueDroid && BlueZ
До Android 4.2 компания Google использовала официальный стек протоколов Bluetooth для Linux BlueZ. BlueZ — это фактически проект с открытым исходным кодом, выпущенный Qualcomm на основе соглашения GPL в мае 2001 года в качестве официального стека протоколов Bluetooth ядра Linux 2.4.6. С ростом популярности устройств Android BlueZ также был значительно улучшен и расширен. Например, версия BlueZ в Android 4.1 обновлена до 4.93, которая поддерживает базовую спецификацию Bluetooth 4.0 и реализует большинство профилей.
Начиная с Android 4.2, Google представил BlueDroid, который был разработан совместно с Broadcom, в исходный код Android, чтобы заменить BlueZ. Qualcomm, основатель BlueZ, также удалит BlueZ из своего эталонного дизайна Android на базе чипа и поддержит BlueDroid.
По сравнению с BlueZ наиболее похвальной частью BlueDroid является то, что его структура фрейма стала более лаконичной и ясной. Это также является хорошим преимуществом для наших инженеров: ясная и лаконичная структура делает наше мышление в процессе отладки более ясным;
1. Структурная схема фреймворка BlueDroid в Android 4.2: (Официально предоставлена Google).
(1) Приложение вызывает функцию Bluetooth системы через API в пакете android.bluetooth.
(2) Приложение под названием Bluetooth было добавлено в пространство уровня приложения. Он существует как основной процесс bluetooth системы. Он будет использовать JNI для вызова уровня Bluetooth HAL для выполнения различных запросов Bluetooth.
(3) Bluetooth HAL также является новым модулем Android 4.2, который состоит из уровня аппаратной абстракции спецификации ядра Bluetooth и уровня абстракции аппаратного обеспечения спецификации приложения Bluetooth. Благодаря изолирующему эффекту уровня HAL, верхний код можно легко трансплантировать на различные платформы микросхем.
(4) В качестве ядра всей службы Bluetooth модуль стека Bluetooth состоит из двух частей: уровня приложения Bluetooth (сокращенно BTA) и встроенной системы Bluetooth (сокращенно BTE). BTA реализует управление устройствами Bluetooth, управление статусом и некоторые спецификации приложений. BTE взаимодействует с чипом Bluetooth производителя через HCI для реализации общих функций и связанных протоколов стека протоколов Bluetooth. Кроме того, BTE также включает унифицированный интерфейс ядра (GKI), производители микросхем Bluetooth могут использовать GKI для быстрой и простой трансплантации стека протоколов Bluetooth в другие операционные системы или платформы мобильных телефонов.
(5), Vendor Extensions (расширения поставщика): разработчики могут добавлять собственные расширения для реализации модулей и компонентов, зависящих от поставщика.
(6), общая архитектура стека протоколов bluedroid:
Архитектура всей системы очень проста, потому что большинство вещей выполняется на уровне Bluedroid, а верхний уровень относится только к вызову и обратному вызову. В этой части мы проанализируем код позже для подробного анализа.
2. Архитектура кода BlueZ
Подобно Bluedroid, BlueZ также следует стандартному процессу приложения, но единственное различие между ними — DBUS BlueZ. Удаление DBUS из blueDroid делает структуру кода более понятной и гладкой. На следующем рисунке показана архитектура кода Bluetooth (официально предоставлена Google):
3、BlueDrod PK BlueZ
Хотя BlueDroid имеет тенденцию заменять BlueZ, его поддержка спецификаций приложения Bluetooth еще не завершена. Например, BlueDroid поддерживает только AVRCP 1.0, но не последнюю версию AVRCP 1.5. Таким образом, если некоторые отечественные производители микросхем или мобильных телефонов смогут завершить трансплантацию модулей, связанных с BlueZ, в BlueDroid как можно скорее, считается, что это поможет им занять лидирующие позиции во все более конкурентном мобильном мире. Кроме того, как пионер зрелой технологии беспроводной связи с низким энергопотреблением, Bluetooth в будущем будет играть все более важную роль в области носимых устройств.
Android BlueDroid (2): инициализация процесса запуска BlueDroid Bluetooth
1. Обзор процесса активации Bluetooth, как показано на следующем рисунке: init, enable
Как и общий вызов функции, верхний уровень Android передает APP -> Native -> JNI -> bluetoothinterface -> bluetooth HCIinterface. Соответствующие функции init, set_power и preload реализованы в интерфейсе HCI.
Основные функции, реализуемые функциями init и enable:
(1), создайте: btif_task / BTIF_TASK
(2), инициализировать BTE
(3), создайте: btu_task / BTU_TASK
(4) Инициализировать HCI, связанный с последовательным портом, запустить основной поток HCI: bt_hc_callback, питание чипа, инициализация параметров RF, настройки, связанные с именем адреса Bluetooth;
(5) Создайте: bt_hc_worker_thread Рабочий основной поток Bluetooth, отправьте и получите команды;
(6), инициализировать стек протокола Bluetooth;
Во-вторых, реализация функции initNative
Эта часть в основном запускает соответствующий sock, инициализирует стек протоколов, запускает btif_task, а также отслеживает и обрабатывает сообщения о состоянии, относящиеся к интерфейсу Bluetooth. Процесс реализации следующий.
1. Прикладная часть вызова функции (начиная с adatper)
packages\apps\Bluetooth\src\com\android\bluetooth\btservice\ AdapterService.java
public void onCreate() <
if (DBG) debugLog(«onCreate»);
mBinder = new AdapterServiceBinder(this);
mAdapterProperties = new AdapterProperties(this);
mAdapterStateMachine = AdapterState.make(this, mAdapterProperties);
mJniCallbacks = new JniCallbacks(mAdapterStateMachine, mAdapterProperties);
initNative (); // Вызов функции initNative;
mCallbacks = new RemoteCallbackList ();
//Load the name and address
private native boolean initNative();
2. Реализация функции JNI, эта часть такая же, как и другие реализации JNI.
packages\apps\Bluetooth\jni\com_android_bluetooth_btservice_AdapterService.cpp
static JNINativeMethod sMethods[] = <
/* name, signature, funcPtr */
packages\apps\Bluetooth\jni\com_android_bluetooth_btservice_AdapterService.cpp
Конкретная реализация функции initNative реализуется путем вызова функции init в C через структуру bt_interface_t. В то же время передайте структуру функции обратного вызова sBluetoothCallbacks. Эта структура функции более важна, и основные изменения состояния реализуются через функции в этой структуре функции обратного вызова.
static const bt_interface_t *sBluetoothInterface = NULL;
static bool initNative(JNIEnv* env, jobject obj) <
sJniCallbacksObj = env->NewGlobalRef(env->GetObjectField(obj, sJniCallbacksField));
int ret = sBluetoothInterface-> init (& sBluetoothCallbacks); // Вызов соответствующей интерфейсной функции на C
ALOGE(«Error while setting the callbacks \n»);
if ( (sBluetoothSocketInterface = (btsock_interface_t *)
Источник
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:
Источник