如何使Android和多个BLE之间的连接更加稳定?

如何使Android和多个BLE之间的连接更加稳定?,android,Android,我正在实现Android和BLE之间的连接?像防丢失或查找器,android手机连接到BLE设备后,手机每秒读取一次BLE设备的RSSI 如果BLE设备的RSSI低于RSSI阈值,则认为超出范围。例如:阈值为-70,设备的当前RSSI为-80 当应用程序被认为超出范围时。它每5秒钟向BLE发送一次消息。但几次之后,它总是断开连接。我使用以下代码将消息发送到BLE设备 BluetoothGattService HelloService = Gatt.getService(HELLO_SERVICE

我正在实现Android和BLE之间的连接?像
防丢失
查找器
,android手机连接到BLE设备后,手机每秒读取一次BLE设备的RSSI

如果BLE设备的RSSI低于RSSI阈值,则认为超出范围。例如:阈值为-70,设备的当前RSSI为-80

当应用程序被认为
超出范围时
。它每5秒钟向BLE发送一次消息。但几次之后,它总是断开连接。我使用以下代码将消息发送到BLE设备

BluetoothGattService HelloService = Gatt.getService(HELLO_SERVICE_UUID);

if(HelloService == null) {
    Log.d(TAG, "HelloService not found!");
    return;
}

//If the Service is not null , try to get the characteristic.
BluetoothGattCharacteristic Characteristic = HelloService.getCharacteristic(UUID_HELLO_CHARACTERISTIC);

if(Characteristic == null) {
    Log.d(TAG, "Characteristic not found!");
    return;
}       

Gatt.setCharacteristicNotification(Characteristic, true);

Characteristic.setValue(text, BluetoothGattCharacteristic.FORMAT_UINT8, 0);
Gatt.writeCharacteristic(Characteristic);
Log.d(TAG, "StepCount Characteristic End!");    
以上代码正确,BLE可以接收消息。但BLE设备将在几秒钟后断开连接。看来在短时间内做不止一件事对一个设备来说是个负担

BluetoothGattService HelloService = Gatt.getService(HELLO_SERVICE_UUID);

if(HelloService == null) {
    Log.d(TAG, "HelloService not found!");
    return;
}

//If the Service is not null , try to get the characteristic.
BluetoothGattCharacteristic Characteristic = HelloService.getCharacteristic(UUID_HELLO_CHARACTERISTIC);

if(Characteristic == null) {
    Log.d(TAG, "Characteristic not found!");
    return;
}       

Gatt.setCharacteristicNotification(Characteristic, true);

Characteristic.setValue(text, BluetoothGattCharacteristic.FORMAT_UINT8, 0);
Gatt.writeCharacteristic(Characteristic);
Log.d(TAG, "StepCount Characteristic End!");    
问题是:如何使Android和BLE之间的连接更加稳定?

一些建议:

  • 如果可以避免,请不要使用通知。根据个人在某些环境中使用某些手机的经验,通知可能会停止工作,并可能导致总体不稳定。尝试定期阅读
  • 只有在收到回拨到
    BluetoothGattCallback.onCharacteristicWrite()
    BluetoothGattCallback.onCharacteristicRead()
    进行上一次读或写操作的回调后,才能执行读或写操作
  • 更一般地说,永远不要同时做两件事,不管是扫描、连接、阅读、写作还是其他。您应该使用作业队列序列化所有操作,仅当上一个作业完成(或失败)时才从该队列弹出
  • 在您所说的几乎超出范围的情况下,操作可能需要很长时间才能完成,有时超过5秒。因此,在5秒或更短的时间内完成另一个操作,实际上是在“踩”上一个操作。但是,在这些情况下,操作也永远不会返回回调,因此必须实现超时。我用10秒钟。除此之外,操作失败了
    • 一些建议:

      • 如果可以避免,请不要使用通知。根据个人在某些环境中使用某些手机的经验,通知可能会停止工作,并可能导致总体不稳定。尝试定期阅读
      • 只有在收到回拨到
        BluetoothGattCallback.onCharacteristicWrite()
        BluetoothGattCallback.onCharacteristicRead()
        进行上一次读或写操作的回调后,才能执行读或写操作
      • 更一般地说,永远不要同时做两件事,不管是扫描、连接、阅读、写作还是其他。您应该使用作业队列序列化所有操作,仅当上一个作业完成(或失败)时才从该队列弹出
      • 在您所说的几乎超出范围的情况下,操作可能需要很长时间才能完成,有时超过5秒。因此,在5秒或更短的时间内完成另一个操作,实际上是在“踩”上一个操作。但是,在这些情况下,操作也永远不会返回回调,因此必须实现超时。我用10秒钟。除此之外,操作失败了
        • 一些建议:

          • 如果可以避免,请不要使用通知。根据个人在某些环境中使用某些手机的经验,通知可能会停止工作,并可能导致总体不稳定。尝试定期阅读
          • 只有在收到回拨到
            BluetoothGattCallback.onCharacteristicWrite()
            BluetoothGattCallback.onCharacteristicRead()
            进行上一次读或写操作的回调后,才能执行读或写操作
          • 更一般地说,永远不要同时做两件事,不管是扫描、连接、阅读、写作还是其他。您应该使用作业队列序列化所有操作,仅当上一个作业完成(或失败)时才从该队列弹出
          • 在您所说的几乎超出范围的情况下,操作可能需要很长时间才能完成,有时超过5秒。因此,在5秒或更短的时间内完成另一个操作,实际上是在“踩”上一个操作。但是,在这些情况下,操作也永远不会返回回调,因此必须实现超时。我用10秒钟。除此之外,操作失败了
            • 一些建议:

              • 如果可以避免,请不要使用通知。根据个人在某些环境中使用某些手机的经验,通知可能会停止工作,并可能导致总体不稳定。尝试定期阅读
              • 只有在收到回拨到
                BluetoothGattCallback.onCharacteristicWrite()
                BluetoothGattCallback.onCharacteristicRead()
                进行上一次读或写操作的回调后,才能执行读或写操作
              • 更一般地说,永远不要同时做两件事,不管是扫描、连接、阅读、写作还是其他。您应该使用作业队列序列化所有操作,仅当上一个作业完成(或失败)时才从该队列弹出
              • 在您所说的几乎超出范围的情况下,操作可能需要很长时间才能完成,有时超过5秒。因此,在5秒或更短的时间内完成另一个操作,实际上是在“踩”上一个操作。但是,在这些情况下,操作也永远不会返回回调,因此必须实现超时。我用10秒钟。除此之外,操作失败了