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笔记相关推荐

  1. nrf51822蓝牙学习笔记三

    目录 协议栈初始化 回调派发函数 蓝牙事件派发 系统事件派发 协议栈GAP入门 GAP初始化 GAP介绍 GAP软件设计分析 GAP安全模式配置 GAP连接要求 设备名称修改 连接参数的设置 连接间隔 ...

  2. 蓝牙技术基础知识总结笔记1 - 蓝牙版本及 4.0 和 BLE 的关系等

    1.蓝牙技术的起源 蓝牙的创始人是瑞典爱立信公司. 爱立信早在 1994 年就已进行研发. 1997 年,爱立信与其他设备生产商联系,并激发了他们对该项技术的浓厚兴趣. 1998 年 2 月,5 个跨 ...

  3. [转载]秀脱linux实战笔记linux-kernel-3.0.3实战篇

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 秀脱linux实战笔记linux-kernel-3.0.3实战片篇: QQ:     6 ...

  4. OPPO Find5 X909T ColorOS1.0系统精简笔记

    OPPO Find5 X909T ColorOS1.0系统精简笔记 挂载 system 分区 在ColorOS 1.0 系统下,进入官方Recovery后即可使用 ADB 连接手机,adb shell ...

  5. 从零开始游戏开发笔记(0):前期准备

    从零开始游戏开发笔记(0):前期准备(持续更新中) 一.开发软件 1.1 游戏引擎 1.2 美工软件 1.3 音乐软件 1.4 插件 二.教程.素材 1.1 学习教程 1.2 素材网站 三.其他技能 ...

  6. 【原创】Windows® Embedded CE 6.0 Fundamentals 读书笔记_Chapter 9

    Chapter 9 第九章主要是介绍关于应用程序开发的一章.这一章比较适合应用层开发的人员来了解如何基于wince6.0开发应用层程序,首先我 们还是先看一些单词 //================ ...

  7. mysql查询数据为0的所有字段6_MySQL8.0 初级学习笔记(六)查询数据

    MySQL8.0 初级学习笔记(六)查询数据 MySQL8.0 初级学习笔记(六)查询数据 查询有多种方法:单表查询,使用集合函数查询,连接查询,子查询,合并查询结果,为表和字段取别名,使用正则表达式 ...

  8. 蓝牙遥控小车2.0版发布啦

    蓝牙遥控小车2.0版发布啦! 蓝牙模块的主从机模式 1.主从机模式 2.设置主从机模式 蓝牙遥控器 1.硬件接线 2.程序设计 蓝牙小车 1.硬件接线 2.程序设计 今天要跟大家分享的是两个蓝牙模块之 ...

  9. 【《RISC-V “V“ Vector Extension Version 1.0》阅读笔记】

    <RISC-V "V" Vector Extension Version 1.0>阅读笔记 RISC-V "V" Vector Extension ...

最新文章

  1. C语言生成一个随机的九行九列数独,一个随机生成数独的C++程序
  2. 遴选中计算机类,计算机卓越班遴选办法-计算机学院
  3. mysql频繁查询出错_Mysql数据库频繁查询错误解决方案
  4. Java - Collection
  5. myeclipse去除jsp校验错误
  6. combotree 可以异步加载吗_Unity AssetBundle 资源打包,加载,本地缓存方式,安卓,PC本地加载路径问题...
  7. Hibernate连接数据库
  8. 判斷作業系統為 64bit 或 32bit z
  9. 2fsk调制解调原理框图_数字调制解调输出什么 数字调制解调输出特点介绍【图文】...
  10. python语言的特点强制可读_python程序语言设计第二讲(笔记)
  11. react 刨坑之路之使用create-react-app脚手架
  12. Linux Centos firewall 防火墙 开启 80 端口配置案例
  13. Nero Burning Rom V6多区段刻录详解
  14. python计算2的n次方_python求n次方
  15. 彻底理解vue的钩子函数,vue的生命周期理解,什么是vue的生命周期,钩子函数
  16. python新手快速入门教程-10 分钟快速入门 Python3的教程
  17. 分享、活动、地推、广告:openinstall全渠道多场景解决方案
  18. C语言教程(四):基础知识(最后一续)
  19. 实现软件GPS的软硬件设计讨论
  20. JavaScript的pop()

热门文章

  1. H3C S5560-EI系列交换机配置Web管理
  2. c语言五一快乐源码,快乐“五一”
  3. Nokia的操作技巧
  4. 互联网思维——简约思维
  5. 抖音号永久封禁了怎么解封
  6. CSS-浏览器缩放使边框大小改变,导致布局改变的问题
  7. 毕业论文设置图序号为图1-1,而不是图一-1,同时设置题注方便交叉引用
  8. 关于大脑记忆可视化的初步尝试(一)
  9. 基于React Native和Ethers.js的电子钱包(二):路由和导航
  10. Android TTS语音播报实践