【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:…...

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

多层负载均衡实现
1、单节点负载均衡 1)站点层与浏览器层之间加入了一个反向代理层,利用高性能的nginx来做反向代理 2)nginx将http请求分发给后端多个web-server 优点: 1)DNS-server不需要动 2)负载均衡:通过ngi…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...