TI中文支持网
TI专业的中文技术问题搜集分享网站

蓝牙的配对问题

我把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…

赞(0)
未经允许不得转载:TI中文支持网 » 蓝牙的配对问题
分享到: 更多 (0)