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

前言

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

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;

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

抓包分析



结尾

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

相关推荐
雾江流4 小时前
LinkAndroid 0.6.0 | 支持多部手机同时连接的全能手机投屏工具
智能手机·软件工程
feiyangqingyun4 小时前
全网唯一/Qt结合ffmpeg实现手机端采集摄像头推流到rtsp或rtmp/可切换前置后置摄像头/指定分辨率帧率
qt·智能手机·ffmpeg
云云32111 天前
亚矩云手机赋能Vinted矩阵运营:破解二手电商多账号与本地化困局
网络·人工智能·智能手机·矩阵·自动化
东风西巷12 天前
MolyCamCCD复古胶片相机:复古质感,时尚出片
android·数码相机·智能手机·软件需求
沿着缘溪奔向大海12 天前
蓝牙数据通讯,实现内网电脑访问外网电脑
java·爬虫·python·socket·蓝牙
开开心心就好12 天前
高效批量转换Word到PDF的方法
javascript·安全·智能手机·pdf·word·objective-c·lisp
云云32112 天前
Subway Surfers Blast × 亚矩阵云手机:手游矩阵运营的终极变现方案
大数据·人工智能·线性代数·智能手机·矩阵·架构
东风西巷13 天前
有道翻译官手机版:智能翻译,随行助手
android·智能手机·软件需求
openKylin13 天前
Macintosh小电脑、小手机 | openKylin最新硬件创意形态首次亮相!
智能手机·开源
非凡ghost13 天前
墨记APP:水墨风记事,书写生活诗意
android·智能手机·生活·软件需求