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