第一章 BLE基本概念了解
一、蓝牙4.0和BLE区别
 
  蓝牙4.0是一种应用非常广泛、基于2.4G射频的低功耗无线通讯技术。蓝牙低功耗(Bluetooth Low Energy ),人们又常称之为BlueTooth Smart,是由SIG( the Bluetooth Special Interest Group) 在2010年6月起草,在原有标准的蓝牙4.0核心协议上添加的一种低功耗技术。
  蓝牙低功耗不等同于蓝牙4.0,只是蓝牙4.0的一个分支。蓝牙4.0是蓝牙3.0+ HS(高速蓝牙)规范的补充,专门面向对成本和功耗都有较高要求的无线方案,可广泛用于卫生保健、体育健身、家庭娱乐、安全保障等诸多领域。伴随着智能穿戴、智能硬件的兴起,BLE的应用越来越广泛,已经深入到我们的日常生活种的方方面面。
 
二、BLE的特点
 
1)快速地建立连接。
2)小数据包。一个数据包最多只包含20个字节。
3)发送和接收持续时间短。
4)尽量少的工作时间,尽量快地进入休眠模式。
5)超低的峰值电流和待机电流。
6)超长的待机时间。
 
以上特点使得BLE非常适合用在短距离、低延迟、小数据量的应用场合。
也正是由于这个原因,使得由一颗CR1632的纽扣电池的BLE设备可以续航半年至一年以上。
 
三、单模和双模
 
  蓝牙4.0包含两个内容:传统蓝牙(CLASSIC)和低功耗(LE)。
  我们常用的蓝牙芯片例如CC2540、NRF51822、QN9020、CSR1000等都只支持蓝牙低功耗(BLE),所以我们称之为单模芯片;而支持传统蓝牙和蓝牙低功耗的IC一般是手机、平板和PC机上的芯片组。我们称之为双模芯片。当然,单颗支持传统蓝牙和蓝牙低功耗的芯片好像有些厂家也有,只是不太常见。
  传统蓝牙可以用来连接蓝牙耳机,也可以连接支持SPP协议的蓝牙模块;蓝牙低功耗可以用来连接外部的智能外设。蓝牙低功耗技术制定的初衷是为了最大程度上延长蓝牙设备的续航时间,这就是为什么一般常见的穿戴式设备不支持语音传输,只在一些间歇式、数据量小的场合应用的原因。
 
       注:有的同学可能会问,假如我一定要用BLE传音频呢?不考虑功耗和续航时间的话当然可以,但是不推荐这样做。
 
注:来自..\nrf51822\nRF51822EK_TM配套资料\实战教程\(1)初识蓝牙低功耗1
 
 
 
第二章 探讨BLE软件体系结构
 
四、应用层和协议栈
 
 
 
nRF51822 SOC BLE的软件分为上下2部分:
 
1) 应用部分(APPLICATION)
  这部分NORDIC公司是以SDK的形式提供的。SDK里面包含心率、防丢、电池电量等常见的BLE profiles。开发者可以把SDK作为蓝本,在此基础上进行修改、移植、开发自己的应用程序。
 
2) 蓝牙协议栈部分(SOFTDEVICE)
  蓝牙协议栈是nRF51822实现蓝牙功能的关键。这部分NORDIC公司只提供HEX文件,不提供源代码。nRF51822的蓝牙协议栈有以下几种:
a)S110。这个是我们经常用到的从协议栈。安装好SDK以后,在安装目录下的S110文件里面所有的项目工程工程源代码都是与之对应的。S110有很多个版本,而且还在不断升级,需要注意的是,必须保证S110跟SDK的版本是匹配的。
b)S120。这个是从协议栈。安装好SDK以后,可以在安装目录下的S120文件夹里面找到对应的源代码。开发者也需要注意版本匹配问题。
c)S130。这个是主从一体的协议栈。官方提供了一个DEMO程序。
 
注:应用部分和协议栈部分是相互独立的,它们之间通过API接口函数进行通讯。
 
 
五、BLE协议栈
 
5.1、数据链路层的功能:
  数据链路层负责广播、扫描、连接的建立和维护。
 
5.2、数据链路层定义了4个角色:
1) scaner和advertiser
2) master和advertiser
 
  在建立连接之前,scanner(手机、平板、PC)负责扫描、发起扫描请求和发起连接请求;而advertiser(智能外设)任务是发起广播、相应扫描请求信号、响应连接请求进而跟scanner端建立连接。数据链路层同时也负责将各种数据包按正确的数据格式组织起来,正确地发送到对方。建立连接以后scanner被称为master,advertiser被称为slave.
 
5.3、数据链路层的2种信道:
1)广播信道:提供给还没有建立连接的蓝牙设备提供发射广播、扫描、建立连接的信道。BLE有3个广播信道:37、38、39,在每一个广播事件发生时,advertiser分别在这3个信道上各发送一次广播信号。传统蓝牙的广播信道有16-32个,而BLE只有3个,这就是为什么BLE的广播时间比较短的原因。
2)数据信道:提供给已经建立蓝牙连接的master和slave端提供可靠的数据通信信道。BLE规定,数据信道有37个。为加强通讯的可靠性,避开干扰,BLE设备通过自适应跳频的方式在这37个信道上传输数据。
 
nRF51822采用的是Random Static address,在启动的时候协议栈从FICR里面读取作为设备的蓝牙地址.如果用户需要使用Public address,则需要使用sd_ble_gap_address_set()这个函数重新设定蓝牙地址。
 
5.4、帧格式:
 
 
1) Preamble:前导码,广播接收端可以用来进行同步和自动增益控制(AGC)。在广播帧中Preamble固定为“01010101“。
2) Access Address:在广播帧中Access Address固定为0x8E89BED6。
3) PDU Header: 用来表示不同类型的帧。
A) 以ADV_开头的帧表示该帧是广播帧,是由advertiser(蓝牙外设)发出的,它们有4种类型,分别用在不同的蓝牙设备上面。
B) ADV_SCAN_IND为扫描帧,是由scanner(手机、平板、PC)发出的。
C) ADV_SCAN_REQ为扫描请求帧,是由scanner(手机、平板、PC)发出的。只在scanner想从advertiser获取更多的广播数据的时候才由scanner发出。相应的,当ADV_SCAN_REQ被发出以后,advertiser
会以SCAN_RSP作为回应。
D) SCAN_RSP为ADV_SCAN_ REQ的回应。
E) CONNECT_REQ为scanner向advertiser发起的建立连接的请求。
F) Res为保留字段,不用理会。
G) TxAdd、RxAdd 用来表示发送该广播帧的蓝牙设备的蓝牙地址类型。1表示random address 0表示public address。蓝牙地址的种类我们在前一节已叙述。
H) Length 表示后面PDU Payload的大小。
4) PDU Payload 为广播的实际载荷。
5) CRC 为整个广播帧的24-bit CRC值。
 
 
 第三章 TI的相关资料摘要
 

FROM:..\nrf51822\nRF51822EK_TM配套资料\店主搜集BLE学习资料
TI 2013研讨会蓝牙4.0讲解部分PPT 20130508.pdf
 
六、兼容性示意图
 
 
七、低功耗蓝牙协议栈(Bluetooth Low Energy Protocol Stack)
 
 
 
八、BLE物理层(PHY)
 
• 3 个固定的广播通道
• 37 个自适应自动跳频数据通道
 
       
 
比较好~后面有characteristic的详细介绍
:BLE_CC2540_DeepDive_Training_2011这篇文章是上篇的英文版,比较全
 
 
第四章 nRF51822-BLE工程理解
 

Attention:other's talk about the project code, good
 
九、广播
 
9.1、由一个广播超时系统休眠看广播事件
 
:自动休眠的时间是在广播中的 m_adv_params.timeout     = APP_ADV_TIMEOUT_IN_SECONDS;设置的!
注:下面代码来自X-CASE第一版部分测试代码
 /**@brief Function for initializing the Advertising functionality.
*
* @details Encodes the required advertising data and passes it to the stack.
* Also builds a structure to be passed to the stack when starting advertising.
*/
static void advertising_init(void)
{
uint32_t err_code;
ble_advdata_t advdata;
uint8_t flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; 12 ble_uuid_t adv_uuids[] =
13 {
14 {BLE_UUID_HEART_RATE_SERVICE, BLE_UUID_TYPE_BLE},
15 {BLE_UUID_BATTERY_SERVICE, BLE_UUID_TYPE_BLE},
16 {BLE_UUID_DEVICE_INFORMATION_SERVICE, BLE_UUID_TYPE_BLE}
17 };//广播工程蓝牙3个服务的uuid

// Build and set advertising data
memset(&advdata, , sizeof(advdata)); advdata.name_type = BLE_ADVDATA_FULL_NAME;
advdata.include_appearance = true;
advdata.flags.size = sizeof(flags);
advdata.flags.p_data = &flags;
advdata.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[]);
advdata.uuids_complete.p_uuids = adv_uuids; err_code = ble_advdata_set(&advdata, NULL);
APP_ERROR_CHECK(err_code); // Initialize advertising parameters (used when starting advertising)
memset(&m_adv_params, , sizeof(m_adv_params)); m_adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND;
m_adv_params.p_peer_addr = NULL; // Undirected advertisement
m_adv_params.fp = BLE_GAP_ADV_FP_ANY;
m_adv_params.interval = APP_ADV_INTERVAL;
m_adv_params.timeout = APP_ADV_TIMEOUT_IN_SECONDS;
}
 
:广播事件中断在下面code中
:加重显示部分则是上面39行广播时间timeout事件到了,在其中做系统休眠处理~
 /*****************************************************************************
* Static Event Handling Functions
*****************************************************************************/ /**@brief Function for handling the Application's BLE Stack events.
*
* @param[in] p_ble_evt Bluetooth stack event.
*/
static void on_ble_evt(ble_evt_t *p_ble_evt)
{
uint32_t err_code;
static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID; switch (p_ble_evt->header.evt_id)
{
case BLE_GAP_EVT_CONNECTED:
led_stop(); m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle; // Initialize the current heart rate to the average of max and min values. So that
// everytime a new connection is made, the heart rate starts from the same value.
// m_cur_heart_rate = 0;//(MAX_HEART_RATE + MIN_HEART_RATE) / 2;
// Start timers used to generate battery and HR measurements.
application_timers_start(); // Start handling button presses
err_code = app_button_enable();
APP_ERROR_CHECK(err_code);
break; case BLE_GAP_EVT_DISCONNECTED:
// Since we are not in a connection and have not started advertising, store bonds
err_code = ble_bondmngr_bonded_centrals_store();
APP_ERROR_CHECK(err_code); // @note Flash access may not be complete on return of this API. System attributes are now
// stored to flash when they are updated to ensure flash access on disconnect does not
// result in system powering off before data was successfully written. // Go to system-off mode, should not return from this function, wakeup will trigger
// a reset.
//system_off_mode_enter();
app_button_disable();
DispColor(BLACK);
//re-enter advertising model if disconnected advertising_init();
// Start advertising
advertising_start();
break; case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
err_code = sd_ble_gap_sec_params_reply(m_conn_handle,
BLE_GAP_SEC_STATUS_SUCCESS,
&m_sec_params);
APP_ERROR_CHECK(err_code);
break; case BLE_GAP_EVT_TIMEOUT:
if (p_ble_evt->evt.gap_evt.params.timeout.src == BLE_GAP_TIMEOUT_SRC_ADVERTISEMENT)
{
led_stop(); nrf_gpio_cfg_sense_input(SENSOR_BUTTON_PIN_RIGHT,
BUTTON_PULL,
NRF_GPIO_PIN_SENSE_LOW); nrf_gpio_cfg_sense_input(SENSOR_BUTTON_PIN_LEFT,
BUTTON_PULL,
NRF_GPIO_PIN_SENSE_LOW);
#if defined(ENABLE_UP)
nrf_gpio_cfg_sense_input(SENSOR_BUTTON_PIN_UP,
BUTTON_PULL,
NRF_GPIO_PIN_SENSE_LOW); nrf_gpio_cfg_sense_input(SENSOR_BUTTON_PIN_DOWN,
BUTTON_PULL,
NRF_GPIO_PIN_SENSE_LOW);
#endif system_off_mode_enter();
}
break;

default:
// No implementation needed.
break;
}
}

More:[蓝牙] 1、蓝牙核心技术了解(蓝牙协议、架构、硬件和软件笔记)

@beautifulzzzz 2015-12-11 continue~

 

[蓝牙] 2、蓝牙BLE协议及架构浅析&&基于广播超时待机说广播事件的更多相关文章

  1. 蓝牙 BLE 协议学习: 001-BLE协议栈整体架构

    背景 在深入BLE协议帧之前,我们先看一下BLE协议栈整体架构. 转载自:<深入浅出低功耗蓝牙(BLE)协议栈> 架构 如上图所述,要实现一个BLE应用,首先需要一个支持BLE射频的芯片, ...

  2. 蓝牙 BLE 协议学习: 3种蓝牙架构实现方案(蓝牙协议栈方案)

    导言 不同的蓝牙架构可以用在不同的场景中.从而协议帧的架构方案也会不同. 转载自:<三种蓝牙架构实现方案(蓝牙协议栈方案)> 蓝牙架构实现方案有哪几种?我们一般把整个蓝牙实现方案叫做蓝牙协 ...

  3. 蓝牙 BLE 协议学习: 000-有关概念介绍

    背景 在学校内就用过蓝牙技术参加过比赛(并拿了奖):而蓝牙作为物联网中比较常见的协议,有必要进行深入的学习.此后的文章会以 ble(v4.0) 进行学习. 介绍 蓝牙技术最初由电信巨头爱立信公司于 1 ...

  4. IOS学习之蓝牙4.0 BLE

    IOS学习也一段时间了,该上点干货了.前段时间研究了一下IOS蓝牙通讯相关的东西,把研究的一个成果给大家分享一下. 一 项目背景 简单介绍一下做的东西,设备是一个金融刷卡器,通过蓝牙与iphone手机 ...

  5. 蓝牙4.0 BLE入门

    在BLE协议中有两个角色,一个是周边(Periphery),另外一个是中央(Central).一个中央可以同时连接多个周边,但一个周边某一时刻只能连接一个中央.但是不管periphery还是centr ...

  6. Android低功耗蓝牙(蓝牙4.0)——BLE开发(上)

    段时间,公司项目用到了手机APP和蓝牙设备的通讯开发,这里也正好对低功耗蓝牙(蓝牙4.0及以后标准)的开发,做一个总结. 蓝牙技术联盟在2010年6月30号公布了蓝牙4.0标准,4.0标准在蓝牙3.0 ...

  7. 蓝牙BLE: 蓝牙4.0 BLE广播数据解析(转)

    BLE 设备工作的第一步就是向外广播数据.广播数据中带有设备相关的信息.本文主要说一下 BLE 的广播中的数据的规范以及广播包的解析. 1. 广播模式 BLE 中有两种角色 Central 和 Per ...

  8. [IOT] 自制蓝牙工牌办公室定位系统 (二)—— 基于ESP32的蓝牙信号扫描系统

      前面章节: 自制蓝牙工牌办公室定位系统 (一)-- 阿里物联网平台概览及打通端到云(硬核·干货)   目录: 1.蓝牙广播简介 2.蓝牙扫描简介 3.基于蓝牙广播和蓝牙扫描常见应用 4.ESP32 ...

  9. 第13节-BLE协议L2CAP层

    学习资料:官方手册 Vol 3: Core System Package [Host volume] Part A: Logical Link Control and Adaptation Proto ...

随机推荐

  1. 20145229&20145316 《信息安全系统设计基础》 实验二 固件设计

    实验封面 实验步骤 1.配置环境 开发环境的配置同实验一 2.拷贝文件 将实验代码拷贝到共享文件夹中 3.在虚拟机中编译代码 4.下载调试 在超级终端中运行可执行文件pthread,可得实验结果如图 ...

  2. MongoDB(NoSQL) 入门

    一.简介 NoSQL数据库因其可扩展性使其变得越来越流行,利用NoSQL数据库可以给你带来更多的好处, MongoDB是一个用C++编写的可度可扩展性的开源NoSQL数据库. 本文主要讲述MongoD ...

  3. C# this和base的使用

    namespace THISORBASE { //参考地址:http://blog.sina.com.cn/s/blog_7300c7d90100rs20.html /*这个时候,派生类和基类的_st ...

  4. ES6中的var let const应如何选择

    javascript世界里面的每个人都在说有关ECMAScript 6 (ES6,也称作ES 2015)的话题,对象的巨大变化 ( 类 , super() , 等), 函数 (默认参数等), 以及模块 ...

  5. 转:Xms Xmx PermSize MaxPermSize 区别

    Eclipse崩溃,错误提示:MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) sp ...

  6. Cracking-- 17.13 将二叉树转换成双向链表

    在书的105页 使用中根遍历的思想 left 之后 为 root 之后 为 right 则对左子树来说 left->right = root; root->left = left; 对右子 ...

  7. 1500. Prime Gap 11 月 11日

    /*本篇为转载,在此申明,具体就是先设定从2以后所有的数都为质数,定为质数的数的倍数则不是质数,慢慢排除后面的数*/ #include<iostream>#include<cstri ...

  8. 简单jquery实现select三级联动

    简单的jquery实现select三级联动 代码如下: <!DOCTYPE html> <html> <head> <meta charset="u ...

  9. 使用doxygen制作C代码文档

    使用doxygen制作C代码文档 C 代码注释风格约定 行间注释 /*! * * 这里是注释 * */ 行内注释 <code here> /*! 这里是注释 */ doxygen 风格的宏 ...

  10. IOS对.Net返回的Base64string解析问题

    1.c#生成Base64字符串的代码 string body = "{\"title\":\"上次CVR卡其\",\"url\": ...