Logo of the blog, my fursona's head looking all smug videah's blogseemed like a good idea at the time

破解房东的锅炉

发表于 2025 年 4 月 22 日 • 阅读时长 10 分钟 Very bright red photo of a Macbook plugged into a HackRF radio, with my thermostat sitting next to it

重要提示: 在尝试本文中的任何操作之前,请务必进行尽职调查,并检查当地法律。发射无线电信号可能很快就会在法律上出现问题,而且我在这里专门使用的频段 (868Mhz) 在没有许可证的情况下在美国是非法的。我不想因为我的原因而让你家门口出现穿着西装的人。我已经警告过了! Pixel art animation of my fursona with a sad expression. Pixel art animation of my fursona with a sad expression. 不久前,我搬进了一间公寓,第一次独自生活。这给了我相当多的自由来按照自己的喜好塑造我的生活环境,但还不足以让我开始拆墙。毕竟,我还要考虑房东(和押金!) 🙂

虽然还达不到拆墙的程度,但我发现给公寓供暖非常令人沮丧。我的房东安装的锅炉恒温器是一个单一的无线电控制单元,它使用内置的温度传感器来调节供暖的开启和关闭,以达到目标温度。这带来了一些“第一世界”的问题:

我使用 Home Assistant 自动化我公寓周围的事务,并且我想在这里也能做同样的事情。 显然,有很多现成的解决方案可以解决这个问题,但要回到拆墙的比喻,它们需要我房东的合作,并且可能需要电工来访。我不想那样!

相反,这里介绍了我如何找到一种控制公寓供暖的方式,这种方式在使用房东已经安装的现有恒温器的情况下不留痕迹,并且可能在此过程中学到一些关于无线电的知识。

从哪里开始?

我知道恒温器通过某种无线电协议与锅炉通信。我们可以尝试从头开始逆向工程该协议,但正如我稍后将要讨论的那样,这非常复杂,并且远远超出了我微薄的无线电技能。

最终,我决定尝试一种称为 Replay Attack 的方法要容易得多。这包括克隆锅炉和恒温器之间发送的信号,然后通过重新广播这些信号来假装_我们_是恒温器。 这样,我们就不需要理解协议,只需重放它即可。

这种方法需要一定的运气和祈祷。 重放攻击很容易通过在通信中使用递增的计数器来阻止,忽略计数器值你已经看到的信号。 我很幸运恒温器没有这样做——你的情况可能会有所不同! Pixel art animation of my fursona with a walking expression. Pixel art animation of my fursona with a walking expression.

初步侦察

我做的第一件事是检查网上是否有关于我的特定恒温器的任何信息。 我偶然发现了 我拥有的确切型号的列表,以及附件部分中的数据表。 关于_射频通信_的部分正是我想要的:

由此,我们知道恒温器在 868Mhz 范围内通信。 Protocol: Encrypted 部分最初有点令人担忧,但事实证明这不是问题。

我在这里遇到的第一个问题是,网上关于克隆 868Mhz 信号的资源少得惊人。 大部分内容是关于使用 LoRa/Meshtastic。 我会遇到很多 Reddit 帖子,人们试图为吊扇和车库门做和我一样的事情,但似乎没有人有任何答案…… 😭 Pixel art animation of my fursona with a normal expression.

我_怀疑_这是因为在美国未经许可的 868Mhz 传输是非法的,并且没有人关心欧洲,但谁真的知道呢。 如果它是 433Mhz 而不是 868Mhz,我的生活会_轻松得多_,因为有很多面向消费者的工具可以在该频段上进行通信。 Pixel art animation of my fursona with a normal expression.

查看信号

由于没有太多信息,我认为首先要做的是实际_查看_无线电数据包并检查它们。 我过去读过关于 软件定义无线电 的文章,并猜测这是我的最佳选择。 大多数 SDR 都_非常_昂贵,所以我选择了来自 AliExpress 的廉价 RTL-SDR V4。(实际上,由于我们最终会了解到的原因,这最终有点不必要!)

您可能听说过臭名昭著的 Flipper Zero 及其克隆和重放信号的能力。 也许你像我一样考虑在这种情况下使用它,但请注意,Flipper 不是 SDR。 Flipper 对它可以运行的频率非常吝啬。 当我借了一个 Flipper 并且在它不起作用时认为一切都毫无希望时,我才痛苦地发现了这一点。 Pixel art animation of my fursona with a sleeping expression. Pixel art animation of my fursona with a sleeping expression.

到货后,我将其与 SDR++ 软件连接到我的笔记本电脑,只是为了看看它是否有效,并初步了解我的恒温器的状态。 按了几次恒温器的按钮后,我设法看到了瀑布亮起来! 868Mhz 处的“瀑布”显示长水平闪烁。 Pixel art animation of my fursona with a dead expression.

忽略瀑布上的实心垂直线——这只是使用非常便宜的 SDR 的常见副产品,对我来说,它出现在我正在检查的任何频率附近。 Pixel art animation of my fursona with a dead expression.

这一步不是很重要,但我们可以尝试使用 rtl_433 工具(尽管名称如此,它也适用于其他频率)来查看恒温器是否正在使用已知的协议。 更晦涩的设备可能无法在此处工作! 看起来这个恒温器使用的协议与另一个 Honeywell 恒温器相同。 demand 属性设置锅炉是打开 (1) 还是关闭 (0),然后锅炉以确认响应(大概是为了让恒温器可以确定它是否超出范围)。

尝试喊回去

既然我们已经实际看到了来回通信,我们希望能够自己发送一些数据包,并像我们是恒温器一样控制锅炉。 使用 868Mhz Challenger Dev Board,首次尝试失败... 这是我被困了_几个月_的一步。 我试图走“智能”路线,尝试使用 URH _手动_逆向工程和重建数据包,然后使用非常便宜的 868Mhz 微控制器板广播它们。 我可以肯定地说,这一切都远远超出了我的技能范围。 没有一个板子是真正设计成除了_完全相同的板子_之外的任何东西通信的,而要更进一步,需要以我不舒服的方式摆弄无线电寄存器。

The HackRF 官方 HackRF One 板,后来催生了许多 AliExpress 克隆版。

然后,我决定采用大锤方法:使用功能齐全的 SDR 来重放完全相同的信号,而无需关心信号实际包含的内容。 但是我之前获得的廉价 RTL-SDR 仅支持接收,不支持广播。 可以广播的 SDR 通常_数百美元_。

我说_通常_是因为最常见的具有广播功能的 SDR 之一,HackRF One(通常超过 400 美元),在 AliExpress 上有大量克隆版,价格仅为 40 美元。

然后我说_曾经_是因为,几个月后写这篇文章时,AliExpress 几乎删除了所有可以通过搜索“HackRF”找到的列表。 据我了解,它们在许多国家/海关被抓到,这些国家/海关对进口令人毛骨悚然的黑客工具感到不满,所以他们只是决定删除所有列表,而不是处理它。 更新的克隆版可以从 此处 购买,但它们远没有以前那么便宜了…… 😭 Pixel art animation of my fursona with a sad expression. Pixel art animation of my fursona with a sad expression.

廉价克隆本应是开源硬件的硬件,存在一些明显的道德问题(可能还有一些技术问题),但我认为这对于我的小型用例来说是可以的。 如果在你的能力范围内,请支持原始硬件项目Pixel art animation of my fursona with a walking expression.

正如我之前暗示的那样,这使得对 RTL-SDR 的需求有点多余? 但我想拥有另一个 SDR 来确认我们没有污染其他频率总是好的。 Pixel art animation of my fursona with a walking expression.

实际喊回去

有了 HackRF,我们可以使用 hackrf_transfer 工具 来记录信号,最重要的是,_重放_信号。 我执行这些命令,然后按下恒温器上的相应控件,将信号写入各个文件:

# 我们将频率设置为 868.3Mhz,采样率设置为 2000000。
hackrf_transfer -r turn_off.raw -f 868300000 -s 2000000
hackrf_transfer -r turn_on.raw -f 868300000 -s 2000000

然后我们可以尝试像这样从 CLI 关闭和打开锅炉:

# 我们使用 -a 打开放大器,使用 -x 稍微增加增益。
hackrf_transfer -t turn_off.raw -f 868300000 -s 2000000 -a 1 -x 23
hackrf_transfer -t turn_on.raw -f 868300000 -s 2000000 -a 1 -x 23

这样做之后,我可以听到锅炉内的物理继电器打开和关闭!

自动化整个过程 我的 HackRF 克隆版装在一个 3D 打印的外壳中,已插入服务器。

我将 HackRF 插入到连接到我的 Home Assistant 服务器的供电 USB 集线器。 我编写了一个非常基本的 Web 服务器,该服务器仅在 Docker 容器中向上传输上述传输命令。

然后使用 Average Sensor Plugin 和下面的配置 YAML:

command_line:
 - switch:
name: Boiler
command_on: "curl http://docker-vm:1111/api/on"
command_off: "curl http://docker-vm:1111/api/off"
sensor:
 - platform: average
name: "Average Temperature"
entities:
   - sensor.bedroom_thermostat_temperature
   - sensor.kitchen_thermostat_temperature
climate:
 - platform: generic_thermostat
name: Boiler Thermostat
heater: switch.boiler
target_sensor: sensor.average_temperature

我们有一个可工作且可控制的恒温器! 🤯

在这一点上,我很高兴在经过这么多个月后让它_工作_,因此我将第一个承认这种使用 Home Assistant 的设置有点草率,并且可以使用一些清理。 最好编写一个适当的插件并直接控制无线电,而不是向 CLI 发出命令。 依靠 curl 来加热我的公寓可能有点可恶?

值得吗?

Grafana 图显示温度跟随目标温度。

自 12 月初以来,我一直在使用此设置来控制公寓的供暖,并且自此以来没有任何问题! 从我的手机上拨入温度非常方便,而且我的自动化让我觉得这个项目真的值得付出努力。

我有一些基本的自动化,例如在我睡觉时降低温度,然后在早上在我醒来时升高温度,但我也有它,这样当我进城时暖气会关闭,当我距离几个火车站时又会重新打开,所以我的地方对我回家来说既舒适又温暖!

我唯一不满意的是需要使用像 HackRF 这样非常强大且通用的无线电来进行像锅炉开/关开关这样简单的事情。 但我宁愿使用一些过度的东西并让它工作,也不愿花时间试图强迫较小的无线电来听我的命令。

重要的是我不像以前那么冷了! 🐺

此处有一个评论区。 现在不见了。

截至 2025 年 3 月 16 日,英国的 在线安全法 已全面生效。 该法律给像这样的业余爱好者网站带来很多挑战,无法呈现任何用户到用户的内容(比如,博客评论),并且如果不遵守,将会面临非常严重的后果。

如果我们对自己诚实的话,Ofcom(负责执行此法规的监管机构)因为这个博客而踢我的门的可能性很低。 但这种可能性至少高于零,而且惩罚是会毁掉人生的 1800 万英镑罚款(!!),所以根本不值得冒险。 承担风险。

一位友善的律师写下了 这项法律对像这样的自营博客的影响,保证我不受影响的唯一方法是手动审核所有评论,然后才能公开。 不是要对这一切大惊小怪,但我真的不想这样做! 我喜欢我目前的设置!

所以我想作为一种小小的抗议行为,并对冲任何风险,我完全删除了评论区。 对此表示歉意!

如果你想了解更多关于这件事的信息,以及它对业余爱好者互联网的危害有多大,请阅读这篇文章

Artwork Credits © videah 2025