0

Google が提供する Gatt サンプル プロジェクトに基づいて、BLE アプリを開発しています: https://developer.android.com/samples/BluetoothLeGatt/index.html。というわけで、特性に書き込んでいるデータを正常に送信できます。ここで、この特性がいつ値を変更するかを知る必要があります。

デバイス アクティビティ

private void displayGattServices(List<BluetoothGattService> gattServices) 
{
   // get services & characteristics
   ................ 

final BluetoothGattCharacteristic characteristic = mGattCharacteristics.get(2).get(0);
        final int charaProp = characteristic.getProperties();
        mWriteCharacteristic = characteristic;
        mBluetoothLeService.setCharacteristicNotification(mWriteCharacteristic, true);

   // write in the characteristic to send a reset command to BLE device

   // Start the read method, that permit subscribe to the characteristic
   BluetoothLeService.read(mWriteCharacteristic);
   BluetoothLeService.set(mWriteCharacteristic,true);
};

BluetoothLeService

public static void read(BluetoothGattCharacteristic characteristic) 
     {
        if (mBluetoothAdapter == null || mBluetoothGatt == null) 
        {
            Log.w("BluetoothAdapter not initialized");
            return;
        };

        mBluetoothGatt.readCharacteristic(characteristic);
    };

    public static void set(BluetoothGattCharacteristic characteristic, boolean enabled) 
    {
        if(mBluetoothAdapter == null || mBluetoothGatt == null) 
        {
            Log.w("BluetoothAdapter not initialized");
            return;
        };

        mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);

        UUID uuid = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");
        BluetoothGattDescriptor descriptor = characteristic.getDescriptor(uuid);
        descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
        mBluetoothGatt.writeDescriptor(descriptor);
    };

しかし、読み取り特性の値を取得する方法がわかりません。実際、私のコードが特性にうまくサブスクライブするかどうかはわかりません。誰かが私を助けることができますか?特性の値が本当に変化するかどうかを確認するにはどうすればよいですか? また、この特性の新しい値を画面に表示するにはどうすればよいですか? 私のコードは正しいですか、何かを追加、変更、または削除する必要がありますか? あらかじめご了承ください。この質問でガイドします:BLEデバイスから複数の特性を同期的に読み取る(Androidの推奨方法)

4

1 に答える 1

0

この関数内でループを実行する必要があります - displayGattServices(List gattServices)を実行し、接続された BLE デバイスのサービス全体と特性を取得します。

UUID 値に基づいて特性名プロパティを決定するには、 BLE 特性を参照できます。

BLE デバイスに適用できる特性を決定したら、それをキューに追加し、それらを読み取り/設定します。

@ DeviceActivityクラス

List <BluetoothGattCharacteristic> bluetoothGattCharacteristic = new ArrayList<BluetoothGattCharacteristic>();
Queue<BluetoothGattCharacteristic> mWriteCharacteristic = new LinkedList<BluetoothGattCharacteristic>();

private void displayGattServices(List<BluetoothGattService> gattServices) 
{
    for(BluetoothGattService service : gattServices) 
    {   
        Log.i(TAG, "Service UUID = " + service.getUuid());

        bluetoothGattCharacteristic = service.getCharacteristics();

        for(BluetoothGattCharacteristic character: bluetoothGattCharacteristic)
        {   
            Log.i(TAG, "Service Character UUID = " + character.getUuid());    

            // Add your **preferred characteristic** in a Queue
            mWriteCharacteristic.add(character);   
        }
    }

    if(mWriteCharacteristic.size() > 0)
    {
       read_Characteristic();
    };
};

DeviceActivityクラスにも以下の関数を追加します。

   // make sure this method is called when there is more than one characteristic to read & set
   private void read_Characteristic()  
   {

      BluetoothLeService.read(mWriteCharacteristic.element());
      BluetoothLeService.set(mWriteCharacteristic.element(),true);
      mWriteCharacteristic.remove();
   };

Service メソッドでそれらを設定した後、 BluetoothLeServiceサービス クラスによって発生するさまざまなイベントを処理するために、 DeviceActivityアクティビティ クラスにブロードキャスト レシーバーが必要です。

private final BroadcastReceiver gattUpdateReceiver = new BroadcastReceiver() 
{
   @Override
   public void onReceive(Context context, Intent intent) 
   {
       // TODO Auto-generated method stub
       final String action = intent.getAction();

       if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) 
       {
           // Connection with the BLE device successful                
           ................
           ................ 
       } 
       else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) 
       {
          // BLE device is disconnected 
          ................
          ................ 
       }
       else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) 
       {
          displayGattServices(BluetoothLeService.getSupportedGattServices());
       }
       else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) 
       {
          Log.i(TAG, "Collecting data");

         ................
         ................

         // If there are more than one characteristic call this method again
         if(mWriteCharacteristic.size() > 0)
         {
            read_Characteristic();
         };
      };
   };  
};

ガイドとなるサンプル コードがさらに必要な場合は、BLE サンプル コードを参照できます。

于 2014-11-27T08:24:46.370 に答える