问题描述
我正在尝试从 obd2 蓝牙 LE 适配器读取数据。我能够连接到适配器(Carista)。我知道这一点是因为调用了 onDescriptorWrite
回调,但在使用从适配器的 GATT 服务获得的写入特性发送命令后,我从未收到响应。我使用以下命令
mWriteCharacteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);
mWriteCharacteristic.setValue(cmdstr);
mBluetoothGatt.writeCharacteristic(mWriteCharacteristic)
然而 onCharacteristicRead
从未被调用。
难道我做错了什么?我尝试了不同的特征变化,但无济于事。
预先感谢您的意见。
@Override
public void onServicesdiscovered(BluetoothGatt gatt,int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
List<BluetoothGattService> services = gatt.getServices();
for (BluetoothGattService service : services) {
if (service.getUuid().equals(SERVICE_UUID)) {
sharedPref.edit().putString(getString(R.string.paired_adapter_address),gatt.getDevice().getAddress()).apply();
mBluetoothGatt = gatt;
deviceState = DEVICE_STATE.CONNECTING;
mWriteCharacteristic = service.getcharacteristics().get(0);
mReadCharacteristic = service.getcharacteristics().get(1);
setCharacteristicNotification(mReadCharacteristic);
scanning = false;
Intent intent = new Intent("state");
intent.putExtra("message",MainActivity.MESSAGE_CONNECTING);
LocalbroadcastManager.getInstance(getApplicationContext()).sendbroadcast(intent);
return;
}
}
}
gatt.disconnect();
}
public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic) {
if (mBluetoothAdapter == null || mBluetoothGatt == null) {
Log.w(TAG,"BluetoothAdapter not initialized");
return;
}
mBluetoothGatt.setCharacteristicNotification(characteristic,true);
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(DESCRIPTOR_UUID);
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
mBluetoothGatt.writeDescriptor(descriptor);
}
解决方法
在我的 CARISTA 上,第一个特征是 WRITE 特征,第二个特征是 READ 特征。
一般来说:您必须探查特征的属性,而不是对其进行硬编码。无法保证 READ 特性始终是第一个,而 WRITE 特性始终是第二个。事实上,适配器并不总是需要通过两种不同的特征来导出串行端口——有时它只是一种。