本帖最后由 XCray 于 2022-5-11 11:32 编辑
两位过奖了,这算是个学习笔记吧。
从产品逻辑和使用习惯推测,蓝牙体重秤应该都是大同小异的,也就是广播数据略有区别,感觉这个方法可以实现绝大多数蓝牙秤的接入。
我们知道,把大象关进冰箱也就需要3步;差不多的是,把一个蓝牙体重秤/体脂秤接入ESPHome&HA也只需要3步:
1. 信息收集
包括MAC地址、数据广播参数、数据广播内容
1.1 先使用如下代码获取MAC地址,编译写入ESP32模块后,打开LOGS,然后把体重秤放在距离模块很近的地方,站上去,观察日志,根据电平很容易找出体重秤的MAC地址。
其他基本代码略去不提,不知道的同学先去熟悉了解再来尝试。
1.2 当然,如果你可以从产品包装、说明书、背面铭牌或app里找到MAC地址,上一小步就可以跳过去了,直接用下面的代码收集数据广播参数:
esp32_ble_tracker:
on_ble_advertise:
- mac_address: 11:22:33:44:55:66
then:
- lambda: |-
ESP_LOGD("ble_adv", "New BLE device");
ESP_LOGD("ble_adv", " address: %s", x.address_str().c_str());
ESP_LOGD("ble_adv", " name: %s", x.get_name().c_str());
ESP_LOGD("ble_adv", " Advertised service UUIDs:");
for (auto uuid : x.get_service_uuids()) {
ESP_LOGD("ble_adv", " - %s", uuid.to_string().c_str());
}
ESP_LOGD("ble_adv", " Advertised service data:");
for (auto data : x.get_service_datas()) {
ESP_LOGD("ble_adv", " - %s: (length %i)", data.uuid.to_string().c_str(), data.data.size());
}
ESP_LOGD("ble_adv", " Advertised manufacturer data:");
for (auto data : x.get_manufacturer_datas()) {
ESP_LOGD("ble_adv", " - %s: (length %i)", data.uuid.to_string().c_str(), data.data.size());
}
这都是esphome官方文档里的代码,我一点都没有改。把其中的MAC地址改成你的体重秤的地址,编译写入esp32(推荐ota),然后还是打开LOGS,再次站到秤上,找到带有(length xx)的那一行,就是我们要利用的广播数据。
这里我们说的“数据广播参数”,包括两个东西:
- 广播类型(Advertised manufacturer data?还是 Advertised service data?)
- UUID,就是(length xx)前面的0xXXXX
- 对了,还有消息长度
1.3 根据上面的判断,修改代码,找到对应的 Advertised manufacturer data 或者 Advertised service data 那一行,修改如下:
ESP_LOGD("ble_adv", " - %s:%s", data.uuid.to_string().c_str(), hexencode(data.data).c_str());
新版本esphome废弃了hexencode()函数,改为format_hex_pretty(),直接替换即可。
其余输出可以尽数删掉了,省得一堆垃圾信息看着心烦。
然后再次编译刷写esp32模块、打开LOGS再次称重,得到完整的数据广播消息内容;同时从秤上的显示屏或者手机app观察记录体重数值。
2. 数据分析猜解
把从秤上或app上看到的体重数值转成16进制,在1.3步骤中得到的消息体中查找。相信绝大多数体重秤都不会加密,很容易就可以找到。
如果你实在找不到的话,不妨发出来一起看看。
3. 修改代码实现接入
根据上一步的分析结论,修改我提供的代码,需要修改的地方我都在行后加了注释。然后重新编译写入,完工。
主贴里提到的高级玩法,有兴趣的话自己试吧。
说实话,我对体重秤接入HA其实没多大兴趣,这个帖子只是一时兴起,发出来供有兴趣的朋友参考。
|