我正在尝试在Tablet和我的MCU之间建立一个连接,它通过GATT连接为BLE和发送/接收特性。 MCU是GATT服务器,平板电脑是我的GATT客户端。
到目前为止工作的是什么: 两个设备都相互连接。 我可以通过我的GATT服务器发送通知,以便我的GATT客户端正在读取onCharacterChanged中的选择特征,以便进一步完成任务。
但是我在将Gatt Client的特性写入服务器时有一些奇怪的行为。我通过onClick函数触发发送过程:
buttonOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
byte[] testByte = new byte[1];
testByte[0] = 3;
characteristic.setValue(testByte);
bluetoothGatt.writeCharacteristic(characteristic);
}
});
到目前为止这是有效的(我在onClick之前填充了特征对象)。 现在我有另一个onClickListener来改变特征的值并再次发送它。
buttonTwo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
byte[] testByte = new byte[1];
testByte[0] = 7;
characteristic.setValue(testByte);
bluetoothGatt.writeCharacteristic(characteristic);
}
});
因此,一旦我在GATT服务器上的特征应该具有值3和一次7.这只能工作一次,直到我的连接丢弃并重新打开,然后我可以重新发送该特征。 writeCharacteristic来自BluetoothGatt类,如下所示:
public boolean writeCharacteristic(BluetoothGattCharacteristic characteristic) {
if ((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_WRITE) == 0
&& (characteristic.getProperties() &
BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) == 0) return false;
if (VDBG) Log.d(TAG, "writeCharacteristic() - uuid: " + characteristic.getUuid());
if (mService == null || mClientIf == 0 || characteristic.getValue() == null) return false;
BluetoothGattService service = characteristic.getService();
if (service == null) return false;
BluetoothDevice device = service.getDevice();
if (device == null) return false;
synchronized(mDeviceBusy) {
if (mDeviceBusy) return false;
mDeviceBusy = true;
}
try {
mService.writeCharacteristic(mClientIf, device.getAddress(),
service.getType(), service.getInstanceId(),
new ParcelUuid(service.getUuid()), characteristic.getInstanceId(),
new ParcelUuid(characteristic.getUuid()),
characteristic.getWriteType(), AUTHENTICATION_NONE,
characteristic.getValue());
} catch (RemoteException e) {
Log.e(TAG,"",e);
mDeviceBusy = false;
return false;
}
return true;
}
我发现这个过程陷入了
synchronized(mDeviceBusy) {
if (mDeviceBusy) return false;
mDeviceBusy = true;
}
但我不知道为什么到目前为止。有没有我应该设置告诉我的GATT服务器我将"重写"那个特点?我是否需要使用线程或其他东西并将其置于睡眠状态?