31

Bluetooth năng lượng thấp quản lý các thông số kết nối dường như đã thay đổi trong Android 6.Android 6.0 kẹo xốp marshmallow BLE: Kết nối thông số

Tôi có một thiết bị ngoại vi BLE những người cần sử dụng một số thông số kết nối cụ thể (đặc biệt, khoảng thời gian kết nối) và tôi muốn sử dụng khoảng thời gian kết nối tối thiểu được phép theo đặc tả BLE (tức là 7,5ms).

SDK Android không cho phép chọn nó từ phía BLE GAP Central (điện thoại thông minh), do đó, cách thích hợp để làm điều đó là làm cho thiết bị ngoại vi GAP của tôi gửi L2CAP Connection Parameter Update Request sau khi kết nối GAP được thực hiện.

Các thông số tôi yêu cầu là:

  • conn khoảng phút: 7,5ms
  • conn khoảng tối đa: 7,5ms
  • nô lệ thời gian chờ: 0
  • giám sát thời gian chờ: 2000 mili giây

Điều này hoạt động như mong đợi với tất cả các thiết bị Android mà tôi đã thử nghiệm, từ 4,3 đến 5.x: sau khi gửi L2CAP Connection Parameter Update Request, thiết bị của tôi nhận được L2CAP Connection Parameter Update Response với 0x0000 (được chấp nhận), tiếp theo là LE Connection Update Complete event nơi tôi có thể thấy rằng các thông số kết nối được yêu cầu cũng được tính đến.

Bây giờ, với máy tính bảng Nexus 9 hoặc với 2 thiết bị Nexus 5 khác nhau, tất cả đều có Android 6.0.1, tôi có thể thấy rằng L2CAP Connection Parameter Update Request luôn bị từ chối (Tôi nhận được L2CAP Connection Parameter Update Response với 0x0001 (bị từ chối)). Sau đó, tôi nhận được một số LE Connection Update Complete event nơi tôi có thể thấy rằng các tham số kết nối được yêu cầu KHÔNG được tính đến.

Tôi đã thử điều này với 2 cách triển khai khác nhau ở bên ngoại vi (một với ST Microelectronics 'BlueNRG, một với NRF52 của Nordic Semiconductor), cả hai đều có cùng kết quả.

Sau đó, sau khi thử nghiệm thêm: Tôi đã thử các bộ tham số khác nhau, thay đổi khoảng thời gian tối đa của conn (tôi giữ các thông số khác giống nhau). Dưới đây là những gì tôi tìm thấy:

  • với tối đa khoảng conn = 18.75ms, cập nhật theo yêu cầu đã được chấp nhận với khoảng thời gian thiết lập để 18.75ms
  • với tối đa khoảng conn = 17.50ms, cập nhật theo yêu cầu đã được chấp nhận với thiết lập khoảng thời gian để 15.00 ms
  • với conn tối đa khoảng thời gian = 15.00ms, cập nhật theo yêu cầu đã được chấp nhận với thiết lập khoảng thời gian để 15.00ms
  • với tối đa khoảng conn = 13.75ms, cập nhật theo yêu cầu đã được chấp nhận với khoảng thời gian thiết lập để 11.25ms
  • với tối đa khoảng conn = 11,25ms, yêu cầu cập nhật đã được chấp nhận với khoảng thời gian được đặt thành 11,25ms
  • với bất kỳ giá trị tối đa khoảng thời gian nào khác dưới 11,25ms, tôi bị từ chối.

Vì vậy, quan sát là một cái gì đó đã thay đổi rõ ràng với cách ngăn xếp BLE của Android 6 xử lý các thông số kết nối. Nhưng dường như không có bất kỳ loại thông tin hoặc tài liệu nào để xác nhận điều đó.

Quan sát của tôi dẫn đến kết luận rằng khoảng thời gian kết nối tối thiểu được phép hiện là 11.25ms (thực sự phù hợp với nhu cầu của tôi) thay vì 7,5ms trong các phiên bản Android trước đó. Nhưng đã tìm thấy nó theo kinh nghiệm, tôi muốn chắc chắn rằng tôi không thiếu một số ràng buộc/quy tắc khác hoặc nếu tối thiểu đó sẽ không động, tùy thuộc vào mức pin hiện tại ...

Điều gì sẽ là tuyệt vời sẽ có tương đương với Apple's Bluetooth Design Guidelines (xem §3.6) để thiết lập những điều rõ ràng về cách một LE Ngoại vi nên đối phó với chủ đề này.

Có ai có cùng vấn đề hoặc biết một số thông tin hữu ích khác từ Google không?

Trả lời

4

Google vẫn chưa cung cấp bất kỳ tài liệu về LE Ngăn xếp Bluetooth thay đổi liên quan đến thay đổi thông số kết nối mặc dù đã có một số rõ ràng trong Android 6.

Kinh nghiệm của tôi với nó đã trở thành giống như của riêng mình, đó là đó 11,25ms giờ là khoảng thời gian kết nối nhanh nhất được phép trong Android 6+.

Dự đoán của tôi là tại sao họ không phát hành tài liệu là nhiều nhà sản xuất đặt ngăn xếp BLE của riêng họ vào điện thoại của họ (BLE trên Samsung và HTC hoạt động khác với vani Android).

Một quan sát khác mà tôi đã thực hiện gây ra nhiều vấn đề là Android 6+ sẽ thay đổi các thông số kết nối từ 2 đến 6 lần trước khi giải quyết các tham số được yêu cầu.

Tôi quan sát thấy rằng sau khi yêu cầu khoảng thời gian cập nhật thông số kết nối 800ms đến 1100ms, tôi thấy khoảng thời gian ban đầu quay lại 7,5ms, sau đó nhảy lên 48,75ms và sau đó nhảy lên 1098,75ms tôi yêu cầu. Sau đó, tôi đăng ký với các thông báo trên một trong các dịch vụ của tôi và khoảng thời gian kết nối một lần nữa nhảy trở lại 7.5ms và sau đó quay lại 1098.75ms. Sau đó, nó ổn định ở mức 1098,75ms trong suốt thời gian kết nối.

Những thử nghiệm đã chạy trên Nexus 6 với Android 6.0.1

Rõ ràng, một số điều rất lạ đang xảy ra trên Android 6 ngăn xếp BLE.

9

So sánh phương thức kết nốiParameterUpdate() từ GattService.java trong AOSP 6.0.1_r17 so với AOSP 5.1.1_r14. Trong cả hai trường hợp, cuộc gọi đi tất cả các cách để Buedroid trong BTA_DmBleUpdateConnectionParams() trong bta_dm_api.c với params tương tự.

6.0:

switch (connectionPriority) 
    { 
     case BluetoothGatt.CONNECTION_PRIORITY_HIGH: 
      minInterval = 9; // 11.25ms 
      maxInterval = 12; // 15ms 
      break; 

     case BluetoothGatt.CONNECTION_PRIORITY_LOW_POWER: 
      minInterval = 80; // 100ms 
      maxInterval = 100; // 125ms 
      latency = 2; 
      break; 
    } 

5,1:

switch (connectionPriority) 
    { 
     case BluetoothGatt.CONNECTION_PRIORITY_HIGH: 
      minInterval = 6; // 7.5ms 
      maxInterval = 8; // 10ms 
      break; 

     case BluetoothGatt.CONNECTION_PRIORITY_LOW_POWER: 
      minInterval = 80; // 100ms 
      maxInterval = 100; // 125ms 
      latency = 2; 
      break; 
    } 

Đây có thể là một phần của câu trả lời cho câu hỏi của bạn. Mặc dù BLE cho phép xuống đến 7,5ms CI, tôi không thể suy đoán tại sao lớp liên kết sẽ không chuyển sang CI thấp hơn theo yêu cầu của thiết bị ngoại vi. Tôi không biết nếu bất kỳ phần nào của mã android kiểm soát kết quả của các cuộc đàm phán với thiết bị ngoại vi.

+0

Tôi muốn thêm điều đó vào btm_ble_api.h, các giá trị của BTM_BLE_CONN_INT_MIN [0x0006] và BTM_BLE_CONN_INT_MAX [0x0C80] chưa thay đổi.Sự từ chối này có lẽ không xảy ra trong l2c_ble.c. – GPS

1

Google guys đã phạm sai lầm trong một trong các cam kết gần đây trong Bluedroid bằng cách xác định BTM_BLE_CONN_INT_MIN_LIMIT0x0009 cung cấp cho bạn 1.25ms x 9 = 11,25ms. Để tuân thủ tiêu chuẩn, nó phải được định nghĩa là 0x0006.

0

11,25 ms là khoảng thời gian kết nối tối thiểu mới. Lý do họ không cho phép 7,5 ms nữa là vì nếu bạn phát âm thanh qua bluetooth cùng một lúc thì âm thanh có thể trở nên bị thay đổi.

+0

Trớ trêu thay, với một dự án mà tôi đang làm việc, Khi chúng tôi cố chuyển âm thanh từ thiết bị ngoại vi, âm thanh trở nên bị thay đổi nếu khoảng thời gian kết nối lớn hơn 10 ms. Phần lớn bởi vì (có thể) lớp liên kết có thể xử lý một số lượng hạn chế các gói dữ liệu cùng một lúc. – GPS

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