2017-10-12 15 views
0

私は+/- 120 BLE GATTサーバーを接続する必要があるAndroidアプリケーションを開発しています。これらのサーバーのうち少なくとも3つはまったく同じサービスおよび特性。私はすべての標準とデフォルトのパターンに従っていても、Android BLEのあらゆる種類の問題を経験してきました。Android BLE onCharacteristic Bluetoothが原因で間違ったステータスが表示されなくなりました

「Bluetoothが動作を停止しました」という理由で、毎日タブレットをデフォルト設定にリセットしなければならないことが毎日起こります。その原因はわかりません。 これは毎日このタイプのメンテナンス(ハードリセット)に耐えることができない非常にイライラしています。

最初はAndroid SDK 18のBLEを試しましたが、これは非常に奇妙な方法で動作し、わずか1日の使用で悪い結果を示していました。 私は、Android BLEを操作するLollipopバージョンを使い始めました。これはいくつかの改善点を示しています。

たとえば、onCharacteristicReadが返され、データがnullのような予期せぬ結果が発生したため、これらの問題が数日間発生しました。 たとえば、onServicesDiscovered()が呼び出されたのにgetServices()がnullを返した後、STATE_CONNECTEDを指定してonConnectionStateChangedの後にdiscoverServices()を呼び出します。 これらの問題はすべて、最初のサーバーから切断した後にのみ発生します。最初に接続したサーバーはすべてを正しく読み書きしますが、disconnect()とonConnectionStateChanged()の後にclose()を実行します。そこで、私は次のサーバーに接続し、これらの問題が発生し始めます(すべてのGATT操作はメインスレッド上にあり、すべての接続は適切に処理され、適切に処理されています)ので、切断して接続する必要があります。属性は適切です。

私は読むべき3つの特徴があり、3番目のものを読んだ後、私は3つの特徴を書き始めます。

私はブルートゥースログを通過しましたが、予想外のことが起こっているのが見えます。このログは、アプリが正常にすべてを読み込むとき(それはいつもと唯一のアプリケーションが接続する最初のGATTサーバです)です:

10-11 09:08:05.350 15989-15989/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-11 09:08:05.350 15989-15989/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-11 09:08:05.350 15989-15989/efp.android.sample D/BluetoothLeScanner: Start Scan 
10-11 09:08:05.351 15989-15989/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-11 09:08:05.352 15989-15989/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-11 09:08:05.353 15989-15989/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-11 09:08:05.354 15989-15989/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-11 09:08:05.362 15989-15994/efp.android.sample I/art: Do partial code cache collection, code=48KB, data=60KB 
10-11 09:08:05.362 15989-15994/efp.android.sample I/art: After code cache collection, code=48KB, data=60KB 
10-11 09:08:05.362 15989-15994/efp.android.sample I/art: Increasing code cache capacity to 256KB 
10-11 09:08:05.457 15989-16002/efp.android.sample D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5 mClientIf=0 
10-11 09:08:05.513 15989-15989/efp.android.sample W/IInputConnectionWrapper: getCursorCapsMode on inactive InputConnection 
10-11 09:08:05.681 15989-16023/efp.android.sample D/ScanRecord: parseFromBytes 
10-11 09:08:05.681 15989-15989/efp.android.sample D/LAURASTAR_BLE: onScanResult 
10-11 09:08:05.682 15989-15989/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-11 09:08:05.683 15989-15989/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-11 09:08:05.684 15989-15989/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-11 09:08:05.685 15989-15989/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-11 09:08:05.685 15989-15989/efp.android.sample D/BluetoothLeScanner: Stop Scan 
10-11 09:08:05.692 15989-15989/efp.android.sample D/BluetoothGatt: connect() - device: F5:8E:C1:91:DC:CC, auto: false 
10-11 09:08:05.692 15989-15989/efp.android.sample D/BluetoothAdapter: isSecureModeEnabled 
10-11 09:08:05.699 15989-15989/efp.android.sample D/BluetoothGatt: registerApp() 
10-11 09:08:05.699 15989-15989/efp.android.sample D/BluetoothGatt: registerApp() - UUID=ebf41986-8aad-4796-a537-7319c00f0f46 
10-11 09:08:05.802 15989-16002/efp.android.sample D/BluetoothGatt: onClientRegistered() - status=0 clientIf=5 
10-11 09:08:06.332 15989-16001/efp.android.sample D/LAURASTAR_BLE: onConnectionStateChange: 
10-11 09:08:06.332 15989-16001/efp.android.sample D/BluetoothGatt: discoverServices() - device: F5:8E:C1:91:DC:CC 
10-11 09:08:06.343 15989-16002/efp.android.sample D/BluetoothGatt: onSearchComplete() = Device=F5:8E:C1:91:DC:CC Status=0 
10-11 09:08:06.343 15989-16002/efp.android.sample D/LAURASTAR_BLE: onServicesDiscovered: 
10-11 09:08:07.143 15989-16002/efp.android.sample W/BluetoothGatt: onCharacteristicRead() - Device=F5:8E:C1:91:DC:CC handle=51 Status=0 
10-11 09:08:07.233 15989-16002/efp.android.sample W/BluetoothGatt: onCharacteristicRead() - Device=F5:8E:C1:91:DC:CC handle=14 Status=0 
10-11 09:08:07.324 15989-16023/efp.android.sample W/BluetoothGatt: onCharacteristicRead() - Device=F5:8E:C1:91:DC:CC handle=23 Status=0 
10-11 09:08:08.136 15989-16023/efp.android.sample D/BluetoothGatt: cancelOpen() - device: F5:8E:C1:91:DC:CC 
10-11 09:08:08.146 15989-16001/efp.android.sample D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=5 device=F5:8E:C1:91:DC:CC 
10-11 09:08:08.151 15989-16001/efp.android.sample D/LAURASTAR_BLE: onConnectionStateChange: 
10-11 09:08:08.265 15989-15989/efp.android.sample D/BluetoothGatt: close() 
10-11 09:08:08.266 15989-15989/efp.android.sample D/BluetoothGatt: unregisterApp() - mClientIf=5 

二GATTサーバーに接続するための最初のGATTサーバーから切断した後、私はに常に持っています読取り特性を切断して再接続します。ただし、常に最初の特性が正しく読み取られます。

読み取りにエラーが発生した場合のログです。読み込みにエラーがある場合は、切断して再接続する必要があります(再接続後に読み込みにエラーがあっても、終了して再度スキャンして試します)。このログで

10-12 08:03:48.133 30409-30409/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-12 08:03:48.133 30409-30409/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-12 08:03:48.134 30409-30409/efp.android.sample D/BluetoothLeScanner: Start Scan 
10-12 08:03:48.134 30409-30409/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-12 08:03:48.137 30409-30409/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-12 08:03:48.260 30409-31121/efp.android.sample D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=6 mClientIf=0 
10-12 08:03:48.391 30409-30422/efp.android.sample D/ScanRecord: parseFromBytes 
10-12 08:03:48.395 30409-30409/efp.android.sample D/LAURASTAR_BLE: onScanResult 
10-12 08:03:48.397 30409-30409/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-12 08:03:48.397 30409-30409/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-12 08:03:48.398 30409-30409/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-12 08:03:48.399 30409-30409/efp.android.sample D/BluetoothAdapter: STATE_ON 
10-12 08:03:48.399 30409-30409/efp.android.sample D/BluetoothLeScanner: Stop Scan 
10-12 08:03:48.410 30409-30409/efp.android.sample D/BluetoothGatt: connect() - device: F5:8E:C1:91:DC:CC, auto: false 
10-12 08:03:48.410 30409-30409/efp.android.sample D/BluetoothAdapter: isSecureModeEnabled 
10-12 08:03:48.411 30409-30409/efp.android.sample D/BluetoothGatt: registerApp() 
10-12 08:03:48.411 30409-30409/efp.android.sample D/BluetoothGatt: registerApp() - UUID=ce6919e5-e4f7-4180-a313-557e168a7c5a 
10-12 08:03:48.514 30409-30422/efp.android.sample D/BluetoothGatt: onClientRegistered() - status=0 clientIf=6 
10-12 08:03:48.745 30409-31121/efp.android.sample D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=6 device=F5:8E:C1:91:DC:CC 
10-12 08:03:48.755 30409-31121/efp.android.sample D/BluetoothGatt: discoverServices() - device: F5:8E:C1:91:DC:CC 
10-12 08:03:48.915 30409-30414/efp.android.sample I/art: Do partial code cache collection, code=19KB, data=28KB 
10-12 08:03:48.916 30409-30414/efp.android.sample I/art: After code cache collection, code=19KB, data=28KB 
10-12 08:03:48.916 30409-30414/efp.android.sample I/art: Increasing code cache capacity to 128KB 
10-12 08:03:48.982 30409-30422/efp.android.sample D/BluetoothGatt: onClientConnParamsChanged() - Device=F5:8E:C1:91:DC:CC interval=6 status=0 (I DONT THINK THIS SHOULD HAPPEN) 
10-12 08:03:49.688 30409-30421/efp.android.sample D/BluetoothGatt: onSearchComplete() = Device=F5:8E:C1:91:DC:CC Status=0 
10-12 08:03:49.689 30409-30421/efp.android.sample D/LAURASTAR_BLE: onServicesDiscovered: 
10-12 08:03:49.711 30409-30422/efp.android.sample D/BluetoothGatt: onClientConnParamsChanged() - Device=F5:8E:C1:91:DC:CC interval=36 status=0 
10-12 08:03:50.467 30409-31121/efp.android.sample W/BluetoothGatt: onCharacteristicRead() - Device=F5:8E:C1:91:DC:CC handle=51 Status=0 
10-12 08:03:50.557 30409-30422/efp.android.sample W/BluetoothGatt: onCharacteristicRead() - Device=F5:8E:C1:91:DC:CC handle=14 Status=5 (status NOT SUCCESS ...) 
10-12 08:03:50.830 30409-30422/efp.android.sample D/BluetoothGatt: onClientConnParamsChanged() - Device=F5:8E:C1:91:DC:CC interval=6 status=0 
10-12 08:03:51.533 30409-31121/efp.android.sample W/BluetoothGatt: onCharacteristicRead() - Device=F5:8E:C1:91:DC:CC handle=14 Status=137 (status NOT SUCCESS ...) 
10-12 08:03:51.533 30409-31121/efp.android.sample D/LAURASTAR_BLE: Data is empty. (null) 
10-12 08:03:51.533 30409-31121/efp.android.sample D/BluetoothGatt: cancelOpen() - device: F5:8E:C1:91:DC:CC 
10-12 08:03:51.561 30409-30422/efp.android.sample D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=6 device=F5:8E:C1:91:DC:CC 
10-12 08:03:51.565 30409-30422/efp.android.sample D/LAURASTAR_BLE: onConnectionStateChange: 
10-12 08:03:51.565 30409-30422/efp.android.sample D/BluetoothAdapter: isSecureModeEnabled 
10-12 08:03:51.609 30409-31121/efp.android.sample D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=6 device=F5:8E:C1:91:DC:CC 
10-12 08:03:51.610 30409-31121/efp.android.sample D/LAURASTAR_BLE: onConnectionStateChange: 
10-12 08:03:51.610 30409-31121/efp.android.sample D/BluetoothGatt: discoverServices() - device: F5:8E:C1:91:DC:CC 
10-12 08:04:01.091 30409-31121/efp.android.sample D/BluetoothGatt: onSearchComplete() = Device=F5:8E:C1:91:DC:CC Status=0 
10-12 08:04:01.091 30409-31121/efp.android.sample D/LAURASTAR_BLE: onServicesDiscovered: 
10-12 08:04:02.048 30409-31121/efp.android.sample W/BluetoothGatt: onCharacteristicRead() - Device=F5:8E:C1:91:DC:CC handle=51 Status=0 
10-12 08:04:02.438 30409-30421/efp.android.sample W/BluetoothGatt: onCharacteristicRead() - Device=F5:8E:C1:91:DC:CC handle=14 Status=0 
10-12 08:04:02.829 30409-30421/efp.android.sample W/BluetoothGatt: onCharacteristicRead() - Device=F5:8E:C1:91:DC:CC handle=23 Status=0 
10-12 08:04:02.898 30409-30414/efp.android.sample I/art: Do partial code cache collection, code=48KB, data=61KB 
10-12 08:04:02.899 30409-30414/efp.android.sample I/art: After code cache collection, code=48KB, data=61KB 
10-12 08:04:02.899 30409-30414/efp.android.sample I/art: Increasing code cache capacity to 256KB 
10-12 08:04:04.389 30409-30422/efp.android.sample D/BluetoothGatt: cancelOpen() - device: F5:8E:C1:91:DC:CC 
10-12 08:04:04.402 30409-30421/efp.android.sample D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=6 device=F5:8E:C1:91:DC:CC 
10-12 08:04:04.406 30409-30421/efp.android.sample D/LAURASTAR_BLE: onConnectionStateChange: 
10-12 08:04:04.502 30409-30409/efp.android.sample V/InputMethodManager: Starting input: [email protected] nm : efp.android.sample [email protected] 
10-12 08:04:04.502 30409-30409/efp.android.sample I/InputMethodManager: [IMM] startInputInner - mService.startInputOrWindowGainedFocus 
10-12 08:04:04.503 30409-30409/efp.android.sample D/InputTransport: Input channel constructed: fd=70 
10-12 08:04:04.503 30409-30409/efp.android.sample D/InputTransport: Input channel destroyed: fd=73 
10-12 08:04:04.519 30409-30409/efp.android.sample D/BluetoothGatt: close() 
10-12 08:04:04.520 30409-30409/efp.android.sample D/BluetoothGatt: unregisterApp() - mClientIf=6 

、これはsuccessfuly第一の特徴を読んだ後に、表示される:次いで

W/BluetoothGatt: onCharacteristicRead() - Device=F5:8E:C1:91:DC:CC handle=14 Status=5 

そしてonClientConnParamsChangedが(discoverServices後呼ばれる)と呼ばれ、そしてonServicesDiscovered前()が呼び出されます。アプリはスキャンし、それを見つけることができますので、ユーザが所望のサーバのMACアドレスを受信することによって、

スタート:

すべての私のコードが正しいように思わ... だからロジックは次のようです。

私はEditTextに実装されたTextWatcherを持っているので、ユーザーがMACアドレスを挿入すると、アプリケーションはアドレスが挿入されたBLEデバイスを探します。

String macToFind = ""; 
private class ScanIronFieldsTextWatcher implements TextWatcher { 

    View view; 
    public ScanIronFieldsTextWatcher(View view) { this.view = view; } 

    @Override 
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 

    @Override 
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 


    public void afterTextChanged(Editable editable) { 

     switch (view.getId()) { 
      case R.id.txt_mac_address: { 
       String originalText = txtMacAddress.getText().toString().toUpperCase(); 
       String macToFind = Tools.getValidMacAddress(originalText); 
       if(mConnectedGatt != null && mConnectedGatt.getDevice().getAddress().equals(macToFind)) { 
        mConnectedGatt.connect(); 
       } 
       else { 
        if(mConnectedGatt != null) { 
         mConnectedGatt.close(); 
         mConnectedGatt = null; 
        } 

        //Search mac address 
        writeToActivityLog("Looking for " + macToFind +"...", LogAdapter.MESSAGE_TYPE_NORMAL); 
        hideKeyboard(); 
        startScan(); 
       } 
      } 
     } 
    } 
} 

ユーザーがmacアドレスを挿入すると、startScan()が開始されます。

STARTSCANは()

private void startScan() { 
     if (!mBluetoothAdapter.isEnabled()) { 
      writeToActivityLog("Bluetooth is off!", LogAdapter.MESSAGE_TYPE_ERROR); 
      return; 
     } 
     try { 
      ScanFilter scanFilter = new ScanFilter.Builder().setDeviceAddress(macToFind).build(); 
      ArrayList<ScanFilter> filters = new ArrayList<ScanFilter>(); 
      filters.add(scanFilter); 

      ScanSettings settings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_BALANCED).build(); 
      mBluetoothAdapter.getBluetoothLeScanner().startScan(filters, settings, mScanCallback); 


      retryingHandler = new Handler(); 
      retryingHandler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        showProgress(false); 
        stopScan(); 

        if (mDevices.size() == 0) { 
         writeToActivityLog("Server not found.", LogAdapter.MESSAGE_TYPE_ERROR); 
        } else { 
         mDevices.clear(); 
        } 
       } 
      }, SCAN_TIME); 
     } catch (IllegalArgumentException e) { 
      writeToActivityLog("Invalid Address!", LogAdapter.MESSAGE_TYPE_ERROR); 
     } 
    } 

mScanCallback:

private ScanCallback mScanCallback = new ScanCallback() { 
     @Override 
     public void onScanResult(int callbackType, ScanResult result) { 
      Log.d(TAG, "onScanResult"); 
      processResult(result); 
     } 

     @Override 
     public void onBatchScanResults(List<ScanResult> results) { 
      Log.d(TAG, "onBatchScanResults: "+results.size()+" results"); 
      for (ScanResult result : results) { 
       processResult(result); 
      } 
     } 

     @Override 
     public void onScanFailed(int errorCode) { Log.w(TAG, "LE Scan Failed: "+errorCode); } 

     private void processResult(final ScanResult result) { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        if(mConnectedGatt == null) { 
         stopScan(); 
         final BluetoothDevice device = result.getDevice(); 
         mDevices.put(device.hashCode(), device); 

         writeToActivityLog("Server found!", LogAdapter.MESSAGE_TYPE_NORMAL); 
         writeToActivityLog("Connecting to " + macToFind + "...", LogAdapter.MESSAGE_TYPE_NORMAL); 

         mConnectedGatt = device.connectGatt(NewDeviceControlActivity.this, false, mGattCallback); 
         retryingHandler.removeCallbacksAndMessages(null); 
        } 
       } 
      }); 
     } 
    }; 

mGattCallback

private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { 
     @Override 
     public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
      super.onConnectionStateChange(gatt, status, newState); 

      if (newState == BluetoothProfile.STATE_CONNECTED) { 
       writeToActivityLog("Connected.", LogAdapter.MESSAGE_TYPE_SUCCESS); 
       mConnected = true; 

       if(!gatt.discoverServices()) { 
        writeToActivityLog("Impossible discoverServices().", LogAdapter.MESSAGE_TYPE_ERROR); 
        if(!retrying) 
         retrying = true; 
        mConnectedGatt.disconnect(); 
       } 
      } 
      else if(newState == BluetoothProfile.STATE_DISCONNECTED) { 

       writeToActivityLog("Disconnected.", LogAdapter.MESSAGE_TYPE_NORMAL); 
       if(!currentIron.hasCompletedSetup()) { 
        showProgress(true); 

        if(retrying) { 
         writeToActivityLog("Trying again...", LogAdapter.MESSAGE_TYPE_NORMAL); 
         if(mConnectedGatt != null) 
          mConnectedGatt.connect(); 
        } 
        else { 
         writeToActivityLog("Trying again but also scanning again... (r)", LogAdapter.MESSAGE_TYPE_NORMAL); 
         retrying = false; 
         if(mConnectedGatt != null) 
          mConnectedGatt.close(); 
         mHandler.postDelayed(new Runnable() { 
          @Override 
          public void run() { 
           startScan(); 
          } 
         }, 2000); 
        } 
       } 
      } 
     } 

     @Override 
     public void onServicesDiscovered(final BluetoothGatt gatt, int status) { 
      super.onServicesDiscovered(gatt, status); 
      Log.d(TAG, "onServicesDiscovered:"); 

      mHandler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        startObtainingIronData(gatt); 
       } 
      }, 700); 
     } 

     @Override 
     public void onCharacteristicRead(BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic, final int status) { 
      super.onCharacteristicRead(gatt, characteristic, status); 


      byte[] data = characteristic.getValue(); 
      if(status != BluetoothGatt.GATT_SUCCESS) { 
       runOnUiThread(new Runnable() { @Override public void run() {Toast.makeText(NewDeviceControlActivity.this, ("BluetoothGatt: Response != GATT_SUCCESS ("+status+")."), Toast.LENGTH_SHORT).show();}}); 
      } 

      if (characteristic.getUuid().toString().contains(Iron.IRON_CODES[4])) { 
       //First characteristic read succesfully 
       final String version = new String(data); 
       runOnUiThread(new Runnable() { @Override public void run() {Toast.makeText(NewDeviceControlActivity.this, ("Version "+version), Toast.LENGTH_SHORT).show();}}); 

       //Request to read second characteristic 
       BluetoothGattCharacteristic characteristic2 = getCharacteristic(gatt, Iron.IRON_CODES[0]); 
       gatt.readCharacteristic(characteristic2); 
      } 
      else if (characteristic.getUuid().toString().contains(Iron.IRON_CODES[0])) { 
       //Read second characteristic 
       if(data == null || data.length == 0) { //returns with status=137 
        Log.d(TAG, "Data is empty " + (data == null ? "(null)" : data));//This ALWAYS happens except the first server the app connects too 
        writeToActivityLog("Data is empty. "+ (data == null ? "(null)" : data), LogAdapter.MESSAGE_TYPE_ERROR); 
        if(!retrying) 
         retrying = true; 
        mConnectedGatt.disconnect(); 
        return; 
       } 
       else { 
        if (data[2] == 4) { 
         //Request to read third characteristic 
         BluetoothGattCharacteristic characteristic2 = getCharacteristic(gatt, Iron.IRON_CODES[1]); 
         if(characteristic2 != null) 
          gatt.readCharacteristic(characteristic2); 
         else { 
          writeToActivityLog("Impossible readCharacteristic Machine Type" , LogAdapter.MESSAGE_TYPE_ERROR); 
          if(!retrying) 
           retrying = true; 

          mConnectedGatt.disconnect(); 
         } 
        } 
       } 
      } 
      else if (characteristic.getUuid().toString().contains(Iron.IRON_CODES[1])) { 
       //Read third characteristic 
       if(data[0] == 0) { 
        BluetoothGattCharacteristic characteristic2 = getCharacteristic(gatt, Iron.IRON_CODES[2]); 
        long now = System.currentTimeMillis(); 
        byte[] nowBytes = new byte[]{(byte) ((int) (now & 255L)), (byte) ((int) (now >> 8)), (byte) ((int) (now >> 16)), (byte) ((int) (now >> 24))}; 
        characteristic2.setValue(nowBytes); 

        writeToActivityLog("Read all information succesfully.", LogAdapter.MESSAGE_TYPE_NORMAL); 

        //Request to write first characteristic 
        if (!gatt.writeCharacteristic(characteristic2)){ 
         writeToActivityLog("Impossible to write timestamp.", LogAdapter.MESSAGE_TYPE_ERROR); 
         if(!retrying) 
          retrying = true; 
         mConnectedGatt.disconnect(); 
        } 

       } 
      } 
     } 

     @Override 
     public void onCharacteristicWrite(final BluetoothGatt gatt, BluetoothGattCharacteristic characteristic2, int status) { 
      super.onCharacteristicWrite(gatt, characteristic2, status); 

      if(status == BluetoothGatt.GATT_SUCCESS) { 
       showProgress(false); 

       if(characteristic2.getUuid().toString().contains(Iron.IRON_CODES[2])) { 

        //Wrote first characteristic 
        String intToWrite = "0x01"; 
        BluetoothGattCharacteristic characteristic = getCharacteristic(gatt, Iron.IRON_CODES[1]); 
        characteristic.setValue(Integer.decode(intToWrite), BluetoothGattCharacteristic.FORMAT_UINT8, 0); 

        //Request to write second characteristic 
        if (!gatt.writeCharacteristic(characteristic)) { 
         writeToActivityLog("Impossible to write first characteristic!.", LogAdapter.MESSAGE_TYPE_ERROR); 
         if(!retrying) 
          retrying = true; 
         mConnectedGatt.disconnect(); 
        } 
       } 
       else if(characteristic2.getUuid().toString().contains(Iron.IRON_CODES[1])) { 

         //Wrote second characteristic 
         service.sendData(), new Callback<String>() { 
            @Override 
            public void onResponse(Call<String> call, Response<String> response) { 

              //Write third characteristic 
              BluetoothGattCharacteristic characteristic = getCharacteristic(gatt, Iron.IRON_CODES[3]); 
              characteristic.setValue(0x40, android.bluetooth.BluetoothGattCharacteristic.FORMAT_UINT8, 0); 
              gatt.writeCharacteristic(characteristic); 


            } 
            @Override 
            public void onFailure(Call<String> call, Throwable t) { 

             if(mConnectedGatt != null) 
              mConnectedGatt.disconnect(); 
            } 
           }); 
         } 
       } 
       else if(characteristic2.getUuid().toString().contains(Iron.IRON_CODES[3])) { 
        //Wrote third characteristic 
        writeToActivityLog("Data written successfully.", LogAdapter.MESSAGE_TYPE_SUCCESS); 

        if(mConnectedGatt != null) 
         mConnectedGatt.disconnect(); 
       } 

      } 
     } 
    }; 

私がトライを持っていますrunOnUIThread内のすべてのmConnectedGatt操作を実行していましたが、同じ結果でした。すべての特性UUIDは正しいものであり、書かれている特性はであり、同じものは読み取られていません。

私は、GATTサーバーがアプリケーションから「歩いている」という問題や、あまりにも遠すぎないという問題はありません。 私は3台のSamsung Galaxy Tab A 10.1 2016でソフトウェアを実行していますが、 はすべて同じ結果を返します。

だから私の結果は基本的にこれらは:期待

(唯一のアプリケーションが接続する最初のサーバーで発生する):見つけMAC

  • サーバーを探してい

    • に接続してください。MAC
    • 接続しました。
    • (第一の特徴を読み取る)バージョン:
    • (第2の特性を読み取る)
    • (第3の特徴を読み取る)
    • (第一の特徴を記述)
    • (第2の特性を記述する)
    • (第3の特徴を記述する)
    • 接続されていません。何が起こる

    (別のサーバーに接続しようとする):

    • はMAC
    • 探し

      サーバ発見!
    • に接続してください。MAC
    • 接続しました。
    • (最初の特性を読み取る)バージョン:
    • データが空です! (ヌル)
    • 接続されていません。
    • もう一度やり直してください...
    • 接続しました。
    • (第一の特徴を読み取る)バージョン:
    • (第2の特性を読み取る)
    • (第3の特徴を読み取る)
    • (第一の特徴を記述)
    • (第2の特性を記述する)
    • (第3の特徴を記述する)
    • 接続されていません。

    私は多くの再接続を推測していますが、これは「Bluetoothが動作を停止しました」原因です。 私はなぜこれが起こっているのか理解できません!

    、誰かが私に何が起こっているかを把握するのに役立ついくつかの時間を過ごすことができれば、私はそう はあなたに

  • +1

    プロジェクトに新しいbleサービスを追加しましたか?それが可能であれば、あなたはブルートゥースキャッシュを消去しようとすることができます。設定 - >アプリケーションに移動し、右上のmoreアイコンをクリックします。システムアプリをクリックします。リストからBluetoothを選択します。ストレージをクリアします。 (ときどき初めてキャッシュをクリアしない場合は、このボタンを2回クリックしてください) 問題が解決したらうれしいです – hasbi

    +0

    @hasbi新しいbleサービスはどういう意味ですか? – Firecat

    +0

    新しい特性を追加することを意味します – hasbi

    答えて

    0

    ありがとう。これは私のために働いた...いただければ幸いしてください: -

    http://www.java2s.com/Open-Source/Android_Free_Code/Development/sdk/io_relayr_ble_serviceBluetoothGattReceiver_java.htm

    これはRxライブラリを使用しています。次の依存関係を試してください: -

    コンパイル "com.polidea.rxandroidble:rxandroidble:1.4.2"

    実装 'io.reactivex.rxjava2:rxjava:2.1.5'

    実装「IO .reactivex.rxjava2:rxandroid:2.0.1 '

    関連する問題