你的手机是如何控制你的手表之广播篇

前言

要让手机能够控制手表,第一步当然要让手机能够"看见"手表,人类作为上帝视角,我们是能够通过眼睛直接看见手机和手表的,但要让手机"看见"手表,就需要一端把自己的信息通过电磁波的形式发往空中,另一端接收到空中的电磁波信号识别到需要的信息,从而感知到对端并与对端握手和后续的交互。完成上述的过程这里需要引入两个概念广播和连接。本章主要讲解如何让两个设备"见面"。

ble广播类型

广播类型 意义
通用广播 既可以被主动扫描到,也可以被连接的广播方式,是最常用的广播方式
定向广播 报文里含有广播者地址和发起者地址,发起者设备收到发给自己的定向广播报文后,可以立即发送连接请求给对方
不可连接广播 只能广播数据,不能响应主动扫描或者连接
可发现广播 不能被连接,但可以广播数据或者响应主动扫描

这里就我们常用的广播报文--通用广播抓包分析下

广播报文格式

报头格式

广播报文类型

广播报文类型 含义
ADV_IND 通用广播指示
ADV_DIRECT_IND 定向连接指示
ADV_NONCONN_IND 不可连接指示
ADV_SCAN_IND 可扫描指示
SCAN_REQ 主动扫描请求
SCAN_RSP 主动扫描响应
CONNECT_REQ 连接请求

发送地址类型

长度

对于广播报文,长度域包含6个比特,有效值的范围是6-37个字节。广播报文除了最多31个字节的数据外,还要包含6个字节的广播设备地址,6个字节加31个字节导致报文长度最多为37个字节,因此需要6比特的长度域

数据

广播包中的数据域使用LTV的格式进行定义,即 length + type + value

length表示(type + value)的总长度;

type为1byte数据类型,蓝牙协议规范定义类型如下:

c 复制代码
/// The type of advertising data(not adv_type)
typedef enum {
    ESP_BLE_AD_TYPE_FLAG              = 0x01,  /* relate to BTM_BLE_AD_TYPE_FLAG in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_16SRV_PART        = 0x02,  /* relate to BTM_BLE_AD_TYPE_16SRV_PART in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_16SRV_CMPL        = 0x03,  /* relate to BTM_BLE_AD_TYPE_16SRV_CMPL in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_32SRV_PART        = 0x04,  /* relate to BTM_BLE_AD_TYPE_32SRV_PART in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_32SRV_CMPL        = 0x05,  /* relate to BTM_BLE_AD_TYPE_32SRV_CMPL in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_128SRV_PART       = 0x06,  /* relate to BTM_BLE_AD_TYPE_128SRV_PART in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_128SRV_CMPL       = 0x07,  /* relate to BTM_BLE_AD_TYPE_128SRV_CMPL in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_NAME_SHORT        = 0x08,  /* relate to BTM_BLE_AD_TYPE_NAME_SHORT in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_NAME_CMPL         = 0x09,  /* relate to BTM_BLE_AD_TYPE_NAME_CMPL in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_TX_PWR            = 0x0A,  /* relate to BTM_BLE_AD_TYPE_TX_PWR in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_DEV_CLASS         = 0x0D,  /* relate to BTM_BLE_AD_TYPE_DEV_CLASS in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_SM_TK             = 0x10,  /* relate to BTM_BLE_AD_TYPE_SM_TK in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_SM_OOB_FLAG       = 0x11,  /* relate to BTM_BLE_AD_TYPE_SM_OOB_FLAG in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_INT_RANGE         = 0x12,  /* relate to BTM_BLE_AD_TYPE_INT_RANGE in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_SOL_SRV_UUID      = 0x14,  /* relate to BTM_BLE_AD_TYPE_SOL_SRV_UUID in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_128SOL_SRV_UUID   = 0x15,  /* relate to BTM_BLE_AD_TYPE_128SOL_SRV_UUID in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_SERVICE_DATA      = 0x16,  /* relate to BTM_BLE_AD_TYPE_SERVICE_DATA in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_PUBLIC_TARGET     = 0x17,  /* relate to BTM_BLE_AD_TYPE_PUBLIC_TARGET in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_RANDOM_TARGET     = 0x18,  /* relate to BTM_BLE_AD_TYPE_RANDOM_TARGET in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_APPEARANCE        = 0x19,  /* relate to BTM_BLE_AD_TYPE_APPEARANCE in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_ADV_INT           = 0x1A,  /* relate to BTM_BLE_AD_TYPE_ADV_INT in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_LE_DEV_ADDR       = 0x1b,  /* relate to BTM_BLE_AD_TYPE_LE_DEV_ADDR in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_LE_ROLE           = 0x1c,  /* relate to BTM_BLE_AD_TYPE_LE_ROLE in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_SPAIR_C256        = 0x1d,  /* relate to BTM_BLE_AD_TYPE_SPAIR_C256 in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_SPAIR_R256        = 0x1e,  /* relate to BTM_BLE_AD_TYPE_SPAIR_R256 in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_32SOL_SRV_UUID    = 0x1f,  /* relate to BTM_BLE_AD_TYPE_32SOL_SRV_UUID in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_32SERVICE_DATA    = 0x20,  /* relate to BTM_BLE_AD_TYPE_32SERVICE_DATA in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_128SERVICE_DATA   = 0x21,  /* relate to BTM_BLE_AD_TYPE_128SERVICE_DATA in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_LE_SECURE_CONFIRM = 0x22,  /* relate to BTM_BLE_AD_TYPE_LE_SECURE_CONFIRM in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_LE_SECURE_RANDOM  = 0x23,  /* relate to BTM_BLE_AD_TYPE_LE_SECURE_RANDOM in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_URI               = 0x24,  /* relate to BTM_BLE_AD_TYPE_URI in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_INDOOR_POSITION   = 0x25,  /* relate to BTM_BLE_AD_TYPE_INDOOR_POSITION in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_TRANS_DISC_DATA   = 0x26,  /* relate to BTM_BLE_AD_TYPE_TRANS_DISC_DATA in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_LE_SUPPORT_FEATURE= 0x27,  /* relate to BTM_BLE_AD_TYPE_LE_SUPPORT_FEATURE in stack/btm_ble_api.h */
    ESP_BLE_AD_TYPE_CHAN_MAP_UPDATE   = 0x28,    /* relate to BTM_BLE_AD_TYPE_CHAN_MAP_UPDATE in stack/btm_ble_api.h */
    ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE  = 0xFF,    /* relate to BTM_BLE_AD_MANUFACTURER_SPECIFIC_TYPE in stack/btm_ble_api.h */
} esp_ble_adv_data_type;

部分常见类型定义解析如下:

抓包分析



结尾

到这里广播篇基本就告一段落了,当然实际中还需要结合具体的场景做分析,主要关注以上几个关键点即可以完成广播相关的操作,下章将介绍如何进行连接,未完待续!

相关推荐
千里马学框架3 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
开开心心就好3 天前
安卓手写文字生成工具,多种纸张一直免费
网络·网络协议·tcp/ip·leetcode·智能手机·电脑·模拟退火算法
开开心心就好3 天前
批量提取PDF中的图片,直接导出原图
前端·javascript·支持向量机·智能手机·pdf·html·启发式算法
终端安全笔记4 天前
iOS 27 之后「策略空转」:设备升级不报错,但旧策略不再管它
android·网络·安全·ios·智能手机
ToDesk_Daas4 天前
随时随地手搓app!手机远程 Vibe Coding 实操分享
智能手机·电脑·iphone
K成长日志5 天前
BLE链路层-隐私保护
网络·物联网·蓝牙·iot·ble
K成长日志5 天前
BLE链路层-Feature Support
网络·嵌入式·无线通信·蓝牙·iot·ble
终端安全笔记5 天前
描述文件、企业证书、MDM 不是三个名字,是三层
android·ios·智能手机
民乐团扒谱机6 天前
【手把手通信仿真】FSK与GFSK调制原理对比及MATLAB全实现,附频谱波形分析
matlab·蓝牙·微电子·通信技术·通信原理·gfsk·fsk
JoyCong19986 天前
鸿蒙用户等来的是ToDesk:折叠屏适配、星闪笔、互动Tab一次补齐
人工智能·智能手机·电脑·鸿蒙·鸿蒙系统·远程工作·ipad