使用wireshark软件抓取广播数据包,完整数据如下:
0000 13 2e 00 02 2b bc 06 0a 01 26 13 00 00 48 02 00 ....+....&...H..
0010 00 d6 be 89 8e 20 1b ad 1b 2b 27 d1 28 02 01 06 ..... ...+'.(...
0020 11 16 95 fe 30 54 8c 16 01 ad 1b 2b 27 d1 28 28 ....0T.....+'.((
0030 01 00 ca 45 57 ...EW
这里边包含有一些软件自添加的字段,不做分析。单独提取出MiBeacon的数据
0000 d6 be 89 8e 20 1b ad 1b 2b 27 d1 28 02 01 06 11
0010 16 95 fe 30 54 8c 16 01 ad 1b 2b 27 d1 28 28 01
0020 00 ca 45 57
拆分分析:
d6 be 89 8e,转换大小端后为0x8e89bed6。access address 通道地址,所有蓝牙广播帧都使用这个地址。
20 1b,Packet Header部分。详细如下图。
20 1b,拆分2进制为0010 0000 0001 1011 对应上图转换为0000 0100 1101 1000 。
PDU type 4bit
ADV_开头的帧表示为广播帧,是由advertiser(蓝牙外设)发出。
ADV_IND:通用的可建立链接的广播。
ADV_DIRECT_IND:快速连接的广播。广播最长发射时间未1.28s
ADV_NONCONN_IND:不能建立链接的广播信号。
ADV_SCAN_IND:扫描帧,由scanner(手机,平板,PC)发出
ADV_SCAN_REQ:扫描请求帧,是由scanner发出的。只在scanner想从avertiser获取更多的广播数据的时候才由scanner发出。相应的,当ADV_SCAN_REQ被发出以后,advertiser会以SCAN_RSP作为回应。
SCAN_RSP为ADV_SCAN_REQ的响应。
CONNECT_REQ:连接请求。scanner向advertiser发出。
MiBeacon使用的是:通用的课件里连接的广播。
TxAdd,RxAdd。用来表示发送改广播帧的蓝牙设备的蓝牙地址类型。1表示random address ,0表示public address。
蓝牙协议规定,任何一个蓝牙设备必须拥有一个唯一的48bit的地址,用以识别标识身份。而且,在广播的时候必须要把蓝牙地址广播出去。
public address是公司通过IEEE申请获得的成为OUI(Organizationally unique identifier)这个地址是固定的地址,全球唯一,不可修改。
LSB用来表示公司名,MSB用来分配给不同的产品。
random address是设备在上电时随机生成或者是芯片厂家在生产芯片的时候随机烧录的不重复的48Bit的蓝牙地址。
小米使用的是public address。
总结一下,packet header字段中的意思是,该广播是通用可连接广播,TxAddr是public,长度为27。
ad 1b 2b 27 d1 28。蓝牙设备地址。就是上面所说的public address地址的实际内容。
接下来的内容就是advData广播数据了。其格式为,长度+类型+内容。
类型种类如下:
/** @defgroup ADV_DATA_TYPE EIR Data Type, Advertising Data Type (AD Type) and OOB Data Type Definitions
* @{
*/
#define GAP_ADTYPE_FLAGS 0x01 //!< The Flags data type contains one bit Boolean flags. Please reference @ref ADV_TYPE_FLAGS for details.
#define GAP_ADTYPE_16BIT_MORE 0x02 //!< Service: More 16-bit UUIDs available
#define GAP_ADTYPE_16BIT_COMPLETE 0x03 //!< Service: Complete list of 16-bit UUIDs
#define GAP_ADTYPE_32BIT_MORE 0x04 //!< Service: More 32-bit UUIDs available
#define GAP_ADTYPE_32BIT_COMPLETE 0x05 //!< Service: Complete list of 32-bit UUIDs
#define GAP_ADTYPE_128BIT_MORE 0x06 //!< Service: More 128-bit UUIDs available
#define GAP_ADTYPE_128BIT_COMPLETE 0x07 //!< Service: Complete list of 128-bit UUIDs
#define GAP_ADTYPE_LOCAL_NAME_SHORT 0x08 //!< Shortened local name
#define GAP_ADTYPE_LOCAL_NAME_COMPLETE 0x09 //!< Complete local name
#define GAP_ADTYPE_POWER_LEVEL 0x0A //!< TX Power Level: 0xXX: -127 to +127 dBm
#define GAP_ADTYPE_OOB_CLASS_OF_DEVICE 0x0D //!< Simple Pairing OOB Tag: Class of device (3 octets)
#define GAP_ADTYPE_OOB_SIMPLE_PAIRING_HASHC 0x0E //!< Simple Pairing OOB Tag: Simple Pairing Hash C (16 octets)
#define GAP_ADTYPE_OOB_SIMPLE_PAIRING_RANDR 0x0F //!< Simple Pairing OOB Tag: Simple Pairing Randomizer R (16 octets)
#define GAP_ADTYPE_SM_TK 0x10 //!< Security Manager TK Value
#define GAP_ADTYPE_SM_OOB_FLAG 0x11 //!< Secutiry Manager OOB Flags
#define GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE 0x12 //!< Min and Max values of the connection interval (2 octets Min, 2 octets Max) (0xFFFF indicates no conn interval min or max)
#define GAP_ADTYPE_SIGNED_DATA 0x13 //!< Signed Data field
#define GAP_ADTYPE_SERVICES_LIST_16BIT 0x14 //!< Service Solicitation: list of 16-bit Service UUIDs
#define GAP_ADTYPE_SERVICES_LIST_128BIT 0x15 //!< Service Solicitation: list of 128-bit Service UUIDs
#define GAP_ADTYPE_SERVICE_DATA 0x16 //!< Service Data
#define GAP_ADTYPE_PUBLIC_TGT_ADDR 0x17 //!< Public Target Address
#define GAP_ADTYPE_RANDOM_TGT_ADDR 0x18 //!< Random Target Address
#define GAP_ADTYPE_APPEARANCE 0x19 //!< Appearance
#define GAP_ADTYPE_ADV_INTERVAL 0x1A //!< Advertising Interval
#define GAP_ADTYPE_LE_BT_ADDR 0x1B //!< LE Bluetooth Device Address
#define GAP_ADTYPE_LE_ROLE 0x1C //!< LE Role
#define GAP_ADTYPE_SP_HASH_C256 0x1D //!< Simple Pairing Hash C-256
#define GAP_ADTYPE_SP_RAND_R256 0x1E //!< Simple Pairing Randomizer R-256
#define GAP_ADTYPE_LIST_32BIT_SILI 0x1F //!< List of 32-bit Service Solicitation UUIDs
#define GAP_ADTYPE_SERVICE_DATA_32BIT 0x20 //!< Service Data - 32-bit UUID
#define GAP_ADTYPE_SERVICE_DATA_128BIT 0x21 //!< Service Data - 128-bit UUID
#define GAP_ADTYPE_SC_CONF_VALUE 0x22 //!< LE Secure Connections Confirmation Value
#define GAP_ADTYPE_SC_RAND_VALUE 0x23 //!< LE Secure Connections Random Value
#define GAP_ADTYPE_URI 0x24 //!< URI
#define GAP_ADTYPE_INDOOR_POSITION 0x25 //!< Indoor Positioning
#define GAP_ADTYPE_TRANSPORT_DISCOVERY_DATA 0x26 //!< Transport Discovery Data
#define GAP_ADTYPE_LE_SUPPORTED_FEATURES 0x27 //!< LE Supported Features
#define GAP_ADTYPE_CHAN_MAP_UPDATE_IND 0x28 //!< Channel Map Update Indication
#define GAP_ADTYPE_MESH_PB_ADV 0x29 //!< Mesh Pb-Adv
#define GAP_ADTYPE_MESH_PACKET 0x2A //!< Mesh Packet
#define GAP_ADTYPE_MESH_BEACON 0x2B //!< Mesh Beacon
#define GAP_ADTYPE_3D_INFO_DATA 0x3D //!< 3D Information Data
#define GAP_ADTYPE_MANUFACTURER_SPECIFIC 0xFF //!< Manufacturer Specific Data: first 2 octets contain the Company Identifier Code followed by the additional manufacturer specific data
/** End of ADV_DATA_TYPE
02 01 06,长度2字节,类型1(FLAGS)标志。
le limited discoverable mode 有限可发现模式,该模式配置在一段时间后,蓝牙停止广播。
le general discoverable mode 普通可发现模式,该模式可以配置广播一直发送。
BR/EDR not supported 不支持经典蓝牙。
Mibeacon使用的是,普通可发现模式,不支持经典蓝牙。
11 16 95 fe 30 54 8c 16 01 ad 1b 2b 27 d1 28 28 01 00
长度11,类型16(service data)。0xfe95 (Mi service UUID)30 54 8c 16 01 ad 1b 2b 27 d1 28 28 01 00 数据。
service data或manu data格式
Frame Control 长度2byte。对应数据为30 54 大端存储,转换后为54 30 ,二进制为0101 0100 0011 0000 。
bit0 0 保留
bit1 0 保留
bit2 0 保留
bit3 isEncrypted 0,该包未加密。
bit4 MAC Include 1 包含固定的MAC地址。
bit5 Capability include 1 包含capability。设备未绑定前,这一位强制为1.
bit6 Object include 0不包含object。
bit7 Mesh 0不包含Mesh
bit8 registerd 0设备未绑定
bit9 solicited 0 无操作
bit10-11 Auth Mode 01大端转换01,1安全认证
bit12-15 Version 1010大端转换0101 版本号5
product ID 产品ID,长度2byte,8c 16 大端转换0x168c=5772.为公司产品的PID。
Frame Counter 序号,1byte,用于去重。
MAC Address 设备MAC地址,6byte。ad 1b 2b 27 d1 28对应蓝牙设备地址(publish address)。
capability 设备能力,1byte。28
28转二进制0010 1000.
bit3-4 BondAbility 10转换后为01 前绑定。
bit5 I/O 1 包含I/O capability字段
01 00 大端转换 00 01 。byte 0 Base I/O capability 01 转换二进制0000 0001 。对应协议为"设备可输入6位数字"。
对于改广播帧做个总结。通道地址0x8e89bed6、广播类型为通用可连接广播、Public address 、地址为ad 1b 2b 27 d1 28、普通可发现模式、不支持经典蓝牙、数据包未加密、MAC地址为ad 1b 2b 27 d1 28、安全认证模式、Mibeacon版本为5、I/O能力为可输入6位数字。
最后给个wireshare的截图