2016-03-22 14 views
4

同様の質問がされましたが、若干異なります。私は接続されたBLEデバイスにデータを渡す方法を知っていますが、私は助けが必要な何か間違ったことをしていると思います。 以下のコードは、BroadcastReceiverを拡張している私のクラスのすべてのメソッドを含んでいます。AndroidのBluetooth LEにデータを書き込む

  1. 「PEN_ADDRESS」で指定されたデバイスをスキャンして接続します。
  2. `onServicesDiscovered`メソッドでは、` UUID`に `abcd`を含むサービスを探します。
  3. 次に、このサービスの特性をループし、 `UUID`に特定の文字列を持つ3つの特性を探します。
  4. 第3の特徴は、writeCharac(mGatt、writeChar1,123);メソッドを呼び出すことによってデータを書き込もうとする書き込み可能な特性です。 上記のデータ123は、単にダミーデータです。

この特性への書き込みをしようとしたときに、私は自分のコードをデバッグしますがwriteCharacメソッド内のブレークポイントを置くことに、私は書き込みが成功しなかったことを示す、status値がfalseであることがわかりました。 ここに何か不足していますか?助けてください!

public class BackgroundReceiverFire extends BroadcastReceiver { 
Context context; 
private BluetoothAdapter mBluetoothAdapter; 
private BluetoothGatt mGatt; 
private BluetoothLeService mBluetoothLeService; 
private boolean mScanning; 
private final String TAG = "READING: "; 
private BluetoothDevice mDevice; 
private Handler mHandler; 
private static final int REQUEST_ENABLE_BT = 1; 
private final String PEN_ADDRESS = "FB:23:AF:42:5C:56"; 
// Stops scanning after 10 seconds. 
private static final long SCAN_PERIOD = 10000; 

    public void onReceive(Context context, Intent intent) { 
     this.context = context; 
     Toast.makeText(context, "Started Scanning", LENGTH_SHORT).show(); 
     initializeBluetooth(); 
     startScan(); 
    } 

    private void initializeBluetooth() { 
     mHandler = new Handler(); 

     // Use this check to determine whether BLE is supported on the device. Then you can 
     // selectively disable BLE-related features. 
     // Initializes a Bluetooth adapter. For API level 18 and above, get a reference to 
     // BluetoothAdapter through BluetoothManager. 
     final BluetoothManager bluetoothManager = 
       (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE); 
     mBluetoothAdapter = bluetoothManager.getAdapter(); 

     // Checks if Bluetooth is supported on the device. 
     if (mBluetoothAdapter == null) { 
      Toast.makeText(this.context, "No Bluetooth", LENGTH_SHORT).show(); 
      return; 
     } 
    } 

    private void startScan() { 
     scanLeDevice(true); 
    } 

    private void stopScan() { 
     scanLeDevice(false); 
    } 

    private void scanLeDevice(final boolean enable) { 
     if (enable) { 
      // Stops scanning after a pre-defined scan period. 
      mHandler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        mScanning = false; 
        mBluetoothAdapter.stopLeScan(mLeScanCallback); 
       } 
      }, SCAN_PERIOD); 

      mScanning = true; 
      //Scanning for the device 
      mBluetoothAdapter.startLeScan(mLeScanCallback); 
     } else { 
      mScanning = false; 
      mBluetoothAdapter.stopLeScan(mLeScanCallback); 
     } 
    } 

    private BluetoothAdapter.LeScanCallback mLeScanCallback = 
      new BluetoothAdapter.LeScanCallback() { 
       @Override 
       public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { 
        if (device.getAddress().matches(PEN_ADDRESS)) { 
         connectBluetooth(device); 
         Toast.makeText(context, "Device Found: " + device.getAddress(), Toast.LENGTH_LONG).show(); 

        } 
       } 
      }; 

    private void connectBluetooth(BluetoothDevice insulinPen) { 
     if (mGatt == null) { 
      Log.d("connectToDevice", "connecting to device: " + insulinPen.toString()); 
      mDevice = insulinPen; 
      mGatt = insulinPen.connectGatt(context, true, gattCallback); 
      scanLeDevice(false);// will stop after first device detection 
     } 
    } 

    private void enableBluetooth() { 
     if (!mBluetoothAdapter.isEnabled()) { 
      mBluetoothAdapter.enable(); 
     } 
     scanLeDevice(true); 
    } 

    private void disableBluetooth() { 
     if (mBluetoothAdapter.isEnabled()) { 
      mBluetoothAdapter.disable(); 
     } 
    } 

    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: 
        gatt.discoverServices(); 
        break; 
       case BluetoothProfile.STATE_DISCONNECTED: 
        Log.e("gattCallback", "STATE_DISCONNECTED"); 
        Log.i("gattCallback", "reconnecting..."); 
        BluetoothDevice mDevice = gatt.getDevice(); 
        mGatt = null; 
        connectBluetooth(mDevice); 
        break; 
       default: 
        Log.e("gattCallback", "STATE_OTHER"); 
        break; 
      } 

     } 

     public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
      mGatt = gatt; 
      List<BluetoothGattService> services = mGatt.getServices(); 
      Log.i("onServicesDiscovered", services.toString()); 
      Iterator<BluetoothGattService> serviceIterator = services.iterator(); 
      while(serviceIterator.hasNext()){ 
       BluetoothGattService bleService = serviceIterator.next(); 
       if(bleService.getUuid().toString().contains("abcd")){ 
        //Toast.makeText(context,"Got the service",Toast.LENGTH_SHORT); 
        BluetoothGattCharacteristic readChar1 = bleService.getCharacteristics().get(0); 
        for (BluetoothGattDescriptor descriptor : readChar1.getDescriptors()) { 
         descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE); 
         mGatt.writeDescriptor(descriptor); 
         mGatt.setCharacteristicNotification(readChar1, true); 
        } 
        //mGatt.readCharacteristic(readChar1); 

        BluetoothGattCharacteristic readChar2 = bleService.getCharacteristics().get(1); 
        for (BluetoothGattDescriptor descriptor : readChar2.getDescriptors()) { 
         descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE); 
         mGatt.writeDescriptor(descriptor); 
         mGatt.setCharacteristicNotification(readChar2, true); 
        } 
        //mGatt.readCharacteristic(readChar2); 

        BluetoothGattCharacteristic writeChar1 = bleService.getCharacteristics().get(2); 
        for (BluetoothGattDescriptor descriptor : writeChar1.getDescriptors()) { 
         descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE); 
         mGatt.writeDescriptor(descriptor); 
         mGatt.setCharacteristicNotification(writeChar1, true); 
        } 
        writeCharac(mGatt,writeChar1,123); 
       } 
      } 

      //gatt.readCharacteristic(therm_char); 

     } 
     public void writeCharac(BluetoothGatt gatt, BluetoothGattCharacteristic charac, int value){ 
      if (mBluetoothAdapter == null || gatt == null) { 
       Log.w(TAG, "BluetoothAdapter not initialized"); 
       return; 
      } 
/* 
      BluetoothGattCharacteristic charac = gattService 
        .getCharacteristic(uuid); 
*/ 
      if (charac == null) { 
       Log.e(TAG, "char not found!"); 
      } 

      int unixTime = value; 
      String unixTimeString = Integer.toHexString(unixTime); 
      byte[] byteArray = hexStringToByteArray(unixTimeString); 
      charac.setValue(byteArray); 
      boolean status = mGatt.writeCharacteristic(charac); 
      if(status){ 
       Toast.makeText(context,"Written Successfully",Toast.LENGTH_SHORT).show(); 
      }else{ 
       Toast.makeText(context,"Error writing characteristic",Toast.LENGTH_SHORT).show(); 
      } 
     } 

     public byte[] hexStringToByteArray(String s) { 
      int len = s.length(); 
      byte[] data = new byte[len/2]; 

      for(int i = 0; i < len; i+=2){ 
       data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16)); 
      } 

      return data; 
     } 

     public void onCharacteristicRead(BluetoothGatt gatt, 
             BluetoothGattCharacteristic 
               characteristic, int status) { 
      Log.i("onCharacteristicRead", characteristic.toString()); 
      String characteristicValue = characteristic.getValue().toString(); 
      Log.d("CHARACTERISTIC VALUE: ", characteristicValue); 
      gatt.disconnect(); 
     } 

     public void onCharacteristicChanged(BluetoothGatt gatt, 
              BluetoothGattCharacteristic 
                characteristic) { 
      String value = characteristic.getValue().toString(); 
      Log.d(TAG,value); 
     } 

    }; 

答えて

-2

あなたは 'writechar1' 場合はwriteCharac()nullに渡しているbtcharacteristic値をチェックしましたか?

+0

はい、それはnullではありませんでした。 – abhinavDAIICT

+0

これは質問への答えを提供しません。十分な[評判](// stackoverflow.com/help/whats-reputation)があれば、[任意の投稿にコメントする]ことができます(// stackoverflow.com/privileges/comment)。代わりに、[質問者からの説明を必要としない回答を提供する](http://meta.stackexchange.com/q/214173/165483)。 –

3

BLE APIは性質上非同期ですが、実際の信号伝送は必然的に同期しています。接続/書き込み/読み取り操作を開始する前に、コールバックへの前回の接続/書き込み/読み取り呼び出しを待たなければなりません。

コードonServicesDiscovered(BluetoothGatt gatt, int status)の機能では、特性書込を試みる前にmGatt.writeDescriptor(descriptor)を2回呼び出しました。 APIは、書き込み要求の書き込みを開始するのを拒否し、記述子の書き込み中は忙しく、mGatt.writeCharacteristic(charac)呼び出しの場合はfalseを返します。

writeCharacteristicを呼び出す前にwriteDescriptorがコールバックするのを待ちます。この性質はよく説明されていませんが、ソースherehereがあります。

+0

ありがとうございます@reTs。私はそれを試して、それが動作する場合更新します。ちょうど1つの疑問、私はまた、2つの特性( 'gatt.readCharacteristic(readChar1);と' gatt.readCharacteristic(readChar2); ')のコメント行を見てください。私は各特性の読み込み/書き込みのために、 'mGatt.writeDescriptor(descriptor)'を呼び出す必要があると考えました。私はそれを間違って理解したと思う。 – abhinavDAIICT

+0

@ abhinavDAIICT BluetoothGattDescriptor.ENABLE_INDICATION_VALUEを記述子に書き込もうとしますが、これは読み取り/書き込み処理とはまったく関係ありません。これらのコード行は、全く別のタイプの送信である特性の表示をオンにするために使用されます。 – reTs

+0

この問題は、onServicesDiscoveredコールバックの開始時にすべての値を更新しようとしたときに問題が修正され、記述子にも書き込んでいるため、特性が書き込まれませんでした。 –

0

@reTsと@poojaに感謝の意を表します。この問題は、この2つの行に起因するものです。 mGatt = null
connectBluetooth(mDevice);
はSTATE_DISCONNECTEDです。私はそれを理解したが、正確な理由を覚えていない。それが役に立つ場合に備えて投稿する。

関連する問題