找回密码
 立即注册

微信扫码登录

搜索
查看: 3703|回复: 73

[硬件DIY] 2.9 元防丢器,直接软件逆向改造成智能家居无线按键

[复制链接]

6

主题

72

回帖

574

积分

高级会员

积分
574
金钱
491
HASS币
20
发表于 2026-8-16 16:19:30 | 显示全部楼层 |阅读模式
本帖最后由 雪晴科技HTH 于 2026-8-20 08:45 编辑

B站视频地址错误,请重试。
B站视频地址错误,请重试。

【项目介绍】
一款 2.9 元的蓝牙防丢器(iTag 类小标签),虽然便宜,但它是一台标准的 BLE GATT 设备。通过纯软件逆向,我把它改造成了一个智能家居无线按键,配合 Home Assistant 实现各种联动,整个过程不用动硬件、不刷固件。

【实现的功能】
1. 单击 / 双击识别,触发任意 HA 自动化(设置里可选目标实体)
2. 寻物报警:一键让标签持续响铃,按下按键即停止
3. 静音模式:按下标签按键无声(针对该型号实测的指令)
4. 电量显示、实时按键记录
5. 封装成 Electron 桌面应用,手机浏览器也能直接访问控制
b19d681e0b3d8689c33652e4193c3ea7.png
【演示】
双击标签 → 切换卧室灯 / 触发自动化,延迟极低。

【技术要点(逆向心得)】
- 服务 0xFFE0,特征 0xFFE1:按键通知,值恒为 0x01,单击/双击靠软件计时判定(300~500ms 窗口)
- 特征 0x2A06(Immediate Alert):写入 0x01 = 响铃,写入 0x02 = 静音 —— 注意这个型号和标准协议是相反的,0x02 并不会响铃,这是实测踩坑得来的
- 断开报警走特征 0xFFE2(Set LinkLost Alert),写入 0x00 可关闭
- HA 联动通过 REST API 调用服务,无需 MQTT

【结尾】
几块钱的成本,就能得到一个好用的智能家居无线按键。代码整理好后会开源,欢迎交流讨论~
软件下载地址:

『来自123云盘用户雪晴科技HTH的分享』ITAG智能按键 Setup 1.0.0.zip
链接:https://1812732169.share.123pan.cn/123pan/rGdKVv-JPydd?pwd=vj7M#
提取码:vj7M
测试软件下载(用于扫描测试自己的标签):
大家可以先下载测试,测试完记住蓝牙标签的mac地址,后续更新esp32作为中继的版本,需要使用到蓝牙的mac地址。
https://xueqing.lanzout.com/iT7Hr42ul3qh
image.png image.png image.png image.png image.png image.png
HA联动的源代码下载(知道自己标签的mac地址之后,可以搜索替换):
通过网盘分享的文件:ITAG智能按键-程序源码.zip
链接: https://pan.baidu.com/s/1Vr3shzTyMKImpCs7EPsOkA?pwd=gjct 提取码: gjct 复制这段内容后打开百度网盘手机App,操作更方便哦
image.png
如果自己不知道修改哪里,可以试一下agent工具。
https://xueqing.lanzout.com/i6khE42umz3c(里面是源代码和AI提示词)
我需要把项目中的 ITAG 智能按键主程序 itag_visualizer.py 适配成使用我自己的 iTag 蓝牙标签
(替换掉作者原来的标签地址)。

背景:
- 这是单文件程序(Python + 内嵌 HTML/JS 前端,http.server 实现,端口 8899),用 bleak 连接 BLE 标签。
- 它启动时会先读同目录的 config.json(存在时优先);读不到才用代码里的 DEFAULT_CONFIG 兜底。
- 请先阅读 itag_visualizer.py 和 config.json 这两个文件,再按清单执行。

我的设备信息:
- 我的 iTag MAC 地址:【填你的MAC,如 12:34:56:AB:CD:EF】
- 我的 HA 地址(可选):【如 http://192.168.1.100:8123】
- 我的 HA 长期访问令牌(可选):【填token】
- 双击判定窗口毫秒数(默认 500):500

需要修改的位置(必须全部检查):
1. config.json(推荐,最高优先级):改 itag_mac 为我的 MAC;改 ha_url/ha_token;
   timing.multi_click_window_ms 按需调整;文件不存在则按 DEFAULT_CONFIG 生成。
2. itag_visualizer.py 代码默认值(config.json 缺失时才生效,也建议同步改):
   - DEFAULT_CONFIG 的 itag_mac(约第 39 行)
   - DEFAULT_CONFIG 的 ha_url/ha_token(约第 40-41 行,敏感信息,必须换成我自己的)
   - DEFAULT_CONFIG 的 timing.multi_click_window_ms / cooldown_ms(约第 60-61 行)
   - 前端兜底 itag_mac: currentConfig?.itag_mac || "..."(约第 1802 行,必须与后端一致)
   - 文件头 docstring 里的 MAC 是注释,可顺手更新。
3. 只改配置,不动业务逻辑:不要改 BLE 连接、手势识别、响铃指令(0x2A06)、按键通知(0xFFE1)等
   任何功能代码;不要改端口(默认 8899)。

输出要求:
- 先报告所有需要改的位置(文件+行号+原值→新值)让我确认;
- 然后执行修改,并保留 config.json.bak 备份;
- 最后给出 3 行以内的验证方法(如:运行 python itag_visualizer.py,网页右上角显示我的 MAC)。
关闭标签蓝牙断开后的自动报警代码

"""Disable ITAG link-lost alarm: write ONLY 0x00 to 0xFFE2, then disconnect"""
import asyncio
import sys

try:
    sys.stdout.reconfigure(encoding="utf-8", errors="replace", line_buffering=True)
    sys.stderr.reconfigure(encoding="utf-8", errors="replace", line_buffering=True)
except Exception:
    pass

from bleak import BleakClient

ADDR = "FF:FF:12:B6:1F:4C"
FFE2_LINKLOST = "0000ffe2-0000-1000-8000-00805f9b34fb"   # Set LinkLost Alert


def p(*a):
    print(*a, flush=True)


async def main():
    p(f"Connecting to {ADDR} ...")
    client = BleakClient(ADDR, timeout=15)
    try:
        await client.connect()
        p("Connected.")

        # ONLY write 0x00 = disable link lost alarm
        await client.write_gatt_char(FFE2_LINKLOST, b"\x00", response=True)
        p("[OK] LinkLost Alert <- 0x00 (OFF). 设置完成!")

        # Verify current state by writing 0x01 and reading back? No - just confirm write.
        p("保持连接 5 秒后断开...")
        await asyncio.sleep(5)

    except Exception as e:
        p(f"ERROR: {e}")
    finally:
        try:
            await client.disconnect()
            p("已断开连接。")
            p()
            p(">>> 现在请听 15 秒:如果不再响 = 关闭成功!")
        except Exception:
            pass


if __name__ == "__main__":
    asyncio.run(main())


关闭标签蓝牙断开后的自动报警代码
"""Enable ITAG link-lost alarm: write ONLY 0x01 to 0xFFE2, then disconnect"""
import asyncio
import sys

try:
    sys.stdout.reconfigure(encoding="utf-8", errors="replace", line_buffering=True)
    sys.stderr.reconfigure(encoding="utf-8", errors="replace", line_buffering=True)
except Exception:
    pass

from bleak import BleakClient

ADDR = "FF:FF:12:B6:1F:4C"
FFE2_LINKLOST = "0000ffe2-0000-1000-8000-00805f9b34fb"   # Set LinkLost Alert


def p(*a):
    print(*a, flush=True)


async def main():
    p(f"Connecting to {ADDR} ...")
    client = BleakClient(ADDR, timeout=15)
    try:
        await client.connect()
        p("Connected.")

        # ONLY write 0x01 = enable link lost alarm
        await client.write_gatt_char(FFE2_LINKLOST, b"\x01", response=True)
        p("[OK] LinkLost Alert <- 0x01 (ON). 设置完成!")

        p("保持连接 5 秒后断开...")
        await asyncio.sleep(5)

    except Exception as e:
        p(f"ERROR: {e}")
    finally:
        try:
            await client.disconnect()
            p("已断开连接。")
            p()
            p(">>> 现在请听 15 秒:如果断开后开始响 = 打开成功!")
        except Exception:
            pass


if __name__ == "__main__":
    asyncio.run(main())





b19d681e0b3d8689c33652e4193c3ea7.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

评分

参与人数 7金钱 +92 HASS币 +20 收起 理由
sorrypqa + 20 高手,这是高手!
decoder + 8 牛而逼之!
隔壁的王叔叔 + 12 高手,这是高手!
admin + 20 + 20 牛而逼之!
summ99111 + 10 感谢楼主分享!
changess + 10
book123 + 12 高手,这是高手!

查看全部评分

回复

使用道具 举报

230

主题

3485

回帖

1万

积分

元老级技术达人

积分
11687
金钱
7952
HASS币
100
发表于 2026-8-16 16:43:50 | 显示全部楼层
这个怎么接入ha的,我家里也有这个防丢器,是用esp32的ble蓝牙吗?你那个云盘下载文件,还要费用,
公众号:Home Assistant分享
回复

使用道具 举报

6

主题

72

回帖

574

积分

高级会员

积分
574
金钱
491
HASS币
20
 楼主| 发表于 2026-8-16 19:33:08 | 显示全部楼层
bugensui 发表于 2026-8-16 16:43
这个怎么接入ha的,我家里也有这个防丢器,是用esp32的ble蓝牙吗?你那个云盘下载文件,还要费用, ...

不收费的,你需要先登录再普通下载,这个网盘有点问题,你登录下载看看,我现在做的第一版是基于电脑windows系统的
回复

使用道具 举报

6

主题

72

回帖

574

积分

高级会员

积分
574
金钱
491
HASS币
20
 楼主| 发表于 2026-8-16 19:37:07 | 显示全部楼层
bugensui 发表于 2026-8-16 16:43
这个怎么接入ha的,我家里也有这个防丢器,是用esp32的ble蓝牙吗?你那个云盘下载文件,还要费用, ...

通过网盘分享的文件:ITAG智能按键-程序源码.zip
链接: https://pan.baidu.com/s/1Vr3shzTyMKImpCs7EPsOkA?pwd=gjct 提取码: gjct 复制这段内容后打开百度网盘手机App,操作更方便哦
回复

使用道具 举报

6

主题

72

回帖

574

积分

高级会员

积分
574
金钱
491
HASS币
20
 楼主| 发表于 2026-8-16 19:40:58 | 显示全部楼层
bugensui 发表于 2026-8-16 16:43
这个怎么接入ha的,我家里也有这个防丢器,是用esp32的ble蓝牙吗?你那个云盘下载文件,还要费用, ...

大佬,您可以看看我发的百度网盘链接,我把py源码打包了,如果需要部署到esp32的话,可以试试esphome,现在第一版测试版本我先放到Windows打包了一下,如果好用的话可以考虑用esp32的蓝牙,因为我用的是树莓派部署的,它上面有蓝牙,所以我可以直接将服务运行到树莓派上,还没考虑esp32
回复

使用道具 举报

230

主题

3485

回帖

1万

积分

元老级技术达人

积分
11687
金钱
7952
HASS币
100
发表于 2026-8-16 19:55:24 | 显示全部楼层
雪晴科技HTH 发表于 2026-8-16 19:40
大佬,您可以看看我发的百度网盘链接,我把py源码打包了,如果需要部署到esp32的话,可以试试esphome,现 ...

谢谢。我父母有的时候出门不带手机,我把钥匙上给他们挂个这个东西,应该就是用蓝牙检测他的特征码对吧,好像特征码你也展示出来了。
公众号:Home Assistant分享
回复

使用道具 举报

6

主题

72

回帖

574

积分

高级会员

积分
574
金钱
491
HASS币
20
 楼主| 发表于 2026-8-16 20:06:26 | 显示全部楼层
bugensui 发表于 2026-8-16 19:55
谢谢。我父母有的时候出门不带手机,我把钥匙上给他们挂个这个东西,应该就是用蓝牙检测他的特征码对吧, ...

是的,蓝牙也是有MAC的,你可以在代码里加标签,多个的话好区分,让AI帮你改一下代码就行
回复

使用道具 举报

230

主题

3485

回帖

1万

积分

元老级技术达人

积分
11687
金钱
7952
HASS币
100
发表于 2026-8-16 20:12:36 | 显示全部楼层
雪晴科技HTH 发表于 2026-8-16 20:06
是的,蓝牙也是有MAC的,你可以在代码里加标签,多个的话好区分,让AI帮你改一下代码就行 ...

谢谢家友。
公众号:Home Assistant分享
回复

使用道具 举报

6

主题

72

回帖

574

积分

高级会员

积分
574
金钱
491
HASS币
20
 楼主| 发表于 2026-8-16 21:43:24 | 显示全部楼层

不客气大佬,有问题随时联系
回复

使用道具 举报

230

主题

3485

回帖

1万

积分

元老级技术达人

积分
11687
金钱
7952
HASS币
100
发表于 2026-8-17 00:02:55 | 显示全部楼层
windows版本左上角的mac地址,是你内置的mac地址是吗,我怎么改成我自己防丢器的呢?自己封装成软件吗?设置里好像改不了
公众号:Home Assistant分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian ( 晋ICP备17001384号-1 )|网站地图

GMT+8, 2026-9-9 17:38 , Processed in 0.172535 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表