我正在开发一个与自行车上的BLE设备连接的应用程序。 该应用程序在Android 4.x上运行良好,但在Android 5上,我们在writeCharacterstic()调用中未获得任何回调。 非常感谢您的帮助,因为我们目前处于停滞状态!

对gatt的所有调用似乎都返回true。 我已确保调用顺序正确,因此GATT服务器不会返回忙状态:

device.connectGatt()
onConnectionStateChange() -> gatt.discoverServices()
onServicesDiscovered() -> gatt.writeDescriptor()
onDescriptorWrite() -> sendRequest()
sendRequest() -> gatt.writeCharacteristic()

我一直在以下设备上进行测试:

  • 具有Android 4.4.2的Samsung Galaxy S4(正在运行)
  • 具有Android 4.3的Samsung Galaxy S3(正在运行)
  • 装有Android 5.0.1的LG Nexus 4( 无效,在writeCharacteristic()上没有回调

码:

private BluetoothGattCallback callback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        super.onConnectionStateChange(gatt, status, newState);

        if (newState == BluetoothGatt.STATE_CONNECTED) {
            Log.i(TAG, "onConnectionStateChange() - STATE_CONNECTED");
            boolean discoverServicesOk = gatt.discoverServices();
        } else if (newState == BluetoothGatt.STATE_DISCONNECTED) {
            Log.i(TAG, "onConnectionStateChange() - STATE_DISCONNECTED");
        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        super.onServicesDiscovered(gatt, status);
        Log.i(TAG, "onServicesDiscovered()");

        BluetoothGattService service = gatt.getService(UART_UUID);
        characteristic = service.getCharacteristic(TX_UUID);

        boolean result = gatt.setCharacteristicNotification(characteristic, true);
        Log.i(TAG, "onServicesDiscovered() - setCharacteristicNotification " + result);

        if (characteristic.getDescriptor(CLIENT_UUID) != null) {
            BluetoothGattDescriptor desc = characteristic.getDescriptor(CLIENT_UUID);
            result = desc.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
            Log.i(TAG, "onServicesDiscovered() - ENABLE_NOTIFICATION_VALUE " + result);
            result = desc.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
            Log.i(TAG, "onServicesDiscovered() - ENABLE_INDICATION_VALUE " + result);
            result = gatt.writeDescriptor(desc);
            Log.i(TAG, "onServicesDiscovered() - writeDescriptor " + result);
        }

        connectionState = STATE_CONNECTED;
    }

    @Override
    public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
        super.onDescriptorWrite(gatt, descriptor, status);
        mCurrentRequest = getNextRequest();
        Log.i(TAG, "onDescriptorWrite() - sending request, type: " + mCurrentRequest.getType());
        sendRequest(mCurrentRequest);
    }

    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
        super.onCharacteristicChanged(gatt, characteristic);

        // DON'T GET HERE ON LOLLIPOP
        Log.d(TAG, "onCharacteristicChanged() - size: " + characteristic.getValue().length + ", type: " + mCurrentRequest.getType());
    }
}

public void sendRequest(AsciiRequest asciiRequest) {
    start = System.currentTimeMillis();
    if (characteristic != null && connectionState == STATE_CONNECTED) {
        Log.i(TAG, "sendRequest() - sending request, type: " + mCurrentRequest.getType());
        characteristic.setValue(asciiRequest.getData());
        characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);
        boolean result = gatt.writeCharacteristic(characteristic);
        Log.i(TAG, "sendRequest() - result writeCharacteristic: " + result);
    } else {
        Log.e(TAG, "sendRequest() - not connected");
    }
}

日志:

03-31 14:08:28.614: I/BikeActivity(30045): onResume() - not connected yet, trying to connect
03-31 14:08:28.616: I/BikeActivity(30045): doConnect() - connecting to device Bike 2
03-31 14:08:28.634: I/BikeActivity(30045): doConnect() - connected to device Bike 2
03-31 14:08:29.137: I/BikeActivity(30045): onConnectionStateChange() - STATE_CONNECTED
03-31 14:08:29.151: I/BikeActivity(30045): onConnectionStateChange() - connected to device Bike 2
03-31 14:08:29.164: I/BikeActivity(30045): onServicesDiscovered()
03-31 14:08:29.170: I/BikeActivity(30045): onServicesDiscovered() - setCharacteristicNotification true
03-31 14:08:29.170: I/BikeActivity(30045): onServicesDiscovered() - ENABLE_NOTIFICATION_VALUE true
03-31 14:08:29.170: I/BikeActivity(30045): onServicesDiscovered() - ENABLE_INDICATION_VALUE true
03-31 14:08:29.172: I/BikeActivity(30045): onServicesDiscovered() - writeDescriptor true
03-31 14:08:29.173: I/BikeActivity(30045): onDescriptorWrite() - sending request, type: 25
03-31 14:08:29.182: I/BikeActivity(30045): sendRequest() - sending request, type: 25
03-31 14:08:29.186: I/BikeActivity(30045): sendRequest() - result writeCharacteristic: true
03-31 14:08:34.182: I/BikeActivity(30045): doDisconnect() - disconnecting from device Bike 2
03-31 14:08:34.233: I/BikeActivity(30045): onConnectionStateChange() - STATE_DISCONNECTED
03-31 14:08:34.233: I/BikeActivity(30045): onConnectionStateChange() - disconnected
03-31 14:08:34.263: I/BikeActivity(30045): doDisconnect() - toastText: No response from bike.
03-31 14:08:34.318: I/BikeActivity(30045): onPause()
03-31 14:08:34.712: I/BikeActivity(30045): onDestroy()

#1楼 票数:0

我知道这是一个迟来的答案,但在这种情况下可能会帮助其他人。 我在Android 5设备上有同样的错误-请注意,您有断开连接事件,而不是编写特征记录。 尝试添加空的回调:

public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) 
    {
    }

它帮助我使用了Android 5设备。

  ask by poa translate from so

未解决问题?本站智能推荐:

1回复

如何使用Android BLE API 21知道BLE信标超出范围

这个问题已经在这里有了答案: 如何检测BLE设备何时不在范围内? 2个答案 新的Android BLE api(从api 21开始)允许通过onBatchScanResults轻松找到信标上的回调,但是当信标超出范围时是否可以获得某种信息? 我想我可以手动完
1回复

如何解决 BLE 中的 onClientConnectionState() - status=22 clientIf=7 错误

我有一个 Android 应用程序,用于将蓝牙低功耗(BLE) 与我的手机连接。 该应用程序在 Galaxy S5 (Android 5.0.1)、Galaxy S6 (Android 6.0) 等几乎手机上运行良好。 但是,它在 Galaxy Note 3 (Android 5.0.1) 中存在一
2回复

BLuetooth Gatt Callback无法使用Lollipop的新API

我目前有一种方法可以写入BLE设备发出蜂鸣声。 我的蓝牙回拨如下: 我的ReadCharacteristic实现如下: 对于运行KitKat及以下版本的设备,此当前方法非常适用。 但是当我在Lollipop上运行相同的功能时,它会使设备发出几声嘟嘟声然后停止工作。 从那时起
1回复

如何在api 19和api 19之上的蓝牙应用程序工作?

我有一个关于蓝牙LE的android应用,它在api 21下很好地工作。 但是它不工作其他API。 我该如何解决? 如何在api 19和api 19之上同时运行蓝牙应用程序(相同的apk)?
3回复

Android中的BluetoothLeScanner的setReportDelay的目的是什么?

Android中的BluetoothLeScanner的setReportDelay的目的是什么? 我无法想象为什么会有延迟报告?
2回复

您能否在Android 5.0中唯一标识BLE MAC地址?

在Android 5.0中,BLE不再使用静态MAC地址,而是使用称为IRK和公共密钥密码学的方法在一段时间后更改MAC。 是否有可能以一种无法被该手机用户欺骗的方式唯一地标识Android手机,或者除非对方合作,否则现在完全变得不可能了吗?
1回复

BluetoothLeAdvertiser是否可以在装有Android 5.0的Nexus 4上使用?

我知道Android 5.0支持BLE外设模式,但是我不确定它是否可以在带有Android 5.0的Nexus 4上运行。 QuickBeacon应用与可疑的Nexus 4不兼容。
1回复

低功耗蓝牙和Android手机之间可以稳定连接的是哪种模式?

对于BLE和Android Phone之间的连接,我有两种选择: 我测试了这两种方法:第一种方法连接速度更快,但是不允许在后台重新连接。 但是,在这个问题上,我认为是稳定的连接。 哪种方法在两种方法中更稳定? 如果我想要更稳定的连接,您能建议我这样做的方法吗? 谢谢大家 这