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.

主从一体机pairing failed unspecified reason

Other Parts Discussed in Thread: CC2640R2F

Hi:

我遇到一个主从一体机pairing的问题,

我使用最新sdk 4.30,用的是原装例子multi-role,测试某个peripheral的配对,peripheral是主动发起配对模式的;

我设置的配对信息是:

uint8_t pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;//GAPBOND_PAIRING_MODE_NO_PAIRING;//GAPBOND_PAIRING_MODE_INITIATE;
uint8_t mitm = TRUE;
uint8_t ioCap = DEFAULT_IO_CAPABILITIES;//GAPBOND_IO_CAP_DISPLAY_ONLY;
uint8_t bonding = TRUE;
uint8_t replaceBonds = FALSE;

// Set pairing mode
GAPBondMgr_SetParameter(GAPBOND_PAIRING_MODE, sizeof(uint8_t), &pairMode);

// Set authentication requirements
GAPBondMgr_SetParameter(GAPBOND_MITM_PROTECTION, sizeof(uint8_t), &mitm);

// Set I/O capabilities
GAPBondMgr_SetParameter(GAPBOND_IO_CAPABILITIES, sizeof(uint8_t), &ioCap);

// Set bonding requirements
GAPBondMgr_SetParameter(GAPBOND_BONDING_ENABLED, sizeof(uint8_t), &bonding);

// Set bond list LRU
GAPBondMgr_SetParameter(GAPBOND_LRU_BOND_REPLACEMENT, sizeof(uint8_t), &replaceBonds);

// Register and start Bond Manager
VOID GAPBondMgr_Register(&multi_role_BondMgrCBs);

测试出现连接后,还没有进入pairing start state,直接就pairing failed:错误码是23.unspecified reason;

用wireshark抓包如下图:

请问,这可能是什么原因造成的?

  • 改成uint8_t pairMode = GAPBOND_PAIRING_MODE_INITIATE;也不能配对成功吗
  • Hi:

    不能的,这里的peripheral 固定是GAPBOND_PAIRING_MODE_INITIATE配对模式,是配对发起者,

    配对码是要通过算法算出的;

    之前使用simple_central,是可以正常进行配对流程的,现在是multi-role,就不能配对了。

    pairing start 状态都没有触发。

  • 我刚测试配对成功,默认密码是123456
  • Hi:

    请问是用哪个sdk下的Multi-role?

    我这要与peripheral 配对,peripheral 是用蓝牙5协议的,配对码是要经过自定义的算法 计算出来的。

    我用sdk 4.30 或者sdk 4.10 下的multi role 的例子,蓝牙协议是4.2,连接peripheral 后,发现没有进入pairing start state,直接就pairing failed :unspecified reason。

  • Hi:

    我通过wireshark抓包,对比之前ble5stack下的例程simple_central与peripheral 配对流程,

    multi-role与peripheral 配对失败在于Pairing Public Key后没有继续收到Peripheral 的Pairing Confirm,以及DHKey Check。

    请问,Multi-role端需要设置什么参数,才能获得Peripheral 的pairing confirm以及DHKey Check?

    截图:simple_central 与peripheral 配对抓包流程

  • sdk 4.30下的Multi-role,例程要有输入密码的过程,没输入密码不会收到Pairing Confirm

  • 请问,在sdk4.30 的multirole 例程下代码,你有做些改动吗? 因为我的peripheral 端一旦配对失败立即断开,

    而multi-role 端连接peripheral 后,马上就pairing failed。

  • 没有修改过,我用手机连的,CC2640r2f作从机
  • 我是测试sdk 4.30 multi-role例程,CC2640R2 作为主机,发现multi-role 配对流程没有进入pairing start state就pairing failed:unspecified reason.
    而用sdk 3.40 的multi-role,测试同一个peripheral,连接后直接就paired、bond save success,这流程也是不符合标准的;两个例程中的配对参数都是一样的;
    如下:
    uint32_t passkey = DEFAULT_PASSCODE;//123456
    uint8_t pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;
    uint8_t mitm = TRUE;
    uint8_t ioCap = DEFAULT_IO_CAPABILITIES;//GAPBOND_IO_CAP_DISPLAY_ONLY;
    uint8_t bonding = TRUE;
    GAPBondMgr_SetParameter(GAPBOND_DEFAULT_PASSCODE, sizeof(uint32_t), &passkey);
    // Set pairing mode
    GAPBondMgr_SetParameter(GAPBOND_PAIRING_MODE, sizeof(uint8_t), &pairMode);
    // Set authentication requirements
    GAPBondMgr_SetParameter(GAPBOND_MITM_PROTECTION, sizeof(uint8_t), &mitm);
    // Set I/O capabilities
    GAPBondMgr_SetParameter(GAPBOND_IO_CAPABILITIES, sizeof(uint8_t), &ioCap);
    // Set bonding requirements
    GAPBondMgr_SetParameter(GAPBOND_BONDING_ENABLED, sizeof(uint8_t), &bonding);
    而同样的配对参数,在ble5stack下的simple_central 就是可以与peripheral配对的,配对流程就是收到pairing start state,再输入正确的,计算出来的配对码,就可以触发pairing success,再自动bond success。
    不知multi-role 为何配对结果就完全不同?
  • 我测试可以绑定成功,都使用默认设置

    用的是multi-role和simple_peripheral

  • 请问,在终端打印配对流程是pairing->paired->bond success->bond save success 吗?

    一般配对流程是在pairing 状态时,输入配对码,才paired,再bond sucess,bond save success。我用multi-roel测试去与peripheral配对,

    这里测试用较高sdk,比如4.10以上,example下的multi-role去测试配对,连接后,立即因unspecified reason 配对失败;

    而sdk4.10 以下的multi-role 则是连接后,不需要输入配对码,直接就paired->bond save sucess.

    这两种现象看起来都不属于正常配对流程。

  • 我用C:\ti\simplelink_cc2640r2_sdk_4_30_00_08\examples\rtos\CC2640R2_LAUNCHXL\blestack下的simple_peripheral和multi_role例程测试结果如上

    在CC26X2上测试ble5.1的也一样

    看看你是不是修改了什么

  • 谢谢!

    我的multirole工程没有改动,IAR 版本是8.11.3。

    请问,你的multi-role测试与peripheral配对,是否需要输入配对码?

    我的multi-role连接peripheral后,直接就paired ->bond save success. 没有进入输入passcode 流程。

    终端打印如下:

    0x04EE03CC1DE5

    *Main Menu

    < Next Item

    Scan >

    MTU Size: 65

    MTU Size: 65

    connHandle 0 paired success

    Cxn 0 bond save success

  • 不需要输入,具体原理和说明可以看dev.ti.com/.../node
  • 你好!

    我看了配对流程,我的代码也是按照task4 Enable Bonding 的设置配对参数,因为我的peripheral 的配对码是按照自定义的算法算出的,multi-role端也需要

    按照同样算法计算出配对码,发到SMP层。我的理解是,一般来说只要MITM 设为true,iocap设为可输入设备,就应该要输入配对码。

    比如手机配对流程,也是在接收配对一端输入配对码后,才双方配对完成,添加到绑定设备表中。

    请问,在sdk4.30中,如何改成需要输入配对码才配对成功?

  • 没有键盘还不能做到用配对码
  • 不能的,我这是MITM模式,配对码是要通过自定义的算法算出的。算出来后,再发到SMP层。若双方配对码一样,才配对成功。
  • 你好!

    上面配对问题是因为我的配对码是要经过计算得到的,而multi-role 是直接发出自定义的123456给SMP,所以配对失败,

    我再将原multi-role定义的配对码123456,不发到SMP,只有收到计算出来的配对码,才发出。

    uint32_t passcode = 123456;
    // Display_print1(dispHandle, MR_ROW_SECURITY, 0, "Passcode: %d", passcode);
    // Send passcode to GAPBondMgr
    // GAPBondMgr_PasscodeRsp(pData->connectionHandle, SUCCESS, passcode);//先注释掉发出配对码

    现在遇到一个问题是,从发出正确的配对码,到收到pairing success之间相隔接近25s,

    请问,是否有参数设置,缩短配对时间;

    比如,我从02:45:28.337 发出配对码,到02:25:53.622 收到配对状态信息,之间相差25s左右。

  • 一般配对不会有这么长时间,你抓包看下配对过程的具体情况
  • 你好!

    我抓包测试过,发现配对时间一直在确认配对confirm,时间接近25s。不知为何会消耗如此长时间。