Cicada000的博客

求知若饥,虚心若愚


学校洗衣机初探


2024.04.05
科普 技术 教学 电子
5 分钟阅读

  学校每个寝室的阳台上都有一台洗衣机,通过专门的APP付款之后便可以启动洗衣机进行洗衣。这种有意思的东西自然引起了我的注意。在和同学进行交流的时候发现对方也对这个洗衣机有了一些兴趣,并且已经拆解并了解过了内部结构,于是便合计着打算应该好好研究研究。

  本文中提到的大多数软件部分例如电脑端串口读取脚本、Android软件主要由我完成,大多数硬件部分例如PCB绘制、硬件程序编写由好友ESsanae完成。

第一次尝试

  学校里的洗衣机型号为TCL的TB-V6001G,但是洗衣机的按钮全部被拆除,无法通过原有的按钮进行操控。通过同学的拆解得知,洗衣机的控制部分主要有两块板子组成,一块板子集成了网卡,用于接收指令并上传一些数据(例如洗衣机的当前状态和洗衣剩余时间等等),另一块板子用于对洗衣机进行控制,执行洗衣操作。

  知道了内部的一些信息之后,就可以尝试去破解一下了。原本以为洗衣机与云端的通信使用的是学校的校园网。于是做了一个钓鱼WiFi想要尝试看看洗衣机发送和接收的数据,但是一直没有设备连上我的钓鱼WiFi,最后只能拆开一探究竟了。拆解之后发现自己还是too young,这玩意和云端通信用的是自己的物联网卡,根本不走WiFi。抓手机发送给云端的数据包也比较麻烦且大概率有较强的加密,只能尝试使用其他办法进行破解了。

尝试使用WiFi钓鱼抓包

  经过进一步的拆机研究发现,洗衣机接受云端信号的模块与洗衣机的控制模块可以分离,两个模块之间的连线处标有VCC、GND、TX和RX字样。看到这思路变得清晰了起来,可以通过读取并抓取两者之间互相发送的数据,再重发捕捉到的联网模块发给洗衣机控制模块的数据,这样也许就可以实现绕过正常的支付让洗衣机正常工作了。于是我们便拆下了带有物联网卡的云端数据接收模块连接至电脑,想要分析一下信号来一探究竟。

洗衣机内部结构

  根据目前的拆解了解到,数据的流向大概如下所示:

Layer 1 用户 云端 洗衣机网卡 发送数据 发送数据 洗衣机控制板 发送数据

  当我们把模块连接至电脑并用串口助手读取数据时,映入眼帘的只是一些毫无意义的乱码文字,可能是接收文本的编码方式不对?于是我们又更改了接收文本的编码方式,但是仍然不能接收到任何有意义的信息。当我们把接收数据转为十六进制显示时,貌似也不能显示出什么正确的结果,改变了奇偶校验位、数据位、波特率等相关配置也不能显示出什么有用的信息,这条路貌似也不太能走得通,这也为之后绕了一大个圈子埋下了伏笔,于是第一次的探索只能到此为止了。

第一次尝试

第二次尝试

  第一次尝试并不是很顺利,我们猜测可能是厂商使用了私有的协议进行编码,导致我们无法正常读取数据。如果再往底层考虑大概只能用示波器抓取最原始的高低电平数据,奈何财力不够。在询问淘宝卖洗衣机控制板的卖家也无果之后,买了一块国产Raspberry Pi Zero小板子并使用Github上的项目将其作为一台逻辑分析仪来使用,最终抓到了一些高低电平数据。但由于性能限制,由树莓派做成的逻辑分析仪在高采样率下只能保存极短一段时间的数据,所以只能对一段玄乎其玄的数据进行各种猜测和分析,但是在试过各种神奇的协议之后发现都不是很能对的上,于是又无功而返。

Raspberry Pi Zero
分析抓取到的数据

  第二天周六在寝室里闲着也是闲着,于是便打开抓到的数据再次细细研究,发现抓到的数据正好能对上9600波特率、8位数据位、无校验位、停止位为1的TTL信号(是的,不知道为什么第一次读取出来不对,可能是之前测试的波特率不对或者执着于想要读出文本数据吧)。到此为止,工作大概完成六七成了。

接收到的十六进制信号

  于是再将洗衣机的云端数据接收模块连接至电脑,调至正确的波特率,其他设置均为默认,果然读出了正常的数据。再在手机上发送一个付费洗衣的信号,果然也成功抓到了控制洗衣机板子的信号。和我们想象的一样,厂商应该没有在这一层做额外的加密,将这个信号重发,也成功使洗衣机正常运行。

手动抓取数据并重发

终于结束了……吗?

  看到这里,接下来的操作基本上大家都能想到,无非就是替代洗衣机网卡向洗衣机的控制板发送信号即可。实现的方案也很简单,断开洗衣机网卡与控制板的连接,用一个蓝牙串口模块与洗衣机控制板相连,给蓝牙串口模块发送捕获到的信号就行了。但是这样的方法有一个问题,就是云端会显示洗衣机离线,想要解决这个问题也很简单,就是不拦截控制板发回网卡的数据,只模拟洗衣机网卡发向控制板的数据。

Layer 1 用户 云端 洗衣机网卡 发送数据 发送数据 洗衣机控制板 发送数据 STM32 发送数据 第三方软件 蓝牙模块 发送数据 发送数据

  正当我们以为完工而欣喜时,在测试的时候又遇到了新的问题。在本地而非通过云端发送洗衣机运行信号时,云端将在几秒内发送一个停止信号使洗衣机中断当前的工作。因此必须将洗衣机控制板和洗衣机网卡的数据完全隔离,这也诞生了最终版本的控制系统。

Layer 1 洗衣机正常通信 分析信号源 云端 蓝牙 直至接收到信号 启动定时器 在定时器内屏蔽云端信号 向洗衣机发送指令 结束后恢复正常通信 正常洗衣 流程结束

  为了更加方便的使用洗衣机,我在一个GitHub项目的基础上修修改改,最终完成了使用手机蓝牙连接HC05蓝牙模块的 Android软件。至于洗衣机内部嘛…看不到的地方就随便将就一下吧(这个密密麻麻的走线令人看着就头大

更优雅的方法

  上图中的面包板走线实在是令人头疼,大大降低了安装和维护的便捷性,不是长久之计,于是便诞生了第二版的蓝牙控制模块。这一版蓝牙控制模块可以不用面包版与杜邦线与洗衣机的控制模块连接,大大降低了安装的复杂度。同时大幅缩小了整个模块的体积,使得其能够更加灵活的放置进洗衣机中。(不过由于有一点小缺陷懒得修,所以到现在为止洗衣机内还使用着第一版的杂乱走线方案💦

深入理解?

  文章到上面其实已经足够了,洗衣机的各项功能都能正常使用,基本上没有其他问题。唯一不理解的就是洗衣机云端和控制板之间发送的十六进制信号具体的含义了,目前只能解读出末尾可能是剩余时间这一信息,剩下的目前还不明白。如果有感兴趣的读者可以联系我获取串口通信的元数据来进行分析。


Wait a Second...