8

Một chút kẹt ở đây, có thể cần sự giúp đỡ của bạn. Tôi muốn đọc một số đặc điểm BLE cùng một lúc, một số người đề nghị sử dụng PriorityQueue cho điều đó. Tôi đã biết tất cả các uuids, vv chỉ cần một cách để đọc một số cùng một lúc. Bất cứ ai có thể giải thích chính xác nó trông như thế nào? Hoặc có thể có một giải pháp dễ dàng hơn?Android cách đọc nhiều đặc điểm BLE với PriorityQueue

Cảm ơn trước, đây là mã của tôi:

public static final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { 

    PriorityQueue<BluetoothGattCharacteristic> queue = new PriorityQueue<BluetoothGattCharacteristic>(); 

    // When connection state changes 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
     if (newState == BluetoothProfile.STATE_CONNECTED) { 
      Log.v(TAG, "Connected!"); 
      gatt.discoverServices(); 
     } 
     if (newState == BluetoothProfile.STATE_DISCONNECTED) { 
      Log.v(TAG, "Disconnected..."); 

     } 
    } 

    @Override 
    public void onServicesDiscovered(BluetoothGatt gatt, int status) { 

     List<BluetoothGattService> services = gatt.getServices(); 
     BluetoothGattService rightService = null; 

     for (int i = 0; i < services.size(); i++) { 
      if (services.get(i).getCharacteristics().size() > 8) { 
       rightService = services.get(i); 
      } 
     } 

     List<UUID> uuidsList; 

     UUID TRANSMISSION_POWER = rightService.getCharacteristics().get(4).getUuid(); 
     UUID BROADCASTING_INTERVAL = rightService.getCharacteristics().get(6).getUuid(); 
     UUID BEACON_NAME = rightService.getCharacteristics().get(8).getUuid(); 
     UUID CONNECTION_MODE = rightService.getCharacteristics().get(9).getUuid(); 
     //UUID SOFT_REBOOT = rightService.getCharacteristics().get(10).getUuid(); 

     uuidsList = new ArrayList<UUID>(); 

     uuidsList.add(TRANSMISSION_POWER); 
     uuidsList.add(BROADCASTING_INTERVAL); 
     uuidsList.add(BEACON_NAME); 
     uuidsList.add(CONNECTION_MODE); 
     //uuidsList.add(SOFT_REBOOT); 

     queue.add(rightService.getCharacteristic(uuidsList.get(0))); 
     queue.add(rightService.getCharacteristic(uuidsList.get(1))); 
     queue.add(rightService.getCharacteristic(uuidsList.get(2))); 

    } 

    @Override 
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { 

     Log.v(TAG, "CHARACTERISTIC VALUE___: " + characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0)); 
     onServicesDiscovered(gatt, 0); 

    } 

}; 

UPDATE:

ngay cả sau khi đưa chúng vào chủ đề khác nhau nó vẫn chỉ phản ứng với một gatt.readCharacteristic (...). như sau:

// Gatt Callback 
public static final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { 

    // When connection state changes 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
     if (newState == BluetoothProfile.STATE_CONNECTED) { 
      Log.v(TAG, "Connected!"); 
      gatt.discoverServices(); 
     } 
     if (newState == BluetoothProfile.STATE_DISCONNECTED) { 
      Log.v(TAG, "Disconnected..."); 

     } 
    } 

    @Override 
    public void onServicesDiscovered(BluetoothGatt gatt, int status) { 


     List<BluetoothGattService> services = gatt.getServices(); 

     /* 
     DISPLAY ALL SERVICES AND CHARACTERISTICS 

     for (int i = 0; i < services.size(); i++) { 
      Log.v(TAG, "SERVICE____: " + services.get(i).getUuid()); 

      for (int k = 0; k < services.get(i).getCharacteristics().size(); k++) { 
       Log.v(TAG, "CHARACTERISTIC____: " + services.get(i).getCharacteristics().get(k).getUuid()); 
      } 

     } 
     */ 

     BluetoothGattService rightService = null; 

     for (int i = 0; i < services.size(); i++) { 
      if (services.get(i).getCharacteristics().size() > 8) { 
       rightService = services.get(i); 
      } 
     } 

     List<UUID> uuidsList; 

     UUID TRANSMISSION_POWER = rightService.getCharacteristics().get(4).getUuid(); 
     UUID BROADCASTING_INTERVAL = rightService.getCharacteristics().get(6).getUuid(); 
     UUID BEACON_NAME = rightService.getCharacteristics().get(8).getUuid(); 
     UUID CONNECTION_MODE = rightService.getCharacteristics().get(9).getUuid(); 
     //UUID SOFT_REBOOT = rightService.getCharacteristics().get(10).getUuid(); 

     uuidsList = new ArrayList<UUID>(); 

     uuidsList.add(TRANSMISSION_POWER); 
     uuidsList.add(BROADCASTING_INTERVAL); 
     uuidsList.add(BEACON_NAME); 
     uuidsList.add(CONNECTION_MODE); 
     //uuidsList.add(SOFT_REBOOT); 


     class powerThread extends Thread{ 

      UUID uuid; 
      BluetoothGatt gatt; 
      BluetoothGattService service; 
      public powerThread(UUID uuid, BluetoothGatt gatt, BluetoothGattService service) { 
       this.gatt = gatt; 
       this.service = service; 
       this.uuid = uuid; 
      } 
      @Override 
      public void run() { 
       gatt.readCharacteristic(service.getCharacteristic(uuid)); 
      } 
     } 
     powerThread pt = new powerThread(TRANSMISSION_POWER, gatt, rightService); 
     pt.run(); 


     class intervalThread extends Thread{ 

      UUID uuid; 
      BluetoothGatt gatt; 
      BluetoothGattService service; 
      public intervalThread(UUID uuid, BluetoothGatt gatt, BluetoothGattService service) { 
       this.gatt = gatt; 
       this.service = service; 
       this.uuid = uuid; 
      } 
      @Override 
      public void run() { 
       gatt.readCharacteristic(service.getCharacteristic(uuid)); 
      } 
     } 
     intervalThread it = new intervalThread(BROADCASTING_INTERVAL, gatt, rightService); 
     it.run(); 


    } 

    @Override 
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { 

     Log.v(TAG, "CHARACTERISTIC VALUE___: " + characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0)); 

    } 

}; 
+0

Cố gắng đọc từng cái một? Whats vấn đề với điều đó – AAnkit

+0

Tôi đã làm, và tôi đã chọn giải pháp này cho bây giờ. Vấn đề là tôi cần kết nối nhiều lần và mất nhiều thời gian hơn tôi muốn. –

Trả lời

10

Đối với bất kỳ ai có thể gặp phải vấn đề tương tự, đây là giải pháp dễ sử dụng Danh sách <>.

public static final BluetoothGattCallback readGattCallback = new BluetoothGattCallback() { 

    List<BluetoothGattCharacteristic> chars = new ArrayList<>(); 

    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 

     if (newState == BluetoothProfile.STATE_CONNECTED) { 
      Log.v(TAG, "Connected!"); 
      broadcastingInterval = 999; 
      transmissionPower = 999; 
      gatt.discoverServices(); 
     } 
     if (newState == BluetoothProfile.STATE_DISCONNECTED) { 
      Log.v(TAG, "Disconnected..."); 

     } 
    } 

    @Override 
    public void onServicesDiscovered(BluetoothGatt gatt, int status) { 

     List<BluetoothGattService> services = gatt.getServices(); 
     BluetoothGattService rightService = null; 

     for (int i = 0; i < services.size(); i++) { 
      if (services.get(i).getCharacteristics().size() > 8) { 
       rightService = services.get(i); 
      } 
     } 

     chars.add(rightService.getCharacteristics().get(4)); 
     chars.add(rightService.getCharacteristics().get(6)); 

     requestCharacteristics(gatt); 

    } 

    public void requestCharacteristics(BluetoothGatt gatt) { 
     gatt.readCharacteristic(chars.get(chars.size()-1)); 
    } 

    @Override 
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { 
     if (status == 0) { 

      if (characteristic.getUuid().toString().substring(7, 8).equals("5")) { 
       transmissionPower = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0); 
       Log.v(TAG, "tPOWER READ"); 

      } else if (characteristic.getUuid().toString().substring(7,8).equals("7")) { 
       broadcastingInterval = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0); 
       Log.v(TAG, "INTERVAL READ"); 
      } 

      chars.remove(chars.get(chars.size() - 1)); 

      if (chars.size() > 0) { 
       requestCharacteristics(gatt); 
      } else { 
       gatt.disconnect(); 
      } 
     } 
    } 

}; 
  1. Tạo một danh sách các đặc
  2. Trong onServicesDiscovered cư danh sách với đặc điểm bạn muốn đọc/ghi
  3. Tạo một phương pháp mới được gọi là requestCharacteristics (GATT) và vượt qua các đối tượng GATT với nó. Gọi phương thức này từ onServicesDiscovered sau khi thêm các đặc tính vào danh sách.
  4. Trong yêu cầuChức năng vi khuẩn() gọi gatt.readCharacteristic (chars.get (chars.size() - 1));
  5. Trong onCharacteristicĐọc kiểm tra xem kích thước của danh sách của bạn có không phải là số không, sau đó đọc đặc tính của bạn, xóa mục cuối cùng trong danh sách của bạn và gọi lại yêu cầuCharacteristic().
  6. Đó là tất cả
Các vấn đề liên quan