蓝牙外围设备丢LTK的处理方法

当使用Nordic蓝牙芯片开发时,如果遇到因丢失长期密钥(LTK)导致的连接加密失败,文章提供了一种处理方法。在PM_CONN_SEC_FAILED事件中,根据错误代码判断情况,若本地设备丢失了绑定信息,则等待重新配对;否则,如iOS设备取消配对,设备将断开连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蓝牙外围设备丢LTK的处理方法

案例使用的Nordic蓝牙芯片进行开发

参考博客园大佬文章

  • 参数说明
 PM_LINK_SECURED_PROCEDURE_ENCRYPTION, /**< @brief Using an LTK that was shared during a previous bonding procedure to encrypt the link. */`在这里插入代码片`
 #define PM_CONN_SEC_ERROR_PIN_OR_KEY_MISSING (PM_CONN_SEC_ERROR_BASE + 0x06)  /**< @brief Encryption failed because the peripheral has lost the LTK for this bond. See also @ref BLE_HCI_STATUS_CODE_PIN_OR_KEY_MISSING and Table 3.7 ("Pairing Failed Reason Codes") in the Bluetooth Core Specification 4.2, section 3.H.3.5.5 (@linkBLEcore).  */

  • 事件处理方法

 case PM_EVT_CONN_SEC_FAILED:
         {
            BLEDBG_STR("PM_EVT_CONN_SEC_FAILED\r\n");
            BLEDBG_FMTSTR("peer_id=0x%04x, error=0x%04x\r\n",p_evt->peer_id, p_evt->params.conn_sec_failed.error);
            BLEDBG_FMTSTR("procedure=%d\r\n",p_evt->params.conn_sec_failed.procedure);
             /* Often, when securing fails, it shouldn't be restarted, for security reasons.
              * Other times, it can be restarted directly.
              * Sometimes it can be restarted, but only after changing some Security Parameters.
              * Sometimes, it cannot be restarted until the link is disconnected and reconnected.
              * Sometimes it is impossible, to secure the link, or the peer device does not support it.
              * How to handle this error is highly application dependent. */
            ble_cntrlinfo.flg_commFail = TRUE;  //置上通讯失败标志位
             if ((p_evt->params.conn_sec_failed.procedure == PM_LINK_SECURED_PROCEDURE_ENCRYPTION) && \
                (p_evt->params.conn_sec_failed.error == PM_CONN_SEC_ERROR_PIN_OR_KEY_MISSING))
            {// Local device lost bond info, don't disconnect and wait for re-bond
               BLEDBG_STR("Waiting for host to fix bonding\r\n");

            }
            else
            { //IOS手机主动点击了取消配对,设备端需要断开连接,
           	  sprintf(m_message, "Security procedure failed, disconnect.\r\n");   
              dev_ctrl_send_msg(m_message, strlen(m_message));//这里可以增加回复信息给手机
                err_code = sd_ble_gap_disconnect(p_evt->conn_handle,BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
                if ((err_code != NRF_ERROR_INVALID_STATE) && (err_code != BLE_ERROR_INVALID_CONN_HANDLE))
                {
                        APP_ERROR_CHECK(err_code);
                }

            }

           
         } break;
### 蓝牙低功耗 (BLE) 的连接过程详解 蓝牙低功耗(Bluetooth Low Energy, BLE)是一种专为短距离无线通信设计的技术,其核心目标是在保持低功耗的同时实现高效的数据传输。以下是关于 BLE 连接过程的详细介绍。 #### 1. 广播阶段 在广播阶段,外围设备(Peripheral Device)通过发送广告数据包来宣告自己的存在。这些广告数据包包含了设备的相关信息以及服务 UUID 等内容。中心设备(Central Device)则扫描周围的广告信号并决定是否发起连接请求。此阶段的关键术语包括: - **Advertising Interval**: 外围设备发送广告数据的时间间隔。 - **Scan Request/Response**: 中心设备可以通过 Scan Request 请求更多细节信息,外围设备随后返回 Scan Response 数据包[^2]。 #### 2. 建立连接 当中心设备检测到感兴趣的外围设备时,它会向该设备发出 Connection Request。一旦连接建立完成,两个设备进入连接模式,在每个 connection interval 开始时交换数据包。具体来说: - Master 和 Slave 设备会在每次 connection event 中交互一次,即 master 向 slave 发送一个数据包,slave 随后回传一个响应包[^1]。 - 如果配置了 slave latency 功能,则允许 slave 在特定条件下延迟应答或完全忽略某些事件以节省能量消耗。 #### 3. 安全机制 - 配对与绑定 为了保护隐私及防止未授权访问,通常需要执行配对操作。在此过程中会产生长期密钥(LTK),用于后续快速安全重新连接: - 当首次成功完成配对之后,如果双方都将 LTK 存储于闪存之中,则未来每当它们之间再次形成新的链接关系之时便无需重复经历完整的配对步骤;而是可以直接运用先前所保存下来的 LTK 来实施加密通讯方式——这就是所谓的 bonding 行为[^3]。 需要注意的是,“pairing”有时会被当作既包含实际意义上的 pair action 又涵盖了 bond formation 的广义概念来进行讨论,除非特别指出区别所在之处。 #### 示例代码展示如何初始化一个简单的 BLE 扫描器 下面给出了一段 Python 实现简单 BLE 扫描功能的例子: ```python from bluepy.btle import Scanner, DefaultDelegate class ScanDelegate(DefaultDelegate): def __init__(self): DefaultDelegate.__init__(self) def handleDiscovery(self, dev, isNewDev, isNewData): if isNewDev: print(f"Discovered device {dev.addr}") elif isNewData: print(f"Received new data from {dev.addr}") scanner = Scanner().withDelegate(ScanDelegate()) devices = scanner.scan(10.0) for dev in devices: print(f"Device {dev.addr} ({dev.rssi}) dBm") ``` 以上脚本利用 `bluepy` 库创建了一个基本的 BLE 扫描程序,能够发现附近的 BLE 设备及其地址和信号强度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值