对于一个项目,我想通过BLE 4.2(带有DLE)发送加速度数据。加速包包含81个值(每个24位,共243个字节)。我的目标是发送18个数据包(1458个加速数据包或4374个字节)。我使用Samsung Galaxy A3 2017 Edition作为中央设备,并使用微控制器(nRF52832dk)作为外围设备。发送完所有数据包后,将终止与智能手机的连接,并记录新的1458加速数据包。之后,RTC会在nRF52832dk上激活睡眠模式1分钟。 1分钟后,nRF52832dk将进行广告宣传以与智能手机建立新连接。下图说明了该问题:
nRF52832dk上的软件运行正常。我能够记录数据,进入睡眠模式,在1分钟后唤醒,并宣传新的连接。我的问题是软件应用程序。我使用这些教程:
•https://github.com/googlesamples/android-BluetoothLeGatt
•https://developer.android.com/guide/topics/connectivity/bluetooth-le
在BluetoothLeGatt中,我已更改:
mBluetoothGatt = device.connectGatt(this,true,mGattCallback);
当第二个参数为true时,智能手机可能会自动连接。正常(对于与nRF的首次连接)
最初是: mBluetoothGatt = device.connectGatt(this,false,mGattCallback);
建立连接后,GATT处理程序将调用回调例程。
// Implements callback methods for GATT events that the app cares about. For example,
// connection change and services discovered.
private final BluetoothGattCallback mGattCallback =
new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
String intentAction;
if (newState == BluetoothProfile.STATE_CONNECTED) {
intentAction = ACTION_GATT_CONNECTED;
mConnectionState = STATE_CONNECTED;
broadcastUpdate(intentAction);
Log.i(TAG, "Connected to GATT server.");
// Attempts to discover services after successful connection.
Log.i(TAG, "Attempting to start service discovery:" +
mBluetoothGatt.discoverServices());
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
intentAction = ACTION_GATT_DISCONNECTED;
mConnectionState = STATE_DISCONNECTED;
Log.i(TAG, "Disconnected from GATT server.");
broadcastUpdate(intentAction);
}
}
@Override
// New services discovered
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
} else {
Log.w(TAG, "onServicesDiscovered received: " + status);
}
}
@Override
// Result of a characteristic read operation
public void onCharacteristicRead(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic,
int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}
}
@Override
// Change in the characteristic
public void onCharacteristicChanged(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic) {
broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}
}; </i>
建立连接并接收到第一个数据包后,我进入broadcastUpdate
<i>private void broadcastUpdate(final String action,
final BluetoothGattCharacteristic characteristic) {
final Intent intent = new Intent(action);
// This is special handling for the nRF52 profile. Data parsing is
// carried out as per profile specifications:
// http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml
if (UUID_NRF.equals(characteristic.getUuid())) {
byte[] data = characteristic.getValue();
if (data != null && data.length > 0) {
final StringBuilder stringBuilder = new StringBuilder(data.length);
for(byte byteChar : data)
stringBuilder.append(String.format("%02X ", byteChar));
intent.putExtra(EXTRA_DATA, new String(data) + "\n" + stringBuilder.toString());
}
} else {
// For all other profiles, writes the data formatted in HEX.
final byte[] data = characteristic.getValue();
if (data != null && data.length > 0) {
final StringBuilder stringBuilder = new StringBuilder(data.length);
for(byte byteChar : data)
stringBuilder.append(String.format("%02X ", byteChar));
intent.putExtra(EXTRA_DATA, new String(data) + "\n" + stringBuilder.toString());
}
}
sendBroadcast(intent);
}
现在我遇到了两个问题(在更改代码之前,我有两个相同的问题)。
第一个问题: 我的第一个问题是,我只收到18个BLE软件包中的一个(第一个)。
第二个问题: 我的第一个问题也引起了我的第二个问题。应用程序无法识别该连接已从nRF52832dk终止。
还有另一个问题。到底是什么
endBroadcast(intent);
?
答案 0 :(得分:0)
这篇文章非常复杂,我想你是说你不能接收nrf52数据。
您需要检查nrf52支持多少MTU,BLE保护最大值为'247',有效数据长度为'244'有效长度为(DEVICE_MTU-OPCODE_LENGTH(1)-HANDLE_LENGTH(2));
所以您说要接收2474个字节,至少是17次。
android上的当前进程是onCharacteristicChanged-> onCharacteristicRead
如果要触发onCharacteristicChanged,则需要打开远程设备通知,如下所示:
private void EnableNotification(BluetoothGattDescriptor d, BluetoothGatt gatt)
{
gatt.SetCharacteristicNotification(d.Characteristic, true);
d.SetValue(new byte[] { 1, 1 });
gatt.WriteDescriptor(d);
}