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