微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 蓝牙的配对问题

蓝牙的配对问题

时间:10-02 整理:3721RD 点击:

我把SimpleBLEPeripheral这个工程烧进去,然后把pairMode 模式设置为GAPBOND_PAIRING_MODE_INITIATE,自己设置了一个密码,用手机去连,但是无论输什么密码都可以进入,是不是系统默认没有进行密码的验证,要自己写,如果自己写的话,那传来的密码又放哪了?

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;

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左右,显示匹配失败,最后我删了这个函数,好像正常了,所以我想问一下,这个函数的功能到底是什么?谢谢。

nick,

TI协议栈里面并没有提供ProcessPasscodeCB()这个函数。

iOS跳出的匹配框有要求你输入配对码吗?

另外,有对照过我之前提到的那些配对设置吗?

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 );

麻烦帮我解答一下,谢谢。

尼克,

有几个混乱的地方,

    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。

Hi,Yan

我想问一下,GAPBOND_IO_CAP_DISPLAY_ONLY这个参数指的是从机有显示功能还是iphone有显示功能?

我如果把pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ,那样不是不会发起匹配了吗?Iphone应该不会主动发起匹配啊。

Hi,Yan

        我发现了一个严重的问题,我以前其实是不会出现这种闪退的情况,所以我一直在想,跟上回的区别是什么,因为我程序根本没改过,后来我发现一点,我以前进行验证的时候,iphone没有连接无线网络,但是这次我连接了,我反复进行了测试,发现只要没有连着无线网络,验证框就不会闪退,只要连着无线网络,验证框就会出现闪退。

尼克,

GAPBOND_IO_CAP_DISPLAY_ONLY 表示的是从机的属性。

没错,iPhone是不加密的。

Hi,Yan

        其实我以前是不会出现这种验证框闪退的情况,只是这次我遇到了这种情况,然后我一直在找问题所在,发现一个严重的问题,我经过反复验证,发现只要打开无线网络并连接,验证框会出现闪退,而不连接无线网络,就不会闪退。我上次刚好没开无线网络,而这次刚好开了,遇到了这种情况,我想会不会是这个问题。

尼克,

哈,很有意思!

我没这么试过,也不确定。你能再多试试确认一下吗?也有可能是ligheblue的bug...

你好!我的设置是这样的

{
uint32_t passkey = 0; // passkey "000000"
uint8_t pairMode = GAPBOND_PAIRING_MODE_INITIATE;//GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;
uint8_t mitm = TRUE;
uint8_t ioCap = GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT;
uint8_t bonding = TRUE;

GAPBondMgr_SetParameter(GAPBOND_DEFAULT_PASSCODE, sizeof(uint32_t),
&passkey);
GAPBondMgr_SetParameter(GAPBOND_PAIRING_MODE, sizeof(uint8_t), &pairMode);
GAPBondMgr_SetParameter(GAPBOND_MITM_PROTECTION, sizeof(uint8_t), &mitm);
GAPBondMgr_SetParameter(GAPBOND_IO_CAPABILITIES, sizeof(uint8_t), &ioCap);
GAPBondMgr_SetParameter(GAPBOND_BONDING_ENABLED, sizeof(uint8_t), &bonding);
}

这样设置之后,就不会进入以下注册的回调函数里面了

VOID GAPBondMgr_Register(&simpleBLEPeripheral_BondMgrCBs);

// GAP Bond Manager Callbacks
static gapBondCBs_t simpleBLEPeripheral_BondMgrCBs =
{
App_passcodeCB, //NULL, // Passcode callback (not used by application)
App_pairStateCB //NULL // Pairing / Bonding state Callback (not used by application)
};

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top