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的包,另外附件中是完整的抓包文件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代码是怎么查询对应哪个事件的呢?