当前位置: 首页 > 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…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...