蓝牙HID配对过程

news2024/12/26 11:43:18

配对通常调用分两步

1. Bluetooth AdapterService.cancelDiscovery

btif_dm_cancel_discovery
BTfM_CancelInquiry
BTA_DM_SEARCH_CANCEL_CMPL_EVT
BTM_BLI_INQ_CANCEL_EVT
BTM_BLI_INQ_DONE_EVT
discovery_state_changed_cb
btif_dm_cancel_discovery
BTA_DM_SEARCH_CANCEL_CMPL_EVT
BTA_DM_SEARCH_CANCEL_CMPL_EVT
discovery_state_changed_cb

hci上可以看到Inquiry_cancel,或者搜索已经完成Inquiry_Complete

2. 配对CreateBond

在bluetooth service(bluetooth.apk)里我们通常看到这样的日志

BluetoothBondStateMachine

BluetoothBondStateMachine: bondStateChangeCallback: Status: 0 Address: **:**:**:**:**:** newState: 1
BluetoothBondStateMachine: Bond State Change Intent:**:**:**:**:**:** BOND_NONE => BOND_BONDING
BluetoothBondStateMachine: bondStateChangeCallback: Status: 0 Address: **:**:**:**:**:** newState: 2
BluetoothBondStateMachine: **:**:**:**:**:** is bonded, wait for SDP complete to broadcast bonded intent
BluetoothBondStateMachine: Bond State Change Intent:**:**:**:**:**:** BOND_BONDING => BOND_BONDED

Java里状态是BOND_NONE(10) ->BOND_BONDING(11)->BOND_BONDED(12)

native状态对应是 0->1->2

native的callback是bond_state_changed_cb

刚调用create_bond状态就变为了BT_BOND_STATE_BONDING(1)
btif_dm_cb_create_bond
  bond_state_changed(BT_STATUS_SUCCESS, bd_addr, BT_BOND_STATE_BONDING);

认证正确就变为BT_BOND_STATE_BONDED(2)
btif_dm_auth_cmpl_evt
  bond_state_changed(status, bd_addr, state);  

bluedroid协议栈里btm有这么些状态,

IDLE -> GET_REM_NAME ->WAIT_PIN_REQ ->WAIT_LOCAL_IOCAPS ->WAIT_NUM_CONFIRM ->WAIT_AUTH_COMPLETE

几个基本调用

adapterService.java

createBond  
   send BondStateMachine.CREATE_BOND
       createBondNative  com_android_bluetooth_btservice_AdapterService.cpp 
           sBluetoothInterface->create_bond((RawAddress*)addr, transport);  bluetooth.cc
               btif_dm_create_bond(bd_addr, transport)

btif_dm.cc         
bt_status_t btif_dm_create_bond

   btif_stats_add_bond_event(*bd_addr, BTIF_DM_FUNC_CREATE_BOND,
                            pairing_cb.state);

  btif_transfer_context(btif_dm_generic_evt, BTIF_DM_CB_CREATE_BOND,
                        (char*)&create_bond_cb,
                        sizeof(btif_dm_create_bond_cb_t), NULL);

btif_dm_generic_evt

   btif_dm_cb_create_bond(create_bond_cb->bdaddr, create_bond_cb->transport)

btif_dm_cb_create_bond
   bond_state_changed(BT_STATUS_SUCCESS, bd_addr, BT_BOND_STATE_BONDING);
   BTA_DmBond(bd_addr, addr_type, transport);   bta_dm_api.cc

      bta_dm_bond    bta_dm_act.cc

           BTM_SecBond   btm_sec.cc

                btm_sec_bond_by_transport
  

btm_sec_bond_by_transport

      BTM_DeleteStoredLinkKey(&bd_addr, NULL)
      btm_sec_change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME);
      status = BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR);

配对正常时hci日志

 

 

bluedroid正常时logcat日志

BluetoothBondStateMachine( 1175): Bond address is:**:**:**:**:**:**
bt_btif : btif_dm_create_bond: bd_addr=**:**:**:**:**:**, transport=0
bond_state_changed: state=1, prev_state=0, sdp_attempts = 0
bond_state_changed: HAL bt_hal_cbacks->bond_state_changed_cb
bt_btm  : BTM: BTM_DeleteStoredLinkKey: delete_all_flag: false
bt_btm  : BTM_SecBond: Remote sm4: 0x0  HCI Handle: 0xffff
bt_btm  : btm_sec_change_pairing_state()  Old: IDLE
bt_btm  : btm_sec_change_pairing_state()  New: GET_REM_NAME pairing_flags:0x1
bt_stack: [VERBOSE1:btm_inq.cc(809)] BTM_ReadRemoteDeviceName: bd addr **:**:**:**:**:**
bt_stack: [VERBOSE1:btm_acl.cc(2505)] connecting_bda: 18:84:c1:57:b9:5f
bt_btm  : State:GET_REM_NAME sm4: 0x0 sec_state:0
I/BluetoothBondStateMachine( 1175): Bond State Change Intent:**:**:**:**:**:** BOND_NONE => BOND_BONDING
bt_btm  : btm_sec_rmt_name_request_complete

bt_l2cap: l2cu_create_conn_after_switch :0 num_acl:1 no_hi: 0 is_bonding:1  (HCI: Create_Connection)
bt_stack: [VERBOSE1:btm_acl.cc(2505)] connecting_bda: **:**:**:**:**:**
bt_stack: [VERBOSE1:btm_sec.cc(2602)] Security Manager: **:**:**:**:**:**
bt_btm  : btm_sec_change_pairing_state()  Old: GET_REM_NAME
bt_btm  : btm_sec_change_pairing_state()  New: WAIT_PIN_REQ pairing_flags:0x5

bt_stack: [VERBOSE2:btm_sec.cc(3911)] btm_sec_connected: Security Manager: in state: WAIT_PIN_REQ    (HCI_EVT: Connection_complete)
bt_btm  : btm_acl_created: peer **:**:**:**:**:** hci_handle=51 link_role=1  transport=1
bt_btm  : btm_sec_execute_procedure: Required:0x10 Flags:0x88 State:0
bt_btm  : Security Manager: Start authentication  (HCI_CMD: Authentication Requested (0x0411)
bt_btm  : btm_acl_created: peer **:**:**:**:**:** hci_handle=51 link_role=0  transport=1
bt_btm  : BTM_SetLinkPolicy (HCI_CMD: Write Link Policy Settings (0x080d))
bt_stack: [VERBOSE2:btm_sec.cc(4509)] btm_sec_link_key_request bda: **:**:**:**:**:** (HCI_EVT: Link Key Request (0x17))
bt_btm  : btm_io_capabilities_req: State: WAIT_PIN_REQ
bt_btm  : btm_io_capabilities_req:Security mode: 4, Num Read Remote Feat pages: 0
bt_btm  : btm_sec_change_pairing_state()  Old: WAIT_PIN_REQ
bt_btm  : btm_sec_change_pairing_state()  New: WAIT_LOCAL_IOCAPS pairing_flags:0x5
bt_btm  : BTM_ReadRemoteVersion
bt_btm  : BTM_ReadRemoteFeatures
bt_btif : BTA_DM_LINK_UP_EVT. Sending BT_ACL_STATE_CONNECTED
bt_btif : btif_dm_upstreams_evt: HAL bt_hal_cbacks->acl_state_changed_cb 

bt_smp  : smp_br_connect_callback
bt_stack: [VERBOSE1:smp_l2c.cc(259)] smp_br_connect_callback for pairing BDA: **:**:**:**:**:**
bt_btm  : btm_sec_change_pairing_state()  Old: WAIT_LOCAL_IOCAPS
bt_btm  : btm_sec_change_pairing_state()  New: WAIT_NUM_CONFIRM pairing_flags:0x5  (HCI_EVT: User Confirmation Request (0x33))
bt_btif : btif_dm_upstreams_evt: ev: BTA_DM_SP_CFM_REQ_EVT
bt_btif : btif_dm_ssp_cfm_req_evt: HAL bt_hal_cbacks->ssp_request_cb
BluetoothBondStateMachine: sspRequestCallback: [B@b5713bd name: [B@d452db2 cod: 1288 pairingVariant 2 passkey: 449970
bt_btif : btif_dm_ssp_reply: accept=1  (HCI_CMD: User Confirmation Request Reply (0x042c))
bt_btm  : BTM_ConfirmReqReply() State: WAIT_NUM_CONFIRM  Res: 0
bt_btm  : btm_sec_change_pairing_state()  Old: WAIT_NUM_CONFIRM
bt_btm  : btm_sec_change_pairing_state()  New: WAIT_AUTH_COMPLETE pairing_flags:0x5
bt_btm  : btm_simple_pair_complete()  Pair State: WAIT_AUTH_COMPLETE  Status:0  sec_state: 1
bt_stack: [VERBOSE2:btm_sec.cc(3574)] btm_sec_auth_complete: Security Manager: in state: WAIT_AUTH_COMPLETE handle:51 status:
bt_btm  : btm_sec_change_pairing_state()  Old: WAIT_AUTH_COMPLETE
bt_btm  : btm_sec_change_pairing_state()  New: IDLE pairing_flags:0x5
bt_btif : btif_dm_upstreams_evt: ev: BTA_DM_AUTH_CMPL_EVT
bt_btif : btif_dm_auth_cmpl_evt: Storing link key. key_type=0x4, bond_type=1

bt_btif : bond_state_changed: state=2, prev_state=1, sdp_attempts = 1
bt_btif : bond_state_changed: HAL bt_hal_cbacks->bond_state_changed_cb
BluetoothBondStateMachine: bondStateChangeCallback: Status: 0 Address: **:**:**:**:**:** newState: 2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/789401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ElasticSearch学习--自动补全

目录 自定义分词器 介绍 配置自定义分词器 拼音分词器的问题​编辑 总结 DSL自动补全查询 RestAPI实现自动补全 自定义分词器 介绍 自定义分词器只在当前库中有效 配置自定义分词器 拼音分词器的问题 总结 DSL自动补全查询 RestAPI实现自动补全

VLAN---虚拟局域网

VLAN— 虚拟局域网 LAN—局域网 MAN—城域网 WAN—广域网 1.一个VLAN相当于是一个广播域 VLAN—通过路由器和交换机协同工作后,将原本的一个广播域逻辑上,拆 分为多个虚拟的广播域。 VLAN配置: 1.创建VLAN VID—VLAN ID------用来区分和…

1、传统锁回顾(Jvm本地锁,MySQL悲观锁、乐观锁)

目录 1.1 从减库存聊起1.2 环境准备1.3 简单实现减库存1.4 演示超卖现象1.5 jvm锁1.6 三种情况导致Jvm本地锁失效1、多例模式下,Jvm本地锁失效2、Spring的事务导致Jvm本地锁失效3、集群部署导致Jvm本地锁失效 1.7 mysql锁演示1.7.1、一个sql1.7.2、悲观锁1.7.3、乐观…

行为型设计模式之观察者模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everythi…

Alluxio技术分析

Alluxio技术分析 Alluxio: A Virtual Distributed File System Alluxio主要解决的基于磁盘的分布式存储层性能低下的问题,通过alluxio提供的分布式内存来加速数据分析。 Alluxio的这种通过内存加速数据的想法其实是有明确的使用场景的: Immutable da…

【安全】web中的常见编码浅析浏览器解析机制

目录 常见编码 一、ASCII码 二、URL编码 三、Unicode编码 四、HTML实体编码 结合编码理解浏览器解析机制 常见编码 一、ASCII码 ASCII (American Standard Code for Information Interchange,美国信息交换标准代码) 计算机内部&#xff0…

QString和QByteArray的区别

QString和QByteArray的区别 本质格式转换QString字符串格式化打印长度 本质 QString是对QByteArray的再次封装 QString可以通过char*来构造,也可以通过QByteArray来构造 QByteArray就是char* QString是编码后的char* QString也是封装了字符串, 但是内部的编码为utf…

Linux笔记——搜索命令find、解压缩命令、vi编辑器、用户权限命令、系统信息相关命令讲解

系列文章目录 Linux笔记——磁盘进行分区与挂载介绍 Linux笔记——管道相关命令以及shell编程 Linux笔记——进程管理与网络监控技术讲解​​​​​​ Linux笔记——rpm与yum下载软件命令介绍 文章目录 系列文章目录 准备工作 一 搜索命令—— find 搜索 1.1 目标 1.…

【UE5 多人联机教程】04-加入游戏

效果 步骤 1. 新建一个控件蓝图,父类为“USC_Button_Standard” 控件蓝图命名为“UMG_Item_Room”,用于表示每一个搜索到的房间的界面 打开“UMG_Item_Room”,在图表中新建一个变量,命名为“Session” 变量类型为“蓝图会话结果…

Matlab 点云曲面特征提取

文章目录 一、简介二、实现代码2.1基于k个邻近点2.2基于邻近半径参考资料一、简介 这里基于每个点的邻域协方差来获取点云中具有的曲面几何特征的点,计算方式如下图所示: 二、实现代码 2.1基于k个邻近点 SurfaceVar.m %% *******</

零信任网络架构与实现技术的研究与思考

目前&#xff0c;国外已有较多有关零信任网络的研究与实践&#xff0c;包括谷歌的 BeyondCorp、BeyondProd&#xff0c;软件定义边界&#xff08;Software Defined Perimeter&#xff0c;SDP&#xff09; 及盖特提出的“持续自适应风险与信任评估”等。国内也有不少安全厂商积极…

Unity 性能优化一:性能标准、常用工具

性能标准 推荐耗时&#xff1a; 性能提现到玩家直观感受&#xff0c;就是帧率&#xff0c;为了达到要求的帧率&#xff0c;就要控制CPU的耗时&#xff0c;不同类型的游戏&#xff0c;对帧率要求不一样。下面是推荐耗时&#xff1a; 推荐内存&#xff1a; 避免游戏闪退的重点…

network failed to load response data: no resource with given ide...

Chrome 开发者工具无法显示服务器正常返回的 HTTP 请求 - Failed to load response data 今天做开发时遇到一个问题&#xff0c;Chrome 开发者工具 network 标签里&#xff0c;虽然一个 HTTP 请求已经成功从服务器端返回&#xff0c;但是 Chrome 开发者工具里&#xff0c;仍然…

Cisco学习笔记(CCNA)——Open Shortest Path First (OSPF)

Open Shortest Path First (OSPF) 动态路由协议介绍 动态路由协议&#xff1a; 向路由表中添加远程网络 探索网络 更新和维护路由表 自主网络探索&#xff1a; 通过共享路由表信息路由器能探索到新的网络 动态路由协议的分类 内部网关协议&#xff08;IGP&#xff09; 适…

华为数通HCIP-ISIS高级

isis区域间的互访 1、L2区域 to L1区域 在L1区域发布的路由会以L1-LSP在L1区域内传递&#xff0c;到达L1-2路由器时&#xff0c;L1-2路由器会将该L1-LSP转换为L2-LSP在L2区域内传递&#xff1b; 因此L2区域的设备可以学习到L1区域的明细路由&#xff0c;进行访问&#xff1b;…

通过 API 远程管理 Jenkins

目录 前言&#xff1a; 背景介绍 Jenkins Remote API 的简介 Jenkins Remote API 的调用 Read More ... 前言&#xff1a; Jenkins 是一种开源的持续集成工具&#xff0c;可以帮助我们更加方便地进行软件开发和测试工作。通过 API 远程管理 Jenkins 可以帮助我们更加方便…

Windows 11 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jul 2023)

Windows 11 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jul 2023) Windows 11, version 22H2 官方原版&#xff0c;2023 年 7 月 更新 请访问原文链接&#xff1a;https://sysin.org/blog/windows-11/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作…

(三)RabbitMQ七种模式介绍与代码演示

Lison <dreamlison163.com>, v1.0.0, 2023.06.22 七种模式介绍与代码演示 文章目录 七种模式介绍与代码演示四大交换机四种交换机介绍 工作模式简单模式&#xff08;Hello World&#xff09;工作队列模式&#xff08;Work queues&#xff09;订阅模式&#xff08;Publis…

Qt 类似vscode和matlab的分屏显示效果

运行截图 向右分屏 多分屏 全屏显示 介绍 实现了一个类似vscode和matlab的标签页显示分屏效果&#xff0c;支持鼠标拖拽分屏、全屏显示&#xff0c;可自适应调整大小&#xff0c;程序把要显示的Widget独立出来&#xff0c;可随时替换为其他的用户自定义Widget&#xff0c…

挂载文件系统

文章目录 注册文件系统类型挂载文件系统系统调用mount绑定挂载挂载命名空间1.标准的挂载命名空间2.共享子树&#xff08;1&#xff09;共享挂载&#xff08;2&#xff09;从属挂载&#xff08;3&#xff09;私有挂载&#xff08;4&#xff09;不可绑定挂载 挂载跟文件系统1.根文…