【PHY6222】绑定详解

发布时间:2023年12月23日

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字节。

文章来源:https://blog.csdn.net/qwe5959798/article/details/135149780
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。