TI同事下午好,
在提这个问题前,看了该论坛类似问题的几个讨论。http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/p/49083/170788.aspx#170788
譬如hu ai在2015-3-20 :48里面的回答:
“可以将密码保存在其文件系统中(实际就是flash中),连接配对成功之后就可以通过给其发命令来修改密码了。有一个问题就是除非将手机端的配对信息给删除,否则新的密码对于已经配对成功过的手机是不起作用的,但是新密码对于未配对的移动设备是起作用的”
譬如hu ai在2015-3-25 11:31里面的回答:
”如果老用户之前已经配对过的话新的密码对其实不起作用的。这个不是CC2540的bug,蓝牙协议就是这样的。解决方法有的,你可以绕开系统的输入密码这个过程,自可以将密码保存在其文件系统中(实际就是flash中),连接配对成功之后就可以通过给其发命令来修改密码了。己做一个密码校验功能,这样在任何时候你的修改密码功能均可以生效了“。
对于”如果老用户之前已经配对过的话新的密码对其实不起作用的“这个说法,我想提出我的不同看法:
实验证明,每次在给CC254X烧录程序后,我的CC254X从机都会要求手机APP端进行配对,不管这个手机以前有否配对过!
从这个实验中我们是否可以这么认为:删除CC254X里面的某些位/字段(也可能是已经配对的设备信息),就可以要求所有欲与其连接的手机重新进行密码配对?
如果这个假设成立的话,那么修改旧的配对密码就可以阻止老用户在不经过密码配对的情况下直接与CC254X连接了。
像给CC254X重新烧录程序一样,在修改配对密码后,用户应该删除CC254X里面的那些信息才能保证所有欲与其连接的手机重新进行密码配对?
希望TI工程师能做出正面的回答和建议。谢谢!
FantaSy_:
帮顶。。。。
user3840094:
回复 FantaSy_:
TI的哥哥们,你们在哪里呢?这个速度不行呀。
user3840094:
回复 user3840094:
TI 提供的开发包里面有"gapbondmgr.c" ,该文件下面包含的GAPBondMgr_SetParameter( uint16 param, uint8 len, void *pValue ) 函数看似可以搞定这个“删除绑定了的信息功能,代码如下:
….
case GAPBOND_ERASE_ALLBONDS:
if ( len == 0 )
{ // Make sure there's no active connection
if ( GAP_NumActiveConnections() == 0 )
{ // Erase all bonding records
VOID gapBondMgrEraseAllBondings();
// See if NV needs a compaction
VOID osal_snv_compact( NV_COMPACT_THRESHOLD );
// Make sure Bond RAM Shadow is up-to-date
gapBondMgrReadBonds();
}
else
{
eraseAllBonds = TRUE;
}
}
else
{
ret = bleInvalidRange;
}
break;
….
我用如下方法调用了函数, &passkey这个参数不知如何调用,就借用了配对时的密码变量passkey(其实这个”GAPBOND_ERASE_ALLBONDS“ CASE没用到这个参数的)。
GAPBondMgr_SetParameter(GAPBOND_ERASE_ALLBONDS , 1, &passkey ); //企图删除绑定的手机信息,
运行该命令后 执行了如下步骤:
1,手机退出该蓝牙APP;
2,CC2540硬件RESET;
3,打开手机蓝牙APP与CC2540连接,此时手机端弹出配对密码输入提示;
4,输入争取配对密码,1秒左右后CC2540 端LCD 显示配对成功。
5,执行上述命令后重复步骤1-4(在步骤4时输入错误配对密码),1秒左右后CC2540 端LCD 显示配对失败。
结论:
实践证明,配对成功后的手机用户(安卓系统)信息是可以在CC2540端清除掉的。 这样的一个好处是,新用户在修改新的配对密码后可以清除掉老用户的配对信息,让其不能配对成功。保证了产品的安全性的第一道关有效。
TI的同事们,请从理论上评价一下该方法是否真的可靠/可行!不要再保持沉默了。 步子大一点,胆子大一点。
谢谢 。
user3840094:
回复 user3840094:
纠正一下,是下面的函数及参数才可以删除绑定了的手机信息:
GAPBondMgr_SetParameter(GAPBOND_ERASE_ALLBONDS , 0, &passkey );
因为做了红色参数是0和1的实验,复制时搞错了。特此声明。