蓝牙协议 基于TI cc2540 模块的理解(转)

源:蓝牙协议 基于TI cc2540 模块的理解

Bluetooth 4.0开发
Platform:TI IC:cc2540 Environment:windows 7 tools:IAR 8.20.2

demo Code:BLE_CC254x_1.4.0 from TI

物理层:是1Mbps自适应跳频GFSK射频,工作于免许可证的2.4GHz ISM(工业、科学与医疗)频段。
链路层:用于控制设备的辐射状态,设备将处于五种状态之一:等待、广告、扫描、初始化、连接。广播设备不需要建立连接 就可以发送数据,扫描设备接收广播设备发送的数据;发起连接的设备通过发送连接请求来回应广播设备,如果广播 设备接受连接请求,那么广播设备与发起连接的设备将会进入连接状态。发起练级的的设备称为主机,接受连接请求 的设备称为从机。
主机控制层:为主机和控制器之间提供标准通信接口,这一层,可以是软件或者硬件接口,如UART、SPI、USB等
逻辑链路控制及自适应协议层:为上层提供数据封装服务,允许逻辑上的点对点数据通信。
安全管理层:定义了配对和秘钥分配方式,并为协议栈其他层与另一个设备之间的安全连接和数据交换提供服务
属性协议层:允许设备向另外一个设备展示一块特定的数据,称之为“属性”,在ATT环境中,展示“属性”的设备称为服务器

与之配对的设备称为客户端,链路层状态(主机和从机)与设备的ATT角色是相互独立的。

例如:主机设备既可以是ATT服务器,也可以是ATT客户端;从机设备既可以是ATT服务器,也可以是ATT客户端。

个人理解:(主机和从机定义谁练接谁,服务器和客户端定义于谁给谁共享数据)!!!

如:手机A的蓝牙请求手机B的蓝牙连接,那么对于链路层来说:A是从机,B是主机,连接好以后,A在蓝牙上共享,一块特定数据(比如某个文件)给B,那么A就是ATT的服务器,B就是客户端。

通用属性配置层:定义了使用ATT的服务框架。GATT规定配置文件profile的结构,在BLE中,所有被profile或者服务用到的数据 块称为“特性”,两个建立连接的设备之间的所有数据通信都是通过GATT子程序处理。应用程序和profile直 接使用GATT层。

//========================分割线===========================

demo程序添加打印消息,我手中有两块板一块有OLED液晶屏显示,一块没有液晶屏,我使用了串口作为提示信息!
主机:下载SimpleBLECentral程序 ,使用液晶屏打印

从机:下载SimpleBLEPeripheral程序,使用串口打印
在SimpleBLECentral程序中添加自己的LCD程序,然后使用该液晶作为打印口

在SimpleBLEPeripheral程序添加串口打印程序,然后使用串口作为打印口
串口打印程序,要在工程中添加HAL_UART=TRUE宏定义

void uart_printNotline(char str[]){
char * pstr=str;
if(pstr == NULL) return;
HalUARTWrite(0,(unsigned char*)pstr,strlen(pstr));
 }
 void uart_printLine(char str[]){
char * pstr=str;
if(pstr == NULL) return;
HalUARTWrite(0,(unsigned char*)pstr,strlen(pstr));
HalUARTWrite(0,"\n",1);
 }

液晶屏的可根据自己具体的屏写响应的驱动。

本次使用的模块是:OLED LCD 128*64点阵液晶屏

OLED lcd打印信息

LCD_CLSLineAt8x16Pix(CLS_START_LINE1,CLS_LINE1);  //清楚指定的行

LCD_P8x16Str(0, WRITE_START_LINE1, "Read rsp:");  //在指定的行打印信息
实验效果,如期完成,串口 打印如下:
 BLE Peripheral
0x20CD399FCFCB

Initialized

Advertising

Connected

Char 1:   0

Char 1:   1

Char 1:   2

Char 1:   3

Char 1:   4

Char 1:   5

Char 1:   6

Char 1:   7

Char 1:   8

Disconnected

Advertising
主机使用按键连接 BLE Peripheral从机

BLE协议解析 参考《TI_BLE_Software_Developer‘s_Guide.pdf》

位于C:\Texas Instruments\BLE-CC254x-1.4.0\Documents 只要安装了TI的开发工具包就会有这个文件。
要点:

1、 The protocol stack consists of two sections: the controller and the host.  This separation of controller and host goes back to standard Bluetooth BR/EDR devices.

2、 Any profiles and applications that are being used sit on top of the GAP and GATT layers of the stack.

3、 PHY layer is a 1Mbps adaptive frequency-hopping GFSK, operating in the unlicensed 2.4 GHz ISM.

4、 The LL essentially controls the RF state of the device, LL层本质是控制设备的RF(射频)状态

状态有五个,分别是:

standby, advertising, scanning, initiating, or connected

代码中对应的枚举类型如下

/*
  * GAP Peripheral + Broadcaster Role States.
  */
 typedef enum
 {
   GAPROLE_INIT = 0,                         //!< Waiting to be started
   GAPROLE_STARTED,                          //!< Started but not advertising
   GAPROLE_ADVERTISING,                      //!< Currently Advertising
   GAPROLE_WAITING,                          //!< Device is started but not advertising, is in waiting period before advertising again
   GAPROLE_WAITING_AFTER_TIMEOUT,            //!< Device just timed out from a connection but is not yet advertising, is in waiting period before advertising again
   GAPROLE_CONNECTED,                        //!< In a connection
   GAPROLE_CONNECTED_ADV,                    //!< In a connection and advertising
   GAPROLE_ERROR                             //!< Error occurred - invalid state
 } gaprole_States_t;

Advertisers transmit data without being in a connection, while scanners listen for advertisers. An initiator is a device that is responding to an advertiser with a connection request. If the advertiser accepts, both the advertiser and initiator will enter a connected state. When a device is in a connection, it will be connected in one of two roles: master or slave. The device that initiated the connection becomes the master, and the device that accepted the request becomes the slave.

广告发送数据不需要连接,扫描设备监听广告。发起者是一个响应广告者连接请求的设备。如果广告者接受连接,那么广告者和发起者将进入连接状态。当设备处于连接状态时,它就会扮演着主机或从机的角色。发起连接的设备将作为主机,被连接的设备作为从机。

The HCI layer provides a means of communication between the host and controller via a standardized interface. This layer can be implemented either through a software API, or by a hardware interface such as UART, SPI, or USB.

CHI层给主机和控制之间通信提供标准化接口。这一层既可以有软件的API实现也可以由硬件接口例如:UART、SPI或USB来实现。
The L2CAP layer provides data encapsulation services to the upper layers, allowing for logical end-to-end communication of data.

L2CAP层给上层提供数据封装服务,允许逻辑的端对端数据通信。

The SM layer defines the methods for pairing and key distribution, and provides functions for the other layers of the stack to securely connect and exchange data with another device.
T

he GAP layer directly interfaces with the application and/or profiles, and handles device discovery and connection-related services for the device. In addition, GAP handles the initiation of security features.

The ATT protocol allows a device to expose certain pieces of data, known as “attributes”, to another device. In the context of ATT, the device exposing attributes is referred to as the “server”, and the peer device is referred to as the “client”. The LL state (master or slave) of the device is independent of the ATT role of the device. For example, a master device may either be an ATT server or an ATT client, and a slave device may also be either an ATT server or an ATT client. It is also possible for a device to be both an ATT server and an ATT client simultaneously.

GAP层直接地与应用程序、配置、设备查找和连接服务管理进行交互。一般的,GAP掌管安全特征的启动。 ATT协议允许设备公开一些数据片段,例如设备的“属性”。...。LL状态下的主机从机和ATT下服务和客户是独立的。一个主机设备既可以是ATT服务端,也可以是ATT客户端。同样的一个从机既可以是ATT服务端也可以是ATT客户端。也有两者都是!

使用说明:

The GATT layer is a service framework that defines the sub-procedures for using ATT. GATT specifies the structure of profiles. In BLE, all pieces of data that are being used by a profile or service are called “characteristics”. All data communications that occur between two devices in a BLE connection are handled through GATT sub-procedures. Therefore, the application and/or profiles will directly use GATT.

App或者配置都是直接使用GATT的!

查看demo程序,可以知道协议栈的开始启动的地方在:osal_start_system();、

查找和执行任务的函数:osal_run_system()
流程图如下:


OSAL的事件队列

OSAL 事件和回调映射

Central demo程序:

注意一下几个事件:

#define GAP_DEVICE_INIT_DONE_EVENT            0x00 //!< Sent when the Device Initialization is complete.  This event is sent as an OSAL message defined as gapDeviceInitDoneEvent_t.
 #define GAP_DEVICE_DISCOVERY_EVENT            0x01 //!< Sent when the Device Discovery Process is complete. This event is sent as an OSAL message defined as gapDevDiscEvent_t.
 #define GAP_ADV_DATA_UPDATE_DONE_EVENT        0x02 //!< Sent when the Advertising Data or SCAN_RSP Data has been updated. This event is sent as an OSAL message defined as gapAdvDataUpdateEvent_t.
 #define GAP_MAKE_DISCOVERABLE_DONE_EVENT      0x03 //!< Sent when the Make Discoverable Request is complete. This event is sent as an OSAL message defined as gapMakeDiscoverableRspEvent_t.
 #define GAP_END_DISCOVERABLE_DONE_EVENT       0x04 //!< Sent when the Advertising has ended. This event is sent as an OSAL message defined as gapEndDiscoverableRspEvent_t.
 #define GAP_LINK_ESTABLISHED_EVENT            0x05 //!< Sent when the Establish Link Request is complete. This event is sent as an OSAL message defined as gapEstLinkReqEvent_t.
 #define GAP_LINK_TERMINATED_EVENT             0x06 //!< Sent when a connection was terminated. This event is sent as an OSAL message defined as gapTerminateLinkEvent_t.
 #define GAP_LINK_PARAM_UPDATE_EVENT           0x07 //!< Sent when an Update Parameters Event is received. This event is sent as an OSAL message defined as gapLinkUpdateEvent_t.
 #define GAP_RANDOM_ADDR_CHANGED_EVENT         0x08 //!< Sent when a random address was changed. This event is sent as an OSAL message defined as gapRandomAddrEvent_t.
 #define GAP_SIGNATURE_UPDATED_EVENT           0x09 //!< Sent when the device‘s signature counter is updated. This event is sent as an OSAL message defined as gapSignUpdateEvent_t.
 #define GAP_AUTHENTICATION_COMPLETE_EVENT     0x0A //!< Sent when the Authentication (pairing) process is complete. This event is sent as an OSAL message defined as gapAuthCompleteEvent_t.
 #define GAP_PASSKEY_NEEDED_EVENT              0x0B //!< Sent when a Passkey is needed.  This is part of the pairing process. This event is sent as an OSAL message defined as gapPasskeyNeededEvent_t.
 #define GAP_SLAVE_REQUESTED_SECURITY_EVENT    0x0C //!< Sent when a Slave Security Request is received. This event is sent as an OSAL message defined as gapSlaveSecurityReqEvent_t.
 #define GAP_DEVICE_INFO_EVENT                 0x0D //!< Sent during the Device Discovery Process when a device is discovered. This event is sent as an OSAL message defined as gapDeviceInfoEvent_t.
 #define GAP_BOND_COMPLETE_EVENT               0x0E //!< Sent when the bonding(bound) process is complete. This event is sent as an OSAL message defined as gapBondCompleteEvent_t.
 #define GAP_PAIRING_REQ_EVENT                 0x0F //!< Sent when an unexpected Pairing Request is received. This event is sent as an OSAL message defined as gapPairingReqEvent_t.

GAPP配置

GAPP层总是作为下面四中角色中的一种:

1、广播者(Broadcaster)——不能连接广告设备

2、观测者(Observer)——扫描广播,但不能启动连接

3、外设(Peripheral)——可连接的广告设备,在单链路层连接作为从机操作

4、集中器(Central)——扫描广告和启动连接,在单链路和多链路层连接作为主机操作。目前,BLE集中器协议栈支持连接三个设备。

在一个典型的低功耗蓝牙系统中,外设广告特定的数据来让集中器设备知道它是可以被连接的设备。广告的内容包括:设备的地址,和一些附加的数据,如设备名字。集中器收到广告数据后,向外设发送("scan request")扫描请求。外设会响应一个(“scan response”)扫描回应。这个过程称为设备发现。 通过这个过程,集中器已经识别了外设,并且知道这个外设和它自己可以形成一个连接。然后集中器可以发送一个建立连接的请求给外设。一个连接请求应该包括一些连接的参数,

如下所示:

1.Connection Interval(GAPROLE_MIN_CONN_INTERVAL && GAPROLE_MAX_CONN_INTERVAL)- 连接间隔,在BLE的两个设备的连接中使用跳频机制。两个设备使用特定的信道发送和接收数据, 然后过一段时间后再使用新的信道(BLE协议栈的链路层处理信道的切换)。两个设备在切换信道后发送和接收数据称为一个连接事件。尽管没有应用数据被发送和接收,两个设备仍旧会交换链路层数据来维持连接。这个连接间隔就是这个两个连接事件的之间的时间间隔。间隔以1.25ms为单元,连接间隔的范围的6-3200既7.5ms-4s(4000ms)之间。 不用的应用程序可以要求不同的连接间隔, 拥有长的连接间隔的优点是降低功耗,因为设备在连接事件之间有较长时间的休眠。缺点是设备有数据发送的时候,就必须等到下一个连接事件才可以发送出去。 短时间的连接间隔优点是两设备连接频繁,会有较多的功耗。

2.Slave Latency(GAPROLE_SLAVE_LATENCY)从机延时——这个参数给从机(外设)跳过若干个连接事件的选项。给外设一些灵活度,如果外设没有任何数据发送,就可以选额跳过连接事件 和保持休眠。因此提供了一些功耗的节省。 从机延时值表示跳过最大的连接事件值。范围是0到499,0:不跳过任何连接事件,然而最大值必须不能影响连接间隔大于16.0s。

3.Supervision Timerout(GAPROLE_TIMEOUT_MULTIPLIER)超时管理——这个事两个成功连接事件之间的最大允许间隔。如果超过了这个事件而没有连接成功的连接事件,设备认为连接已经丢失。设备就会返回一个未连接的状态。这个参数值的单位是10ms,管理超时值的范围是10-3200即(100ms - 32s)。一般超时值必须大于有效连接间隔,如下所示:

Effective Connection Interval = (Connection Interval) * ( 1 + (Slave Latency) )

有效连接间隔 = 连接间隔 *(1 + 从机延时)

这些连接设置都可以通过请求集中器修改的,外设只需要向集中器发送“连接参数更新请求”来改变连接设置。这个请求由协议栈的L2ACP层处理。这个请求包括4个参数:连接最小间隔 (GAPROLE_MIN_CONN_INTERVAL)、连接最大间隔(GAPROLE_MAX_CONN_INTERVAL)、从机延时(GAPROLE_SLAVE_LATENCY)、超时(GAPROLE_TIMEOUT_MULTIPLIER)。这些值代表外设所要求的连接参数。接到请求后,集中器可以接受或者拒绝这些新的参数。

连接可以被主机或从机一方以任何原因终止,当一方发起终止连接时,另一方必须响应。 GAP层也处理BLE连接中安全特征初始化,只有在已认证的连接中,特定的数据才能被读写。一旦建立两个设备进行配对,当配对完成以后,形成加密连接的秘钥。在典型的应用中,外设请求集中器提供秘钥来完成配对工作,秘钥可以是一个固定值,也可以是随机生成一个数据提供给使用者,当集中器设备发送正确的秘钥后,两个设备交换安全秘钥并加密认证链接。

GAP 配置参数说明:

3.4.1 GAP Peripheral Role Profile The peripheral role profile provides the means for the keyfob to advertise, connect with a central device (though the initiation of the connection must come from the  central device), and request a specific set of connection parameters from a master device. The primary API function prototypes for the peripheral role profile can be found in the file peripheral.h. The API provides functions to get and set certain GAP 
profile parameters: GAPRole_GetParameter and GAPRole_SetParameter, respectively. Here are a few GAP role parameters of interest: ? GAPROLE_ADVERT_ENABLED – This parameter enables or disables advertisements. The default value for this parameter is TRUE. ? GAPROLE_ADVERT_DATA – This is a string containing the data to appear in the advertisement packets. By setting this value to { 0x02, 0x01, 0x05 }, the device will 
use limited discoverable mode when advertising. More information on advertisement data types and definitions can be found in [7]. ? GAPROLE_SCAN_RSP_DATA – This is a string containing the name of the device that will appear in scan response data. If an observer or central device is scanning and 
sends a scan request to the peripheral device, the peripheral will respond back with a scan response containing this string. ? GAPROLE_ADVERT_OFF_TIME – This parameter is used when the device is put into limited discoverable mode. It sets how long the device should wait before becoming 
discoverable again at the end of the limited discovery period. By setting this value to 0, the device will not become discoverable again until the 
GAPROLE_ADVERT_ENABLED is set back to TRUE. ? GAPROLE_PARAM_UPDATE_ENABLE – This enables automatic connection parameter update requests. The profile default value is FALSE. ? GAPROLE_MIN_CONN_INTERVAL – This parameter is the minimum desired connection interval value. The default value is 80, corresponding to 100ms. ? GAPROLE_MAX_CONN_INTERVAL – This parameter is the maximum desired connection interval value. The default value is 3200, corresponding to 4.0s. ? GAPROLE_SLAVE_LATENCY – This parameter is the desired slave latency. The default value is 0. ? GAPROLE_TIMEOUT_MULTIPLIER – This parameter is the desired connection supervision timeout. The default value is 1000 (corresponding to 10.0s)

时间: 2024-10-19 20:22:57

蓝牙协议 基于TI cc2540 模块的理解(转)的相关文章

Ti CC2540蓝牙模块学习笔记整理

接触CC2540几天,终于有了初步的理解,现将笔记整理如下,只是皮毛,如有错误,还请指正,还有好多没闹明白的地方,以后应该还会继续向里面更新~ 一.整体 1.TI的蓝牙平台支持2种协议栈/应用配置:单一设备配置.网络处理器配置 2.协议栈最顶层2个通用profile: GAP 通用访问配置文件层 Generic Access Profile GATT 通用属性配置文件层 Generic Attribute Profile 3. GAP:处理设备的接入方式及接入过程:①设备发现 ②链路建立 ③链路

蓝牙协议分析(7)_BLE连接有关的技术分析

转自:http://www.wowotech.net/bluetooth/ble_connection.html#comments 1. 前言 了解蓝牙的人都知道,在经典蓝牙中,保持连接(Connection)是一个相当消耗资源(power和带宽)的过程.特别是当没有数据传输的时候,所消耗的资源完全被浪费了.因而,对很多蓝牙设备来说(特别是功耗敏感的设备),希望在无数可传的时候,能够断开连接.但是,由于跳频(hopping)以及物理通道(Physical Channel)划分的缘故,经典蓝牙连接

Protocol buffer序列化及其在微信蓝牙协议中的应用

Protocol buffer是Google出品的一种轻便高效的结构化数据存储格式,可对结构化数据进行序列化,并具有语言无关.平台无关等特点,在通信协议和数据存储等领域已经得到广泛的应用.目前其已经提供 C/C++.Java.Python 等语言的 API. 一.Protocol buffer和XML 在数据通信传输时,一般需要将结构化的数据序列化成流进行传送,接收方再反序列化为原始格式数据进行处理.在Web通信领域,XML应用算是最通用的了.在时间性能上,虽然XML的序列化开销还可以,但是反序

基于TI Davinci架构的多核/双核开发高速扫盲(以OMAP L138为例),dm8168多核开发參考以及达芬奇系列资料user guide整理

基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门 原文转自http://blog.csdn.net/wangpengqi/article/details/8115614 感谢wangpengqi的共享. 一.简单介绍 TI的达芬奇架构嵌入式应用处理器使用DSP与ARM结合的非对称多核结构,当然如今也有管脚全兼容的单核.本文要介绍的就是当中的一款低功耗处理器OMAP L138. OMAP L138包含一个主频300M的ARM9处理器内核和一个300M的C6748DSP内核

Zigbee通讯之开发篇(基于TI 的Z-Stack)

1.Zigbee协议和Z-Stack   Zigbee协议和Z-Stack是什么关系?这可能是初学Zigbee同学想知道的问题.给大家举个例子吧,我们生活中使用的插排是要符合一定的标准的,现在国家标准是GB2099.3-2008,里面规定了好多插排的电气.机械等要求.不同厂家生产的插排,要在中国国内销售的话,必须符合这个标准.但是生产这个插排的厂家多了去了,像 公牛.philips等等(排除做广告的嫌疑).其实Zigbee协议栈规范和Z-Stack的关系也差不多,Z-Stack就是符合Zigbe

【转】蓝牙协议分析(1)_基本概念

原文网址:http://www.wowotech.net/bluetooth/bt_overview.html 1. 前言 自1994年由爱立信推出至今,蓝牙技术已经走过了20个岁月.从最初的Bluetooth V1.0,到Bluetooth V4.0(最新的为V4.1,2013年底发布),经历了近9个版本的修订后,发展为当前的状况. 说实话,如今的蓝牙4.1,简直是一个大杂烩:BR/EDR沿用旧的蓝牙规范:LE抄袭802.15.4:AMP直接使用802.11.而这一切的目的,就是以兼容性和易用

《蓝牙协议及其实现》 - 蓝牙协议体系结构

蓝牙协议体系结构 整个蓝牙协议体系结构可分为底层硬件模块.中间协议层和高端应用层三大部分. 链路管理层(LMP,Link Management Protocol).基带层(BB)和射频(RF)构成蓝牙的底层模块.RF通过2.4GHz无需授权的ISM频段,实现数据位流的过滤和传输,它主要定义了蓝牙收发器应该满足的要求.BB层负责跳频和蓝牙数据及信息帧的传输.LM层负责连接的建立和拆除以及链路的安全和控制,它们为上层软件模块提供了不同的访问入口,但是两个模块接口之间的消息和数据传递必须通过蓝牙主机控

蓝牙协议(bluetooth spec)

1.概述:   蓝牙协议规范遵循开放系统互连参考模型(OSI/RM),从低到高地定义了蓝牙协议堆栈的各个层次. SIG(Session Initiation Protocol)所定义的蓝牙技术规范的目的是使符合该规范的各种应用之间能够实现互操作. 互操作的远端设备需要使用相同的协议栈,不同的应用需要不同的协议栈. 但是,所有的应用都要使用蓝牙技术规范中的数据链路层和物理层. 2.完整的蓝牙协议栈 完整的蓝牙协议栈如图1所示,不是任何应用都必须使用全部协议,而是可以只使用其中的一列或多列. 图1显

基于TI Davinci架构的多核/双核开发快速扫盲(以OMAP L138为例),dm8168多核开发参考以及达芬奇系列资料user guide整理

基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门 原文转自http://blog.csdn.net/wangpengqi/article/details/8115614 感谢wangpengqi的共享. 一.简介 TI的达芬奇架构嵌入式应用处理器使用DSP与ARM结合的非对称多核结构,当然现在也有管脚全兼容的单核.本文要介绍的就是其中的一款低功耗处理器OMAP L138. OMAP L138包括一个主频300M的ARM9处理器内核和一个300M的C6748DSP内核(均