android bluetooth stack-unpair

解配对流程
static int remove_bond(const bt_bdaddr_t *bd_addr)

btif_dm_remove_bond(bd_addr)

static void btif_dm_generic_evt(UINT16 event, char* p_param)

void btif_dm_cb_remove_bond(bt_bdaddr_t *bd_addr)

BTA_DmRemoveDevice((UINT8 *)bd_addr->address);-》BTA_DM_API_REMOVE_DEVICE_EVT

bta_dm_remove_device,       /* BTA_DM_API_REMOVE_DEVICE_EVT */
btm_remove_acl(p_dev->bd_addr, transport);断开HCI ACL连接,马上执行完其命令执行完成后的处理工作btu_hcif_process_event-》HCI_DISCONNECTION_COMP_EVT

bta_dm_process_remove_device(other_address);上个函数最后
BTA_GATTC_CancelOpen(0, bd_addr, FALSE);
BTM_SecDeleteDevice(bd_addr);
BTA_GATTC_Refresh(bd_addr);
bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &sec_event);走到 -》btif_dm_upstreams_cback

这是最后的操作
-------

{
设置绑定类型
btm_set_bond_type_dev(p_data->link_down.bd_addr, BOND_TYPE_UNKNOWN);
从stack中移除hid设备
btif_hh_remove_device(bd_addr);
移除绑定的bonded设备中的加密key信息
btif_storage_remove_bonded_device(&bd_addr);
执行回调,告诉上层解绑成功
bond_state_changed(BT_STATUS_SUCCESS, &bd_addr, BT_BOND_STATE_NONE);
}

HCI ACL断开命令完成后的回调函数
btu_hcif_process_event (UNUSED_ATTR UINT8 controller_id, BT_HDR *p_msg)
case HCI_DISCONNECTION_COMP_EVT:
btu_hcif_disconnection_comp_evt (p);
static void btu_hcif_disconnection_comp_evt (UINT8 *p)
l2c_link_hci_disc_comp (UINT16 handle, UINT8 reason)
    l2cu_release_lcb (p_lcb);//l2c断开—>
              l2cu_process_fixed_disc_cback //l2cap fixed_reg.pL2CA_FixedConn_Cb = gatt_le_connect_cback,smp_connect_callback依次执行L2CA_RegisterFixedChannel注册的fixed_reg.pL2CA_FixedConn_Cb回调
                     l2cu_release_ccb->断开ccb
              btm_acl_removed//断开->remove l2cap acl index information
btm_sec_disconnected (handle, reason);//SMP断开

ACL断开后,GATT/ATT断开,并调用注册的回调函数
当btm_remove_acl 断开acl连接后l2cap的连接状态发生改变,则引起注册的回调操作
static void gatt_le_connect_cback (UINT16 chan, BD_ADDR bd_addr, BOOLEAN connected,UINT16 reason, tBT_TRANSPORT transport)
gatt_is_bda_in_the_srv_chg_clt_list查找远程服务端列表是否有此设备,这里为在服务端的列表里
btm_sec_is_a_bonded_dev这个要解配对的设备是一个已绑定的设备LTK&SRK已保存
gatt_add_a_bonded_dev_for_srv_chg(bd_addr);加入到client端的绑定列表中,原意是 srv chg client,不解
执行以下几个后就 l2cap的回调执行完毕
** This function cleans up the control
blocks when L2CAP channel
gatt_cleanup_upon_disc(bd_addr, reason, transport);

(*p_reg->app_cb.p_conn_cb)(p_reg->gatt_if,  bda, conn_id, FALSE, reason, transport srvc_eng_srvc_eng_connect_cback GATT  profile 连接状态改变*

接下来是SMP层的连接状态改变,说明SMP BR 通道断开连接,执行SMP的回调函数smp_connect_callback



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`stack->data[++stack->top1] = value` 和 `stack->data[stack->top1++] = value` 是两种不同的写法,但在这个特定的情况下,它们实际上是等价的。 假设 `top1` 的初始值为 0,并且执行这两个语句之前,栈 `stack` 已经被正确初始化。那么,这两个语句都将把 `value` 存储到 `stack->data[0]` 中,并将 `top1` 的值增加 1。 下面是对这两个语句的解释和执行过程: 1. `stack->data[++stack->top1] = value`: - `++stack->top1` 表达式会先对 `top1` 的值进行自增操作,然后返回自增后的结果(即先执行 `++stack->top1`,再使用该值)。 - 执行完 `++stack->top1` 后,`top1` 的值变为 1。 - 然后,将 `value` 存储到 `stack->data[1]` 中。 2. `stack->data[stack->top1++] = value`: - `stack->top1++` 表达式会先使用 `top1` 的当前值,然后再对 `top1` 的值进行自增操作。 - 首先,将 `value` 存储到 `stack->data[0]` 中(因为此时 `top1` 的值仍为 0)。 - 然后,执行完 `stack->top1++` 后,`top1` 的值变为 1。 在这个特定的情况下,无论使用哪种写法,最终结果都是将 `value` 存储到 `stack->data[0]` 中,并将 `top1` 的值增加到 1。因此,这两种写法在功能上是等效的。 需要注意的是,这种等效性只在这个特定的语句中成立。在其他上下文中,这两种写法可能会产生不同的结果。因此,在编写代码时,根据具体的语义和需求选择适当的写法是很重要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值