文章目录

  • 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

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

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

  1. 苹果11蓝牙配对不成功怎么办_iphone11连接不上蓝牙的原因及解决方法

    有网友反映新买的iphone11手机蓝牙连接设备后播放音乐信号断断续续,相信很多iPhone 11用户都出现了蓝牙连接不稳定的问题,其中包括拒绝配对.来电自动断开等问题,那么遇到这些问题该怎么解决呢? ...

  2. Android蓝牙开发(二)之蓝牙配对和蓝牙连接

    上篇文章:https://blog.csdn.net/huangliniqng/article/details/82185983 讲解了打开蓝牙设备和搜索蓝牙设备,这篇文章来讲解蓝牙配对和蓝牙连接 1 ...

  3. 如何解决Filezilla 与虚拟机连接不上的问题

    摘自:如何解决Filezilla 与虚拟机连接不上的问题 作者:一只青木呀 发布时间: 2020-08-28 21:48:04 网址:https://blog.csdn.net/weixin_4530 ...

  4. 【Android -- 蓝牙】蓝牙配对和蓝牙连接

    文章目录 一.蓝牙配对 二.蓝牙连接 一.蓝牙配对 搜索到蓝牙设备后,将设备信息填充到listview中,点击listiew则请求配对 蓝牙配对有点击配对和自动配对,点击配对就是我们选择设备两个手机弹 ...

  5. win10 wifi连接不上服务器未响应,简单几步解决win10wifi一直断开连接不上的问题...

    大家在操作win10系统电脑的时候,应该都遇到过win10系统无线网络wifi一直断开连接不上的情况吧,但我们遇到这种情况要怎么解决呢?有些不熟悉的网友可能不太清楚,所以今天本文为大家整理的就是win ...

  6. 此蓝牙设备或计算机无法,蓝牙无法使用,如图,连接不上设备

    一: 使用直观的反馈 二.关于蓝牙的一个服务启动失败 ,本身是自动启动的 三: windows 系统日志里面的错误日志 日志名称:          System 来源:            BTH ...

  7. 解决本地工具无法连接服务器上的mysql的问题

    当本地工具尝试连接服务器的时候,如果出现无法连接的情况,可能是权限没有开. 首先: mysql> show  databases: 发现有mysql数据库 进入该数据库,找到user表 mysq ...

  8. 【解决】长虹电视连接不上WiFi

    长虹电视可能对连接WiFi的兼容性不是太好,当WiFi的密码包含字母或特殊字符时没有办法正常连接,下面连接类型只有一个静态IP,且无法进行调整.刚开始以为是无法调整成动态IP(DHCP)导致的,后来又 ...

  9. 其他机器的访问mysql_解决MySQL其他机器连接不上的问题

    1.改表法.可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 "u ...

  10. lnmp mysql_解决LNMP环境下连接不上mysql的问题

    LNMP环境下 远程连接mysql数据库 一.为了安全起见,lnmp环境是禁止远程连接的,他会删除iptables里面的3306端口的防火墙规则 一.如果是phpmydmin  那要把权限里要远程连接 ...

最新文章

  1. 字符串位加密 php,PHP字符串加密增强版
  2. 标准爬虫初探,来自Python之父的大餐!
  3. 解析rtcm32报文工具_RTCM32编解码中的一些概念及相关文献阅读
  4. 笔记-信息系统开发基础-CMMI组织能力成熟度模型-连续式和阶梯式的分组
  5. 采用信号量机制实现消费者与生产者的线程同步_你还能聊聊常用的进程同步算法? 上篇[五]...
  6. ThreadLocal父子线程传递实现方案
  7. python中字典和集合对象是无序的_Python基础(四):元组、字典和集合
  8. Delphi获取默认打印机名称及端口
  9. 前端学习(2777):组件之间的通讯方式
  10. [EMU8086]基于8086的汇编语言学习
  11. 使用SQL PLUS生成报表
  12. Zdal分库分表中间件介绍
  13. mysql慢查询call_慢查询日志 - Azure Database for MySQL | Microsoft Docs
  14. RpcException:No provider available for remote service异常
  15. android 禁掉唤醒锁acquire()
  16. 读后感系列-2.《看见》柴静(二)
  17. 如何将live stream发布到Youtube
  18. 获取开源医学文献图片(PubMed)制成数据集
  19. HNU 12814 SIRO Challenge(最短路+状态压缩+dp)
  20. 鸿蒙车载智慧屏评测,搭载鸿蒙系统的荣耀智慧屏值得入手吗?荣耀智慧屏全面评测...

热门文章

  1. 计算机时间怎么改24小时模式,怎么修改电脑的时间为24小时制啊?
  2. html 圆角矩形,圆角矩形
  3. 算法笔记:Playing Atari with Deep Reinforcement Learning
  4. WinSCP(版本5.7.6)中文文件名显示乱码
  5. 1898: [Zjoi2005]Swamp 沼泽鳄鱼
  6. 教你免费将手机里的PDF转Word还能同步到电脑
  7. 解析mac苹果电脑与Windows电脑的区别
  8. 企业所得税汇总纳税信息报告网上办理操作指南
  9. 【数学】用C语言实现函数的定积分—— 把 “定积分定义计算出的值” 和 “牛顿-莱布尼兹公式计算出的值” 两者进行误差比较
  10. python语言是什么语言