从LinkLost重新连接后无法从Android收到数据。

4个帖子/ 0新
最后一篇
Ward.wang@huawei.com.
离线
最后一次露面:5年9个月前
加入:2015-07-31 10:43
从LinkLost重新连接后无法从Android收到数据。

大家好,
我们在Android中找到了一个问题。
Andorid支持服务和特征缓存缩短重新连接时间。
测试setps:
1.Android应用程序扫描DA14580并连接,服务发现。
2. Android应用程序绑定DA14580。
3. Android应用程序将数据发送到特征A Wihch是“写入没有响应”
4. DA14580上的应用程序可以收到数据。
5.丢失的链接。
6. Andorid App Scan,Connect,Service Discovery再次。
7. Android应用程序将数据发送到特征,Wihch是“写入没有响应”
8. DA14580上的应用无法收到数据。

我们检查了蓝牙OTA日志,并找到:
步骤6,应用程序从Android缓存获取服务,并且在OTA日志上没有服务发现进程。

我们尝试了从DA14580开始的服务变化,每个连接都效果良好。

蓝牙规范未定义服务发现过程在特性通信之前是必需的。

这是一个关于DA14580的问题,以及如何解决它?
或者我们应该使用da14580的api来解决它吗?

感谢致敬。

设备:
mt_dialog.
离线
最后一次露面:2个月3周前
职员
加入:2015-06-08 11:34
王王王,

王王王,

据我们所知,没有问题,可以检查Write_no_Response包是否使用嗅探器离开Android设备?此外,当您执行第二个写入时,它与以前相同的值?

谢谢mt_dialog.

Joacimwe.
离线
最后一次露面:6个月前1年
格鲁鲁
加入:2014-01-14 06:45
我们也注意到了

我们已经注意到了这一点,当我们发送大量的写命令(在GATT中没有回复)时,我们发送了很多写命令。我认为这是同样的问题,但不能100%肯定。

无论如何,BUG位于Android源代码中,并介绍了这些更改:
https://android.googlesource.com/platform/hardware/libhardware / + / 9ef3c72 ...
https://android.googlesource.com/platform/packages/apps/bluetooth / + / 934d ...

当用户发送写命令时,写入命令将发送到手机内的蓝牙控制器,该手机中将其放入其传出队列中,并且立即将OnCharaClySkrite发送回用户,然后可以发送另一个写命令。但是,蓝牙控制器内的队列只能容纳大约20-30个数据包。因此,它们已经创建了一个“拥塞控制”机制,如下所示:当蓝牙控制器队列已满时,它不会直接发送onCharaClateWwite,但等待直到蓝牙控制器表示其队列不再饱满。这样,在Android上写入命令(“写入没有响应”)在义的意义上是可靠的,除非链接已断开连接,否则不会丢弃数据包。然而,iOS不提供这种巨大的功能,而是默默地丢弃iOS应用程序发送的写命令,当蓝牙控制器队列已满时不发送错误消息回给用户。

上面介绍的Android源代码中的错误是,如果链接断开任何原因(链路丢失以及正常断开连接),则在拥塞时(蓝牙控制器的队列当前已满),则回调表明现在有更多队列中的房间,永远不会发送到更高的图层,当设备重新连接时,它们不会重置它,这将使随后的gatt操作永远不会收到它们的on特征*回调,这将把gatt对象放在“忙”状态下,这意味着所有GATT操作都将失败并返回false。

我们目前使用的解决方法是,如果我们有挂起的写命令继续,我们得到断开回调,我们将关闭此蓝色缩小对象并创建一个新的(使用bluetoothdevice.connectgatt)。由于内部拥塞标志属于BluetoothGatt对象,因此创建一个解决问题的新对象时,它将设置为false。

mt_dialog.
离线
最后一次露面:2个月3周前
职员
加入:2015-06-08 11:34
嗨Joacimwe,

嗨Joacimwe,

感谢征兆,非常感谢。

mt_dialog.