Android 如何使用安卓蓝牙API来计时GATT交换?

Android 如何使用安卓蓝牙API来计时GATT交换?,android,bluetooth,bluetooth-lowenergy,Android,Bluetooth,Bluetooth Lowenergy,我正在编写一个Android应用程序,通过GATT服务与定制设备进行通信。 所述设备提供具有2个特征的用于读取和写入数据的服务。 当一些数据写入写入特性时,BLE设备将通过有线UART接口将其发送到其他设备。然后,另一个设备将通过相同的UART接口响应BLE设备。收到后,BLE设备将发送一个通知,通知其服务的读取特性上有新数据可用,以便我的Android应用程序可以检索它 我想做的是测量从Android应用程序发送请求到收到新数据可用的通知之间经过的时间 我一直在使用秒表。我将其设置为Syste

我正在编写一个Android应用程序,通过GATT服务与定制设备进行通信。 所述设备提供具有2个特征的用于读取和写入数据的服务。 当一些数据写入写入特性时,BLE设备将通过有线UART接口将其发送到其他设备。然后,另一个设备将通过相同的UART接口响应BLE设备。收到后,BLE设备将发送一个通知,通知其服务的读取特性上有新数据可用,以便我的Android应用程序可以检索它

我想做的是测量从Android应用程序发送请求到收到新数据可用的通知之间经过的时间

我一直在使用秒表。我将其设置为System.currentTimeMillis;当我写入数据并将其值与对System.currentTimeMillis的另一个调用进行比较时;收到通知后,发出如下信息:

long stopwatch = System.currentTimeMillis();
// ...

// ...
long elapsed = System.currentTimeMillis() - stopwatch;
我设置了两个秒表来比较两个测量的时间

第一个秒表在调用gatt.writeCharacteristicmyCharacteristic时重置,第二个秒表在调用BluetoothGattCallback.onCharacteristicWrite时重置

我已经注册了我的应用程序,以便在调用BluetoothGattCallback.onCharacteristicChanged时停止两个秒表

问题是,这些测量之间平均有100毫秒!我认为这是相当多的。 调用gatt.writeCharacteristicmyCharacteristic时的平均开始时间为140ms 调用BluetoothGattCallback.onCharacteristicWrite时开始的平均时间为40ms


因此,我想知道什么是为这种交换计时的正确方法,什么时候应该重置秒表以获得最准确的时间测量。

如果使用默认的连接间隔50毫秒,这一点也不奇怪。假设写入是在下一个连接事件(可能在未来50毫秒内发生)时发出的,并且结果在50毫秒后的下一个连接事件时可用并通知,则得到100毫秒。您可以发出连接参数更新请求以获得更快的连接间隔


如果您想获得低开销,为什么要通知数据可用,然后再读取,而不是直接将数据嵌入通知负载中?

我在我的应用程序中也做了同样的事情,将一个7字节的数组发送到HM10,然后通过串行发送到arduino Nano,再发送OK作为确认。我只使用一个秒表,因为我不使用BluetoothGattCallback.onCharacteristicWrite。我在关贸总协定之前启动了秒表。写入后,我等待BluetoothGattCallback.onCharacteristicChanged中的确认,并停止重置秒表。测量的时间变化很大,介于28和200毫秒之间,但平均时间约为60毫秒。感谢您的反馈。关于Emil在回复中所说的,不同时间的巨大差异可能来自于连接间隔为50毫秒,因此这在很大程度上取决于您在这些节拍之间发出写入命令的时间。感谢连接间隔的精确性。我会调查的。我想我已经在负载通知中有了数据,因为我从作为参数传递给onCharacteristicChanged的特性中检索数据。不幸的是,我被API 19 KitKat 4.4困住了,连接参数更新请求似乎是在API 21中引入的。我想我必须以50毫秒的连接间隔进行管理。您也可以从外围设备发送连接参数更新请求。我支持您的回答,因为它帮助我缩短了发送和确认之间的时间,将连接参数更新请求设置为高。我不知道这与写入和通知间隔有关,我认为这与设备连接时间有关。现在平均时间为40毫秒,变化较小。