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.

CC2540 Pairing fail : 0x08



在使用TimeApp例子测试时,发现首次使用iphone与开发板进行配对时,可以成功配对;

但是之后重启板子,然后重新连接,此时由于iphone记住了已经配对的设备,不会弹出询问框,而是直接启动配对流程,但是此时配对失败,错误码为:0x08,具体程序位置为:

    if ( state == GAPBOND_PAIRING_STATE_COMPLETE )
    {
        if ( status == SUCCESS )
        {
            DEBUG_PRINT("Pairing success\r\n");
        }
        else
        {
            DEBUG_PRINT("Pairing fail : 0x%x\r\n", status);
        }
    }
  • cai,

    0x08 是 SMP_PAIRING_FAILED_UNSPECIFIED.

    iOS 本身是不会主动发起配对的。

    你的timeAPP 默认的配对模式应该是 GAPBOND_PAIRING_MODE_INITIATE,因此你会主动发起配对。

    你试一下把 DEFAULT_BONDING_MODE 设置成 FALSE 试试。

    能否抓包看一下配对的时候发生了什么?

  • 我确实是把配对模式设为GAPBOND_PAIRING_MODE_INITIATE的;

    另外DEFAULT_BONDING_MODE 设为FALSE后确实不会有问题,因为重启后就不会自动重新配对了,但是我是希望能在断开恢复后自动重连的,所有需要把BONDING_MODE设为TRUE吧;

    抓包截图如下,在第二张图能看到Paring Fail的包,另外附件中是完整的抓包文件

  • cai,

    看不出有什么原因导致iOS回复了一个配对失败的包。

    跟iOS连接的时候,推荐设置 配对模式为 GAPBOND_PAIRING_MODE_WAIT_FOR_REQ。

    断开后自动重连跟绑定没有关系,只要你断开后广播,iOS 进行搜索连接,就能自动重连。

  • Hi,

        我大概知道这里的关键因素是什么了,我是在做苹果的ANCS工程,而不是通过自己的app与设备进行通信的,所以ANCS可能会有一些比较特殊的要求。

        我在测试的时候是在iphone的蓝牙设置界面里搜到设备然后进行连接的,如果把配对模式设为GAPBOND_PAIRING_MODE_WAIT_FOR_REQ,连接后不会产生配对请求,这样在手机产生通知的时候,不会notify给设备,所以我估计可能苹果要求必须要进行paring才会推送通知。

        至于自动重连,由于没有自己的app,所以依赖的是系统的机制,所以如果我不paring和bonding的话,在连接断开恢复后,即时设备广播,手机应该也是不会自动连接的。

        不知道我的猜测是否正确,不过我对paring和bonding的概念还是比较模糊,他们是否是必须的呢?在GATT Notify的场景下。

  • cai,

    很有意思。我也并不清楚iPhone 对ANCS 是否有更高的安全要求。因为iPhone 本身默认是不需要配对加密的。

    从你的实验来看,iPhone或许需要配对加密才会发送 ANCS 的通知,有可能这涉及到个人信息隐私问题,或许要更高安全级别。

    另外,对于Notify本身来讲,和配对绑定是没有任何关系的。

    如果第一次连接的时候绑定了加密信息,那么第二次应该不需要再重新配对,直接用前一次绑定的信息进行链路数据加密就行了。

    照你之前的配置,收到配对失败后,连接断开了还是后面还继续?(我发现我的packet sniffer 没法解析你抓的包,可能我的软件有问题,要重装一下)

  • Hi,

        配对失败后,连接没有断开,而是继续通信,只是手机端不会把通知Notify过来。

  • cai,

    我确认过,ANCS 必须要配对后才能使用。

    你的配对参数是怎么配的?如下:

    uint32 passkey = 0; // passkey "000000"
    uint8 pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;
    uint8 mitm = TRUE;
    uint8 ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY;
    uint8 bonding = TRUE;

  • Hi,

    配置如下:

    uint32 passkey = 19655;    //如果mitm是FALSE的话这个是什么应该关系都不大吧
    uint8 pairMode = GAPBOND_PAIRING_MODE_INITIATE;
    uint8 mitm = FALSE;
    uint8 ioCap = GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT;
    uint8 bonding = TRUE;

  • cai,

    MITM 改成TRUE。

    这是安全级别,防止man in the middle 监听配对加密过程。

  • Hi,

        MITM改成TRUE了,不过还是无法解决paring fail 0x08的问题,我之前还以为这个是控制是否要输入密码的呢。

  • cai,

    ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY  呢?

    我看google上搜索有其他人搞定的。:http://mbientlab.com/blog/ancs-on-ti2541-in-an-afternoon/

  • Hi,

    我试了一下他的配置,似乎把PASSKEY改成000000就可以了,现在我在重启设备后自动连接手机也能够正确的paring和bonding了!

    现在只有一种case无法正确bonding,就是我把新的代码直接烧入芯片然后重启(其实就是用SmartRF Flash Programmer烧入程序),此时是无法正确paring的(我猜测是否是因为烧写程序后擦掉了某些配对信息),但是这不影响实际的用户使用了,希望这回是真的好了!

    附上我当前的配置如下:

    uint32 passkey = 000000;
    uint8 pairMode = GAPBOND_PAIRING_MODE_INITIATE;
    uint8 mitm = TRUE;
    uint8 ioCap = GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT;    //因为我不希望用户还需要在手机上输入密钥,太麻烦
    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 );

  • cai,

    恭喜!

    000000 估计是iOS 默认固定的配对码。

    重新编程flash 之后,会把NV部分也擦除,那里是存放配对信息的,所以会需要重新配对绑定。


  • 0是IOS默认的密码,当配对正确完成后IOS记录了配对信息,,,再次连接时IOS会不提示,直接进入配对状态,对吗? 

    我试了一下 当改成非0密码时,就会有这个问题,,,请问当这样的情况发生 该如何处理呢?

     

    或者有其他的办法不让这个错误出现?

    因为我需要在2541上修改密码,,,

     

    谢谢

  • 这个我也不知道怎么搞。。。坐等TI员工回答

  • guifeng,

    well,这个我也只是估计。因为我对iOS端编程的要求并不熟悉。

    最好的建议是你去看一下iOS端的BLE 一些编程要求的定义,参数范围什么的。

    我知道的是iOS默认是不会主动发起配对的,你如果每次从2541上主动发起配对,再修改密码,那么每次iOS 可能都需要删除已配对设备后再重新配对。坛子里也有其他人在问这个问题。

  • 我发现我在TI程序里面改的正确参数能够让IPhone输入密码配对, 但是在我的程序里面一样的配置却不行,找了一下原因好像是 gapbondmgr.c文件里面接收的信息没有收到 GAP_MSG_EVENT事件。请问这是有什么东西影响了么?

  • yan

    你所说的0x08代码是怎么查询对应哪个事件的呢?