2017-08-08 38 views
0

我正在编写一个Android应用程序,通过GATT服务与定制设备BLE进行通信。所述设备提供具有用于读取和写入数据的2个特征的服务。 当某些数据写入WRITE特性时,BLE器件将通过有线UART接口将其发送到其他器件。该其他器件将通过相同的UART接口响应BLE器件。收到信息后,BLE设备将发送一条通知,指出其新服务的READ特性中有新数据,以便我的Android应用程序可以检索它。如何使用Android蓝牙API调度BLE GATT交换?

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

我已经实施了“秒表”作为long。我将它设置为System.currentTimeMillis();当我写一个数据,我在通知接收其值与另一个呼叫System.currentTimeMillis();给予类似:

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

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

我已经设置2个秒表比较测量2次。

当我呼叫gatt.writeCharacteristic(myCharacteristic)时,第一个秒表将被重置,而第二个秒表将在调用BluetoothGattCallback.onCharacteristicWrite()时重置。

我已经注册了来自READ特征通知的应用程序,所以我在调用BluetoothGattCallback.onCharacteristicChanged()时停止了两个秒表。

事情是,我在这些测量之间平均有100ms!我认为这是相当多的。 我打电话给gatt.writeCharacteristic(myCharacteristic)的平均时间是140ms BluetoothGattCallback.onCharacteristicWrite()被调用的平均时间是40ms。

所以我想知道什么是正确的方式来进行这样的交流,什么时候应该重置我的秒表以获得最准确的时间测量。

+0

我在我的应用中做了完全相同的事情, 向HM10发送一个7字节的数组,它通过串行发送给一个发送“OK”作为确认的arduino Nano。 我只使用一个秒表,因为我对BluetoothGattCallback.onCharacteristicWrite()不做任何处理。 我在gatt.writeCharacteristic(myCharacteristic)之前开始计时。写完后,我等待BluetoothGattCallback.onCharacteristicChanged()中的确认并停止重置我的秒表。测量的时间变化很大,在28到200毫秒之间,但平均时间约为60毫秒。 – GrooverFromHolland

+0

感谢您的反馈。关于Emil在他们的回应中所说的话,不同时间的巨大差异可能来自连接间隔为50毫秒的事实,因此这很大程度上取决于您在这些“打勾”之间发出写入命令的时间。 – PlikPlok

回答

1

那么如果你使用50毫秒的默认连接间隔,这根本就不奇怪。假设在下一次连接事件(将来可能发生高达50毫秒)发出写入,并且结果可用并在50毫秒后的下一次连接事件中通知,则您将获得100毫秒。您可以发出连接参数更新请求以获得更快的连接间隔。

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

+0

感谢您提供连接间隔的精确度。我会仔细看看的。 我想我已经有了有效负载通知中的数据,因为我从作为参数传递给onCharacteristicChanged()的特征中检索数据。我不会再从那里发出更多的消息。 – PlikPlok

+0

不幸的是,我坚持使用API​​ 19(KitKat 4.4),并且似乎API 21引入了连接参数更新请求。我想我必须使用50ms连接间隔进行管理。 – PlikPlok

+0

您也可以从外设发送连接参数更新请求。 – Emil