原创 【博客大赛】TI CC2541 BLE协议栈之Broadcaster

2015-9-21 16:02 2687 20 20 分类: MCU/ 嵌入式 文集: CC254x蓝牙BLE4.0协议栈学习笔记

蓝牙BLE4.0协议的GAP层规定了BLE4.0的四种角色——广播者(Broadcaster)、观测者(Observer)、主机(Central)和外设(Peripheral)。TI CC2541的协议栈(v1.4.0)里有个例程SimpleBLEBroadcaster,是用来实现一个蓝牙广播者。苹果比较火的iBeacons就是一个广播者。

广播者就是只通过广播的形式发送信息,不与其他蓝牙设备配对、连接。信息的内容可以是位置信息,可以是温湿度或其他自定义的信息。

广播事件分为四种类型:

a connectable undirected event——可连接非定向类型

a connectable directed event——可连接定向类型

a non-connectable undirected event——不可连接非定向类型

a scannable undirected event——可扫描非定向类型

CC2541协议栈中是如此定义的:

/** @defgroup GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES GAP Advertising Report Event Types

 * for eventType field in gapDevRec_t and gapDeviceInfoEvent_t

 * @{

 */

#define GAP_ADRPT_ADV_IND             0x00 //!< Connectable undirected advertisement

#define GAP_ADRPT_ADV_DIRECT_IND      0x01 //!< Connectable directed advertisement

#define GAP_ADRPT_ADV_SCAN_IND       0x02 //!< Scannable undirected advertisement

#define GAP_ADRPT_ADV_NONCONN_IND   0x03//!< Non-Connectable undirected advertisement

#define GAP_ADRPT_SCAN_RSP            0x04//!< Scan Response

当然它还定义了扫描的响应事件(Scan response)。

上述四种类型的区别在:

20150921154423489001.jpg

主要是针对主机或者说其他设备的扫描和连接请求的回应不同。

蓝牙BLE4.0规范的Vol.6 Part B Section 4.4.2.3~4.4.2.6对上述四种广播类型有详细的表述,这里只来研究GAP_ADRPT_ADV_SCAN_IND类型,因为CC2541SimpleBLEBroacaster例程是定义成的可扫描类型。如上图所示,只响应扫描请求不响应连接请求。

广播相关的参数有:

1Advertising Interval广播间隔(Advertising_Interval_Min& Advertising_Interval_Max

所有非定向广播,两个广播事件的广播间隔(T_advEvent)为:

T_advEvent = advInterval + advDelay

advInterval必须是0.625ms的整数倍,且20msadvInterval10.24s,对于可扫描非定向广播类型和不可连接非定向广播类型,advInterval要大于等于100ms1600.625ms);对于可连接非定向广播类型,该值最小可以到20ms.

20150921154434619002.jpg

而式中的advDelay值是一个0~10ms之间的伪随机数。

Advertising_Interval_Min& Advertising_Interval_Max两个参数用来调整广播间隔Advertising Interval,通常分别设置上下限,也可以设置为同一个值,值应为0.625ms的倍数。在CC2541的协议栈中是设置为了同一值。

#define DEFAULT_ADVERTISING_INTERVAL          160

uint16 advInt = DEFAULT_ADVERTISING_INTERVAL;

GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, advInt );

GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, advInt );

GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MIN, advInt );

GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MAX, advInt );

2Advertising_Type广播类型

就是前面所讲的四种广播类型,不再赘述。

3Own_Address_Type自身地址类型

指的是广播者本身的地址类型。

20150921154440334003.jpg

0表示使用公共设备地址,就是在IEEE注册的地址,即全球唯一的MAC1表示使用随机地址。默认状态下是0,即公共地址。

另外,还有Direct_Address_TypeDirect_Address等参数,情况跟Own_Address_Type类似。

4Advertising_Channel_Map广播信道设置

20150921154446559004.jpg

广播信道在信道37~39中选择。

5Advertising_Filter_Policy广播过滤策略

主要是针对扫描的请求的。

20150921154452517005.jpg

6 Advertising DataScan Reponse Data广播数据和扫描应答数据

这两种数据包的结构是一样的。

20150921154511668006.jpg

都是最长31个字节。不同的是,广播数据是在广播的时候主动发送的数据;扫描应答数据是在收到扫描请求的时候响应的数据。

这两个参数在例程中的设置如下:

static uint8 scanRspData[] =

{// complete name

0x15,   // length of this data

GAP_ADTYPE_LOCAL_NAME_COMPLETE,

0x53,   // 'S'

0x69,   // 'i'

0x6d,   // 'm'

0x70,   // 'p'

0x6c,   // 'l'

0x65,   // 'e'

0x42,   // 'B'

0x4c,   // 'L'

0x45,   // 'E'

0x42,   // 'B'

0x72,   // 'r'

0x6f,   // 'o'

0x61,   // 'a'

0x64,   // 'd'

0x63,   // 'c'

0x61,   // 'a'

0x73,   // 's'

0x74,   // 't'

0x65,   // 'e'

0x72,   // 'r'

  // Tx power level

  0x02,   // length of this data

  GAP_ADTYPE_POWER_LEVEL,

  0       // 0dBm 

};

 

static uint8 advertData[] =

{

  // Flags; this sets the device to use limited discoverable

  // mode (advertises for 30 seconds at a time) instead of general

  // discoverable mode (advertises indefinitely)

  0x02,   // length of this data

  GAP_ADTYPE_FLAGS,

  GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,

 

  // three-byte broadcast of the data "1 2 3"

  0x04,   // length of this data including the data type byte

  GAP_ADTYPE_MANUFACTURER_SPECIFIC,      // manufacturer specific advertisement data type

  1,

  2,

  3

};

scanRspData[]数组的最后面有一个发射功率设置的参数,这里设置为0dbm. Hci.h文件中声明了这样的函数接口

extern hciStatus_t HCI_EXT_SetTxPowerCmd( uint8 txPower );

对发射功率的设置,有4个等级:

LL_EXT_TX_POWER_MINUS_23_DBM,LL_EXT_TX_POWER_MINUS_6_DBM,LL_EXT_TX_POWER_0_DBM,LL_EXT_TX_POWER_4_DBM

分别是4dbm0dbm-6dbm-23dbm,如果要修改,可以调用这个HCI函数来设置。

上述参数在CC2541SimpleBLEBroadcaster例程里面是这样设置的:

uint8 advType = GAP_ADTYPE_ADV_SCAN_IND; // use scannable unidirected advertisements

GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );

GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );   

GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );

GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );

GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ), &advType );

这个SimpleBLEBroadcaster例程在DeviceMonitor中竟然扫描不到其MAC,目前原因未知,可能跟DeviceMonitor软件有关。

20150921154518880007.jpg

通过Sniffer抓包,可以抓到:

20150921154525905008.jpg

 

文章评论0条评论)

登录后参与讨论
我要评论
0
20
关闭 站长推荐上一条 /2 下一条