2017-11-25 494 views
0

我试图发送10个字节的数据,每30miliseconds之间使用蓝牙低enegry通知的2个Android设备之间。目标是实现低延迟通信,并且对低能量没有兴趣。Android ble,requestConnectionPriority不起作用

您可以在Delay graph(Y field = delta time between packets)中查看结果。前10秒的沟通正在进行得足够好。 (数据包之间的间隔最大为30-40ms)。然而,在10秒后,间隔要么极高,要么极低。

这可能是由于非严格的连接间隔参数而发生的。您可以检查一个hci_events的样本,清楚地显示减速是由hci_events引起的。

我试图配置连接的参数,从主调用函数

requestConnectionPriority 

但是,它并没有改变结果图什么。我还使用wireshark检查数据包,并发现主站甚至没有发送配置连接间隔的请求。我也尝试了另一个配置请求

requestMtu 

具有完全相同的结果,没有更新数据包从主站发送。

所以,有两个问题显示出这个意见。

  • 为了确保低能耗,在第10秒钟有一个超时时间?如果是这样,我该如何禁用它?
  • 调用requestConnectionPriority有什么不对吗,从android 6.0.1起中央(master)的角色?你能给我一个关于如何正确调用的简单例子吗?

注意requestConnectionPriority被称为之后的连接是建立在BluetoothGattCallbackonConnectionStateChange

具有从机(服务器)角色的设备正在运行(Android 5.1.1)并且主机(客户机)正在运行(Android 6.0.1)。

非常感谢!

重要更新:这是至关重要提的连接正在发起设备之间的方式。

  • 中央设备调用device.connectGatt,其中设备是BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address)。地址是硬编码字符串,外围设备的公共mac地址。您可以检查logcat logshci logs
  • 我也曾尝试用合法的方式(周边广告并连接到扫描随机地址)连接,但我得到一个错误“发起直接连接失败,拓扑限制”。你可以检查logcat logshci logs

回答

0

为了确保低能耗,在第10秒有一个超时时间吗?如果是这样,我该如何禁用它?

没有

是有些事情错了电话requestConnectionPriority,从中央(主)的作用了Android 6.0.1?你能给我一个关于如何正确调用的简单例子吗?

我不知道有关requestConnectionPriority的任何错误。但是你可以尝试在onServicesDiscovered回调之后执行该方法。在GATT服务发现期间,Android暂时将连接间隔更改为7.5毫秒,因此如果您不等到服务发现完成,则可能会感到困惑。

关于requestMtu,请确保在没有其他GATT操作挂起的情况下执行该方法(否则它将不起作用)。

另外一个技巧是使用空气嗅探器,而不仅仅是看hci日志。

+0

谢谢Emil的及时回复。我测试了你的建议,但并没有导致不同的行为。也许问题是我发起连接的方式。我会在接下来的几分钟内更新这个问题。 –

+0

我希望看到您的HCI日志。 logcat日志告诉连接参数更新失败,这似乎不太好。 “拓扑”限制意味着您的蓝牙芯片不支持在其他事情发生的同时启动连接(可能是可连接的广告或从属连接?)。你有什么Android设备? – Emil

+0

我刚刚更新了添加hci日志的问题。具体来说,对于中心我们基于这个[示例](https://github.com/googlesamples/android-BluetoothLeGatt)和外设这个[示例](https://github.com/androidthings/sample-bluetooth-le -gattserver),它以三星S7作为外设和索尼M5作为核心。我们的问题出现在我们用作中央[Orbbec Pessec设备](https://orbbec3d.com/product-persee/)时,它具有API 21(M5的更高统计数据)和蓝牙4.0与COD COMPUTER。谢谢你,请原谅我的延迟,但我没有启用通知。 –