Когда я пытаюсь подключиться и отключиться от периферийного устройства BLE несколько раз подряд (с задержкой в несколько секунд между ними), мое приложение падает. При ближайшем рассмотрении это связано с тем, что служба Bluetooth устройства разбилась. Вот соответствующие строки журнала из logcat:
2022-03-21 12:54:08.591 2161-2210/? E/bt_hci: Ctlr H/w error event - code:0x21
2022-03-21 12:54:08.591 2161-2210/? I/bt_stack: [INFO: .cc(323)] clear_l2cap_whitelist: Clearing whitelist from l2cap channel. conn_handle=512 cid=4:4
2022-03-21 12:54:08.591 2161-2210/? W/bt_stack: [WARNING:bta_gattc_act.cc(1043)] bta_gattc_conn_cback: cif=3 connected=0 conn_id=0x0003 reason=0x0003
2022-03-21 12:54:08.591 2161-2210/? W/bt_stack: [WARNING:bta_gattc_act.cc(1043)] bta_gattc_conn_cback: cif=4 connected=0 conn_id=0x0004 reason=0x0003
2022-03-21 12:54:08.591 2161-2210/? W/bt_stack: [WARNING:bta_gattc_act.cc(1043)] bta_gattc_conn_cback: cif=5 connected=0 conn_id=0x0005 reason=0x0003
2022-03-21 12:54:08.591 2161-2210/? W/bt_stack: [WARNING:bta_gattc_act.cc(1043)] bta_gattc_conn_cback: cif=6 connected=0 conn_id=0x0006 reason=0x0003
2022-03-21 12:54:08.592 2161-2210/? W/bt_stack: [WARNING:bta_gattc_act.cc(1043)] bta_gattc_conn_cback: cif=7 connected=0 conn_id=0x0007 reason=0x0003
2022-03-21 12:54:08.592 2161-2210/? W/bt_stack: [WARNING:bta_gattc_act.cc(1043)] bta_gattc_conn_cback: cif=8 connected=0 conn_id=0x0008 reason=0x0003
2022-03-21 12:54:08.593 2161-2743/? I/bt_stack: [INFO:message_loop_thread.cc(175)] Run: message loop starting for thread bt_module_lifecycle_thread
2022-03-21 12:54:08.593 2161-2743/? I/bt_core_module: module_start_up Starting module "controller_module"
2022-03-21 12:54:08.593 2161-2190/? E/bt_btif: Received H/W Error.
2022-03-21 12:54:08.596 2161-2190/? I/bt_stack: [INFO:btif_config.cc(647)] hash_file: Disabled for multi-user
2022-03-21 12:54:08.597 2161-2190/? I/bt_stack: [INFO:btif_config.cc(689)] write_checksum_file: Disabled for multi-user, since config changed removing checksums.
2022-03-21 12:54:08.598 2161-2743/? I/bt_log_fw_log_switch: Start: skip to enable legacy FW log feature
2022-03-21 12:54:08.599 2161-2210/? I/bt_stack: [INFO:btu_hcif.cc(1160)] read_encryption_key_size_complete_after_encryption_change: disconnecting, status: 0x02
2022-03-21 12:54:08.615 2161-2743/? I/bt_core_module: module_start_up Started module "controller_module"
2022-03-21 12:54:08.615 2161-2743/? I/bt_stack: [INFO:message_loop_thread.cc(196)] Run: message loop finished for thread bt_module_lifecycle_thread
2022-03-21 12:54:08.615 2161-2209/? W/bt_btm: btm_decode_ext_features_page: feature page 1 ignored
2022-03-21 12:54:08.616 2161-2209/? W/bt_btm: btm_decode_ext_features_page: feature page 2 ignored
2022-03-21 12:54:08.616 2161-2209/? I/bt_stack: [INFO:message_loop_thread.cc(87)] ShutDown: thread bt_module_lifecycle_thread(-1) is already stopped
2022-03-21 12:54:08.730 395-6284/? E/[email protected]: BluetoothDeathRecipient::serviceDied - Bluetooth service died
Это происходит только на двух устройствах, которые я тестировал (оба на Android 10). Например, это не происходит на устройстве Samsung Android 11.
Перезапустив службу Bluetooth после нескольких циклов подключения/отключения, я не смог снова столкнуться с этой проблемой. Однако этот обходной путь не подходит для использования клиентами, поскольку они потеряют соединение с другими устройствами BT, которые они используют в настоящее время.
Мой вопрос заключается в том, как продолжить понимание основной причины этой проблемы? Это полностью аппаратная проблема устройства, с которой я ничего не могу поделать? Или есть что-то, что можно изменить в моем подходе?
Если стек Bluetooth дает сбой в телефоне, то, скорее всего, это ошибка в стеке Bluetooth, с которой вы ничего не можете сделать, кроме как отправить отчет об ошибке производителю телефона.
Однако вы можете попытаться выяснить, при каких обстоятельствах это происходит, и выполнить обходной путь, чтобы избежать этого. Журнал hci snoop в сочетании с logcat может помочь.
В любом случае, если вы правильно запрограммируете свое приложение, оно не должно падать само по себе только из-за сбоя стека Bluetooth. Вы сможете восстановиться после перезапуска стека Bluetooth. См. Как обнаружить изменение состояния Bluetooth с помощью широковещательного приемника?, как вы можете получать уведомления об изменениях состояния Bluetooth.
Это то, что я ожидал. Я буду обрабатывать сбой стека Bluetooth в самом приложении. Спасибо за ответ.