[蓝牙] 2、蓝牙BLE协议及架构浅析&&基于广播超时待机说广播事件

第一章 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

http://blog.csdn.net/lr2131/article/details/42106169?t=1434597809616

九、广播

9.1、由一个广播超时系统休眠看广播事件

:自动休眠的时间是在广播中的 m_adv_params.timeout     = APP_ADV_TIMEOUT_IN_SECONDS;设置的!

注:下面代码来自X-CASE第一版部分测试代码

 1 /**@brief Function for initializing the Advertising functionality.
 2  *
 3  * @details Encodes the required advertising data and passes it to the stack.
 4  *          Also builds a structure to be passed to the stack when starting advertising.
 5  */
 6 static void advertising_init(void)
 7 {
 8     uint32_t      err_code;
 9     ble_advdata_t advdata;
10     uint8_t       flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
11
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
18
19     // Build and set advertising data
20     memset(&advdata, 0, sizeof(advdata));
21
22     advdata.name_type               = BLE_ADVDATA_FULL_NAME;
23     advdata.include_appearance      = true;
24     advdata.flags.size              = sizeof(flags);
25     advdata.flags.p_data            = &flags;
26     advdata.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[0]);
27     advdata.uuids_complete.p_uuids  = adv_uuids;
28
29     err_code = ble_advdata_set(&advdata, NULL);
30     APP_ERROR_CHECK(err_code);
31
32     // Initialize advertising parameters (used when starting advertising)
33     memset(&m_adv_params, 0, sizeof(m_adv_params));
34
35     m_adv_params.type        = BLE_GAP_ADV_TYPE_ADV_IND;
36     m_adv_params.p_peer_addr = NULL;                           // Undirected advertisement
37     m_adv_params.fp          = BLE_GAP_ADV_FP_ANY;
38     m_adv_params.interval    = APP_ADV_INTERVAL;
39     m_adv_params.timeout     = APP_ADV_TIMEOUT_IN_SECONDS;
40 }

:广播事件中断在下面code中

:加重显示部分则是上面39行广播时间timeout事件到了,在其中做系统休眠处理~

 1 /*****************************************************************************
 2 * Static Event Handling Functions
 3 *****************************************************************************/
 4
 5 /**@brief Function for handling the Application‘s BLE Stack events.
 6  *
 7  * @param[in]   p_ble_evt   Bluetooth stack event.
 8  */
 9 static void on_ble_evt(ble_evt_t *p_ble_evt)
10 {
11     uint32_t        err_code;
12     static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID;
13
14     switch (p_ble_evt->header.evt_id)
15     {
16     case BLE_GAP_EVT_CONNECTED:
17         led_stop();
18
19         m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
20
21         // Initialize the current heart rate to the average of max and min values. So that
22         // everytime a new connection is made, the heart rate starts from the same value.
23         // m_cur_heart_rate = 0;//(MAX_HEART_RATE + MIN_HEART_RATE) / 2;
24         // Start timers used to generate battery and HR measurements.
25         application_timers_start();
26
27         // Start handling button presses
28         err_code = app_button_enable();
29         APP_ERROR_CHECK(err_code);
30         break;
31
32     case BLE_GAP_EVT_DISCONNECTED:
33         // Since we are not in a connection and have not started advertising, store bonds
34         err_code = ble_bondmngr_bonded_centrals_store();
35         APP_ERROR_CHECK(err_code);
36
37         // @note Flash access may not be complete on return of this API. System attributes are now
38         // stored to flash when they are updated to ensure flash access on disconnect does not
39         // result in system powering off before data was successfully written.
40
41         // Go to system-off mode, should not return from this function, wakeup will trigger
42         // a reset.
43         //system_off_mode_enter();
44         app_button_disable();
45         DispColor(BLACK);
46         //re-enter advertising model if disconnected
47
48         advertising_init();
49         // Start advertising
50         advertising_start();
51         break;
52
53     case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
54         err_code = sd_ble_gap_sec_params_reply(m_conn_handle,
55                                                BLE_GAP_SEC_STATUS_SUCCESS,
56                                                &m_sec_params);
57         APP_ERROR_CHECK(err_code);
58         break;
59
60     case BLE_GAP_EVT_TIMEOUT:
61         if (p_ble_evt->evt.gap_evt.params.timeout.src == BLE_GAP_TIMEOUT_SRC_ADVERTISEMENT)
62         {
63             led_stop();
64
65             nrf_gpio_cfg_sense_input(SENSOR_BUTTON_PIN_RIGHT,
66                                      BUTTON_PULL,
67                                      NRF_GPIO_PIN_SENSE_LOW);
68
69             nrf_gpio_cfg_sense_input(SENSOR_BUTTON_PIN_LEFT,
70                                      BUTTON_PULL,
71                                      NRF_GPIO_PIN_SENSE_LOW);
72 #if defined(ENABLE_UP)
73             nrf_gpio_cfg_sense_input(SENSOR_BUTTON_PIN_UP,
74                                      BUTTON_PULL,
75                                      NRF_GPIO_PIN_SENSE_LOW);
76
77
78             nrf_gpio_cfg_sense_input(SENSOR_BUTTON_PIN_DOWN,
79                                      BUTTON_PULL,
80                                      NRF_GPIO_PIN_SENSE_LOW);
81 #endif
82
83             system_off_mode_enter();
84         }
85         break;
86
87     default:
88         // No implementation needed.
89         break;
90     }
91 }

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

@beautifulzzzz 2015-12-11 continue~

时间: 2024-07-29 00:33:36

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

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

段时间,公司项目用到了手机APP和蓝牙设备的通讯开发,这里也正好对低功耗蓝牙(蓝牙4.0及以后标准)的开发,做一个总结. 蓝牙技术联盟在2010年6月30号公布了蓝牙4.0标准,4.0标准在蓝牙3.0+HS标准的基础上增加了对低功耗蓝牙(BLE)的支持.相比原有的普通蓝牙和高速蓝牙,BLE最大的特点就是低功耗,低延时,快速的搜索和连接速度,但数据传输速度相比传统蓝牙低.接下去将从BLE的概念以及代码两个方面介绍Android下的BLE. 先来说说基本概念: 1.BLE相关概念 1.1 GATT.

蓝牙4.0 BLE入门

在BLE协议中有两个角色,一个是周边(Periphery),另外一个是中央(Central).一个中央可以同时连接多个周边,但一个周边某一时刻只能连接一个中央.但是不管periphery还是central都是可以实现GATT server和GATT client去传输数据,但是无法同时都是. 先来讲一下相关术语和概念: GATT:Generic Attribute Profile,GATT配置文件是一个通用的规范,用于在BLE链路上发送和接收被称为"属性"的数据块.目前所有的BLE应用

iOS开发 之 可穿戴设备 蓝牙4.0 BLE 开发

1 前言 当前有越来越多的可穿戴设备使用了蓝牙4.0 BLE(Bluetooth Low Energy).对于iOS开发而言,Apple之前专门推出CoreBluetooth的Framework来支持BLE的开发.对于硬件开发有了解的朋友应该知道,在之前使用低版本的蓝牙的设备,要连接到iOS设备上,需要注册MFI,拥有MFI协议才能进行相应的开发.如果大家关注我之前对LEGO EV3的研究,就可以发现,EV3是使用了蓝牙2.1,因此需要MFI协议来进行开发. 本文将一步一步讲解如何使用CoreB

Android 蓝牙4.0 BLE 理解

本文简单结合两篇文章 http://blog.csdn.net/hellogv/article/details/24267685 http://blog.csdn.net/jimoduwu/article/details/21604215 在BLE协议中,有两个角色,周边(Periphery)和中央(Central),一个中央可以同时连接多个周边,但是一个周边某一时刻只能连接一个中央.但是不管是Periphery还是Central都是可以实现 GATT server 和 GATT client去

蓝牙4.0 BLE

读了N多文档,其中推荐的有: Webee的<蓝牙4.0是战演练> Ghostyu的 <BLE权威教程> 1:透穿实现: 利用TI的BLE包里的工程直接烧 上位设备用 central,下位设备用peripheral工程 做以下处理: central 的NPI初始化时添加uart CB,并在串口回调函数中 直接添加write char函数写进特征值(实现上位从串口接收并通过蓝牙发送), 使能特征值通知,并在通知处理事件中将数据从串口发送(实现上位的从蓝牙接受并从串口发送) periph

Android项目实战(三十四):蓝牙4.0 BLE 多设备连接

原文:Android项目实战(三十四):蓝牙4.0 BLE 多设备连接 最近项目有个需求,手机设备连接多个蓝牙4.0 设备 并获取这些设备的数据. 查询了很多资料终于实现,现进行总结. -------------------------------------------------------------------------------------------------------------------------------------------------------------

解密:Ble低功耗蓝牙和蓝牙mesh网络之间的关系

如今蓝牙mesh组网从推出到现在近一年时间了,蓝牙mesh组网的优势让众多方案商趋之若鹜.今天来普及下Ble低功耗蓝牙和蓝牙mesh网络之间的关系! 一.低功耗蓝牙和蓝牙mesh的关系: 蓝牙mesh并非无线通信技术,而是一种网络技术.蓝牙mesh网络依赖于低功耗蓝牙.低功耗蓝牙技术是蓝牙mesh使用的无线通信协议栈. 低功耗蓝牙设备可以设置成广播模式,以无连接方式进行工作,其广播的数据,位于广播范围内的任何其他蓝牙主机设备都可接收.这是"一对多"(1:N)的拓扑,其中N可以是一个非常

Bluetooth Low Energy(低功耗蓝牙)-For蓝牙4.x

此文翻译至Android API里的Bluetooth Low Energy,希望对大家有所帮助.谢谢. Android4.3(API版本18)介绍了内置平台支持BLE的中心角色,并且提供了相关API,高大尚的程序员们可以使用这些API来扫描设备.查询服务(指服务端进程).读写特性值(指特定的字符).与经典蓝牙不同的是,BLE的设计是为了提供显著的低功耗支持.这使得Android应用可以仅需很低的功耗与BLE设备进行通信,心跳频率(不是人的心跳,是指发送心跳包检测设备是否还在),监听适配设备等等

BLE——协议层次结构

未完待续…… BLE协议 Bluetooth Application Applications GATT-Based Profiles/Services Bluetooth Core (Stack) BLE Host ATT.GATT.SM GAP L2CAP HCI(对蓝牙协议无影响) BLE Controller Link Layer Physical Layer 1  Bluetooth Core(Stack) 蓝牙核心协议,关注蓝牙核心技术的描述和规范,只提供基础的机制. 蓝牙核心协议由