This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

蓝牙的配对问题

我把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)
    };