【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…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
