我的目标是构建一个用于三星 AC AR24HSFSAWKN 的自定义 wifi 模块。我有这样一个官方模块SWL-B70F,我正在尝试对其与主 AC 板的通信进行逆向工程。这只是为了挑战,也是我第一次尝试这种 hack。
从AC 手册中,我确定了以下引脚排列:
CN51 - WI-FI MODULE
#1 : WIFI UART SIGNAL1
#2 : WIFI UART SIGNAL2
#3 : WIFI RESET SIGNAL
#4 : GND
#5 : DC 12V
#6 : N.C
拆卸模块后,我在一个臂板内找到了第二块,我确定它是降压稳压器(12V -> 5V)。在稳压器板上,我将一些电线连接到 UART 线 + GND 到 RX 引脚上的 2 条 ftdi 电缆,因此我可以在两个方向上转储帧。我已经用不同的tty波特率多次启动了设备。我认为 9600 波特是正确的,因为其他没有给出好的模式。现在我以下面的交流结束。我发现了一些常见的模式。我想帧以d0(or d0c002)开头并以e0. 似乎有一个消息计数器、一个固定分隔符、一个有效负载和一个校验和:<start> <????> <counter> <sep?> <payload> <CheckSum8 Xor> <end>。发送一条消息时,另一条线路上会发送一条类似的消息,可能是一条ack消息。
我可以通过实际的 wifi 模块发送 xml 命令。作为测试,我发送了一个OFF命令,导致以下交换:
OFF 命令:
# try 1
-> d0c002 12 000000000038 fe 1204060201f074010f 5f e0
<- d0c002 12 000000000038 fe 1205060201f074010f 5e e0
# try 2
-> d0c002 12 000000000047 fe 1204060201f074010f 20 e0
<- d0c002 12 000000000047 fe 1205060201f074010f 21 e0
# try 3
-> d0c002 12 000000000058 fe 1204060201f074010f 3f e0
<- d0c002 12 000000000058 fe 1205060201f074010f 3e e0
另一个可能的命令是 get DeviceState,它返回以下 XML(但没有触发与主板的任何交换,我想这些值在初始化时存储在 wifi 模块中):
?xml version="1.0" encoding="utf-8" ?>
<Response Type="DeviceState" Status="Okay">
<DeviceState>
<Device DUID="F8042ED83EA0" GroupID="AC" ModelID="AC" >
<Attr ID="AC_FUN_ENABLE" Type="RW" Value="Enable"/>
<Attr ID="AC_FUN_POWER" Type="RW" Value="Off"/>
<Attr ID="AC_FUN_OPMODE" Type="RW" Value="Auto"/>
<Attr ID="AC_FUN_TEMPSET" Type="RW" Value="21"/>
<Attr ID="AC_FUN_COMODE" Type="RW" Value="Off"/>
<Attr ID="AC_FUN_ERROR" Type="RW" Value="NULL"/>
<Attr ID="AC_FUN_TEMPNOW" Type="R" Value="23"/>
<Attr ID="AC_FUN_SLEEP" Type="RW" Value="0"/>
<Attr ID="AC_FUN_WINDLEVEL" Type="RW" Value="Auto"/>
<Attr ID="AC_FUN_DIRECTION" Type="RW" Value="Fixed"/>
<Attr ID="AC_ADD_AUTOCLEAN" Type="RW" Value="Off"/>
<Attr ID="AC_ADD_SETKWH" Type="RW" Value="255"/>
<Attr ID="AC_ADD_CLEAR_FILTER_ALARM" Type="RW" Value="240"/>
<Attr ID="AC_ADD_APMODE_END" Type="W" Value="0"/>
<Attr ID="AC_ADD_STARTWPS" Type="RW" Value="Default"/>
<Attr ID="AC_ADD_SPI" Type="RW" Value="Off"/>
<Attr ID="AC_OUTDOOR_TEMP" Type="R" Value="71"/>
<Attr ID="AC_COOL_CAPABILITY" Type="R" Value="68"/>
<Attr ID="AC_WARM_CAPABILITY" Type="R" Value="80"/>
<Attr ID="AC_SG_WIFI" Type="W" Value="Connected"/>
<Attr ID="AC_SG_INTERNET" Type="W" Value="Disconnected"/>
<Attr ID="AC_ADD2_USEDWATT" Type="R" Value="65024"/>
<Attr ID="AC_ADD2_VERSION" Type="RW" Value="65024"/>
<Attr ID="AC_SG_MACHIGH" Type="W" Value="216"/>
<Attr ID="AC_SG_MACMID" Type="W" Value="62"/>
<Attr ID="AC_SG_MACLOW" Type="W" Value="160"/>
<Attr ID="AC_SG_VENDER01" Type="W" Value="248"/>
<Attr ID="AC_SG_VENDER02" Type="W" Value="4"/>
<Attr ID="AC_SG_VENDER03" Type="W" Value="46"/>
<Attr ID="AC_ADD2_PANEL_VERSION" Type="R" Value="150224"/>
<Attr ID="AC_ADD2_OUT_VERSION" Type="R" Value="1246985"/>
<Attr ID="AC_FUN_MODEL" Type="R" Value="5"/>
<Attr ID="AC_ADD2_OPTIONCODE" Type="R" Value="53432"/>
<Attr ID="AC_ADD2_USEDPOWER" Type="R" Value="58933"/>
<Attr ID="AC_ADD2_USEDTIME" Type="R" Value="265675"/>
<Attr ID="AC_ADD2_CLEAR_POWERTIME" Type="RW" Value="254"/>
<Attr ID="AC_ADD2_FILTERTIME" Type="RW" Value="500"/>
<Attr ID="AC_ADD2_FILTER_USE_TIME" Type="R" Value="10000"/>
</Device>
</DeviceState>
</Response>
启动日志中存在一些值,例如AC_ADD2_USEDTIME, AC_ADD2_OPTIONCODE, AC_ADD2_USEDPOWER, AC_ADD2_FILTER_USE_TIME=>
d0c002 39 000000000009 fe 14032d3201fef601fef403150224f303130709f501053902 d0b8(AC_ADD2_OPTIONCODE) e0040000 e635 e404000 40dcb(AC_ADD2_USEDPOWER) e801fee90103e602 2710(AC_ADD2_FILTER_USE_TIME) 93 e0
框架可以拆分为:
14032d3201fef601fef403150224f303130709f50105
3902 d0b8
e004 0000e635
e404 00040dcb
e801 fee90103
e602 2710
e004, e404,e602可能是一些字段标题?
校验和是CheckSum8 Xor第一个字节的:d0c00212000000000047fe1204060201f074010f->20
此外,第一次交换 ( 0000/ 00fc) 再也没有出现过,所以应该是某种握手。
接下来我将尝试移除wifi模块,并重放与它的通信,模拟AC。
问题:
- 我的方法论和假设是否有效?
- 帧中的第二个字段可能是什么(似乎是唯一值
0f 12 18 1c 1e 22 30)? - 我是否正确拆分帧?
- 您对如何解码剩余消息和反转完整协议有一些建议吗?
- 它看起来像其他地方已知的东西吗?
- 任何其他提示:)
非常感谢!
完整的启动日志:
#-> WIFI TO AC
#<- AC TO WIFI
-> 00fc
<- 0000
-> d0c002 12 000000000000 fe 12040601010f7401f0 64 e0
<- d0c002 12 000000000000 fe 12050601010f7401f0 65 e0
-> d0c002 18 000000000001 fe 14040c170115180105190127fd0102 37 e0
<- d0c002 18 000000000001 fe 14050c170115180105190127fd0102 36 e0
-> d0c002 1e 000000000002 fe 140412fa01f8fb0104fc012ef701d8f8013ef901a0 6d e0
<- d0c002 1e 000000000002 fe 140512fa01f8fb0104fc012ef701d8f8013ef901a0 6c e0
-> d0c002 18 000000000003 fe 14040c170115180105190127fd0102 35 e0
<- d0c002 18 000000000003 fe 14050c170115180105190127fd0102 34 e0
-> d0c002 1e 000000000004 fe 140412fa01f8fb0104fc012ef701d8f8013ef901a0 6b e0
<- d0c002 1e 000000000004 fe 140512fa01f8fb0104fc012ef701d8f8013ef901a0 6a e0
-> d0c002 18 000000000005 fe 14040c170115180105190127fd0102 33 e0
<- d0c002 18 000000000005 fe 14050c170115180105190127fd0102 32 e0
-> d0c002 1e 000000000006 fe 140412fa01f8fb0104fc012ef701d8f8013ef901a0 69 e0
<- d0c002 1e 000000000006 fe 140512fa01f8fb0104fc012ef701d8f8013ef901a0 68 e0
-> d0c002 30 000000000006 fe 1207240201f04101324301e24401126201006301c2ea01fe5a01155c0117730100f70400000000 ce e0
<- d0c002 30 000000000006 fe 1206240201f04101324301e24401126201006301c2ea01fe5a01155c0117730100f70400000000 cf e0
-> d0c002 1c 000000000008 fe 13021032004000440043007500760077007800 80 e0
<- d0c002 26 000000000008 fe 13031a3201234001ff4401f043010f7501f07601497702004478020050 3f e0
-> d0c002 22 000000000009 fe 1402163200f600f400f300f5003900 e000e400e800e900e600 2b e0
<- d0c002 39 000000000009 fe 14032d3201fef601fef403150224f303130709f501053902d0b8e0040000e635e40400040dcbe801fee90103e6022710 93 e0
-> d0c002 0f 00000000000a fe 14040337010f c3 e0
<- d0c002 0f 00000000000a fe 14050337010f c2 e0
-> d0c002 18 00000000000b fe 14040c170115180105190127fd0102 3d e0
<- d0c002 18 00000000000b fe 14050c170115180105190127fd0102 3c e0
-> d0c002 22 00000000000c fe 1402163200f600f400f300f5003900 e000e400e800e900e600 2e e0
<- d0c002 39 00000000000c fe 14032d3201fef601fef403150224f303130709f501053902d0b8e0040000e635e40400040dcbe801fee90103e6022710 96 e0
-> d0c002 1e 00000000000d fe 140412fa01f8fb0104fc012ef701d8f8013ef901a0 62 e0
<- d0c002 1e 00000000000d fe 140512fa01f8fb0104fc012ef701d8f8013ef901a0 63 e0
-> d0c002 0f 00000000000e fe 1404033801f0 37 e0
<- d0c002 0f 00000000000e fe 1405033801f0 36 e0
-> d0c002 0f 00000000000f fe 14040337010f c6 e0
<- d0c002 0f 00000000000f fe 14050337010f c7 e0
-> d0c002 0f 000000000010 fe 14040337010f d9 e0
<- d0c002 0f 000000000010 fe 14050337010f d8 e0
-> d0c002 18 000000000011 fe 14040c170115180105190127fd0102 27 e0
<- d0c002 18 000000000011 fe 14050c170115180105190127fd0102 26 e0
-> d0c002 1e 000000000012 fe 140412fa01f8fb0104fc012ef701d8f8013ef901a0 7d e0
<- d0c002 1e 000000000012 fe 140512fa01f8fb0104fc012ef701d8f8013ef901a0 7c e0
-> d0c002 0f 000000000013 fe 1404033801f0 2a e0
<- d0c002 0f 000000000013 fe 1405033801f0 2b e0
-> d0c002 0f 000000000014 fe 14040337010f dd e0
<- d0c002 0f 000000000014 fe 14050337010f dc e0
-> d0c002 0f 000000000015 fe 1404033801f0 2c e0
<- d0c002 0f 000000000015 fe 1405033801f0 2d e0
-> d0c002 0f 000000000016 fe 14040337010f df e0
<- d0c002 0f 000000000016 fe 14050337010f de e0
-> d0c002 0f 000000000017 fe 1404033801f0 2e e0
<- d0c002 0f 000000000017 fe 1405033801f0 2f e0
-> d0c002 0f 000000000018 fe 14040337010f d1 e0
<- d0c002 0f 000000000018 fe 14050337010f d0 e0
-> d0c002 0f 000000000019 fe 1404033801f0 20 e0
<- d0c002 0f 000000000019 fe 1405033801f0 21 e0
-> d0c002 0f 00000000001a fe 14040337010f d3 e0
<- d0c002 0f 00000000001a fe 14050337010f d2 e0

