Android 4.3 Bluetooth Energi Rendah tidak stabil

189

Saat ini saya sedang mengembangkan aplikasi yang akan menggunakan Bluetooth Low Energy (pengujian pada Nexus 4). Setelah memulai dengan API BLE resmi di Android 4.3, saya perhatikan bahwa setelah saya menghubungkan perangkat untuk pertama kalinya, saya jarang dapat berhasil terhubung ke / berkomunikasi dengan perangkat itu atau perangkat lain lagi.

Mengikuti panduan di sini , saya dapat berhasil terhubung ke perangkat, memindai layanan dan karakteristik, dan membaca / menulis / menerima pemberitahuan tanpa masalah. Namun, setelah memutuskan dan menghubungkan kembali, saya sering tidak dapat memindai layanan / karakteristik atau tidak dapat menyelesaikan membaca / menulis. Saya tidak dapat menemukan apa pun di log untuk menunjukkan mengapa ini terjadi.

Setelah ini terjadi, saya harus menghapus aplikasi, menonaktifkan Bluetooth, dan me-restart telepon sebelum mulai berfungsi lagi.

Setiap kali perangkat terputus saya pastikan untuk memanggil tutup () pada objek BluetoothGatt dan mengaturnya ke nol. Ada wawasan?


EDIT:
Log dumps: Untuk log-log ini saya me-root-kan ponsel saya dan menaikkan level jejak dari item-item terkait di /etc/bluetooth/bt_stack.conf

Koneksi yang sukses - Upaya pertama setelah me-reboot ponsel dan menginstal aplikasi. Saya dapat terhubung, menemukan semua layanan / karakteristik, dan membaca / menulis.

Upaya Gagal 1 - Ini adalah upaya berikutnya setelah memutuskan sambungan dari koneksi yang berhasil di atas. Tampaknya saya dapat menemukan karakteristik, tetapi upaya pertama untuk membaca mengembalikan nilai nol dan segera terputus setelahnya.

Upaya Gagal 2 - Contoh di mana saya bahkan tidak dapat menemukan layanan / karakteristik.


EDIT 2:
Perangkat yang saya coba sambungkan didasarkan pada chip CC2541 TI. Saya memperoleh TI SensorTag (juga didasarkan pada CC2541) untuk bermain-main dan menemukan bahwa TI merilis aplikasi android untuk SensorTag kemarin. Namun, aplikasi ini memiliki masalah yang sama. Saya menguji ini pada dua Nexus 4 lainnya dengan hasil yang sama: Koneksi ke SensorTag berhasil pertama kali atau kedua, tetapi (menurut log) gagal menemukan layanan setelahnya, menyebabkan semua jenis crash. Saya mulai bertanya-tanya apakah ini masalah dengan chip khusus ini?

sa.shadow
sumber
Silakan kirim log lengkap dari ponsel Anda dari boot-up sampai Anda menghadapi masalah.
AAnkit
3
Saya menggunakan Samsung Galaxy S4 dengan Google 4.3 Android edisi bocor diinstal; setelah beberapa kali terhubung / terputus, ketika saya menemukan layanan saya akan secara acak mendapatkan 129 (GATT_INTERNAL_ERROR) dan mendapatkan onConnectionStateChange dengan status 133 (GATT_ERROR), status = BluetoothProfile.DEVICE_DISCONNECTED.
reTs
1
Untuk sekali atau dua kali saya mendapat beberapa status 129 dan 133 panggilan balik dalam waktu singkat dan saya tidak pernah bisa menerima panggilan balik dalam BluetoothGattCallback sampai saya reboot perangkat saya (tetapi pemindaian baik-baik saja).
reTs
1
Lupa mengatakan bahwa saya menguji dengan sekitar sepuluh perangkat menggunakan chip TI (maaf saya tidak tahu model mereka) dan satu perangkat dengan chip Nordic. Perangkat dengan chip Nordic tidak pernah melaporkan kesalahan. (Namun tidak cukup untuk membuktikan masalahnya adalah spesifik TI)
reTs
1
Saya dapat mengkonfirmasikan bahwa masalah ini masih ada di Samsung Galaxy S5 (Kedua G900VVRU2BOG5 dan G900VVRU2BOA8 membangun versi). Jika saya menghapus data dari Pengaturan> Manajer Aplikasi >> Semua >> Bluetooth , itu berfungsi untuk sementara waktu.
IronBlossom

Jawaban:

184

Petunjuk implementasi penting

(Mungkin beberapa petunjuk itu tidak diperlukan lagi karena pembaruan OS Android.)

  1. Beberapa perangkat seperti Nexus 4 dengan Android 4.3 membutuhkan waktu 45+ detik untuk terhubung menggunakan instance gatt yang ada . Mengatasi masalah: Selalu tutup instance gatt pada disconnect dan buat instance gatt baru pada setiap koneksi.
  2. Jangan lupa menelepon android.bluetooth.BluetoothGatt#close()
  3. Mulai utas baru di dalam onLeScan(..) dan kemudian hubungkan. Alasan: BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)selalu gagal, jika dipanggil di LeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)dalam utas yang sama pada Samsung Galaxy S3 dengan Android 4.3 (setidaknya untuk build JSS15J.I9300XXUGMK6)
  4. Sebagian besar perangkat memfilter iklan
  5. Lebih baik tidak menggunakan android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback) dengan parameter untuk memfilter UUID layanan tertentu karena ini rusak sepenuhnya di Samsung Galaxy S3 dengan Android 4.3 dan tidak bekerja untuk UUID 128bit secara umum.
  6. Gatt selalu dapat memproses satu perintah pada suatu waktu . Jika beberapa perintah dipanggil singkat setelah yang lain, yang pertama dibatalkan karena sifat sinkron dari implementasi gatt.
  7. Saya sering melihat bahkan pada perangkat modern dengan Android 5, bahwa Wifi mengganggu bluetooth dan sebaliknya. Sebagai pilihan terakhir, matikan wifi untuk menstabilkan bluetooth.

Tutorial untuk pemula

Titik masuk yang cukup OK untuk pendatang baru bisa berupa video tutorial ini: Mengembangkan Aplikasi Bluetooth Cerdas untuk Android http://youtu.be/x1y4tEHDwk0

Masalah dan penyelesaian yang dijelaskan di bawah mungkin diperbaiki sekarang oleh pembaruan OS

Mengatasi: Saya bisa "menstabilkan" aplikasi saya melakukan itu ...

  1. Saya memberi pengguna pengaturan "Mulai ulang Bluetooth". Jika pengaturan itu diaktifkan, saya me-restart Bluetooth di beberapa titik yang menunjukkan awal tumpukan BLE menjadi tidak stabil. Misal, jika startScan mengembalikan false. Poin yang baik mungkin juga jika serviceDiscovery gagal. Saya hanya mematikan dan menghidupkan Bluetooth.
  2. Saya memberikan pengaturan lain "Matikan WiFi". Jika pengaturan itu diaktifkan, aplikasi saya mematikan Wifi saat aplikasi berjalan (dan menyalakannya kembali setelah itu)

Pekerjaan ini didasarkan pada pengalaman berikut ...

  • Memulai ulang Bluetooth membantu memperbaiki masalah dengan BLE dalam banyak kasus
  • Jika Anda mematikan Wifi, tumpukan BLE menjadi jauh lebih stabil. Namun, ini juga berfungsi dengan baik pada sebagian besar perangkat dengan wifi dihidupkan.
  • Jika Anda mematikan Wifi, memulai ulang Bluetooth sepenuhnya memulihkan tumpukan BLE tanpa perlu mem-boot ulang perangkat dalam banyak kasus.
Satu dunia
sumber
33
Google, Anda harus memperbaikinya sekarang. Pekerjaan ini (saya memang ditambah karena berhasil) adalah konyol.
Chris Herbert
4
Terkadang, penemuan layanan akan berhasil dengan status 0 (dengan asumsi tidak ada masalah), namun pembacaan karakteristik akan menghasilkan nilai NULL karena pada dasarnya tidak benar-benar terhubung atau karakteristik tidak ditemukan (saya melihat ini di log: 11-01 18:37: 32.131: WARN / BluetoothGatt (20119): Pengecualian tidak tertangani: java.lang.NullPointerException)
Lo-Tan
2
@ Lo-Tan Saya selalu memeriksa setelah penemuan layanan, apakah layanan yang saya harapkan sudah termasuk. Anda juga tidak pernah bisa yakin, jika penemuan layanan memberikan hasil apa pun. Terkadang saya tidak menerima panggilan balik. Jadi saya menerapkan batas waktu untuk penemuan layanan.
OneWorld
2
Pengalaman saya adalah: Samsung S3 (4.3) berhasil terhubung kembali setelah menutup klien Gatt seperti yang dijelaskan dalam paragraf 2 di atas; menggunakan Nexus 4 & 7 (4.4.2) Saya tidak dapat menyambung kembali setelah koneksi terputus, bahkan dengan memulai kembali adaptor BL, tetapi dapat dihubungkan kembali secara otomatis setelah 2 menit
Konstantin Konopko
1
Adakah yang bisa mengkonfirmasi apakah android.bluetooth.BluetoothGatt hanya dapat menangani satu operasi GATT yang tertunda PER PERANGKAT , PER PROSES , atau PERIODE (yaitu: di semua proses). Saya kira itu PER PERANGKAT, tetapi masalah ini sangat kacau sehingga tidak akan mengejutkan saya jika sebaliknya. Jika batasannya hanya PER PERANGKAT, maka OS / Perangkat yang mampu menangani beberapa operasi simultan adalah merokok gun proof bahwa masalah ini murni karena beberapa implementasi naif lemah dalam contoh BluetoothAdapter bahwa OS menyerahkan setiap proses (yang saya asumsikan adalah tunggal di semua proses).
swooby
18

Mematikan WIFI:

Saya dapat mengonfirmasi juga, bahwa mematikan WIFI membuat Bluetooth 4.0 lebih stabil terutama pada Google Nexus (Saya memiliki Nexus 7).

Masalah

adalah bahwa aplikasi saya berkembang membutuhkan baik WIFI dan berkesinambungan scanning Bluetooth LE . Jadi mematikan WIFI tidak ada pilihan bagi saya.

Terlebih lagi yang saya sadari adalah bahwa pemindaian LE Bluetooth terus - menerus sebenarnya dapat mematikan koneksi WIFI dan membuat adaptor WIFI tidak dapat terhubung kembali ke jaringan WIFI apa pun hingga pemindaian BLE AKTIF. (Saya tidak yakin tentang jaringan seluler dan internet seluler).
Ini pasti terjadi pada perangkat berikut:

  • Nexus 7
  • Motorola Moto G

Namun pemindaian BLE dengan WIFI aktif tampak cukup stabil pada:

  • Samsung S4
  • HTC One

Solusi saya

Saya memindai BLE dalam waktu singkat 3-4 detik kemudian saya mematikan pemindaian selama 3-4 detik . Kemudian nyala lagi.

  • Jelas saya selalu mematikan pemindaian BLE ketika saya terhubung ke perangkat BLE.
  • Ketika saya memutuskan koneksi dari perangkat saya memulai kembali BLE (hidupkan adaptor OFF dan kemudian ON) untuk mengatur ulang tumpukan sebelum mulai memindai lagi.
  • Saya juga mengatur ulang BLE ketika menemukan servicesatau characteristicsgagal.
  • Ketika saya mendapatkan data iklan dari perangkat yang harus disambungkan oleh aplikasi (misalkan 500 kali tanpa dapat terhubung - sekitar 5-10 detik iklan) saya mereset BLE lagi.
benka
sumber
Anda bilang saya me-restart BLE setelah perangkat terputus. Misalkan, Jika pengguna mentransfer file melalui koneksi bluetooth. Kemudian, Anda akan menyebabkan transfer bluetooth itu gagal kapan saja.
Rahul Rastogi
1
apa yang Anda maksud dengan "matikan adaptor lalu ON"?
Marian Paździoch
Saya setuju, Wifi dan Bluetooth bersama-sama membunuh kinerja aplikasi di Moto G.
Nigilan
@ MarianPaździoch, dengan "MATIKAN adaptor lalu ON" @ benka berarti BluetoothAdapter
Anup
9

Pastikan Nexus Anda dipasangkan dengan perangkat. Saya tidak dapat memverifikasi apakah komunikasi berfungsi dengan baik, tetapi Anda akan dapat terhubung lebih dari sekali tanpa reboot. Tampaknya koneksi pertama tidak memerlukan pemasangan tetapi semua upaya selanjutnya dilakukan.

Saya akan memperbarui jawaban ini dalam beberapa hari ketika saya menguji penemuan layanan dan gatt membaca dan menulis permintaan tanpa reboot.

EDIT: Ternyata saya sedang menguji pada versi firmware pengembangan (sensor kami) yang menyebabkan masalah jika tidak dipasangkan. Pembuatan firmware produksi terbaru kami berfungsi dengan baik pada 2540-an dan 2541-an.

EDIT: Saya memang memperhatikan bahwa pada Nexus 7 2013, koneksi lebih stabil ketika WiFi dimatikan. Saya ingin tahu apakah ini membantu orang lain.

EDIT: Saya tampaknya sudah mundur dengan pasangan. Semuanya berfungsi dengan baik saat tidak dipasangkan. Setelah berpasangan, saya mengalami gejala yang sama persis seperti OP. Hanya belum diketahui apakah ini terkait dengan firmware kami atau API Android BLE. Hati-hati jika menguji ini karena setelah dipasangkan, Anda mungkin tidak dapat memutuskan hubungan karena bug yang dijelaskan dalam 3b dari posting ini .

Mikt25
sumber
Saya secara konsisten menyambungkan dan menghubungkan kembali ke perangkat CC2541 tanpa jenis pemasangan atau reboot manual.
dgel
Menurut pendapat saya, tidak ada pasangan yang diperlukan. Dokumen resmi juga tidak mengomentari pemasangan. Saya juga bisa melakukan notifikasi tulis, baca, perubahan karakteristik tanpa pemasangan apa pun. Namun, hanya untuk waktu yang singkat. Sekarang goyah lagi ... SAMSUNG BLE SKD v2.0 juga tidak memerlukan pemasangan dan bekerja dengan cukup baik.
OneWorld
3
Saya dapat mengonfirmasi, ini lebih stabil setelah mematikan Wifi. Semua orang harus mencobanya.
OneWorld
1
Apakah pemasangan diperlukan atau tidak tergantung pada implementasi perangkat. perangkat nrf8002 memerlukan pemasangan dan API Samsung 2.0 dan 1.2 keduanya mendukung hal ini. Sepertinya dukungan api resmi mengalami masalah dengan aspek pemasangan karena setelah saya memasangkan perangkat baru, sepertinya tidak mungkin untuk memutuskan hubungan!
Chris Herbert
2
Saya memiliki pekerjaan di sekitar karena tidak dapat memutuskan hubungan. 1) pergi ke menu bt Anda, pilih tidak berpasangan, hapus perangkat ble dari daerah atau gunakan itu, pilih perangkat ble di menu bt dan itu akan mencoba memasangkan dan gagal, kemudian mengatur ulang bluetooth. Setelah mengatur ulang perangkat akan tidak berpasangan.
Chris Herbert
7

Dalam beberapa model ada cacat: https://code.google.com/p/android/issues/detail?id=180440

Di sisi lain dalam kasus saya masalahnya adalah, bahwa koneksi saya tidak ditutup dengan benar pada metode onDestroy. Setelah penutupan yang benar, masalah bagi saya tidak ada, tidak masalah bahwa wifi dihidupkan atau dimatikan.

btGatt.disconnect();
btGatt.close();
Krystian
sumber
Mengapa closeperlu?
IgorGanapolsky
3
Prosedur penutupan yang benar adalah Kunci ketika Anda ingin menghubungkan Bluetooth beberapa kali. Dalam pengalaman saya, ini bekerja paling baik jika Anda menjalankan koneksi Ble Anda di layanan UNBOUND terpisah sehingga Anda dapat memulai dan menghentikannya dengan tangan. Dan itu Anda sebut mConnectedGatt.disconnect (); ble_device = null; di inDestroy Anda (). Dalam kasus saya, pola ini berfungsi stabil tanpa masalah.
medTech
4

Saya menghadapi masalah yang sama. Perbaikan saya adalah

if (Build.VERSION.SDK_INT >= 23) {
  mBluetoothGatt = device.connectGatt(this, false, mGattCallback, BluetoothDevice.TRANSPORT_LE);
} else {
  mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
}

& menelepon dekat setelah terputus.

Sam Reyes
sumber