蓝牙配对,解决蓝牙多次连接不上的问题

news/2024/11/3 3:40:41/

文章目录

  • nRF52832 配对和绑定
    • 1、在连接时,nRF52832向蓝牙主机发送配对请求
    • 2、主机收到配对请求后,向nRF52832发送安全参数请求,nRF52832收到后回复请求
    • 3、判断配对是否成功
    • 4、设置密码显示
    • 5、设置静态密码
    • 6、设置允许重复配对

nRF52832 配对和绑定

参考博客:链接1;链接2

1、在连接时,nRF52832向蓝牙主机发送配对请求

在连接发生时,协议栈会向应用层发送BLE_GAP_EVT_CONNECTED信号,在接收到连接发生时,唤起配对请求。将以下代码添加到ble_evt_handler函数下的BLE_GAP_EVT_CONNECTED分支的末尾。

/** 唤起配对请求*/
ble_gap_sec_params_t  sec_params_auth;
sd_ble_gap_authenticate(m_conn_handle,&sec_params_auth);
  • 1
  • 2
  • 3

2、主机收到配对请求后,向nRF52832发送安全参数请求,nRF52832收到后回复请求

收到主机发送的安全参数请求后,nRF52832需要对其进行回复,相应的标志信息为BLE_GAP_EVT_SEC_REQUEST。在ble_evt_handler函数中添加以下分支。

case BLE_GAP_EVT_SEC_REQUEST:  /** 返回配对请求*/ble_gap_sec_params_t sec_params;memset(&sec_params,0,sizeof(ble_gap_sec_params_t));err_code = sd_ble_gap_sec_params_reply(m_conn_handle,BLE_GAP_SEC_STATUS_SUCCESS,&sec_params,NULL);APP_ERROR_CHECK(err_code);break;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

配对相关的配置参数在main.c文件前的宏定义里:

#define SEC_PARAM_BOND                  1                                       /**< Perform bonding. */
#define SEC_PARAM_MITM                  1                                       /**< Man In The Middle protection not required. */
#define SEC_PARAM_LESC                  0                                       /**< LE Secure Connections not enabled. */
#define SEC_PARAM_KEYPRESS              0                                       /**< Keypress notifications not enabled. */
#define SEC_PARAM_IO_CAPABILITIES       BLE_GAP_IO_CAPS_DISPLAY_ONLY             /**< Display Only. */
#define SEC_PARAM_OOB                   0                                       /**< Out Of Band data not available. */
#define SEC_PARAM_MIN_KEY_SIZE          7                                       /**< Minimum encryption key size. */
#define SEC_PARAM_MAX_KEY_SIZE          16                                      /**< Maximum encryption key size. */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

需要修改的内容:

SEC_PARAM_BOND 是否绑定:改为1

SEC_PARAM_MITM 中间人保护:改为1

SEC_PARAM_IO_CAPABILITIES IO能力:改为BLE_GAP_IO_CAPS_DISPLAY_ONLY,如果不改的话,虽然也会弹出配对,但是没有输入框,即所有人均可配对。

3、判断配对是否成功

配对后需要判断配对是否成功,不成功则断开连接。相应的标志信息为 BLE_GAP_EVT_AUTH_STATUS 。在ble_evt_handler函数中添加以下分支:

case BLE_GAP_EVT_AUTH_STATUS:if(p_ble_evt->evt.gap_evt.params.auth_status.auth_status == BLE_GAP_SEC_STATUS_SUCCESS) {NRF_LOG_INFO("Pair success!");} else {NRF_LOG_INFO("Pair failed!");sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);}break;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4、设置密码显示

上面第2步中设置了密码显示,在配对时会触发相应的标志信息:BLE_GAP_EVT_PASSKEY_DISPLAY,在ble_evt_handler函数中添加以下分支:

 case BLE_GAP_EVT_PASSKEY_DISPLAY:NRF_LOG_INFO("PASSKEY:%s",p_ble_evt->evt.gap_evt.params.passkey_display.passkey);break;
  • 1
  • 2
  • 3

5、设置静态密码

以上设置为动态密码,每次配对时随机生成配对密码,可设置为静态密码,在gap_params_init函数的结尾加上以下代码:

/** 设置静态密码*/ble_opt_t passkey_opt;uint8_t passkey[] = "123456";passkey_opt.gap_opt.passkey.p_passkey = passkey;err_code = sd_ble_opt_set(BLE_GAP_OPT_PASSKEY, &passkey_opt);APP_ERROR_CHECK(err_code);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

6、设置允许重复配对

当手机单方面取消配对时,nRF52832中还保存着相应的配对信息,所以在重新连接时会发生无法配对的问题,所以需要设置可以重复配对,在pm_evt_handler函数中添加以下分支代码:

/** 手机端取消配对之后无法连接,添加重新连接的代码*/case PM_EVT_CONN_SEC_CONFIG_REQ://重新连接{// Reject pairing request from an already bonded peer.pm_conn_sec_config_t conn_sec_config = {.allow_repairing = true};//允许再次配对pm_conn_sec_config_reply(p_evt->conn_handle, &conn_sec_config);}break;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

暂时就写道这儿吧,原理啥的在参考的两篇博客里都有,代码经过验证可行。欢迎指正。


http://www.ppmy.cn/news/687710.html

相关文章

mac双系统蓝牙鼠标连接不上解决

打开控制面板&#xff0d;查看方式选大图表&#xff0d;设备和打印机&#xff0d;添加设备&#xff0d;找到鼠标后右击属性里面有个协议把那个打上对勾&#xff0c;再重新启用蓝牙&#xff0c;添加设备&#xff0c;点击蓝牙鼠标。

计算机连接不上蓝牙鼠标,win7系统蓝牙鼠标连接不上的解决方法

win7系统使用久了&#xff0c;好多网友反馈说win7系统蓝牙鼠标连接不上的问题&#xff0c;非常不方便。有什么办法可以永久解决win7系统蓝牙鼠标连接不上的问题&#xff0c;面对win7系统蓝牙鼠标连接不上故障问题&#xff0c;我们只需要1、一般蓝牙鼠标不好用&#xff0c;你先检…

计算机连接不上蓝牙鼠标,win10系统蓝牙鼠标连接不上的图文教程

有关win10系统蓝牙鼠标连接不上的操作方法想必大家有所耳闻。但是能够对win10系统蓝牙鼠标连接不上进行实际操作的人却不多。其实解决win10系统蓝牙鼠标连接不上的问题也不是难事&#xff0c;小编这里提示两点&#xff1a;1、一般蓝牙鼠标不好用&#xff0c;你先检查一下是否电…

计算机连接不上蓝牙鼠标,Win10无法连接蓝牙鼠标如何解决_蓝牙鼠标连接不上win10电脑修复方法...

在win10系统中&#xff0c;自带有蓝牙功能&#xff0c;方便用户们使用蓝牙设备&#xff0c;比如蓝牙鼠标蓝牙耳机等&#xff0c;但是有用户却遇到了无法连接蓝牙鼠标的情况&#xff0c;这是怎么回事呢&#xff0c;为此这就给大家带来win10蓝牙鼠标连接不上电脑的详细修复步骤。…

图像的基础操作

1.获取并修改图像中的像素值 img np.zeros((256, 256, 3), np.uint8) # 创建图像px img[100, 100] # 获取&#xff08;100&#xff0c;100&#xff09;点的像素值 blue img[100, 100, 0] # 仅获取&#xff08;100&#xff0c;100&#xff09;蓝色通道的像素值 …

《卓有成效的管理者》导读

《卓有成效的管理者》是一本经典的管理学书籍&#xff0c;它由知名管理学者彼得德鲁克所著&#xff0c;被誉为管理学的“圣经”。 随着时代的不断发展和进步&#xff0c;管理理念和方法也在不断地更新和完善。因此&#xff0c;在拆书之前还有必要推荐另一本同类书籍——《经理…

手机死机短信 死机,狂震,黑屏短信下载,能让mtk手机震动黑屏死机

解压后放在手机里当做普通短信发出去就OK了&#xff0c;接受手机只要是MTK的&#xff0c;也就是山寨机&#xff0c;必定会有反映。需要注意的是智能手机似乎发不起&#xff0c;我的手机是LINUX、朋友的是WM6好像都只能作为彩信发&#xff0c;这样山寨手机收到以后没有任何反映。…

论文笔记 CPU Accounting for Multicore Processors

Abstract 确定了对CPU utilization的不准确测量是如何影响OS的几个关键方面的这篇文章提出来了一个比CPU utilization更准确的性能评估指标 In this paper, we identify how an inaccurate measurement of the CPU utilization affects several key aspects of the system suc…