微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > CC2540 Pairing fail : 0x08

CC2540 Pairing fail : 0x08

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

在使用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的包,另外附件中是完整的抓包文件5141.paring_fail_0x08.rar:

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代码是怎么查询对应哪个事件的呢?

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

网站地图

Top