Bluetooth LE mendengarkan beberapa notifikasi karakteristik

Saya menggunakan aplikasi BLE di ponsel Android yang berkomunikasi dengan papan sensor BLE khusus. Ada dua karakteristik yang diberikan oleh board, akselerasi dan ecg. Di sisi ponsel, saya ingin menerima notifikasi dua karakteristik dari papan sensor. Kode saya untuk mengatur notifikasi:

mGatt.setCharacteristicNotification(ecgChar, true);
            BluetoothGattDescriptor descriptor = ecgChar.getDescriptor(
                    UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
            descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
            mGatt.writeDescriptor(descriptor);
            mGatt.setCharacteristicNotification(accelChar, true);
            descriptor = ecgChar.getDescriptor(
                    UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
            descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
            mGatt.writeDescriptor(descriptor);

Namun, saya hanya dapat menerima notifikasi untuk karakteristik pertama. Ketika saya hanya mendaftarkan notifikasi untuk satu karakteristik, itu berfungsi dengan baik. Frekuensi pengambilan sampel adalah 100Hz untuk EKG dan akselerasi. Jadi bagaimana saya bisa menerima notifikasi dari kedua karakteristik tersebut? Terima kasih.


person Sentimental    schedule 09.02.2017    source sumber


Jawaban (2)


Anda hanya dapat memiliki satu operasi gatt yang luar biasa dalam satu waktu. Dalam hal ini Anda melakukan dua panggilan writeDescriptor sebelum menunggu hingga panggilan pertama selesai. Anda harus menunggu https://developer.android.com/reference/android/bluetooth/BluetoothGattCallback.html#onDescriptorWrite(android.bluetooth.BluetoothGatt,%20android.bluetooth.BluetoothGattDescriptor,%20int) hingga Anda dapat mengirimkan berikutnya satu.

person Emil    schedule 09.02.2017
comment
Faktanya, saya tahu operasi gatt bersifat serial, jadi saya mencoba menambahkan penundaan antara dua penulisan tetapi tidak berhasil. Sekarang saya menggunakan panggilan balik untuk menangani serialisasi, yang merupakan cara yang benar dan berfungsi dengan baik! Terima kasih! - person Sentimental; 09.02.2017
comment
Terima kasih kamu menyelamatkan hidupku. Belum ada informasi mengenai hal ini. - person Haroun Hajem; 04.12.2018

Saya setuju dengan jawaban Emil. Ketika Anda telah menulis deskriptor untuk karakteristik pertama:

boolen isSucsess = mGatt.writeDescriptor(descriptor);

Anda harus menunggu panggilan balik untuk karakteristik pertama ini dari:

onDescriptorWrite(BluetoothGatt gatt, deskriptor BluetoothGattDescriptor, status int) - metode BluetoothGattCallback.

Hanya setelah itu Anda harus melanjutkan ke karakteristik berikutnya dan pemrosesan deskriptornya.

Sebagai contoh, Anda dapat memperluas BluetoothGattDescriptor dan menjalankan karakteristik berikutnya dan pemrosesan deskriptornya dalam metode

onDescriptorWrite(...) { ... di sini ...}.

Perlu diketahui juga bahwa terkadang Anda harus mengatur notifikasi untuk semua karakteristik dan kemudian menulis deskriptornya. Saya telah menemui ini dalam latihan saya dengan perangkat timbangan berat badan. Untuk mendapatkan bobot saya perlu mengatur notifikasi untuk baterai, waktu, berat, setelah itu menulis deskriptor untuk semua karakteristik (menunggu panggilan balik untuk semua orang)).

Untuk kode yang jelas, Anda sebaiknya bekerja dengan multitrading.

Yang terbaik, StaSer.

person Serg.Stankov    schedule 10.07.2018
comment
Saya telah mengikuti strategi yang sama namun saya tidak mendapatkan nilai untuk kedua karakteristik tersebut. Saya menulis deskriptor pertama setelah mendapatkan nilai dari deskriptor itu, lalu menulis deskriptor kedua. Bisakah Anda menyarankan solusi apa pun. - person YBDevi; 12.03.2020