5

Tôi đang cố gắng viết ứng dụng Bluetooth LE truy cập màn hình trái tim thông minh Zephyr HxM. Màn hình này có một số dịch vụ Bluetooth, nhưng tôi quan tâm đến Dịch vụ pin, Dịch vụ nhịp tim và Dịch vụ tùy chỉnh có Hoạt động tăng tốc và tăng tốc. Có một đặc điểm cho mỗi mức pin, (BAT), Đo nhịp tim (HR) và Đo lường tùy chỉnh (CUS). Bản cập nhật HxM khoảng một lần mỗi giây.Các sự cố với Thông báo LE Bluetooth của Android

Tôi đang làm điều này với Galaxy S4 với Android 4.4.

Nó không hoạt động như mong đợi từ tài liệu.

cách tiếp cận ban đầu của tôi là để làm:

Read BAT 
Set notification for HR 
Set notification for CUS. 

Sau đó chờ cho callbacks. Thiết thông báo có nghĩa là kêu gọi

BluetoothGatt.setCharacteristicNotification(Characteristic char , boolean enabled) 

(Người ta cũng có thể làm thông báo cho BAT, tuy nhiên, spec không yêu cầu này để được hỗ trợ. Các HxM, tuy nhiên, không hỗ trợ nó.)

này không công việc. Tôi nhận được BAT và thông báo cho nhân sự chứ không phải CUS. Nếu tôi loại bỏ bước thứ hai, tôi nhận được thông báo cho CUS. Tôi không thể nhận được cả hai. (Điều này cho thấy tôi đang đọc các đặc điểm chính xác, vì vậy đó có thể là [có thể] không phải vấn đề.)

Tôi đã tìm thấy một số dấu hiệu cho thấy ngăn xếp Bluetooth cho Android đang đồng bộ, nhưng không có tài liệu cứng. Sau đó, tôi đã thử các cách sau:

Read BAT. 
Wait for the BAT reading, then set notification for HR, 
Get HR, then disable notification for HR, and start notification for CUS. 
Get CUS, then disable notification for CUS, and start notification for HR. 
And continue to loop. 

Tôi có BAT và đó là tất cả.

Bằng cách thử và sai, tôi phát hiện ra các công việc sau:

Read BAT. 
Wait for the BAT reading, then set notification for HR, 
Get HR, then start notification for CUS. 
Get CUS, then start notification for HR. 
And continue to loop. 

(. Tương tự như trên nhưng không vô hiệu hóa thông báo) Thông thường, tôi nhận được một đọc Nhân sự, thì CUS một trong vòng 200 ms. Người ta có thể cho rằng họ đến từ cùng một bản cập nhật. (Không có dấu thời gian trong dữ liệu, mà phải được giữ ngắn để được LE.) Trong thực tế, logic là phức tạp hơn, như giờ là cần thiết trong trường hợp dự kiến ​​đọc không đến. Logic này là FAR phức tạp hơn (và dễ bị lỗi) so với lần thử đầu tiên của tôi, đó là những gì tài liệu hướng dẫn có vẻ là điều thích hợp.

Tôi đã liên lạc với Zephyr, và họ nói rằng HxM Smart đã được thử nghiệm rộng rãi trên Windows và sẽ thực hiện các thông báo đồng thời. Cũng có những dấu hiệu nó hoạt động như trên iOS.

Có vấn đề nữa mà tôi không hiểu. Để nhận thông báo, bạn phải kích hoạt các đặc điểm địa phương để thông báo với một cái gì đó như:

BluetoothGattDescriptor descriptor = characteristic 
     .getDescriptor(UUID_CLIENT_CHARACTERISTIC_CONFIG); 
resSet = descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); 
resWrite = mBluetoothGatt.writeDescriptor(descriptor); 

Đây là một thiết lập cho mỗi đặc trưng, ​​và chỉ nên cần phải được thực hiện một lần, khi đặc tính là lần đầu tiên nhận được. Thay vào đó, tôi thấy tôi phải làm điều đó mỗi lần tôi đặt thông báo. Có thể điều này chỉ gây ra một sự chậm trễ đủ thời gian cho những thứ để làm việc. Tôi không biết. Thử nghiệm và lỗi này đang mất rất nhiều thời gian của tôi. Nó sẽ là tốt đẹp để có một tuyên bố dứt khoát về cách thức hoạt động của nó.

Tôi nên lưu ý rằng đối với tất cả các cuộc gọi trả lại kết quả, kết quả là đúng (thành công).

Tôi xin lỗi vì tuyên bố dài. Câu hỏi của tôi là:

Tôi không tìm thấy tài liệu nào mà tôi phải làm những điều được mô tả. Tất cả các chỉ dẫn là bạn thiết lập thông báo và chờ cuộc gọi lại. Có tài liệu nào hay đây là lỗi hay chỉ là triển khai không tốt? (Hay là lỗi của tôi?) Tôi đặc biệt muốn biết tài liệu về những gì tôi phải làm.

Thứ hai, có một biến chứng nữa. Tôi đã cố gắng để gỡ lỗi vào các thói quen để xem những gì mã thực sự đang làm. Khi tôi truy cập BluetoothGatt.class, các dòng nguồn không khớp với những gì mà stack debug nói. Do đó, tôi cho rằng S4 không sử dụng Android chuẩn. Tôi không biết đi đâu từ đó. Nó đã bực bội, và trong khi tôi có một cái gì đó dường như làm việc, nó là kludgy và gần như chắc chắn ít mạnh mẽ hơn.

Cảm ơn bạn đã được trợ giúp.

+0

câu hỏi hay. Tôi đã có một vấn đề tương tự mà tôi đã phải lắng nghe hai đặc điểm thông qua notifiaction và ghi vào một thứ ba. Không thể làm cho nó hoạt động đúng trên android tuy nhiên nó làm việc tốt trên ios. Tôi sẽ đề nghị thử nó trên một thiết bị Android (thương hiệu) khác nếu bạn có cơ hội. BLE vẫn không ổn định ngay cả trên 4.4.4, rất nhiều thứ không hoạt động như mong đợi, thiếu tài liệu và vẫn mang lại kết quả khác nhau trên các thiết bị di động khác nhau. – benka

+0

Bạn sẽ có thể bật các thông báo và chỉ nhận các thông báo mà không cần tiếp tục làm gì thêm. Điều cần nhận ra là bạn chỉ có thể thực hiện một thao tác cuối cùng như writeDescriptor tại một thời điểm. Nếu một trong những vẫn còn đang tiến triển và bạn cố gắng và làm một số khác nó chỉ bỏ qua yêu cầu mới. Điều này không phải là ở tất cả các tài liệu cũng như một nỗi đau. Bạn phải thiết lập một số phương pháp xếp hàng đợi xem http://stackoverflow.com/questions/21278993/android-ble-how-to-read-multiple-characteristics – Ifor

+0

Ifor, Thanks. Tôi nghĩ rằng vấn đề của tôi là không chờ đợi cho writeDescriptor. Ngoài ra còn có một bài viết tại http://stackoverflow.com/questions/17910322/android-ble-api-gatt-notification-not-received về điều này nhưng nó không xem xét thông báo. Từ những gì bạn nói tôi không phải lo lắng về chúng (sau khi cho phép chúng đúng cách với writeDescriptor). Tôi ra khỏi máy tính của tôi nhưng sẽ cố gắng này ngay sau khi tôi trở lại. Cảm ơn một lần nữa. –

Trả lời

1

Tôi đã có cùng một vấn đề với việc viết nhiều giá trị theo thứ tự, đặt một Thread.sleep (200) ở giữa chúng giải quyết được vấn đề (tôi nên nói). Có thể điều này cũng hữu ích khi nhận thông báo. Thử nghiệm điều này trên Android 4.4.2 trên Nexus 5. Và không, 4.4 không giải quyết được tất cả các sự cố ...

1

Có lẽ rất muộn nhưng bạn nên triển khai kiến ​​trúc xếp hàng để thiết lập đặc điểm gửi thông báo. Tôi đã sử dụng một kỹ thuật tương tự như miznick trong bài đăng https://stackoverflow.com/a/18207869/3314615 và kết thúc bằng cách viết mã trình bao bọc cho ngăn xếp BLE gốc vì có một số ứng dụng tôi sử dụng BLE cho. Kể từ đó tôi đã không có vấn đề nhận thông báo. Tôi đồng ý với bạn rằng tài liệu BLE Android nên có một số loại thông tin hoặc cảnh báo về Ngăn xếp BLE không đồng bộ. Thành thật mà nói, tôi tin rằng nó nên được viết lại để xử lý các cuộc gọi viết đồng bộ và chỉ cần xếp hàng chúng.

+0

Trở lại năm 2014, tôi đã thực hiện hàng đợi cho writeDescriptor và readCharacteristic như được mô tả bởi miznick trong stackoverflow.com/questions/17910322/…. Xem nhận xét trên bài đăng gốc. Nó vẫn tiếp tục hoạt động. Nếu có bất kỳ khoản tín dụng nào cho nỗ lực này, nó sẽ đến Ifor. –

0

Trước tiên, bạn đặt Thông báo (ví dụ: setCharacteristicNotification và set Descriptor) cho đặc tính đầu tiên.

Và, Đặt thông báo cho đặc tính thứ hai trong hàm chức năng gọi lạiDescriptorWrite.

Các vấn đề liên quan