8

ile birden fazla BLE karakterini nasıl okuyacağınız hakkında Buraya sıkışmış bir bit, yardımınıza ihtiyaç duyabilir. Birkaç BLE karakterini bir kerede okumak istiyorum, bazı insanlar bunun için PriorityQueue kullanmayı önermektedir. Zaten tüm uuidleri, vb. Biliyorum, sadece bir kerede birkaç tane okumak için bir yol gerekiyor. Herkes nasıl göründüğünü açıklayabilir mi? Ya da belki başka bir kolay çözüm var mı? peşinAndroid, bir PriorityQueue

sayesinde burada benim kodudur:

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); 

    } 

}; 

GÜNCELLEME:

bile hala tek gatt.readCharacteristic (...) tepki farklı parçacığı üzerinde koyarak sonra. gibi: Aynı sorunla karşılaşabilir herkes için

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

birer birer okuma çalıştı? Ne yaptım – AAnkit

+0

ile yaptım ve şimdi bu çözümü seçtim. Sorun şu ki, birden çok kez bağlanmam gerekiyor ve bunu almak istediğimden daha uzun sürüyor. –

cevap

10

, burada özelliklerinin bir listesi <> kullanarak kolay bir çözümdür.

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. yeni bir yöntem denilen requestCharacteristics (GATT) oluştur yazma doldurmak sen/okumak istediğiniz özelliklere sahip listeyi özelliklerine onServicesDiscovered yılında
  2. bir listesini oluşturun ve buna GATT nesnesi iletir. Listeye özellikler ekledikten sonra bu yöntemi onServicesDiscovered'den çağırın.
  3. İstekKriti() yöntemi çağrısı gatt.readCharacteristic (chars.get (chars.size() - 1));
  4. OnCharacteristicRead Listenizin boyutunun sıfır olmadığını kontrol edin, ardından karakteristiğinizi okuyun, listenizin son öğesini kaldırın ve requestCharacteristic() işlevini tekrar arayın.
  5. var Hepsi bu