我把SimpleBLEPeripheral这个工程烧进去,然后把pairMode 模式设置为GAPBOND_PAIRING_MODE_INITIATE,自己设置了一个密码,用手机去连,但是无论输什么密码都可以进入,是不是系统默认没有进行密码的验证,要自己写,如果自己写的话,那传来的密码又放哪了??
Yan:
nick,
配对,鉴权,加密,绑定是个系统的过程,空中并不会传来传去密码,这样并不安全。
配对还有其他设定,看一下你代码里面下面的几个参数是怎么设置的:
uint32 passkey = 0; // passkey "000000" uint8 pairMode = GAPBOND_PAIRING_MODE_INITIATE;//GAPBOND_PAIRING_MODE_WAIT_FOR_REQ; uint8 mitm = TRUE; uint8 ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY; uint8 bonding = TRUE;
nick Jim:
回复 Yan:
hi,Yan
我现在解决了这个问题,发现是static void ProcessPasscodeCB(uint8 *deviceAddr,uint16 connectionHandle,uint8 uiInputs,uint8 uiOutputs)这个密码回调函数的问题
static void ProcessPasscodeCB(uint8 *deviceAddr,uint16 connectionHandle,uint8 uiInputs,uint8 uiOutputs){ uint32 passcode; uint8 str[7]; // Create random passcode LL_Rand( ((uint8 *) &passcode), sizeof( uint32 )); passcode %= 1000000; // Send passcode response GAPBondMgr_PasscodeRsp( connectionHandle, SUCCESS, passcode );}发现这样是无论手机端输入什么密码,都可以匹配,然后我改成了这样:
static void ProcessPasscodeCB(uint8 *deviceAddr,uint16 connectionHandle,uint8 uiInputs,uint8 uiOutputs){ uint32 passcode = 123456; uint8 str[7]; // Create random passcode //LL_Rand( ((uint8 *) &passcode), sizeof( uint32 )); //passcode %= 1000000; // Send passcode response GAPBondMgr_PasscodeRsp( connectionHandle, SUCCESS, passcode );}
发现匹配的密码变成了123456,但是这样会有一个很奇怪的现象,就是IOS端会跳出一个匹配框,然后经过3~5S左右,匹配框自己消失了,再经过3S左右,显示匹配失败,最后我删了这个函数,好像正常了,所以我想问一下,这个函数的功能到底是什么?谢谢。
Yan:
回复 nick Jim:
nick,
TI协议栈里面并没有提供ProcessPasscodeCB()这个函数。
iOS跳出的匹配框有要求你输入配对码吗?
另外,有对照过我之前提到的那些配对设置吗?
nick Jim:
回复 Yan:
hi,Yan
这个函数是我自己仿照central写的,后来发现这个函数是不需要,所以去掉了。iOS有跳出输入匹配框,但是过一会儿会消失
比如下面的图:
这显示了配对,要求输入密码,我如果不输入密码,保持在这个界面,过了4S以后,配对请求框消失了,变成了这样
这样再保持不动,过一会儿,就变成下面的断开连接
我的参数是这样配置的
uint32 passkey = 564564; // passkey "000000" uint8 pairMode = GAPBOND_PAIRING_MODE_INITIATE; uint8 mitm = TRUE; uint8 ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY; uint8 bonding = TRUE; GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof ( uint32 ), &passkey ); GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof ( uint8 ), &pairMode ); GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof ( uint8 ), &mitm ); GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof ( uint8 ), &ioCap ); GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof ( uint8 ), &bonding );
麻烦帮我解答一下,谢谢。
Yan:
回复 nick Jim:
尼克,
有几个混乱的地方,
uint8 pairMode = GAPBOND_PAIRING_MODE_INITIATE; 你主动请求配对 uint8 mitm = TRUE; uint8 ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY; 你告诉iPhone 你的设备有显示功能, 这样iPhone就会弹出窗口等着你输入你在你的设备上显示的pin 码,而你的设备实际上根本没显示功能。。。
我建议,你要不改成pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ, 要不改成ioCap = GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT。
nick Jim:
回复 Yan:
Hi,Yan
我想问一下,GAPBOND_IO_CAP_DISPLAY_ONLY这个参数指的是从机有显示功能还是iphone有显示功能?
我如果把pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ,那样不是不会发起匹配了吗?Iphone应该不会主动发起匹配啊。
nick Jim:
回复 Yan:
Hi,Yan
我发现了一个严重的问题,我以前其实是不会出现这种闪退的情况,所以我一直在想,跟上回的区别是什么,因为我程序根本没改过,后来我发现一点,我以前进行验证的时候,iphone没有连接无线网络,但是这次我连接了,我反复进行了测试,发现只要没有连着无线网络,验证框就不会闪退,只要连着无线网络,验证框就会出现闪退。
Yan:
回复 nick Jim:
尼克,
GAPBOND_IO_CAP_DISPLAY_ONLY 表示的是从机的属性。
没错,iPhone是不加密的。
nick Jim:
回复 Yan:
Hi,Yan
其实我以前是不会出现这种验证框闪退的情况,只是这次我遇到了这种情况,然后我一直在找问题所在,发现一个严重的问题,我经过反复验证,发现只要打开无线网络并连接,验证框会出现闪退,而不连接无线网络,就不会闪退。我上次刚好没开无线网络,而这次刚好开了,遇到了这种情况,我想会不会是这个问题。
Yan:
回复 nick Jim:
尼克,
哈,很有意思!
我没这么试过,也不确定。你能再多试试确认一下吗?也有可能是ligheblue的bug…