小米蓝牙广播数据解析(MiBeacon)

使用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的截图

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值