【BLE】广播数据包结构讲解,五颗蓝牙芯片对比
【广播数据包结构讲解】
广播数据包的讲解网上可参考的也挺多,讲解了整个数据包的每个字节每个位的功能描述,非常详细。
今天我们换个方式,按照代码编写的方式,只要是被SDK封装的部分都不做考虑,例如报头、crc校验等,讲讲应用层需要关心的部分,对比下五颗蓝牙芯片的广播包数据。
上图所示为广播包的结构图,需要注意的是数据段最大为37字节,其中广播设备的mac地址占用6字节,所以广播最大的有效的数据是31字节。
广播数据结构
广播数据包最长31字节,而这31字节又被拆成很多小数据包,每个小数据包代表一类广播数据。例如有设备名称数据包,外观数据包,发射功率数据包,服务UUID数据包,服务数据数据包,厂商自定义数据包。
每个小数据包结构如下:
{
unsigned char length; //整数据长度-1
unsigned char type; //数据类型
unsigned char data[length-1];//数据
}
举个例子:如果我全部使用自定义数据包,length=30,type=0xff,data[29],真实能够填充的就是29个字节
广播数据包类型type
type值是蓝牙联盟定义的,全球统一,宏的命名是每个厂家自己定义的,如下是nordic sdk的定义。
/**@defgroup BLE_GAP_AD_TYPE_DEFINITIONS GAP Advertising and Scan Response Data format* @note Found at https://www.bluetooth.org/Technical/AssignedNumbers/generic_access_profile.htm* @{ */
#define BLE_GAP_AD_TYPE_FLAGS 0x01 /**< Flags for discoverability. */
#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE 0x02 /**< Partial list of 16 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE 0x03 /**< Complete list of 16 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE 0x04 /**< Partial list of 32 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_COMPLETE 0x05 /**< Complete list of 32 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE 0x06 /**< Partial list of 128 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE 0x07 /**< Complete list of 128 bit service UUIDs. */
#define BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME 0x08 /**< Short local device name. */
#define BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME 0x09 /**< Complete local device name. */
#define BLE_GAP_AD_TYPE_TX_POWER_LEVEL 0x0A /**< Transmit power level. */
#define BLE_GAP_AD_TYPE_CLASS_OF_DEVICE 0x0D /**< Class of device. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C 0x0E /**< Simple Pairing Hash C. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R 0x0F /**< Simple Pairing Randomizer R. */
#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_TK_VALUE 0x10 /**< Security Manager TK Value. */
#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_OOB_FLAGS 0x11 /**< Security Manager Out Of Band Flags. */
#define BLE_GAP_AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE 0x12 /**< Slave Connection Interval Range. */
#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT 0x14 /**< List of 16-bit Service Solicitation UUIDs. */
#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT 0x15 /**< List of 128-bit Service Solicitation UUIDs. */
#define BLE_GAP_AD_TYPE_SERVICE_DATA 0x16 /**< Service Data - 16-bit UUID. */
#define BLE_GAP_AD_TYPE_PUBLIC_TARGET_ADDRESS 0x17 /**< Public Target Address. */
#define BLE_GAP_AD_TYPE_RANDOM_TARGET_ADDRESS 0x18 /**< Random Target Address. */
#define BLE_GAP_AD_TYPE_APPEARANCE 0x19 /**< Appearance. */
#define BLE_GAP_AD_TYPE_ADVERTISING_INTERVAL 0x1A /**< Advertising Interval. */
#define BLE_GAP_AD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS 0x1B /**< LE Bluetooth Device Address. */
#define BLE_GAP_AD_TYPE_LE_ROLE 0x1C /**< LE Role. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C256 0x1D /**< Simple Pairing Hash C-256. */
#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R256 0x1E /**< Simple Pairing Randomizer R-256. */
#define BLE_GAP_AD_TYPE_SERVICE_DATA_32BIT_UUID 0x20 /**< Service Data - 32-bit UUID. */
#define BLE_GAP_AD_TYPE_SERVICE_DATA_128BIT_UUID 0x21 /**< Service Data - 128-bit UUID. */
#define BLE_GAP_AD_TYPE_LESC_CONFIRMATION_VALUE 0x22 /**< LE Secure Connections Confirmation Value */
#define BLE_GAP_AD_TYPE_LESC_RANDOM_VALUE 0x23 /**< LE Secure Connections Random Value */
#define BLE_GAP_AD_TYPE_URI 0x24 /**< URI */
#define BLE_GAP_AD_TYPE_3D_INFORMATION_DATA 0x3D /**< 3D Information Data. */
根据上面的定义,我们解析下上篇文章中,广播数据包的信息。
ESP32的广播数据代码:(广播包数据最多31的字节)
static void hci_cmd_send_ble_set_adv_data(void)
{char *adv_name = "ESP-BLE-HELLO";uint8_t name_len = (uint8_t)strlen(adv_name);uint8_t adv_data[31] = {0x02, 0x01, 0x06, 0x0, 0x09};uint8_t adv_data_len;adv_data[3] = name_len + 1;for (int i = 0; i < name_len; i++) {adv_data[5 + i] = (uint8_t)adv_name[i];}adv_data_len = 5 + name_len;uint16_t sz = make_cmd_ble_set_adv_data(hci_cmd_buf, adv_data_len, (uint8_t *)adv_data);esp_vhci_host_send_packet(hci_cmd_buf, sz);
}
看下其他几家广播数据
TI的CC254X,可以自己分析分析,内部有UUID了,让扫描者(手机)提前知道我有那些功能。
static uint8 advertData[] =
{//自定义的广播数据段0x03,GAP_ADTYPE_MANUFACTURER_SPECIFIC,0,//自定义数据10,//自定义数据2// 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 dataGAP_ADTYPE_FLAGS,DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,// service UUID, to notify central devices what services are included// in this peripheral0x03, // length of this dataGAP_ADTYPE_16BIT_MORE, // some of the UUID's, but not allLO_UINT16( SIMPLEPROFILE_SERV_UUID ),HI_UINT16( SIMPLEPROFILE_SERV_UUID ),
};
瑞昱的RTL87XX,里面有个0xFF类型的小数据包,下面有他的结构解释图。
static uint8_t advertData[] =
{0x02,GAP_ADTYPE_FLAGS,GAP_ADTYPE_FLAGS_LIMITED | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,0x08, // length 0x09, // type="Complete local name" 'R', 'T', 'L', '8', '7', '6','2', 0x0F, /* length */0xFF, /* type="GAP_ADTYPE_MANUFACTURER_SPECIFIC" */0x00, 0x00, /* company Id*/0x00,0x00,0x00,0x00,0x00,0x00, /*MAC Address*/0x01, /*TYPE=0x01,0x02,0x03,0x04*/0x01,0x00, /**/0x00,0x00,0x00,
};
0xFF主要用于厂商信息和自定义数据,数据区前两个字节是芯片的生产厂家(也可自定义),后面数据自定义。上面图片的长度有问题,不说了。
沁恒的CH579,中规中矩,一个flag,一个uuid
static uint8 advertData[] =
{ // flags0x02,GAP_ADTYPE_FLAGS,GAP_ADTYPE_FLAGS_GENERAL | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,// service UUIDs0x05,GAP_ADTYPE_16BIT_MORE,LO_UINT16(HEARTRATE_SERV_UUID),HI_UINT16(HEARTRATE_SERV_UUID),LO_UINT16(BATT_SERV_UUID),HI_UINT16(BATT_SERV_UUID)
};
nordic,它就是封装了一层,ble_advertising_init()内部又进行拆解,然后放入协议栈,可能协议栈(不开源)组合成类似的。已注释。
static void advertising_init(void)//广播初始化
{ret_code_t err_code;ble_advertising_init_t init;memset(&init, 0, sizeof(init));init.advdata.name_type = BLE_ADVDATA_FULL_NAME;//设备名称init.advdata.include_appearance = true;//外观init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;//flag:一般可发现模式,不支持BR/EDRinit.advdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);init.advdata.uuids_complete.p_uuids = m_adv_uuids;//首要服务的UUIDinit.config.ble_adv_fast_enabled = true;//快速广播模式init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;//广播间隔init.config.ble_adv_fast_timeout = APP_ADV_DURATION;//广播持续时间init.config.ble_adv_fast_timeout = 0;//广播持续时间init.evt_handler = on_adv_evt;//广播回调err_code = ble_advertising_init(&m_advertising, &init);//广播模块初始化APP_ERROR_CHECK(err_code);ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);//连接设置标记:没啥用,为了以后使用
}
资料下载
市面上nordic的资料最多,我搜集了些,大家需要的话,自行下载。
公众号后台回复关键词【52832】,发送后收到链接即可下载。
【BLE】广播数据包结构讲解,五颗蓝牙芯片对比相关推荐
- Android的BLE广播数据包介绍和解析---BLE--Android系列, 蓝牙技术BLE
目录 一.引言 二.广播的类型 三.广播数据格式 四.广播数据解析 五.总结 一.引言 理解和分析这个数据包结构(这里面也涉及广播间隔时间的设置,设备广播数据间隔设置长了,会影响设备被发现的效率:设置 ...
- 蓝牙广播数据包_一分钟读懂低功耗蓝牙(BLE)广播数据包
一分钟读懂低功耗蓝牙(BLE)广播数据包 低功耗蓝牙 => BLE (Bluetooth Low Energy) 1. 怎样抓取BLE广播数据包 * 硬件:一个BLE设备(具有广播功能): 一台 ...
- 蓝牙广播数据包_蓝牙BLE数据包格式汇总
以蓝牙4.0为例说明: BLE包格式有:广播包.扫描包.初始化连接包.链路层控制包(LL层数据包).逻辑链路控制和自适应协议数据包(即L2CAP数据包)等: 其中广播包又分为:定向广播包和非定向广播包 ...
- 蓝牙相关学习:4.1.BLE空口包结构
BLE空口包结构 4.0 - 5.1 Uncoded PHY 空口包格式 Preamble (前导) Access Address (AA) 广播包 数据包 PDU CRC 5.1 Coded PHY ...
- TCP/IP网络协议栈:以太网数据包结构、802.3、MTU
<TCP/IP网络协议栈:以太网数据包结构.802.3> <TCP/IP网络协议栈:ARP协议详解> <TCP / IP攻击:ARP缓存中毒的基本原理.TCP序列号预测和 ...
- TCP/IP的层次结构、各层数据封装过程、数据包结构--解析
一.TCP/IP的层次结构 Tcp/ip协议的四个层次 TCP.IP协议的分层结构图 CP/IP协议与OSI模型的对应关系(五层分法) 1.应用层:为用户的应用程序提供接口,使用户可以访问网络.(IE ...
- JAVA网络编程:TCP/IP数据包结构
2019独角兽企业重金招聘Python工程师标准>>> 一般来说,网络编程我们仅仅须要调用一些封装好的函数或者组件就能完毕大部分的工作,可是一些特殊的情况下,就须要深入的理解网络数据 ...
- TCP/IP数据包结构分解
一般来说,网络编程我们只需要调用一些封装好的函数或者组件就能完成大部分的工作,但是一些特殊的情况下,就需要深入的理解 网络数据包的结构,以及协议分析.如:网络监控,故障排查等-- IP包是不安全的,但 ...
- TCP/IP数据包结构详解
一般来说,网络编程我们只需要调用一些封装好的函数或者组件就能完成大部分的工作,但是一些特殊的情况下,就需要深入的理解 网络数据包的结构,以及协议分析.如:网络监控,故障排查等-- IP包是不安全的,但 ...
最新文章
- Java记录 -24- equals方法重写
- 设置UIButton上面是image,下面是title
- C语言编译构建系统,C语言 之建立静态链接库
- 关于Oracle RAC节点间免密码策略
- linux中传输文件方法,Linux快速传输文件几种方法
- jzoj3512-游戏节目【树状数组,双向dfs】
- 如何计算一只鸡的表面积?
- 用一个参数化的模型来投影点
- 下载eclipse出现a java_java - 运行eclipse出现问题?
- 盒马申请多个“屁股脸”商标被驳回!其IP盒马先生被网友戏称:“屁股脸”...
- Angular-Observable和RxJS
- 同时支持mp4/ogg/webm/flv格式的视频播放
- python--反射机制
- java csv api_CSVAPIforJava
- linux全盘备份命令,Linux系统磁盘分区备份的操作
- 鼠标点计算机再点网络也是选定,鼠标左键单击变双击,点一下变两下是什么原因?...
- 光影精灵安装ubuntu20.04安装显卡驱动外界显示屏
- python立方尾不变
- c#基础知识学习——枚举、元组(四)
- 庸科科沾稚尘悦蕉谷捉