NRF51822蓝牙初学笔记1.0之 GAP笔记
1.0、
最近没什么繁忙的事情,自己有点闲时间 ,就自学了一些蓝牙方面的知识,用的是nRF51822的板子。做了一些笔记供大家分享。有什么问题,希望大家及时指出。
蓝牙芯片与普通芯片唯一的好处就是,它的大多数引脚可以配置成想要的功能(除了特殊引脚比如ADC等)。这种多种映射方式方便了硬件操作;软件上,nordic给出了许多库函数和模板供使用,也是很方便的,不过前期要多多熟悉这些代码。
我是先从普通引脚配置学起来,这些没什么要说的,用过任何一款的芯片的工程师都能够很快了解并应用,所以这里一笔带过,直接进入正题我们先看看蓝牙的GAP。在学习之前要先明白GAP是干什么的 --------GAP是发现设备,建立连接,断开连接;简单来说,GAP就是修路的,后面会看到还有一个GATT,这个就是运输数据的。我们进入正题,看下面的代码。
int main(void)
{uint32_t err_code;bool erase_bonds;// Initialize.APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false);uart_init();buttons_leds_init(&erase_bonds);ble_stack_init();gap_params_init(); //GAP初始化services_init();advertising_init();conn_params_init();printf("\r\nUART Start!\r\n");err_code = ble_advertising_start(BLE_ADV_MODE_FAST);APP_ERROR_CHECK(err_code);// Enter main loop.for (;;){power_manage();}
}
}
上面 用的是nRF51822的12.3.0 SDK的串口模板代码,上面的GAP初始化函数,我们可以跳 gap_params_init()过去看看。下面是代码
2.0、
/**@brief Function for the GAP initialization.** @details This function will set up all the necessary GAP (Generic Access Profile) parameters of* the device. It also sets the permissions and appearance.*/
static void gap_params_init(void)
{uint32_t err_code;ble_gap_conn_params_t gap_conn_params;ble_gap_conn_sec_mode_t sec_mode;BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);//模式安全设置//初始化安全模式err_code = sd_ble_gap_device_name_set(&sec_mode, //结构体(const uint8_t *) DEVICE_NAME, //蓝牙名称strlen(DEVICE_NAME));//长度APP_ERROR_CHECK(err_code);memset(&gap_conn_params, 0, sizeof(gap_conn_params));gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL; //最小连接间隔gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL; //最大连接间隔gap_conn_params.slave_latency = SLAVE_LATENCY;gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT; //连接超时err_code = sd_ble_gap_ppcp_set(&gap_conn_params);APP_ERROR_CHECK(err_code);
}
2.01、先谈谈安全模式的概要:
安全模式就是我们经常说的连接模式。两个设备之间的连接安全是GAP负责的部分之一,它允许通过身份验证的连接才能进行数据的可读可写,就相当于我们前面说的给设备铺路一样。一旦形成连接,两个设备可以通过一个被称为配对的过程 ,进行配对时候,密钥建立加密 和认证的连接。说到这里,大家应该有印象就是我们用手机直接连接蓝牙和输入配对密码连接。
2.02、我们现在分析一下代码 ,先看一下安全模式结构体。
uint32_t err_code;ble_gap_conn_params_t gap_conn_params;ble_gap_conn_sec_mode_t sec_mode; //结构体BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode); //设置安全模式err_code = sd_ble_gap_device_name_set(&sec_mode,(const uint8_t *)DEVICE_NAME,strlen(DEVICE_NAME));APP_ERROR_CHECK(err_code);
我们跳到结构体ble_gap_conn_sec_mode_t 里面看看定义
typedef struct
{uint8_t sm : 4; /**< Security Mode (1 or 2), 0 for no permissions at all. */uint8_t lv : 4; /**< Level (1, 2, 3 or 4), 0 for no permissions at all. */} ble_gap_conn_sec_mode_t;
可以看出分为两种:安全模式和水平,它们不同的组合,形成不同的连接安全模式。看一下相关定义函数
/**@defgroup BLE_GAP_CONN_SEC_MODE_SET_MACROS GAP attribute security requirement setters** See @ref ble_gap_conn_sec_mode_t.* @{ */
/**@brief Set sec_mode pointed to by ptr to have no access rights.*/设置模式没有访问权限,0模式0水平
#define BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(ptr) do {(ptr)->sm = 0; (ptr)->lv = 0;} while(0)/**@brief Set sec_mode pointed to by ptr to require no protection, open link.*/设置为无需密码保护,开放性连接,1模式1水平
#define BLE_GAP_CONN_SEC_MODE_SET_OPEN(ptr) do {(ptr)->sm = 1; (ptr)->lv = 1;} while(0)/**@brief Set sec_mode pointed to by ptr to require encryption, but no MITM protection.*/需要密码连接,无MITM保护,1模式2水平
#define BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 2;} while(0)/**@brief Set sec_mode pointed to by ptr to require encryption and MITM protection.*/加密连接和MITM保护 ,1模式3水平
#define BLE_GAP_CONN_SEC_MODE_SET_ENC_WITH_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 3;} while(0)/**@brief Set sec_mode pointed to by ptr to require LESC encryption and MITM protection.*/签名 或加密。MITM保护
#define BLE_GAP_CONN_SEC_MODE_SET_LESC_ENC_WITH_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 4;} while(0)/**@brief Set sec_mode pointed to by ptr to require signing or encryption, no MITM protection needed.*/签名 或加密。无MITM保护
#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_NO_MITM(ptr) do {(ptr)->sm = 2; (ptr)->lv = 1;} while(0)
/**@brief Set sec_mode pointed to by ptr to require signing or encryption with MITM protection.*/MITM保护签名 或加密连接
#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_WITH_MITM(ptr) do {(ptr)->sm = 2; (ptr)->lv = 2;} while(0)
/**@} */
有代码可以看出,我们是选择了 开放连接。
2.03、设备名称修改
err_code = sd_ble_gap_device_name_set(&sec_mode,(const uint8_t *)DEVICE_NAME, //设备名称strlen(DEVICE_NAME));//名称长度APP_ERROR_CHECK(err_code);
设备名称是宏定义:
#define DEVICE_NAME "Nordic_UART" /**< Name of device. Will be included in the advertising data. */
#define MANUFACTURER_NAME "NordicSemiconductor" /**< Manufacturer. Will be passed to Device Information Service. */
#define APP_ADV_INTERVAL 40 /**< The advertising interval (in units of 0.625 ms. This value corresponds to 25 ms). */
#define APP_ADV_TIMEOUT_IN_SECONDS 180 /**< The advertising timeout in units of seconds. */
这个名称在蓝牙扫描的时候 ,可以在手机app或者手机蓝牙扫描到。
2.04、最后看一下蓝牙里面比较重要的一步分,就是连接间隔,这个连接间隔影响到 蓝牙的连接速度和功耗问题,不过 ,具体还要结合广播 间隔来看。先看代码:
memset(&gap_conn_params, 0, sizeof(gap_conn_params));gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL; //最小连接间隔gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL; //最大连接间隔gap_conn_params.slave_latency = SLAVE_LATENCY;gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT; //监督超时err_code = sd_ble_gap_ppcp_set(&gap_conn_params);APP_ERROR_CHECK(err_code);
(1)、最小连接间隔单位是1.25ms,其中设定的最小值为6(也就是7.5ms)
(2)、最大连接间隔单位1.25ms,,其中设定的最大值为3200(也就是4s)
(3)、监督超时单位为10ms,其中最小值为10(100ms)到最大值3200(32s),超出设定的最大时间还没有连接,设备就会判断连接失败。
NRF51822蓝牙初学笔记1.0之 GAP笔记相关推荐
- nrf51822蓝牙学习笔记三
目录 协议栈初始化 回调派发函数 蓝牙事件派发 系统事件派发 协议栈GAP入门 GAP初始化 GAP介绍 GAP软件设计分析 GAP安全模式配置 GAP连接要求 设备名称修改 连接参数的设置 连接间隔 ...
- 蓝牙技术基础知识总结笔记1 - 蓝牙版本及 4.0 和 BLE 的关系等
1.蓝牙技术的起源 蓝牙的创始人是瑞典爱立信公司. 爱立信早在 1994 年就已进行研发. 1997 年,爱立信与其他设备生产商联系,并激发了他们对该项技术的浓厚兴趣. 1998 年 2 月,5 个跨 ...
- [转载]秀脱linux实战笔记linux-kernel-3.0.3实战篇
+++++++++++++++++++++++++++++++++++++++++++++++++++++++ 秀脱linux实战笔记linux-kernel-3.0.3实战片篇: QQ: 6 ...
- OPPO Find5 X909T ColorOS1.0系统精简笔记
OPPO Find5 X909T ColorOS1.0系统精简笔记 挂载 system 分区 在ColorOS 1.0 系统下,进入官方Recovery后即可使用 ADB 连接手机,adb shell ...
- 从零开始游戏开发笔记(0):前期准备
从零开始游戏开发笔记(0):前期准备(持续更新中) 一.开发软件 1.1 游戏引擎 1.2 美工软件 1.3 音乐软件 1.4 插件 二.教程.素材 1.1 学习教程 1.2 素材网站 三.其他技能 ...
- 【原创】Windows® Embedded CE 6.0 Fundamentals 读书笔记_Chapter 9
Chapter 9 第九章主要是介绍关于应用程序开发的一章.这一章比较适合应用层开发的人员来了解如何基于wince6.0开发应用层程序,首先我 们还是先看一些单词 //================ ...
- mysql查询数据为0的所有字段6_MySQL8.0 初级学习笔记(六)查询数据
MySQL8.0 初级学习笔记(六)查询数据 MySQL8.0 初级学习笔记(六)查询数据 查询有多种方法:单表查询,使用集合函数查询,连接查询,子查询,合并查询结果,为表和字段取别名,使用正则表达式 ...
- 蓝牙遥控小车2.0版发布啦
蓝牙遥控小车2.0版发布啦! 蓝牙模块的主从机模式 1.主从机模式 2.设置主从机模式 蓝牙遥控器 1.硬件接线 2.程序设计 蓝牙小车 1.硬件接线 2.程序设计 今天要跟大家分享的是两个蓝牙模块之 ...
- 【《RISC-V “V“ Vector Extension Version 1.0》阅读笔记】
<RISC-V "V" Vector Extension Version 1.0>阅读笔记 RISC-V "V" Vector Extension ...
最新文章
- C语言生成一个随机的九行九列数独,一个随机生成数独的C++程序
- 遴选中计算机类,计算机卓越班遴选办法-计算机学院
- mysql频繁查询出错_Mysql数据库频繁查询错误解决方案
- Java - Collection
- myeclipse去除jsp校验错误
- combotree 可以异步加载吗_Unity AssetBundle 资源打包,加载,本地缓存方式,安卓,PC本地加载路径问题...
- Hibernate连接数据库
- 判斷作業系統為 64bit 或 32bit z
- 2fsk调制解调原理框图_数字调制解调输出什么 数字调制解调输出特点介绍【图文】...
- python语言的特点强制可读_python程序语言设计第二讲(笔记)
- react 刨坑之路之使用create-react-app脚手架
- Linux Centos firewall 防火墙 开启 80 端口配置案例
- Nero Burning Rom V6多区段刻录详解
- python计算2的n次方_python求n次方
- 彻底理解vue的钩子函数,vue的生命周期理解,什么是vue的生命周期,钩子函数
- python新手快速入门教程-10 分钟快速入门 Python3的教程
- 分享、活动、地推、广告:openinstall全渠道多场景解决方案
- C语言教程(四):基础知识(最后一续)
- 实现软件GPS的软硬件设计讨论
- JavaScript的pop()