Android BLE受信のセットのピット

3511 ワード

Bluetooth受信フレームは、TI CC 2541で正常に動作、受信はNotify文字で受信.
このCharacteristicを検索後、以下の方法で通知を設定することができる.
boolean ret = mBluetoothGatt.setCharacteristicNotification(mRxChar,true);
その後、Bluetoothコールバック関数での受信データ
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic)
しかし、このコードをNORDIC 51822に切り替える環境では、スキャン、結合、送信が可能であるが、受信することはできない.
Nordicの公式のnRF ToolBoxのソースコードでは、分析を調べた結果、setCharacteristicNotification()がNotify受信通知を本当に開くことができないことが分かった.その初期化方法を取り出してBluetoothライブラリの中に置いて、試してみるとやはり受信できて、特の記録の下で、その中のenableNotificationsはnRFの初期化方法で、


 private static final UUID CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");
 /**
  * Enables notifications on given characteristic
  *
  * @return true is the request has been sent, false if one of the arguments was null or the characteristic does not have the CCCD.
  */
 protected final boolean enableNotifications(final BluetoothGattCharacteristic characteristic) {
  final BluetoothGatt gatt = mBluetoothGatt;
  if (gatt == null || characteristic == null)
   return false;

  // Check characteristic property
  final int properties = characteristic.getProperties();
  if ((properties & BluetoothGattCharacteristic.PROPERTY_NOTIFY) == 0)
   return false;

  Log.d("BLE", "gatt.setCharacteristicNotification(" + characteristic.getUuid() + ", true)");
  gatt.setCharacteristicNotification(characteristic, true);
  final BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID);
  if (descriptor != null) {
   descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
   Log.v("BLE", "Enabling notifications for " + characteristic.getUuid());
   Log.d("BLE", "gatt.writeDescriptor(" + CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID + ", value=0x01-00)");
   return gatt.writeDescriptor(descriptor);
  }
  return false;
 }

 /**
  * Enables indications on given characteristic
  *
  * @return true is the request has been sent, false if one of the arguments was null or the characteristic does not have the CCCD.
  */
 protected final boolean enableIndications(final BluetoothGattCharacteristic characteristic) {
  final BluetoothGatt gatt = mBluetoothGatt;
  if (gatt == null || characteristic == null)
   return false;

  // Check characteristic property
  final int properties = characteristic.getProperties();
  if ((properties & BluetoothGattCharacteristic.PROPERTY_INDICATE) == 0)
   return false;

  Log.d("BLE", "gatt.setCharacteristicNotification(" + characteristic.getUuid() + ", true)");
  gatt.setCharacteristicNotification(characteristic, true);
  final BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID);
  if (descriptor != null) {
   descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
   Log.v("BLE", "Enabling indications for " + characteristic.getUuid());
   Log.d("BLE", "gatt.writeDescriptor(" + CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID + ", value=0x02-00)");
   return gatt.writeDescriptor(descriptor);
  }
  return false;
 }

保険のために、両方の初期化方法を書きます.これで、BluetoothライブラリはTIとNodicで正常に受信できます.
mBluetoothGatt.setCharacteristicNotification(mRxChar,true);//nRFチップはこのenableNotifications(mRxChar)を持っていなければならない.