2017-03-08 16 views
0

私たちは、数秒ごとにカスタムサービスのカスタム特性を更新し、BLEを使用するデバイスを用意しています。私がしたいのは、それらの更新を監視することだけです。ここでの目的は、そのデバイスに接続してからサービスに接続し、その特性を監視するために最小限のコードを書くことです。ただし、デバイスに接続できません。Android、非常に単純なBLEの例、デバイスに接続できない

Bluetoothデバイスがこの機能をスキャンすることによって発見されるたびに呼び出されます。これはgattCallBackFunctionの私の実装です

void checkDevice(BluetoothDevice device){ 
    if (targetFound) return; 
    if (device.getAddress().equals(DEVICE_ADDRESS)){ 
     logger.append("-> Target device found with name: " + device.getName() + "\n"); 
     targetFound = true; 
     targetDevice = device; 
     bleAdapter.stopLeScan(new BluetoothAdapter.LeScanCallback() { 
      @Override 
      public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { 
       logger.append("-> Scan has stopped\n"); 
      } 
     }); 

     logger.append("-> Attempting to connect to target device\n"); 
     gattConnection = targetDevice.connectGatt(this,false,gattCallBackFuntion); 
    } 
} 

これらの機能の両方が同じクラスに実装されている
private BluetoothGattCallback gattCallBackFuntion = new BluetoothGattCallback() { 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
     super.onConnectionStateChange(gatt, status, newState); 

     if (newState == BluetoothProfile.STATE_CONNECTED) { 
      Boolean gattRes = gattConnection.discoverServices(); 
      logger.append("-> Connected to GATT Server. Starting service discovery. Result: " + gattRes.toString() + "\n"); 
     } 
     else{ 
      logger.append("-> Connection state has changed but is " + newState); 
     } 
    } 

    @Override 
    public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
     super.onServicesDiscovered(gatt, status); 
     List<BluetoothGattService> services = gatt.getServices(); 
     String list = ""; 
     String tab = " "; 
     for (int i = 0; i < services.size(); i++){ 
      BluetoothGattService service = services.get(i); 
      list = list + tab + service.toString() + "\n"; 
     } 
     logger.append("-> Services Discovered: \n"); 
     logger.append(list); 
    } 
}; 

これは唯一の活動です。

私はいつか理解しているように、onConnectionStateChange関数は、Androidからデバイスへの接続を示すように呼び出さなければなりません。しかし、これは決して起こりません。アプリは "ターゲットデバイスに接続しようとしています"と表示され、他には何も言わないでください

アイデアはありますか?

+0

これは本当に機能するはずです。面白いことがあれば、HCIスヌープログやログキャットをチェックしてください。ただし、bleAdapter.stopScanの引数は、startScanで使用したものと同じコールバックオブジェクトへの参照でなければなりません。 – Emil

+0

ログを投稿してください。コードは問題ありません。 – 7383

+0

正解!ログはかなり明確でした。ブルートゥースには何の問題もありませんでした。問題はロガーライン(logger.append( " - > GATT Serverに接続しました。サービスディスカバリの開始結果:" + gattRes.toString()+ "\ n");)でした。文字列。テキストビューを更新してrunOnUiThreadから呼び出すrunnableを作成することで、この問題を解決しました。ありがとうございました。誰かがこれに対する答えを書くべきです。 PD:stopLeScanのコールバックの説明をありがとう!!! – aarelovich

答えて

0

ほとんどのBluetooth gattコールバックはバックグラウンドスレッド内で実行されるため、コールバック内でUI操作を実行しないでください。 AndroidのUIガイドラインに従ってUIスレッドですべての操作を実行する必要があります

関連する問題