nrf52832--串口例程添加静态密码配对、绑定

在nrf官方例程上添加如下功能:

一、在连接时请求配对;

二、配对密码设置为静态密码;

三、配对成功后进行绑定,下次连接时不需要再输入密码

参考博客:点击打开链接

*****************************************************************************************************************************************************************************************分割线********************************************************

****************************************************************************************************************************

术语:中心设备:手机app

           外围设备:开发板

1、在连接时外围设备向中心设备发送配对请求:

ble_gap_sec_params_t sec_params_auth;
sd_ble_gap_authenticate(m_conn_handle, &sec_params_auth);//向中心设备发送配对请求

2、中心设备收到配对请求后,向外围设备发送安全参数参数请求,外围设备收到安全参数请求后开始回复中心设备:

        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
            // Pairing not supported
               //err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
	      ble_gap_sec_params_t sec_params;
	      sec_params.bond = 0; //°ó¶¨±êÖ¾£¬ÔÝʱ²»ÐèÒª°ó¶¨
	      sec_params.mitm = 1;//ÖмäÈ˱£»¤
	     sec_params.io_caps = BLE_GAP_IO_CAPS_DISPLAY_ONLY;
						sec_params.min_key_size = 7;
						sec_params.max_key_size = 16;
						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;

当中心设备收到安全参数后,开始进行配对流程。接下来,通过调试助手来显示配对密码

case BLE_GAP_EVT_PASSKEY_DISPLAY:
    SEGGER_RTT_printf(0, "passkey: %s\n",p_ble_evt->evt.gap_evt.params.passkey_display.passkey); 
    break;

效果如下:

至此,我们的整个配对过程已经结束,现在配对过程使用的是动态密码,接下来我们需要设置使用静态密码。

在gap_params_init中添加如下代码,将静态密码设置为123456,其中密码都是以字符串的方式存储

		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);

最终效果如下

接下来需要设置绑定状态,设置绑定状态后,已经配对的设备下次进行连接时就不需要再次进行配对,而是直接请求外部设备分发密钥,进行链路的加密,设置如下:

配对参数初始化:

ble_gap_sec_params_t m_sec_params;
ble_gap_sec_keyset_t m_sec_keyset;
ble_gap_enc_key_t m_own_enc_key;
ble_gap_enc_key_t m_peer_enc_key;

static void sec_params_init()
{
memset(&m_sec_params, 0, sizeof(ble_gap_sec_params_t));
m_sec_params.bond = 1; //°ó¶¨±êÖ¾£¬ÔÝʱ²»ÐèÒª°ó¶¨
m_sec_params.mitm = 1;//ÖмäÈ˱£»¤
m_sec_params.io_caps = BLE_GAP_IO_CAPS_DISPLAY_ONLY;
m_sec_params.min_key_size = 7;
m_sec_params.max_key_size = 16;
m_sec_params.kdist_own.enc = 1;
m_sec_params.kdist_own.id = 0;
m_sec_params.kdist_own.sign = 0;
m_sec_params.kdist_peer.enc = 1;
m_sec_params.kdist_peer.id = 0;
m_sec_params.kdist_peer.sign = 0;
	
m_sec_keyset.keys_own.p_enc_key = &m_own_enc_key;
m_sec_keyset.keys_own.p_id_key = NULL;
m_sec_keyset.keys_own.p_pk = NULL;
m_sec_keyset.keys_own.p_sign_key = NULL;
	
m_sec_keyset.keys_peer.p_enc_key = &m_peer_enc_key;
m_sec_keyset.keys_peer.p_id_key = NULL;
m_sec_keyset.keys_peer.p_pk = NULL;
m_sec_keyset.keys_peer.p_sign_key = NULL;
}

        case BLE_GAP_EVT_SEC_PARAMS_REQUEST://ÖÐÐÄÉ豸ÏòÍâΧÉ豸ÇëÇóÅä¶Ô²ÎÊý
            // Pairing not supported
//            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
                        
                        sec_params_init();//Åä¶Ô²ÎÊý³õʼ»¯
                        err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_SUCCESS, &m_sec_params, &m_sec_keyset);
            APP_ERROR_CHECK(err_code);
                        
            break;

                case BLE_GAP_EVT_PASSKEY_DISPLAY://½øÐÐÅä¶Ôʱ£¬ÏÔʾPIN
                        SEGGER_RTT_printf(0, "passkey: %s\n",p_ble_evt->evt.gap_evt.params.passkey_display.passkey); 
                        break;
                
                case BLE_GAP_EVT_SEC_INFO_REQUEST://°ó¶¨³É¹¦ºó£¬Ã¿´Î½øÐÐÁ¬½Ó¾Í²»ÐèÒªÔÚ½øÐÐÅä¶Ô£¬¶øÊÇÖ±½ÓÇëÇóÃÜÔ¿
                        sd_ble_gap_sec_info_reply(m_conn_handle, &(m_own_enc_key.enc_info), NULL, NULL);
                        sec_params_display();
                        SEGGER_RTT_printf(0, "BLE_GAP_EVT_SEC_INFO_REQUEST\n"); 
                        break;
                case BLE_GAP_EVT_AUTH_STATUS:
                        if(p_ble_evt->evt.gap_evt.params.auth_status.auth_status == BLE_GAP_SEC_STATUS_SUCCESS)
                        {
                            SEGGER_RTT_printf(0, "pair success\n");
                            sec_params_display(); 
                        }
                        else
                        {
                            SEGGER_RTT_printf(0, "pair error\n");
                        } 

最后,说一下蓝牙配对绑定的过程

1、外围设备向中心设备发送配对请求

2、中心设备收到请求后向外围设备发送配对参数请求;

3、外围设备向中心设备发送配对参数,并根据自己的IO能力显示配对码;

4、配对切绑定成功后,中心设备再次连接外围设备时就不会进行配对,而是直接申请密钥


  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
### 回答1: nrf52832-qfaa是一款由Nordic Semiconductor公司开发的低功耗蓝牙系统级芯片。原理图即为该芯片的电路连接图,它展示了芯片内部的各个功能模块之间的连接方式和电气特性。对于电路设计和电路分析人员来说,原理图是理解芯片内部结构和工作原理的重要工具。 nrf52832-qfaa原理图主要包括以下几个方面的内容: 1. 电源管理电路:负责芯片的供电和电池管理,包括电源接口、电源描述和电源过滤电路等。 2. MCU核心:这部分含有nrf52832芯片的主控制单元,包括处理器核心、存储器和系统总线等。 3. 外设接口:负责芯片与外部设备的通信,如UART、SPI、I2C和GPIO等。 4. 射频前端:负责无线通信,包括蓝牙低功耗无线模块和射频天线。 5. 时钟和定时器:包括系统时钟和RTC(实时时钟)等,用于芯片的时序控制和定时功能。 6. I/O和连接器:包括与外部电路的连接接口和引脚布局等。 7. 其他模块:如中断控制器、电源管理单元、温度传感器等。 通过阅读nrf52832-qfaa的原理图,电路设计人员可以了解芯片的各个模块的连接方式和通信协议,有助于进行电路设计和系统验证。同时,它也为故障排除和错误修复提供了重要的参考依据。原理图是一个工程师在开发和设计过程中不可或缺的工具,它大大简化了电路设计的复杂性,提高了设计的效率和可靠性。 ### 回答2: nrf52832-qfaa是一款蓝牙低功耗系统芯片,可以用于物联网设备和可穿戴设备等领域。原理图是描述该芯片内部电路连接关系的图纸。 nrf52832-qfaa原理图主要包括器件、排列方式、连接线路等信息。例如,原理图会显示芯片上的各个引脚,以及它们之间的连接方式。它会标明不同器件的型号、值以及相互之间的连接关系,以帮助设计师正确布局和设计电路。 在nrf52832-qfaa原理图中,可以看到该芯片的主要模块,包括处理器、存储器、射频收发器、时钟电路等。这些模块通过连接线路相互连接,以实现各个功能模块之间的通信和控制。 此外,原理图还能显示一些外部器件的连接方式,比如电源管理模块、传感器、接口等。这些外部器件可以通过连接线路与nrf52832-qfaa芯片相互连接,以实现更丰富的功能。 通过阅读nrf52832-qfaa原理图,设计人员可以了解芯片的内部架构和连接方式,从而有助于他们进行电路布局和调试工作。同时,对于学习者来说,也可以通过阅读原理图深入了解这款芯片的工作原理和内部结构。 ### 回答3: nrf52832-qfaa是一款由Nordic Semiconductor公司生产的芯片,主要用于物联网设备和无线通信应用。原理图是对该芯片电路连接的图示,展示各个元件之间的连接方式。 nrf52832-qfaa原理图主要包含以下几个部分: 1. 电源部分:包括电源芯片、电源电容、电源指示灯等,用于提供电源给整个芯片及其外围电路。 2. 调试部分:包括调试接口芯片和相应的连接器,用于对该芯片进行调试和软件烧录。 3. 外部接口部分:包括与其他外部元件连接的接口,如UART、SPI、I2C等,用于实现与其他设备的数据通信。 4. 时钟部分:包括晶振和时钟电路,提供准确稳定的时钟信号给芯片的各个模块。 5. 外设接口部分:包括与外部设备连接的接口,如GPIO(通用输入输出)、ADC(模数转换器)、PWM(脉宽调制)等,用于实现与外部设备的数据交换和控制。 6. 射频部分:包括射频收发器、射频天线等,用于无线通信功能。 原理图中通过不同的连线和符号表示了各个元件之间的连接关系和信号传输方式。通过分析原理图,我们可以了解到该芯片的电路结构和各个功能模块的配置情况,以及与其他外部元件的连接方式。这对于硬件工程师在进行电路设计和调试时非常有帮助,同时也为软件开发人员提供了基础的硬件信息,方便他们进行软硬件的协同开发工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jkdon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值