Bluetooth LE ฟังการแจ้งเตือนลักษณะต่างๆ มากมาย

ฉันใช้แอปพลิเคชัน BLE บนโทรศัพท์ Android ที่สื่อสารกับบอร์ดเซ็นเซอร์ BLE แบบกำหนดเอง บอร์ดมีคุณสมบัติสองประการ ได้แก่ การเร่งความเร็วและคลื่นไฟฟ้าหัวใจ ทางฝั่งโทรศัพท์ ฉันต้องการรับการแจ้งเตือนเกี่ยวกับคุณลักษณะ 2 ประการจากบอร์ดเซ็นเซอร์ รหัสของฉันเพื่อตั้งค่าการแจ้งเตือน:

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);

อย่างไรก็ตาม ฉันสามารถรับการแจ้งเตือนสำหรับลักษณะแรกเท่านั้น เมื่อฉันลงทะเบียนการแจ้งเตือนเพียงคุณสมบัติเดียว มันก็ทำงานได้ดี ความถี่ในการสุ่มตัวอย่างคือ 100Hz สำหรับทั้ง ECG และการเร่งความเร็ว แล้วจะสามารถรับการแจ้งเตือนจากทั้งสองลักษณะได้อย่างไร? ขอบคุณ.


person Sentimental    schedule 09.02.2017    source แหล่งที่มา


คำตอบ (2)


คุณสามารถมีการดำเนินการ gatt ที่ค้างอยู่ได้ครั้งละหนึ่งการดำเนินการเท่านั้น ในกรณีนี้ คุณทำการเรียก writeDescriptor สองครั้งก่อนที่จะรอจนกระทั่งการเรียกครั้งแรกเสร็จสิ้น คุณต้องรอ https://developer.android.com/reference/android/bluetooth/BluetoothGattCallback.html#onDescriptorWrite(android.bluetooth.BluetoothGatt,%20android.bluetooth.BluetoothGattDescriptor,%20int) จนกว่าคุณจะสามารถส่งข้อมูลถัดไปได้ หนึ่ง.

person Emil    schedule 09.02.2017
comment
อันที่จริง ฉันรู้ว่าการดำเนินการ gatt เป็นแบบอนุกรม ดังนั้นฉันจึงพยายามเพิ่มความล่าช้าระหว่างการเขียนสองครั้งแต่ไม่ได้ผล ตอนนี้ฉันใช้การเรียกกลับเพื่อจัดการกับการทำให้เป็นอนุกรม ซึ่งเป็นวิธีที่ถูกต้อง และทำงานได้ดี! ขอบคุณ! - person Sentimental; 09.02.2017
comment
ขอบคุณคุณช่วยชีวิตฉันไว้ ไม่มีข้อมูลเกี่ยวกับเรื่องนี้ - person Haroun Hajem; 04.12.2018

ฉันเห็นด้วยกับคำตอบของเอมิล เมื่อคุณเขียนคำอธิบายสำหรับคุณลักษณะแรก:

boolen isSucsess = mGatt.writeDescriptor(descriptor);

คุณควรรอการโทรกลับสำหรับคุณสมบัติแรกนี้จาก:

onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, สถานะ int) - วิธีการของ BluetoothGattCallback

หลังจากนั้นคุณควรไปที่คุณลักษณะถัดไปและการประมวลผลคำอธิบาย

ตามตัวอย่าง คุณสามารถขยาย BluetoothGattDescriptor และเรียกใช้คุณลักษณะถัดไปและการประมวลผล descriptor ในวิธีการได้

onDescriptorWrite(...) { ... ที่นี่ ...}

โปรดทราบว่าบางครั้งคุณควรตั้งค่าการแจ้งเตือนสำหรับคุณลักษณะทั้งหมดและหลังจากนั้นให้เขียนคำอธิบาย ฉันได้พบสิ่งนี้ในการปฏิบัติของฉันกับเครื่องชั่งน้ำหนัก ในการรับน้ำหนัก ฉันต้องตั้งค่าการแจ้งเตือนสำหรับแบตเตอรี่ เวลา น้ำหนัก หลังจากนั้นจึงเขียนคำอธิบายสำหรับคุณลักษณะทั้งหมด (รอการโทรกลับสำหรับทุกคน)

สำหรับโค้ดที่ชัดเจน คุณควรทำงานกับ multitrading ดีกว่า

ดีที่สุด StaSer

person Serg.Stankov    schedule 10.07.2018
comment
ฉันได้ปฏิบัติตามกลยุทธ์เดียวกัน แต่ฉันยังไม่ได้รับคุณค่าสำหรับทั้งสองลักษณะ ฉันกำลังเขียน descriptor ตัวแรกหลังจากได้รับค่าจาก descriptor นั้น แล้วจึงเขียน descriptor ตัวที่สอง คุณสามารถแนะนำวิธีแก้ปัญหาใด ๆ - person YBDevi; 12.03.2020