首页 > 其他分享 >Android Bluetooth page timeout问题

Android Bluetooth page timeout问题

时间:2024-06-02 18:54:21浏览次数:20  
标签:OPP 蓝牙 ACL link timeout Android page

Android蓝牙连接超时时间 蓝牙配对时间过长

https://blog.51cto.com/u_13019/7750311

测试机与辅助机配对蓝牙成功后,关闭辅助机蓝牙开关,测试机给辅助机通过蓝牙分享一张图片,提示"蓝牙共享,未发送文件"间隔时间应当5秒左右

测试步骤:
1.测试机与辅助机配对蓝牙成功
2.进入设置->蓝牙,选择连接蓝牙偏好设置,选择蓝牙,关闭蓝牙开关
3.测试机给辅助机通过蓝牙分享一张图片
4.提示"蓝牙共享,未发送文件"间隔时间过长

解决方案
root cause:
1.page timeout=12.8s
2.发起OPP后有两次create connection过程,一次是SDP建立的,另一次是RFCOMM连接建立的
所以两次都page timeout的话,总的时间就是25.6s
solution:
修改了page timeout的时间,改为了7.68s,所以等待时间缩短到了15s

响应时间长主要是有两个原因:

  1. 在测试机发出OPP传输请求的时候,首先需要建立ACL link,也就是要去page辅助机,由于辅助机关闭了蓝牙,所以page的过程就会等待timeout才会结束
    目前page timeout的设定是12.8s,也就是page了12.8后才会停止并且上报page timeout的status。
    这个12.8s由两个方面来控制,一个是BT stack,stack设定的默认值是5.12s,另一个是controller,controller会根据stack设定的值对page timeout时间进行调整,规则是:
    当stack设定值>=7.68s时,会采用stack设定的值;当stack设定值<7.68s时,会补偿7.68s,也就是设定为5.12s+7.68s=12.8s,(这个是在bt firmware里面的,firmware是binary release,看不到代码的。)

    这么做的理由是,通常我们不是单纯做page,还会有multi link、coex的分时等,所需要对page时间做补偿,以保证page performance,比如在复杂环境中,保证page的时间,才能确保收包可靠性。
  2. 另一个原因是,由于之前已经配对过,所以在发起连接的时候,第一次page失败后,stack会再下发一次连接请求,这种机制是为了确保复杂环境中仍能会连上设备。
    基于上述两个原因,所以目前发起OPP后,如果对端不在可连接状态,则会等待12.8+12.8=25.6s再上报无法传输的广播。

    如果要优化的话,可以考虑把page timeout改为controller不会调整的最大可设定值,也就是7.68s,而原因2的地方不建议改动,因为修改了重连机制可能导致正常的连接成功率下降。
    page timeout的修改方式:
    system/bt/bta/dm/bta_dm_cfg.cc
41  /* page timeout in 625uS */
42  #ifndef BTA_DM_PAGE_TIMEOUT
43  #define BTA_DM_PAGE_TIMEOUT 8192  ==> 12300
44  #endif
  • 1.
  • 2.
  • 3.
  • 4.
 

8195X0.625uS=5.12s
12300X0.625uS=7.68s

这部分的机制是:

  1. 蓝牙文件传输用的是OPP协议,OPP协议是建立在RFCOMM的基础上的
  2. 正常OPP的流程是:上层发起OPP传输请求—>SDP search(搜索对端OPP服务)—>搜索成功后建立RFCOMM连接—>建立成功后开始传输文件
  3. 在SDP search过程中,会先去建立ACL link(也就是底层的物理传输链路),然后对端将SDP的数据传给本机;但在本CR的测试步骤中,由于此时对端蓝牙关闭了,所以建立ACL link的过程失败了(page timeout),stack上报sdp search fail
  4. 收到sdp search fail的消息后,仍会继续进行下一步,也就是建立RFCOMM连接,这步同样是建立在ACL link上的,由于上一步ACL link没建立起来,所以这步会再次尝试建立ACL link,就会再次经历一个page time;而如果是正常流程,在SDP search的过程中就已经建立起ACL link了,所以在RFCOMM连接的时候就不会重复发起ACL link的连接请求。

目前没有其他优化的方式了,因为page timeout不能改的太小,否则会影响page性能;OPP传输的流程也不建议改动,因为对于不支持L2CAP的OBEX,只能通过RFCOMM传输,如果把RFCOMM连接过程拿掉,可能影响OPP连接的建立

标签:OPP,蓝牙,ACL,link,timeout,Android,page
From: https://www.cnblogs.com/bluestorm/p/18227463

相关文章

  • Android启动窗口SplashScreen
    Android启动窗口SplashScreen首先介绍下什么是启动窗口,对于大部分应用冷启动时的场景都会有启动窗口,为了让效果更明显,在如下代码中(只是一个基本的可以运行的应用即可)添加了sleep5s的代码,在按recent键移除应用后,再点击桌面图标,即可看到启动窗口效果,即使点击后界面内容显示出来前的......
  • 基于Android的XX校园交流APP
    摘要这个App的设计主要包括前台页面的设计和方便用户互动的后端数据库,而前端软件的开发则需要良好的数据处理能力、友好的界面和易用的功能。数据要被工作人员通过界面操作传输至数据库中。通过研究采用MVP结构设计,使用Java开发语言开发,采用ssm架构以及MySQL数据库进行设......
  • springboot基于Android的记录生活APP
    摘要本文拟采用Android平台进行开发,使用java技术和Springboot搭建系统框架,后台使用MySQL数据库进行信息管理,设计开发的记录生活APP。通过调研和分析,系统拥有管理员和用户两个角色,主要具备登录注册,个人信息修改,用户管理,运动项目管理,食物类型管理,新闻资讯管理,食品分析管理,套......
  • 基于Android的跳蚤市场
    摘要伴随着我国社会的发展,人民生活质量日益提高。互联网逐步进入千家万户,改变传统的管理方式,以互联网为基础,利用java技术,结合SpringBoot框架和MySQL数据库开发设计一套跳蚤市场,提高工作效率的同时,减轻管理者工作方面的压力,使他们能够将更多精力投入到市场上,更好的完成用户......
  • Android基础-数据库
    在Android系统中,数据库扮演着至关重要的角色,它负责存储、管理和检索应用程序所需的数据。随着移动应用的日益复杂和功能的不断增加,对数据库的需求也日益提高。在Android中,有多种数据库管理系统和工具可供选择,其中最为常见和广泛使用的是SQLite数据库。下面将详细介绍Android系......
  • Qt for Android 轻松解决编译器无法被识别问题!!
        相信很多小伙伴,也碰到过这种问题。明明下载Qt时,勾选了安卓组件,JDK,NDK、SDK都配置成功,但还是没有安卓编译器,或者是编译器前面有黄色感叹号,无法使用编译器。下面有解决办法。    解决方法:        1、Qt缓存导致(解决大部分问题):        ......
  • Spring Boot整合PageHelper
    文章目录概念前置内容SpringBoot整合PageHelper参考来源概念PageHelper是Mybatis的分页插件前置内容SpringBoot快速整合SpringMVC和Mybatis-Plus,实现基本的增删改查功能SpringBoot整合PageHelper引入maven依赖<!--PageHelper--><dependency>......
  • Android配置Framework开发环境
    联系作者:私信或者个人主页1.解决的问题Android开发中,有很大一部分是Framwrok定制开发,即需要阅读、修改frameworks仓库下的java代码,本文解决如何配置一个好用的framework跳转环境问题。本文介绍的是使用aidegen+androidstudio配置。首先简单介绍一下aidegen是什......
  • Android/iOS 应用内评价功能
    应用内评价,即应用中就能拉起对应商店的对应App的评价窗口,而无需用户到商店App内评价目前整理到有应用内评价功能的平台:Android-GooglePlayiOS-AppleStoreAndroid-GooglePlay应用内评价publicinterfaceGooglePlayFlowListener{voidOnCompleteListener();......
  • AndroidStudio资料
    AndroidStudio导入jar包  Switch语句报错Constantexpressionrequired   AndroidStudio中怎样引用图片资源   新版本Logcat使用详解java反编译jar包并修改class重新打包   Jar包反编译后修改源码再编译java.lang.NoClassDefFoundError:Failedresolutionof:......