8

ここにちょっとしたことがあると、あなたの助けが必要になるかもしれません。私は一度にいくつかのBLE特性を読んでみたいと思っています。そのためにPriorityQueueを使用することをお勧めします。私はすでにすべてのuuidsなどが一度にいくつかの方法を読む必要があることを知っている。 誰もそれがどのように正確に見えるべきか説明できますか?それとももっと簡単な解決法がありますか?事前にAndroid複数のBLE特性をPriorityQueueで読み取る方法

おかげで、ここに私のコードです:

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:

も、それはまだ一つだけgatt.readCharacteristic(...)に反応する異なるスレッド上でそれらを入れた後。次のように:

// 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

1つ1つお読みください。何がその – AAnkit

+0

の問題を解決した、私は今この解決策を選んだ。問題は、複数回接続する必要があることです。これは、必要以上に時間がかかります。 –

答えて

10

を同じ問題が発生する可能性がある人には、ここでは特性の一覧<>を使用して簡単なソリューションです。

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. onServicesDiscoveredで特性
  2. のリストを作成し、あなたがrequestCharacteristics(GATT)と呼ばれる新しいメソッドを作成し、GATTオブジェクトを渡す
  3. を読み取り/書きたい特性を持つリストを作成します。特性をリストに追加した後、onServicesDiscoveredからこのメソッドを呼び出します。
  4. requestCharacteristics()メソッド呼び出しでは、gatt.readCharacteristic(chars.get(chars.size() - 1));
  5. onCharacteristicReadでは、リストのサイズがゼロでないかどうかを確認し、特性を読み、リストの最後の項目を削除して、requestCharacteristic()を再度呼び出します。
  6. これはすべて
関連する問題