2017-11-20 14 views
0

私は自分のアプリでBLE centralを実装しました。 手順:BLE onServicesDiscovered()特性を返さない配列

  1. はBluetoothManager

    mBluetoothManager =(BluetoothManager)mContext.getSystemService(Context.BLUETOOTH_SERVICE)を取得します。

    mBluetoothAdapter = mBluetoothManager.getAdapter();デバイス用

  2. スキャン

  3. 接続デバイス

    mGatt = bluetoothDevice.connectGatt(この偽、gattCallback)。

  4. ハンドルコールバックおよびデバイスは、私はサービスを発見するためにコールを作っています接続されると、サービス発見

を開始します。

gatt.discoverServices(); 

サービスが発見されたら、私は

private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() { 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
     Log.i("onConnectionStateChange", "Status: " + status); 
     switch (newState) { 
      case BluetoothProfile.STATE_CONNECTED: 
       Log.i("gattCallback", "STATE_CONNECTED"); 
       gatt.discoverServices(); 
       break; 

      case BluetoothProfile.STATE_DISCONNECTED: 
       mGatt = null; 
       mBluetoothSingleTonClass.saveGatt(mGatt); 
       deviceDisconnected(); 
       Log.e("gattCallback", "STATE_DISCONNECTED"); 
       break; 

      case BluetoothProfile.STATE_CONNECTING : 
       Log.e("gattCallback", "STATE_CONNECTING"); 
       break; 

      default: 
       Log.e("gattCallback", "STATE_OTHER"); 
     } 
    } 

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

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

     Log.d("onServicesDiscovered", "uuid::" + gatt.getServices().get(0).getUuid()); 
     Log.d("onServicesDiscovered", "uuid::" + gatt.getServices().get(1).getUuid()); 
     Log.d("onServicesDiscovered", "uuid::" + gatt.getServices().get(2).getUuid()); 

     Log.d("onServicesDiscovered", "chars::" + gatt.getServices().get(2).getCharacteristics().size()); 
     Log.d("onServicesDiscovered", "chars::" + gatt.getServices().get(0).getCharacteristics().size()); 
     Log.d("onServicesDiscovered", "chars::" + gatt.getServices().get(1).getCharacteristics().size()); 


    } 
}; 

でそれをキャッチしています問題はであるGATTは私のデバイスが持っているすべてのサービスを提供しますが、それは少数の携帯に空特性配列を与えています。 例:gatt.getServices().get(0).getCharacteristics().size() これはNexusでうまくいきましたが、数日後に空の配列、つまりサイズがゼロになりました。 何か間違っていますか?これは携帯電話の問題ですか?参照リンクは参考になります。

+0

コードを添付してください –

答えて

0

検出手順中にデバイスが切断されると、空の(または短すぎる)リストが表示されることがあります。コールバック内のステータスコードをチェックし、サービスが0(成功)である場合にのみサービスが有効であると仮定してください。

+0

はい私もそれをチェックしました。 if(status == BluetoothGatt.GATT_SUCCESS){ Log.w(TAG、 "onServicesDiscovered success:" + status); } else { Log.w(TAG、 "onServicesDiscovered failure:" + status); }それは0を与えている –

+0

その場合、携帯電話のBluetoothスタックがバグかもしれないもの。 HCIスヌープログを調べて、サービスが正しく報告されているかどうかを確認する必要がありますが、スタックは後で不正なサービスを報告します。 – Emil

+0

私は適切なサービスを受けています。問題は特性IDにあります。それは0を与えています。また、周辺機器に接続するのにもっと時間がかかります。これには解決策がありますか? –

関連する問題