当前位置: 首页 > news >正文

【PHY6222】绑定详解

1.函数详解

bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void* pValue )

设置绑定参数。

bStatus_t GAPBondMgr_GetParameter( uint16 param, void* pValue )

获取绑定参数。

param:

GAPBOND_PAIRING_MODE,配对模式,可以选择:

GAPBOND_PAIRING_MODE_NO_PAIRING,不允许配对

GAPBOND_PAIRING_MODE_WAIT_FOR_REQ,等待配对请求(被动)

GAPBOND_PAIRING_MODE_INITIATE,直接发起配对请求(主动)

GAPBOND_INITIATE_WAIT,等待配对的时间,单位ms,默认是1000ms

GAPBOND_MITM_PROTECTION,是否启用中间人保护

GAPBOND_IO_CAPABILITIES,IO能力设置,可以选择:

GAPBOND_IO_CAP_DISPLAY_ONLY,仅仅可以显示

GAPBOND_IO_CAP_DISPLAY_YES_NO,仅仅可以显示YES和NO

GAPBOND_IO_CAP_KEYBOARD_ONLY,仅仅具有键盘输入

GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT,既没输入也没输出

GAPBOND_IO_CAP_KEYBOARD_DISPLAY,既有显示也有键盘输入

GAPBOND_OOB_ENABLED,使能OOB配对方式

GAPBOND_OOB_DATA,OOB数据,即密钥,详细参考蓝牙传统OOB配对方式。

GAPBOND_BONDING_ENABLED,使能绑定,将会在配对之后发起绑定请求

GAPBOND_KEY_DIST_LIST,绑定过程中分发的密钥种类,多选。支持以下参数:

GAPBOND_KEYDIST_SENCKEY,从机加密密钥(LTK)

GAPBOND_KEYDIST_SIDKEY,从机IRK和ID信息(EDIV和Rand)

GAPBOND_KEYDIST_SSIGN,从机CSRK

GAPBOND_KEYDIST_MENCKEY,主机加密密钥

GAPBOND_KEYDIST_MIDKEY,主机IRK和ID信息

GAPBOND_KEYDIST_MSIGN,主机CSRK

GAPBOND_DEFAULT_PASSCODE,PIN码

GAPBOND_ERASE_ALLBONDS,擦除所有绑定信息

GAPBOND_AUTO_FAIL_PAIRING,测试用,在收到配对请求时直接回复配对失败

GAPBOND_AUTO_FAIL_REASON,测试用,回复配对失败的原因,可以选择:

SMP_PAIRING_FAILED_PASSKEY_ENTRY_FAILED,密钥输入失败,例如用户取消了输入

SMP_PAIRING_FAILED_OOB_NOT_AVAIL,OOB数据不可用

SMP_PAIRING_FAILED_AUTH_REQ,IO能力不满足身份认证需求,配对失败

SMP_PAIRING_FAILED_CONFIRM_VALUE,确认值和计算得到的不同

SMP_PAIRING_FAILED_NOT_SUPPORTED,设备不支持配对

SMP_PAIRING_FAILED_ENC_KEY_SIZE,协商密钥长度不能满足安全需求

SMP_PAIRING_FAILED_CMD_NOT_SUPPORTED,收到的SMP命令当前设备不支持

SMP_PAIRING_FAILED_UNSPECIFIED,未说明配对失败原因

SMP_PAIRING_FAILED_REPEATED_ATTEMPTS,配对和身份认证过程不能执行,因为距离上次时间太短

GAPBOND_KEYSIZE,配对密钥长度

GAPBOND_AUTO_SYNC_WL,清除当前白名单,并重新从Flash中读取绑定设备添加到白名单

GAPBOND_BOND_COUNT,获取当前绑定设备数量

GAPBOND_BOND_FAIL_ACTION,中心设备在绑定失败的时候采取的措施,可以选择:

GAPBOND_FAIL_NO_ACTION,不进行任何操作

GAPBOND_FAIL_INITIATE_PAIRING,启动配对

GAPBOND_FAIL_TERMINATE_LINK,终止连接

GAPBOND_FAIL_TERMINATE_ERASE_BONDS,终止连接并擦除设备上所有绑定信息

void GAPBondMgr_Init( uint8 task_id )

绑定相关初始化,里面只读取了绑定信息。详细见:gapBondMgrReadBonds

uint16 GAPBondMgr_ProcessEvent( uint8 task_id, uint16 events )

处理绑定相关事件。可以看到只处理了SYS_EVENT_MSG类型的信息,详细见gapBondMgr_ProcessOSALMsg

static void gapBondMgrReadBonds( void )

static void gapBondMgr_SyncWhiteList( void )

 

static void gapBondSetupPrivFlag( void )

static uint8 gapBondMgrBondTotal( void )

static uint8 gapBondMgr_ProcessOSALMsg( osal_event_hdr_t* pMsg )

uint8 GAPBondMgr_ProcessGAPMsg( gapEventHdr_t* pMsg ) 

 

void GAPBondMgr_Register( gapBondCBs_t* pCB )

注册配对/绑定状态改变通知的回调函数(pGapBondCB->pairStateCB)和请求PIN码的回调函数(pGapBondCB->passcodeCB),被注册的两个函数会在上面的函数GAPBondMgr_ProcessGAPMsg中调用。

bStatus_t GAPBondMgr_PasscodeRsp( uint16 connectionHandle, uint8 status, uint32 passcode )

更新pin码函数,可以在请求pin码的回调函数(pGapBondCB->passcodeCB)中调用。 

static uint8 gapBondMgrAddBond( gapBondRec_t* pBondRec, gapAuthCompleteEvent_t* pPkt )

添加绑定信息函数。

经过上面的操作,假如是一个新的绑定,已经获得了一个空的可以保存绑定信息的index,后续绑定信息会保存于此。

static void gapBondRecvEvt(uint16 connHandle, gapBondRec_t* pBondRec, gapAuthCompleteEvent_t* pPkt )

在gapBondRecvEvt中也调用了gapBondMgrAddBond,但是在GAPBondMgr_ProcessGAPMsg中gapBondMgrAddBond和gapBondRecvEvt是同时调用的,通过对gapBondMgrAddBond函数的分析可以知道,第一次进入gapBondMgrAddBond函数时,pAuthEvt[pPkt->connectionHandle]应该为空,此时保存了mainRecord、gattCfg以及pAuthEvt[pPkt->connectionHandle]设置为当前信息,在gapBondRecvEvt中的gapBondMgrAddBond中进入时pAuthEvt[pPkt->connectionHandle]已经不为空了,然后才保存TLK、IRK等余下的信息。

static uint8 gapBondMgr_SyncCharCfg( uint16 connHandle )

 static uint8 gapBondMgrUpdateCharCfg( uint8 idx, uint16 attrHandle, uint16 value )

static gapBondCharCfg_t* gapBondMgrFindCharCfgItem( uint16 attrHandle,
                                                    gapBondCharCfg_t* charCfgTbl )

static void gapBondMgrInvertCharCfgItem( gapBondCharCfg_t* charCfgTbl )

翻转charCfgTbl的attrHandle和value。 

static bStatus_t gapBondMgrEraseBonding( uint8 idx )

static bStatus_t gapBondMgrEraseAllBondings( void )

擦除所有绑定信息,只是用了一个for循环把所有单条的擦除。

uint8 GAPBondMgr_CheckNVLen( uint8 id, uint8 len )

返回flash中保存的信息的大小。详细见后续关于内存占用分析。 

static void gapBondFreeAuthEvt( uint16 connHandle )

 bStatus_t GAPBondMgr_LinkEst( uint8 addrType, uint8* pDevAddr, uint16 connHandle, uint8 role )

 

static void gapBondMgrBondReq( uint16 connHandle, uint8 idx, uint8 stateFlags,
                               uint8 role, uint8 startEncryption )

static void gapBondMgrSlaveSecurityReq( uint16 connHandle )

发送安全请求。

static void gapBondMgrAuthenticate( uint16 connHandle, uint8 addrType,
                                    gapPairingReq_t* pPairReq )

2.保存的信息

其中:

GAP_BOND_REC_ID_OFFSET保存的数据类型为:

B_ADDR_LEN为6,所以一共占用14个字节。

GAP_BOND_LOCAL_LTK_OFFSET和GAP_BOND_DEV_LTK_OFFSET保存的数据类型为:

KEYLEN为16,B_RANDOM_NUM_SIZE为8,所以一共需要28字节。

GAP_BOND_DEV_IRK_OFFSET和GAP_BOND_DEV_CSRK_OFFSET都是16字节。

GAP_BOND_DEV_SIGN_COUNTER_OFFSET为4字节。

所以一共需要10*(14+28+28+16+16+4) = 1060字节。

另外10个连接,每个最多保存4个属性项,单个属性项结构如下:

一共需要10*4*4=160字节,一共需要160+1060 = 1220字节。

相关文章:

【PHY6222】绑定详解

1.函数详解 bStatus_t GAPBondMgr_SetParameter( uint16 param, uint8 len, void* pValue ) 设置绑定参数。 bStatus_t GAPBondMgr_GetParameter( uint16 param, void* pValue ) 获取绑定参数。 param: GAPBOND_PAIRING_MODE,配对模式,…...

vue事件绑定

vue提供了v-on事件绑定指令,用来辅助程序员为DOM元素绑定事件监听,语法格式如下: v-on:指令可以简写为 注意:原生DOM对象有onclick,oninput,onkeyup等原生事件,替换为vue的事件绑定…...

如何在服务器上部署springboot项目

在服务器上部署Spring Boot项目通常有以下步骤: 在服务器上安装Java运行环境:首先确保服务器上已经安装了Java运行环境(至少需要Java 8或以上版本)。 快速安装JDK命令: yum install java-1.8.0-openjdk.x86_64 打包S…...

基于Spring Boot的支教志愿者招聘网站

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring Boot的支教志愿者招聘网站,j…...

安装gnvm,nodejs,npm使用方法

安装gnvm,nodejs,npm使用方法 一、安装gnvm gnvm.exe下载地址: https://download.csdn.net/download/hsg77/88651752 http://ksria.com/gnvm/#download 二、配置gnvm环境变量 新建目录,如:d:/nodejs 并把gnvm.exe存储到此目录 并把d:/node…...

word导入导出-Apache POI 和 Poi-tl

word 文件读取 使用Apache POI Word 进行读取文件 使用poi 时如果报ClassNotFoundException 等错误,请注意请求以下maven 文件的版本 Apache POI Word 说明文档:Apache POI Word 说明文档 maven 解决依赖冲突教程:https://www.cnblogs.com/…...

Hadoop 集群环境搭建

目录 第一部分:系统安装... 3 1:图形化安装... 3 2:选择中文... 3 3:安装选项... 3 4:软件选项... 4 5:安装位置... 4 6:网络配置... 6 7:开始安装... 7 8:创建用户... 7…...

maven完结,你真的学完了吗

书接上文:必学的maven的起步-CSDN博客 分模块开发与设计 分模块开发: 创建模块书写代码模块 模块中需要其他的模块,就将他安装到仓库然后再dep中导入依赖通过maven指令安装模块到本地仓库(install) 聚合与继承 聚合…...

【Xcode】解决Unable to process request - PLA Update available

出现场景 IOS更新app时,使用Xcode上传新版本的包时,提示无法上传。 Unable to process request -PLA update available you currently dont have access to this membership resource. To resolve this issue ,agree to the latest program license a…...

力扣单调栈算法专题训练

目录 1 专题说明2 训练 1 专题说明 本博客用来计算力扣上的单调栈题目、解题思路和代码。 单调栈题目记录: 2232866美丽塔II 2 训练 题目1:2866美丽塔II。 解题思路:先计算出prefix[i],表示0~i满足递增情况下,0~i…...

【NI-RIO入门】理解Windows、Real Time与FPGA之间数据通信的原理

于NI kb摘录 1.概述 对于NI RIO系列设备(CompactRIO、sbRIO、myRIO等)进行编程时,需要注意有三个不同的组件。 人机界面 (HMI) 。有时称为“主机”,为用户提供图形用户界面(GUI),用于监控系统…...

关于游戏性能优化的技巧

关于游戏性能优化的技巧 游戏性能优化对象池Jobs、Burst、多线程间隔处理定时更新全局广播缓存组件缓存常用数据2D残影优化2D骨骼转GPU动画定时器优化DrawCall合批处理优化碰撞层优化粒子特效 游戏性能优化 好久没有在CSDN上面写文章了,今天突然看到鬼谷工作室技术…...

antdesignpro实现滚动加载分页数据

原理解析:每滚动一次相当于翻页,请求后端时给的页码参数要想办法加1,后端才能根据页码给出相应数据 注意后端收到页码参数之后要准确计算出每页的首行数据,关键逻辑代码: # 根据前端传的页码,进行计算下一…...

步兵 cocos2dx 加密和混淆

文章目录 摘要引言正文代码加密具体步骤代码加密具体步骤测试和配置阶段IPA 重签名操作步骤 总结参考资料 摘要 本篇博客介绍了针对 iOS 应用中的 Lua 代码进行加密和混淆的相关技术。通过对 Lua 代码进行加密处理,可以确保应用代码的安全性,同时提高性…...

【算法设计与分析】——动态规划算法

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…...

WPF组合控件TreeView+DataGrid之DataGrid封装

(关注博主后,在“粉丝专栏”,可免费阅读此文) wpf的功能非常强大,很多控件都是原生的,但是要使用TreeViewDataGrid的组合,就需要我们自己去封装实现。 我们需要的效果如图所示&#x…...

PIL/Pillow

Abstract PIL(Python Imaging Library)是一个用于图像处理的 Python 库。它提供了广泛的功能,包括图像加载、保存、调整大小、裁剪、旋转、滤镜应用等。 由于 PIL 的开发停止在 2009 年,因此推荐使用其后续的维护版本 Pillow。Pillow 是一个兼容 PIL 接…...

ARM 汇编入门

ARM 汇编入门 引言 ARM 汇编语言是 ARM 架构的汇编语言,用于直接控制 ARM 处理器。虽然现代软件开发更多地依赖于高级语言和编译器,但理解 ARM 汇编仍然对于深入了解系统、优化代码和进行低级调试非常重要。本文将为您提供一个简单的 ARM 汇编入门指南…...

SQL进阶:多表查询

在SQL基础部分,我们在讲解的过程中只用到了单表查询。但实际上,常见的业务场景单表查询不能满足,或者拆分查询性能过慢。这个时候我们就需要用到连接查询。即查询多表按一定规则合并后的数据。 注意,合并后的数据也是表&#xff…...

多层负载均衡实现

1、单节点负载均衡 1)站点层与浏览器层之间加入了一个反向代理层,利用高性能的nginx来做反向代理 2)nginx将http请求分发给后端多个web-server 优点: 1)DNS-server不需要动 2)负载均衡:通过ngi…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...

Qt的学习(二)

1. 创建Hello Word 两种方式,实现helloworld: 1.通过图形化的方式,在界面上创建出一个控件,显示helloworld 2.通过纯代码的方式,通过编写代码,在界面上创建控件, 显示hello world; …...

精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑

精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑 在电子商务领域,转化率与网站性能是决定商业成败的核心指标。今天,我们将深入解析不同类型电商平台的转化率基准,探讨页面加载速度对用户行为的…...