linux 广播包 网卡 tx,BLE广播包信息记录

1. 前导

前导是一个8比特的交替序列。他不是01010101就是10101010,取决于接入地址的第一个比特。

若接入地址的第一个比特为0:01010101

若接入地址的第一个比特为1:10101010

接收机可以根据前导的无线信号强度来配置自动增益控制。

2 接入地址

接入地址有两种类型:广播接入地址和数据接入地址。

广播接入地址:固定为0x8E89BED6,在广播、扫描、发起连接时使用。

数据接入地址:随机值,不同的连接有不同的值。在连接建立之后的两个设备间使用。

对于数据信道,数据接入地址是一个随机值,但需要满足下面几点要求:

1)

数据接入地址不能超过6个连续的“0”或“1”。

2)

数据接入地址的值不能与广播接入地址相同。

3)

数据接入地址的4个字节的值必须互补相同。

4)

数据接入地址不能有超24次的比特翻转(比特0到1或1到0,称为1次比特翻转)。

5)

数据接入地址的最后6个比特需要至少两次的比特翻转。

6)

符合上面条件的有效随机数据接入地址大概有231个。

3. PDU--协议数据单元:

a4c26d1e5885305701be709a3d33442f.png

这部分才是BLE 的关键:

广播报文的报头包含4bit广播报文类型、2bit保留位、1bit发送地址类型和1bit接收地址类型。

a4c26d1e5885305701be709a3d33442f.png

广播报文类型:

在Linux BlueZ中,它就是:

typedef struct

{

uint8_t evt_type;

uint8_t

bdaddr_type;

bdaddr_t

bdaddr;

uint8_t

length;

uint8_t

data[0];

} __attribute__ ((packed))

le_advertising_info;

对应解析代码:

static const char

*evttype2str(uint8_t type)

{

switch (type)

{

case 0x00:

return "ADV_IND - Connectable

undirected advertising";

case 0x01:

return "ADV_DIRECT_IND -

Connectable directed advertising";

case 0x02:

return "ADV_SCAN_IND -

Scannable undirected advertising";

case 0x03:

return "ADV_NONCONN_IND - Non

connectable undirected advertising";

case 0x04:

return "SCAN_RSP - Scan

Response";

default:

return

"Reserved";

}

}

发送地址类型和接收地址类型指示了设备使用公共地址(Public Address)还是随机地址(Random

Address)。公共地址和随机地址的长度一样,都包含6个字节共48位。BLE设备至少要拥有这两种地址类型中的一种,当然也可以同时拥有这两种地址类型。

它在BlueZ中:

typedef struct

{

uint8_t

evt_type;

uint8_t bdaddr_type;

bdaddr_t

bdaddr;

uint8_t

length;

uint8_t

data[0];

} __attribute__ ((packed))

le_advertising_info;

static const char

*bdaddrtype2str(uint8_t type)

{

switch (type)

{

case

0x00:

return

"Public";

case

0x01:

return

"Random";

default:

return

"Reserved";

}

}

长度

广播报文:长度域包含6个比特,有效值的范围是6~37。

数据报文:长度域包含5个比特,有效值的范围是0~31。

广播报文和和数据报文的长度域有所不同,主要原因是:广播报文除了最多31个字节的数据之外,还必须要包含6个字节的广播设备地址。6+31=37,所以需要6比特的长度域。

再次强调:广播时必须要包含6个字节的广播设备地址。

typedef struct

{

uint8_t

evt_type;

uint8_t

bdaddr_type;

bdaddr_t

bdaddr;

uint8_t length;

uint8_t

data[0];

} __attribute__ ((packed))

le_advertising_info;

a4c26d1e5885305701be709a3d33442f.png

图8:广播和扫描响应的数据格式

1)  有效数据部分:包含N个AD Structure,每个AD

Structure由Length,AD Type和AD Data组成。其中:

Length:AD Type和AD Data的长度。

AD Type:指示AD Data数据的含义。

AD type的定义在程序的“ble_gap.h”头文件中。定义如下:

a4c26d1e5885305701be709a3d33442f.png

1 #define BLE_GAP_AD_TYPE_FLAGS 0x01 2 #define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE 0x02 3 #define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE 0x03 4 #define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE 0x04 5 #define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_COMPLETE 0x05 6 #define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE 0x06 7 #define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE 0x07 8 #define BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME 0x08 9 #define BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME 0x09 10 #define BLE_GAP_AD_TYPE_TX_POWER_LEVEL 0x0A 11 #define BLE_GAP_AD_TYPE_CLASS_OF_DEVICE 0x0D 12 #define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C 0x0E 13 #define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R 0x0F 14 #define BLE_GAP_AD_TYPE_SECURITY_MANAGER_TK_VALUE 0x10 15 #define BLE_GAP_AD_TYPE_SECURITY_MANAGER_OOB_FLAGS 0x11 16 #define BLE_GAP_AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE 0x12 17 #define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT 0x14 18 #define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT 0x15 19 #define BLE_GAP_AD_TYPE_SERVICE_DATA 0x16 20 #define BLE_GAP_AD_TYPE_PUBLIC_TARGET_ADDRESS 0x17 21 #define BLE_GAP_AD_TYPE_RANDOM_TARGET_ADDRESS 0x18 22 #define BLE_GAP_AD_TYPE_APPEARANCE 0x19 23 #define BLE_GAP_AD_TYPE_ADVERTISING_INTERVAL 0x1A 24 #define BLE_GAP_AD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS 0x1B 25 #define BLE_GAP_AD_TYPE_LE_ROLE 0x1C 26 #define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C256 0x1D 27 #define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R256 0x1E 28 #define BLE_GAP_AD_TYPE_SERVICE_DATA_32BIT_UUID 0x20 29 #define BLE_GAP_AD_TYPE_SERVICE_DATA_128BIT_UUID 0x21 30 #define BLE_GAP_AD_TYPE_3D_INFORMATION_DATA 0x3D 31 #define BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA 0xFF

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值