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.

[参考译文] CC2541:如果键入了错误的密钥、BLE 配对模式不会断开连接。

Guru**** 2580305 points
Other Parts Discussed in Thread: CC2541

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/570323/cc2541-ble-pairing-mode-does-not-disconnect-if-wrong-passkey-typed

器件型号:CC2541

您好!

我是 Darpan Noel D'Soza、我在 BLE 芯片 CC2541上工作了很长时间、需要启用其中的配对过程。

我正在 Apple 触控设备上使用 Light Blue 应用对其进行各种 BLE 功能的测试。 当我使用(swru271g)开发文档设置配对过程时、除了连接批准外、一切都正常。 当我单击"广告"时、会出现一个弹出窗口、询问密钥、但如果注意到应用程序在后台连接。 即使我在未输入任何密钥的情况下取消了密钥窗口、应用程序也会显示已连接状态。

我需要知道如何尽快解决这个问题。

此致、

Noel D'Shouza

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Darpan、

    您能否提供监听器日志? 这似乎是应用程序未显示正确的状态、在这种情况下、当浅蓝色应用程序声称已连接时、您将能够看到 CC2541广播。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我刚才没有提到整个情况。 当我的设备首次广播并单击以通过 Apple 触控设备连接到外设时、将显示一个请求密钥的窗口、如果注意到该密钥会在后台连接到外设。 为了确认连接、我打开"收听通知"、当条件满足时、我会收到通知。 这种情况一直持续到我故意断开与外围设备的连接。

    我监听了连接并生成了以下日志。 我已记录的过程如下:

    我的外设广播。

    2.我点击要连接的广播。

    3.出现一个窗口,要求输入密钥,然后在后台连接。

    4.键入正确的密钥,然后单击“确定”按钮。

    5.我打开我的服务并启用通知警报。

    6.我单击外围设备端的按钮发送通知,它将显示在客户端设备上。

    7.我断开与外围设备的连接,外围设备再次开始广播。


    这是所遵循的整个过程、并记录在以下 PSD 文件中。

    e2e.ti.com/.../BLE-Jewel-packet-sniffer.psd

    此致、

    Noel D'Shouza。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Noel、您好!

    我无法在您发送的监听器日志中看到断开连接。 这些器件通过身份验证进行连接(位于 P.NBR.64)。 然后、在 P.NBR 513处、它们配对并对链接进行加密。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    断开连接日志对于找出我在配对模式下遇到的问题是否很重要?

    是的、我已经检查了日志、查看了它们连接的时间以及它们配对和链接加密的时间、 但是、尽管存在配对请求和加密过程、但无论配对和加密过程如何、应用程序都会在连接时连接到器件。

    我是否应该特别关注我可能发现问题的地方?

    此致、

    Noel D'Shouza。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Noel、您好!

    连接本身不应等待身份验证、因此您的设备不会出现我所看到的错误行为。 如果您根本不希望设备与外部设备连接、则应实施白色列表。 (设想一下:如果您的设备未连接-它们无法交换密钥。)

    在交换正确的密钥之前,链路未经过身份验证(或加密)。 您可以使用此选项为属性提供 GATT_Permit_AUTHN_READ 等 GATT 许可、以限制对属性的读取和写入。      

    #define GATT_permit_read 0x01 //!<属性可读
    #define GATT_permit_write 0x02 //!<属性是可写
    的#define GATT_permit_AUTHEN_READ 0x04 //!<读取需要身份验证
    #define GATT_Permit_AUTHEN_WRITE 0x08 //!<写入要求身份验证
    #define GATT_Permit_Author_Read 0x10 //!<读取需要授权
    #define GATT_Permit_Author_write 0x20 //!<写入要求授权
    #define GATT_Permit_encrypt_read 0x40 //!<读取需要加密
    #define GATT_permit_encrypt_write 0x80 //!<写入要求加密 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢此回复提供的帮助、我已设法通过使用身份验证读取/写入功能隐藏我的 BLE 定制服务、以防输入错误的 PIN、但输入错误的 PIN 后、它仍保持与器件的连接。

    如果输入的 PIN 错误、我希望设备能够与客户端断开连接。 如何在我的服务器设备中实现此功能。

    此致、

    否。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Noel、您好!

    您可以编辑 gapbondmgr.c 中的 GAPBondMgr_PasscodeRsp()函数,以便在密码错误时终止连接:

    /*********
    *@简短回复密码请求。
    *
    *在 gapbondmgr.h 中定义的公共函数
    //
    bStatus_t GAPBondMgr_PasscodeRsp (uint16 connectionHandle、uint8 status、uint32 passcode)
    {
    bStatus_t ret = Success;
    
    if (status = Success)
    {
    //截断密码
    密码=密码%(GAP_PAD_MAX + 1);
    
    RET = GAP_PasscodeUpdate( passcode,connectionHandle );
    if ( ret !=成功)
    {
    void GAP_TerminateAuth (connectionHandle、SMP_Pairing_failed_PASSKEY 项失败);
    GAPRole_TerminateConnection();
    }
    }
    否则
    {
    void GAP_TerminateAuth (connectionHandle,status);
    }
    
    return ret;
    }