ESP32-BLE2MQTT广播器支持详解:iBeacon、Eddystone与小米传感器
ESP32-BLE2MQTT广播器支持详解:iBeacon、Eddystone与小米传感器
ESP32-BLE2MQTT是一款运行在ESP32上的BLE转MQTT桥接工具,能够将蓝牙低功耗设备的广播数据无缝转换为MQTT消息,实现物联网设备的互联互通。本文将详细介绍其对iBeacon、Eddystone标准广播协议以及小米传感器的完整支持方案,帮助用户快速实现各类BLE设备的数据采集与集成。
核心广播协议支持概述
ESP32-BLE2MQTT通过模块化设计实现了对多种主流BLE广播协议的支持,其核心实现位于main/broadcasters.c文件中。系统采用统一的广播器操作接口(broadcaster_ops_t),为每种协议提供标准化的检测、元数据解析和数据转换功能。目前已支持的广播类型包括:
- iBeacon:苹果公司推出的 proximity 信标协议
- Eddystone:谷歌开发的多帧类型广播协议(UID/URL/TLM)
- 小米传感器:小米生态链设备专用的MiBeacon协议
- 第三方固件:支持ATC1441和PVVX等开源固件的小米温湿度传感器
iBeacon协议深度解析
协议结构与数据格式
iBeacon协议采用苹果公司定义的制造商特定数据格式,其数据结构在main/broadcasters.c中定义为:
typedef struct {
uint16_t company_id; // 0x004C (苹果公司ID)
uint16_t beacon_type; // 0x1502 (iBeacon类型标识)
uint8_t proximity_uuid[16]; // 唯一标识符
uint16_t major; // 主标识符
uint16_t minor; // 次标识符
int8_t measured_power; // 1米处的信号强度
} __attribute__((packed)) ibeacon_t;
关键功能实现
ESP32-BLE2MQTT对iBeacon的支持包括:
-
设备检测:通过验证公司ID(0x004C)和信标类型(0x1502)实现iBeacon设备识别(main/broadcasters.c#L89-L90)
-
元数据解析:提取UUID、Major、Minor参数,并基于信号强度计算距离:
sprintf(s, "%.2f", pow(10, (beacon->measured_power - rssi) / 20.0)); cb("Distance", s, ctx); // 距离计算实现 -
数据转换:将解析后的参数通过MQTT主题发布,典型输出格式为:
{ "UUID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "Major": "1234", "Minor": "5678", "Distance": "2.50" }
Eddystone多帧类型支持
协议家族与帧结构
Eddystone协议提供三种主要帧类型,ESP32-BLE2MQTT在main/broadcasters.c#L115-L149中定义了完整的数据结构:
- UID帧:用于标识唯一设备,包含10字节命名空间和6字节实例ID
- URL帧:用于广播URL地址,支持协议前缀和域名缩写编码
- TLM帧:用于传输信标状态数据,包括电池电压、温度和运行时间
URL帧特殊处理
URL帧采用特殊的编码方式以节省广播包大小,系统在main/broadcasters.c#L212-L248中实现了完整的URL解码功能:
static char *eddystone_url_scheme_get(uint8_t url_scheme) {
if (url_scheme == 0) return "http://www.";
if (url_scheme == 1) return "https://www.";
if (url_scheme == 2) return "http://";
if (url_scheme == 3) return "https://";
// ... 其他编码处理
}
解码后的URL将通过"URL"字段发布,例如将编码后的0x03 0x67 0x6f 0x6f 0x67 0x6c 0x65转换为"https://google"。
TLM帧数据提取
TLM帧提供信标运行状态监测,系统从广播数据中提取关键信息:
sprintf(s, "%d", be16toh(eddystone->u.tlm.vbatt));
cb("Voltage", s, ctx); // 电池电压(mV)
sprintf(s, "%d.%02ld", (int8_t)(temp >> 8), lround((temp & 0xff) * 100 / 256.0));
cb("Temperature", s, ctx); // 温度(°C)
小米传感器全面支持
协议特点与设备覆盖
ESP32-BLE2MQTT实现了对小米MiBeacon协议的完整支持,覆盖多种流行传感器:
- 温湿度传感器:LYWSDCGQ、LYWSD02、LYWSD03MMC
- 植物传感器:HHCCJCY01(MiFlora)、GCLS002
- 运动传感器:RTCGQ02LM(人体红外传感器)
- 门窗传感器:MCCGQ02HL
协议实现位于main/broadcasters.c#L323-L616,通过服务UUID(0xFE95)识别小米设备。
数据解密支持
部分小米设备采用加密广播数据,系统使用mbedtls库实现CCM模式解密:
ret = mbedtls_ccm_auth_decrypt(&ctx, crypt_len, nonce, sizeof(nonce),
aad, sizeof(aad), payload_start, decrypted,
(uint8_t *)mijia_header + len - 4, 4);
用户需在配置文件中提供设备加密密钥,密钥管理通过config_ble_mikey_get函数实现。
传感器数据解析
系统能够解析多种传感器数据类型,包括:
-
温湿度数据(类型0x0D):
sprintf(s, "%.1f", (int16_t)le16toh(*(uint16_t *)mijia_data_entry->data) / 10.0); cb("Temperature", s, ctx); sprintf(s, "%.1f", le16toh(*(uint16_t *)(mijia_data_entry->data + 2)) / 10.0); cb("Humidity", s, ctx); -
光照强度(类型0x07):
uint32_t val = mijia_data_entry->data[0] | (mijia_data_entry->data[1] << 8) | (mijia_data_entry->data[2] << 16); sprintf(s, "%" PRIu32, val); cb("Illuminance", s, ctx); -
土壤湿度(类型0x08/0x14):
sprintf(s, "%u", *mijia_data_entry->data); cb("Moisture", s, ctx);
第三方固件扩展支持
ESP32-BLE2MQTT特别支持刷写第三方固件的小米温湿度传感器,包括:
ATC1441固件
ATC1441固件是针对LYWSD03MMC传感器的开源固件,系统在main/broadcasters.c#L690-L764中实现了数据解析,支持温度、湿度、电池电量和电压等参数的提取。
PVVX固件
PVVX固件提供更多高级功能,系统在main/broadcasters.c#L766-L840中实现了解析,支持更高精度的温湿度数据(小数点后两位)。
快速开始与配置指南
准备工作
- 硬件要求:ESP32开发板(推荐ESP32-C3或ESP32-S3)
- 开发环境:ESP-IDF 4.4及以上版本
- 源码获取:
git clone https://gitcode.com/gh_mirrors/es/esp32-ble2mqtt
核心配置文件
广播器相关配置主要通过以下文件进行:
- 数据配置:data/config.json - 可配置MQTT主题、设备过滤规则等
- 编译配置:sdkconfig.defaults - 可启用/禁用特定广播器支持
典型应用场景
- 环境监测系统:集成多个小米温湿度传感器,实时监测室内环境
- 资产追踪:利用iBeacon的距离计算功能实现资产定位
- 智能办公:通过Eddystone URL广播提供位置相关信息
- 智慧农业:使用MiFlora传感器监测植物生长环境
结语
ESP32-BLE2MQTT通过灵活的模块化设计,为各类BLE广播设备提供了强大的支持能力。无论是标准的iBeacon/Eddystone协议设备,还是小米生态链传感器,都能通过简单配置实现数据的采集与MQTT集成。项目的开源特性也使得用户可以轻松扩展对新设备和协议的支持,为物联网应用开发提供了高效解决方案。
更多推荐
所有评论(0)