2015-05-22 21 views
5

Tôi đang cố gắng đọc trạng thái ban đầu của thiết bị BLE khi tôi kết nối với nó. Đây là mã tôi phải cố gắng làm điều đó:Android BLE readCharacteristic failed

@Override 
public void onServicesDiscovered(BluetoothGatt gatt, int status) 
{ 
    if(status == BluetoothGatt.GATT_SUCCESS) 
    { 
     Log.i(TAG, gatt.getDevice().toString() + "Discovered Service Status: " + gattStatusToString(status)); 
     for(BluetoothGattService service : gatt.getServices()) 
     { 
      Log.i(TAG, "Discovered Service: " + service.getUuid().toString() + " with " + "characteristics:"); 
      for(BluetoothGattCharacteristic characteristic : service.getCharacteristics()) 
      { 
       // Set notifiable 
       if(!gatt.setCharacteristicNotification(characteristic, true)) 
       { 
        Log.e(TAG, "Failed to set notification for: " + characteristic.toString()); 
       } 

       // Enable notification descriptor 
       BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CCC_UUID); 
       if(descriptor != null) 
       { 
        descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); 
        gatt.writeDescriptor(descriptor); 
       } 

       // Read characteristic 
       if(!gatt.readCharacteristic(characteristic)) 
       { 
        Log.e(TAG, "Failed to read characteristic: " + characteristic.toString()); 
       } 
      } 
     } 
    } 
    else 
    { 
     Log.d(TAG, "Discover Services status: " + gattStatusToString(status)); 
    } 
} 

Nhưng lần đọc không thành công! Sau đó nếu tôi bắt đầu đọc dựa trên tương tác giao diện người dùng, nó chỉ đọc tốt! Bất kỳ ý tưởng về những gì đang xảy ra ở đây?

+0

Có thể bạn cần ghép nối/liên kết trước khi đọc? –

Trả lời

12

Trong triển khai Android BLE, các cuộc gọi hoạt động gatt cần được xếp hàng đợi để chỉ có một thao tác (đọc, viết, v.v.) có hiệu lực tại một thời điểm. Vì vậy, ví dụ, sau khi gọi gatt.readCharacteristic(characteristicX), bạn cần phải chờ cuộc gọi lại gatt BluetoothGattCallback.onCharacteristicRead() để cho biết đọc xong. Nếu bạn bắt đầu một thao tác gatt.readCharacteristic() thứ hai trước khi thao tác trước đó hoàn thành, thao tác thứ hai sẽ thất bại (bằng cách trả về false) Điều này xảy ra cho tất cả các phép toán gatt.XXX().

Đó là một công việc nhỏ, nhưng tôi nghĩ giải pháp tốt nhất là tạo hàng đợi lệnh cho tất cả các hoạt động của gatt và chạy từng lệnh một. Bạn có thể sử dụng mẫu lệnh để thực hiện việc này.

+0

Một câu hỏi: cũng cho onCharacteristicChanged Tôi phải thực hiện mẫu lệnh? – aeroxr1

+2

Không. Không có mẫu lệnh/phản hồi cho các đặc điểm đáng chú ý. Các thông báo (onCharacteristicChanged) đến trong không đồng bộ và không nên ảnh hưởng, cũng không bị ảnh hưởng bởi, lệnh xếp hàng cho các lần đọc và viết khác. –

+0

Cảm ơn !!! Và cho srtcharacteristicnotofy và viết descriptor? :) – aeroxr1

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