安卓系统蓝牙配对流程分析

配对流程基本上始于首次连接一个蓝牙设备的过程中,本端的搜索流程结束获取到该设备的BluetoothDevice信息,就可以开启配对流程。

配对,顾名思义就是将两个设备通过相关技术进行绑定,达到能够互相识别彼此的目的。因此通过蓝牙技术进行的配对就是大家理解中的蓝牙配对。随着蓝牙技术在消费市场上越来越普及,生活中很容易就能遇到蓝牙配对这一使用蓝牙功能是必不可缺失的步骤。本期我们就简单聊聊安卓系统蓝牙配对的流程是如何运行的。

Application通过framework层BluetoothDevice对外提供的接口createBond() 开启这一流程。createBondOutOfBand() 通过OOB技术进行配对的接口,一般很少使用。所以应用层需要根据自己的实际使用场景选择正确的接口。

蓝牙服务层在配对流程中基本没有复杂的操作,只是简单地下发指令成功后,通过JNI层的异步回调处理配对状态变化并将该变化对外广播。其时序图如下:

从上图我们唯一需要注意的点就是配对流程开始前需要停掉搜索扫描流程(如果底层正在进行该流程),增加该操作的主要目的是为了确保配对流程能够正常进行。因为搜索扫描和配对流程都会对远端设备进行Discovery操作,防止这两个流程冲突导致配对失败。

协议栈接收到开始配对指令后,主要按照如下的配对状态机进行切换(NumericComparison模式):

  • IDLE :初始状态值

  • GET_REM_NAME :获取远端设备的蓝牙名字

  • WAIT_PIN_REQ :等待Controller请求PIN码

  • WAIT_LOCAL_IOCAPS :等待本端提供IO能力

  • WAIT_NUM_CONFIRM :等待本端Host确认配对

  • WAIT_AUTH_COMPLETE :等待鉴权(配对)流程完成

状态切换对应到HCI上的交互见下图:

每一个配对状态的切换触发时机从上面这张图就十分明了,这里我就不做过多分析。感兴趣的同学可以尝试跟着上图中HCI命令跟踪下代码流程。

协议栈的配对状态随着鉴权完成事件 Authentication Complete 的上报就切h换到初始值了,那这时是不是就代表整个配对流程完成了呢?非也,其实在安卓系统中到这里还不代表配对已经完成,因为上报JNI层的配对状态变化回调并不是通过鉴权完成事件上报完成而回调的。

配对流程的主要工作完成后,协议栈还会继续对该设备尝试进行SDP服务发现,搜索该设备支持哪些协议服务,SDP服务搜索完成后才会上报JNI层配对状态变成Bonded。

触发SDP服务搜索的触发时机是处理上报LinkKey的回调bta_dm_new_link_key_cback()中通过 event = BTA_DM_AUTH_CMPL_EVT 触发的。

随后在函数btif_dm_auth_cmpl_evt()中尝试对该设备进行SDP服务发现,如下图:

SDP服务发现完成后通过回调处理函数btif_dm_search_services_evt()中event = BTA_DM_DISC_RES_EVT上报JNI 层配对状态变化到Bonded。

至此安卓系统中蓝牙配对流程才算闭环完成,上述过程我以Numeric Comparison 配对模型为依据介绍了整个流程,其他配对模型类似,就不一一做出说明了,但协议栈配对状态机的全部值如下,其他模型的配对流程也是在这几种状态机组合下进行切换运行的:

enum { BTM_PAIR_STATE_IDLE,                   /*Idle */ BTM_PAIR_STATE_GET_REM_NAME,           /*Getting the remote name (tocheck for SM4) */ BTM_PAIR_STATE_WAIT_PIN_REQ,           /*Started authentication, waiting for PIN req (PIN is pre-fetched) */ BTM_PAIR_STATE_WAIT_LOCAL_PIN,         /* Waiting for local PIN code*/ BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM,   /*Waiting user 'yes' to numeric confirmation */ BTM_PAIR_STATE_KEY_ENTRY,              /*Key entry state (we are a keyboard) */ BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP,     /*Waiting for local response to peer OOB data*/ BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS,      /*Waiting for local IO capabilities and OOB data */ BTM_PAIR_STATE_INCOMING_SSP,           /*Incoming SSP (got peer IO caps when idle) */ BTM_PAIR_STATE_WAIT_AUTH_COMPLETE,     /*All done, waiting authentication cpmplete */ BTM_PAIR_STATE_WAIT_DISCONNECT         /* Waiting to disconnect theACL */};

配对流程实际上并不是孤立而存在的,配合着搜索扫描、连接等流程共同起作用的,彼此依赖,缺一不可。

本期的分享就到这里,感兴趣的小伙伴欢迎私信留言一起讨论。

蓝牙配对码配置错误_安卓系统蓝牙配对流程分析相关推荐

  1. 蓝牙配对码配置错误_怎么用手机蓝牙给别人的手机传东西?

    打开手机[设置]-[蓝牙],确保两部手机都打开蓝牙并选择蓝牙的可见性:在列表中找到您需要配对的手机,在第二部手机中点击[配对]提示:选择您需要发送的文件,选择蓝牙发送,然后接收即可.以下是详细介绍: ...

  2. 蓝牙配对码配置错误_漏洞问题频发,你还敢开你的蓝牙吗?

    来自:FreeBuf,作者:Sandra1432 链接:https://www.freebuf.com/articles/wireless/250492.html 从1.0到5.0,蓝牙技术不断发展, ...

  3. 蓝牙配对码配置错误_“看yellow 的时候,连错了蓝牙耳机,结果....”哈哈哈哈我笑到村里通网!!...

    人生无处不尴尬有一种令人窒息的操作叫"连错别人的蓝牙耳机"...因为你永远不知道下一秒你的音响里播放的会是什么奇奇怪怪的东西就比如这位被邻居连错蓝牙的兄弟▼啧啧啧这福利谁顶得住啊! ...

  4. 安卓系统应用启动流程分析

    随着移动开发的兴起,安卓系统的重要性愈加突显.本文简要介绍安卓系统上应用启动流程,对于应用开发.系统定制以及性能优化人员来说,熟悉应用启动流程会使得在今后的工作中更加得心应手,做到知其然,知其所以然. ...

  5. 蓝牙配对码配置错误_2020性价比高的无线耳机,双十一目前最值得入手的蓝牙耳机...

      [天极网IT新闻频道]双十一购物狂欢节说来就来,完全不会管你钱包是不是准备好了,无论你是理性的实用主义者,还是冲动的购物狂魔,这都是一个不容错过的抢货节点.很多人预测,蓝牙耳机应该是这次这次购物节 ...

  6. 安卓application_安卓系统蓝牙配对流程分析

    安卓系统蓝牙配对流程分析 配对流程基本上始于首次连接一个蓝牙设备的过程中,本端的搜索流程结束获取到该设备的BluetoothDevice信息,就可以开启配对流程. 配对,顾名思义就是将两个设备通过相关 ...

  7. 抖音SEO优化源码,企业号搜索排名系统,技术理论分析搭建。

    前言:抖音SEO优化源码,企业号搜索排名系统,技术理论分析搭建. 抖音seo源码如何搭建?抖音seo排名优化系统软件部分源码分析,代码打包中... 场景:在 python 中,你可以使用 list[1 ...

  8. 安卓通讯录管理软件_安卓系统50个你不知道的使用窍门!每个都值得你去收藏!...

    今天给大家介绍下安卓系统的安卓手机的使用技巧方法,以时下最为普遍最主流的Android 2.3系统为例,不过大部分使用技巧在其他版本的安卓系统上同样适用. 1.使用Android电源管理widget从 ...

  9. 安卓系统蓝牙服务com.android.bluetooth的使能

    蓝牙系统服务层的使能流程分析 蓝牙服务层的使能基础是其初始化完成,也就是AdapterService通过onBind()将AdapterServiceBinder上报给bind该服务的调用者.我们现在 ...

最新文章

  1. Android——与查询联系人相关的3张表
  2. 行业 | 数据团队该为公司的AI转型负责吗?花五分钟时间换个答案
  3. 关于判断checkbox选中问题
  4. 一分钟理解softmax函数(超简单)
  5. Lodop 打印控件
  6. TestFlight
  7. 使用QUIC协议实现实时视频直播0卡顿
  8. git 列出标签_Git标签介绍:如何在Git中列出,创建,删除和显示标签
  9. python t t_Python ttable包_程序模块 - PyPI - Python中文网
  10. 东大OJ-一元三次方程解的个数
  11. linux 0.11 返回用户侧,iPhone 11 11 Pro 用户必备教程:重启手机,恢复模式,DFU模式...
  12. UVA 1329 Corporative Network(并查集:路径压缩)
  13. LC-1186 连续子数组中可删除一个数的最大和
  14. 图片洗牌切换动画特效
  15. Matlab系列教程_基础知识_程序控制
  16. Sequel pro 连接mysql 报MySQL said: Authentication plugin 'caching_sha2_password' cannot be loaded...
  17. 【视频目标检测】|Towards High Performance Video Object Detection
  18. 全国关于省市区/县的行政区划数据-数据来源国家统计局
  19. 计算机考研院校排名2015,2015年计算机考研学校排名
  20. Improved 3D Object Detector Under Snowfall Weather Condition Based on LiDAR Point Cloud

热门文章

  1. android studio 自动生成对象,在Android Studio中快速导入可绘制对象的方法?
  2. 【STM32入门】这个项目绝了,用手势来产生波形,基于手势控制的波形发生器
  3. 巨坑!同事离职前一天,偷偷将一个470欧的色环电阻串进我的电源线中......
  4. 基于Nexys4 DDR的VGA显示图片
  5. wordpress程序安装php多少,2020最新WordPress网站程序详细安装教程
  6. matlab括号区别,matlab中各种括号(),[],与{}的区别与认识
  7. java返回属性_java – 根据对象属性确定哪个枚举返回
  8. vue怎么自己创建组件并引用_Vue 实现创建全局组件,并且使用Vue.use() 载入方式
  9. python中变量和函数的区别_关于python中带下划线的变量和函数 的意义
  10. python写一个表白程序_520最实用的Python表白程序