ios 代码清除有人给你发送蓝牙配对请求后的存储信息 怎么实现

1619人阅读
一、实验目的
1、了解主从配对绑定的过程中底层是怎么运行的;
1、关于配对于绑定,网上查了很多资料都没查到什么,问了很多人也没有回答的,所以我决定自己深入了解底层关于配对与绑定是如何运行的,我用了接近两个星期来理解的,效率很低,在这里总结一下,希望能帮助到别人。
2.这里之是大概讲了一个方向,因为涉及的点太多,无法一一列出,需要研究细节的,自己去探讨一下,不懂可以在群上讨论
三、实验平台
1、蓝牙协议栈:1.3.2
2、软件平台:IAR For .3
5、硬件平台:Smart RF开发板(从机),Android_Lightblue(主机)
四、实验步骤
1.static&void&gapRole_ProcessGAPMsg(&gapEventHdr_t&*pMsg&)
switch ( pMsg-&opcode )
case GAP_LINK_ESTABLISHED_EVENT:
if ( pPkt-&hdr.status == SUCCESS )
// Notify the Bond Manager to the connection
//通知绑定管理调出绑定当前连接主机的绑定信息如LTK等
VOID GAPBondMgr_LinkEst( pPkt-&devAddrType, pPkt-&devAddr, pPkt-&connectionHandle, GAP_PROFILE_PERIPHERAL );
2.bStatus_t&GAPBondMgr_LinkEst(&uint8&addrType,&uint8&*pDevAddr,&uint16&connHandle,&uint8&role&)
idx = GAPBondMgr_ResolveAddr( addrType, pDevAddr, publicAddr );//查看当前连接的主机是否绑定过
if ( idx & GAP_BONDINGS_MAX ) //如果当前连接主机在NV的某个位置(绑定过)则将绑定信息调出,否则不管
// On peripheral, load the key information for the bonding 从机加载出绑定的密钥信息
// On central and initiaiting security, load key to initiate encyption 主机加载出绑定的密钥信息并向从机发出加密请求
gapBondMgrBondReq( connHandle, idx, stateFlags, role,
((gapBond_PairingMode == GAPBOND_PAIRING_MODE_INITIATE ) ? TRUE : FALSE) )
// If Peripheral and initiating, send a slave security request to initiate either pairing or encryption
//调用出绑定信息后,向主机发出安全请求,主机发起加密或配对(如果没绑定过)
if ( role == GAP_PROFILE_PERIPHERAL &&
gapBond_PairingMode == GAPBOND_PAIRING_MODE_INITIATE )
gapBondMgrSlaveSecurityReq( connHandle ); //向主机发送安全请求
3.等待主机发送配对(没绑定)或加密请求(绑定过)
一、没绑定过
1.static&void&gapRole_ProcessGAPMsg(&gapEventHdr_t&*pMsg&)
switch ( pMsg-&opcode )
GAP_PAIRING_REQ_EVENT:
//接收到主机的配对请求
// Send pairing response //配对响应
gapBondMgrAuthenticate( pPkt-&connectionHandle, pLinkItem-&addrType, &(pPkt-&pairReq) ); //启动认证
2.static&void&gapBondMgrAuthenticate(&uint16&connHandle,&uint8&addrType,gapPairingReq_t&*pPairReq&)
VOID GAP_Authenticate( ¶ms, pPairReq ); //认证,根据配对请求接收到的主机信息(如主机的配对能力等)跟自己的配对能力做比较然后执行下一步动作(由于从机设置成GAPBOND_IO_CAP_DISPLAY_ONLY,所以主机索求密码)
3.static&void&gapRole_ProcessGAPMsg(&gapEventHdr_t&*pMsg&)
switch ( pMsg-&opcode )
GAP_PASSKEY_NEEDED_EVENT: //向主机索求密码
if ( pGapBondCB && pGapBondCB-&passcodeCB ) //用回调函数发送密码请求
// Ask app for a passcode
pGapBondCB-&passcodeCB( pPkt-&deviceAddr, pPkt-&connectionHandle, pPkt-&uiInputs, pPkt-&uiOutputs );
4.static&void&ProcessPasscodeCB(uint8&*deviceAddr,uint16&connectionHandle,uint8&uiInputs,uint8&uiOutputs&)
passcode = 123456;
//使用固定密码123456
// Send passcode response
GAPBondMgr_PasscodeRsp( connectionHandle, SUCCESS, passcode );
//发送密码请求给主机
5.等待主机回复密码,从机接收到主机的密码回复后,在底层对接收到的密码做校验,要么密码不正确(status=SMP_PAIRING_FAILED_CONFIRM_VALUE),要么正确(status=SUCCESS),要么主机取消输入操作status=SMP_PAIRING_FAILED_PASSKEY_ENTRY_FAILED),在校验密码完成后,从机触发事件并向主机发送自己的认证信息等(认证成功)或发送认证Msg&Buffer&Not&Available(密码错误),发送消息是底层完成的,不开源;
6.static&void&gapRole_ProcessGAPMsg(&gapEventHdr_t&*pMsg&)
switch ( pMsg-&opcode )
GAP_AUTHENTICATION_COMPLETE_EVENT:
//认证完成
if ( (pPkt-&hdr.status == SUCCESS) && (pPkt-&authState & SM_AUTH_STATE_BONDING) )//判断认证是否成功
// Save off of the authentication state
VOID gapBondMgrAddBond( &bondRec, //绑定
(gapBondLTK_t *)pPkt-&pSecurityInfo,
(gapBondLTK_t *)pPkt-&pDevSecInfo,
((uint8 *)((pPkt-&pIdentityInfo) ? pPkt-&pIdentityInfo-&irk : NULL )),
((uint8 *)((pPkt-&pSigningInfo) ? pPkt-&pSigningInfo-&srk : NULL )),
((uint32)((pPkt-&pSigningInfo)?pPkt-&pSigningInfo-&signCounter :GAP_INIT_SIGN_COUNTER ))
// Call app state callback
if ( pGapBondCB && pGapBondCB-&pairStateCB ) //通知回调函数当前认证的状态,密码正确或不正确
pGapBondCB-&pairStateCB( pPkt-&connectionHandle, GAPBOND_PAIRING_STATE_COMPLETE, pPkt-&hdr.status );
二、绑定过
1.主机接收到从机的安全请求后,会检查当前连接的从机是否绑定过,绑定过的话,利用绑定的信息做加密并向从机发送加密请求;
2.从机接收到主机的加密请求后,用中的调出来的绑定信息跟主机进行三次加密握手(底层完成),如果加密成功,从机向主机发送绑定完成事件()并触发GAP_BOND_COMPLETE_EVENT事件,如果加密不成功从机删除绑定信息,从机向主机发送绑定完成事件()事件但不触发GAP_BOND_COMPLETE_EVENT事件
3.static&void&gapRole_ProcessGAPMsg(&gapEventHdr_t&*pMsg&)
switch ( pMsg-&opcode )
case GAP_BOND_COMPLETE_EVENT:
//绑定完成
#if ( HOST_CONFIG & CENTRAL_CFG )
if ( pPkt-&hdr.status == LL_ENC_KEY_REQ_REJECTED ) //如果加密失败且status =LL_ENC_KEY_REQ_REJECTED
switch ( gapBond_BondFailOption )
//当绑定过,但是加密失败的时候,主机可以启动重新配对
case GAPBOND_FAIL_INITIATE_PAIRING:
// Initiate pairing
gapBondMgrAuthenticate( pPkt-&connectionHandle, pLinkItem-&addrType, NULL );
if ( pGapBondCB && pGapBondCB-&pairStateCB )
//加密成功,通知回调函数
pGapBondCB-&pairStateCB( pPkt-&connectionHandle, GAPBOND_PAIRING_STATE_BONDED, pMsg-&hdr.status );
1.每次连接后,从机都会向主机发送安全请求,如果没有相互绑定过,主机会发起配对(配对数据中包括主机的密钥等),配对完成后,从机触发GAP_AUTHENTICATION_COMPLETE_EVENT并向主机发送自己的认证信息等,这样相互保存认证信息等后就算绑定了;
2.每次连接后,从机都会向主机发送安全请求,如果配对绑定过,主机和从机会以保存下来的认证信息LTK等来做加密认证,如果加密成,从机触发GAP_BOND_COMPLETE_EVENT事件并向主机发送绑定完成消息(),如果认证失败从机删除绑定信息,从机会向主机发送绑定完成消息()事件当不触发GAP_BOND_COMPLETE_EVENT事件;
1.问题一:从机跟主机配对过一次后,不会再次配对;
答:从机跟主机配对过后,相互保存绑定的认证信息,当再次连接时,主机先会去检查当前从机是否绑定过,如果有,就不会在发起配对了,即使是从机更改了配对密码也是一样,因为再次连接加密认证时是用保存好的绑定信息()来做加密认证的,而不是配对密码,配对密码只是临时密码(),用来在配对时产生的,如果不用配对,更改配对密码是没有任何意义的;
2.问题二:主从机如何删除绑定?
答:主机:在手机的系统蓝牙设置里面有取消配对;
从机:这个函数可以删除所有绑定,但前提它不会立即执行,它要先确认从机当前是在连接状态还是在无连接状态,无连接状态时,删除绑定是立即执行,连接状态时,需要等断开连接后自动执行,详情可以自己看一下这个函数的代码就好,想在连接状态下删除绑定可以直接用,想删除某个绑定可以用;
3.问题三:为什么从机删除绑定后,不会重新配对,会重新配对,只有在系统蓝牙中取消配对在可以重新配对;
答:上面的实验步骤二讲到在从机删除绑定后,主机再和从机连接时,最终会加密失败,从机会发送失败消息给主机,主机可以在接收到加密失败消息后重新启动配对,像二一样,至于不会重新配对,会重新配对那只是程序编写不同而已了;
4.很多人问为什么在阿莫资料中的蓝牙连接之配对与绑定实验中,显示是在配对后的第二次连接才会显示
答:依总结看来,第一次配对绑定并不会触发事件的,而阿莫的OLED显示就是放在GAP_BOND_COMPLETE_EVENT事件,,所以第一次配对OLED不会显示,在主从配对绑定后,每次连接时,如果加密成功都会触发GAP_BOND_COMPLETE_EVENT事件,所以在配对之后的第一次连接才会显示bonding&success,实际上绑定相当与保存认证信息而已,在中gapBondMgrAddBond就已经做了,你也可以在事件中做显示;
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8469次
排名:千里之外
转载:12篇
(1)(1)(1)(1)(2)(13)问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
如题,需要获取的就是蓝牙下面“我的设备”那个列表里的数据
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
(1)第一次匹配时,保存起来,比如用:
(2)再次连接的时候, 把ID清单发给 retrievePeripheralsWithIdentifiers, 官方文档:
(3)补充: 你需要的应该是这个 , 包括了其他应用程序已经连接过的蓝牙设备
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
欢迎物联网大神加入物联网iOS交流群。我们大家一起交流物联网方面的问题
该答案已被忽略,原因:推广(招聘、广告、SEO 等)方面的内容
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App1785人阅读
之前在做项目的时候遇到这个问题,我的设备是支持ANCS协议的,但是每次配对后系统就会自动和我的设备连接,我无法搜索到这个设备,通过 retrieveConnectedPeripheralsWithServices:这方法可以找到已经被连接上的所有设备,但是我想利用 connectPeripheral:options对找到的设备进行连接,但是不成功,纠结了好久终于给我发现问题,在已经搜索到系统已连接上的设备后,不应该继续走设备搜索的方法了,所以connectPeripheral:options对找到的设备进行连接和scanForPeripheralsWithServices
应该是两个分支,代码如下:
-(void)scanDevices:(blackscanPeriperalInfos)blackPeriperalI
//已经被系统或者其他APP连接上的设备数组
& & NSArray *arr = [self.CBcentralmagagerretrieveConnectedPeripheralsWithServices:@[[CBUUIDUUIDWithString:ServiceUUID]]];
& & if(arr.count&0)
&& & for (CBPeripheral* peripheralin arr)
&& & & & & & if (peripheral !=
&& & & & & & {
&& & & & & & & & peripheral.delegate =
& & & & & & & & &
//manager 获取到的Peripheral会自动释放,要重新创建一个Peripheral对象等于获取到的Peripheral,之前项目中有这个,写博客的时候少了这句,导致好多朋友反应这个方法实现不了,后边一位朋友跟我聊得时候发现少了这句,现在补上
& & & & & & & & self.peripheral =
& & & & & & & & [centralManager
connectPeripheral:self.peripheral
options:nil];
&& & & & & & }
& & & & [self.CBcentralmagagerscanForPeripheralsWithServices:niloptions:nil];
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:47425次
积分:1088
积分:1088
排名:千里之外
原创:49篇
转载:67篇
评论:15条
(4)(3)(3)(2)(5)(7)(3)(4)(20)(9)(3)(5)(7)(6)(1)(7)(11)(3)(6)(5)(2)(1)(4)}

我要回帖

更多关于 有人给你发送蓝牙配对请求 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信