Channel
Preamble
Access
Address
PDU
Header
1byte
1byte
4bytes
2bytes
PDU
Payload
Variable
(0-37bytes)
CRC
RSSI
(dBm)
FCS
3bytes 负值
Ok
PDU type
Res
TXAdd
RXAdd
4bits
2bits
1bit
1bit
PDU
length
6bits
Res
2bits
AdvA
6bytes
AdvData
最大 31bytes
PDU type
0000
0001
0010
0110
Packet name
ADV_IND
ADV_DIRECT_IND
ADV_NONCONN_IND
ADV_SCAN_IND
PDU type
0011
0100
0101
Other
Packet name
SCAN_REQ
SCAN_RSP
CONNECT_REQ
Reserved
1)Channel:packetsniffer 设置的广播频道。一共有三个(37,38,39),如 0x25
代表 37 频道。
2)Preamble:前导码,广播接收端可以用来进行同步和自动增益控制(AGC)。
在广播帧中 Preamble 固定为“01010101”。
3)Access Address:地址,在广播帧中 Access Address 固定为 0x8E89BED6。对
于其它数据信道,地址部分由不同的连接决定。
4)PDU Header: 用来表示不同类型的帧。
A)以 ADV_开头的帧表示该帧是广播(advertising)帧,是由 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 的大小。
5) PDU Payload 为广播的实际载荷。
AdvA:蓝牙的 MAC 地址,48 位的 IEEE 地址。(如 0x78C5E56EACD2)。
AdvData:从设备广播数据。
6)CRC:位整个广播帧的 24bitCRC 值。
7) FCS:接收报文时都会有 FCS 校验,如果 FCS 错误,该报文会被丢弃,这个
在收包时就会判断,上层不用考虑。
生成 AdvData 数据的函数:
static uint8 advertData[] =
{
0x02,
GAP_ADTYPE_FLAGS,
DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED, // 第 一 段
数据的主体,设置默认的广播格式,并且不支持 BR/EDR 模式,CC2540 是 ble 单模芯片,是
不支持 BR/EDR 的。
// 表示接下来这一段数据的长度(不包括 0x02 本身)
//表示这段数据的类型或者用途(有哪些种类)
// service UUID, to notify central devices what services are included
// in this peripheral
0x03,
GAP_ADTYPE_16BIT_MORE,
LO_UINT16( SIMPLEPROFILE_SERV_UUID ),
HI_UINT16( SIMPLEPROFILE_SERV_UUID ),
//Server 的 UUID
//表示接下来这一段数据的长度(不包括 0x03 本身)
// 广播时所展示的 Server 的 UUID
};
#define GAP_ADTYPE_ADV_IND 0x00 //可连接、未指定
#define GAP_ADTYPE_ADV_HDC_DIRECT_IND 0x01 //可连接、高占空比、指定
#define GAP_ADTYPE_ADV_SCAN_IND 0x02 //!< Scannable undirected
advertisement
#define GAP_ADTYPE_ADV_NONCONN_IND 0x03 //!< Non-Connectable undirected
advertisement
#define GAP_ADTYPE_ADV_LDC_DIRECT_IND//
uint8 advType = GAP_ADTYPE_ADV_SCAN_IND;
GAPRole_SetParameter( GAPROLE_ADV_EVENT_TYPE, sizeof( uint8 ),
&advType );
协议栈有个工程专门发送广播包的,可参考:
C:\Texas
Instruments\BLE-CC254x-1.4.0\Projects\ble\SimpleBLEBroadcaster