反向工程串行命令

8

简述;

我需要能够反向工程串行命令,以便我可以弄清楚人类可读的值或二进制值是如何被序列化为原始串行命令的。

例如:

if
   66 = 'A1' or '0110 1'
   6e = 'A2' or '0110 2'
   e6 = 'B1' or '1110 1'
   ee = 'B2' or '1110 2'
then
   what is A3 or B3, etc.

我正在为一个开源自动化项目编写包装器。

有一种方法可以发送原始命令,并理论上将多个命令字符串连接在一起。
我嗅探了一些串行命令,这就是它们的样子。

[init] [HouseCode | DeviceCode] [ready] [HouseCode | FunctionCode]   

04 66 06 62       // A1 ON
04 6e 06 62       // A2 ON 
04 62 06 62       // A3 ON
04 6a 06 62       // A4 ON
04 61 06 62       // A5 ON
04 69 06 62       // A6 ON
04 65 06 62       // A7 ON
04 6d 06 62       // A8 ON
04 67 06 62       // A9 ON
04 6f 06 62       // A10 ON
04 63 06 62       // A11 ON
04 6b 06 62       // A12 ON
04 60 06 62       // A13 ON
04 68 06 62       // A14 ON
04 64 06 62       // A15 ON
04 6c 06 62       // A16 ON

04 e6 06 e2       // B1 ON 
04 ee 06 e2       // B2 ON  
04 e2 06 e2       // B3 ON 
04 ea 06 e2       // B4 ON 
....
04 ec 06 e2       // B16 ON
04 66 06 63       // A1 Off
04 e6 06 e3       // B1 Off

04 66 06 61       // All A lights On (using A1 as the starting point)
04 e6 06 e1       // All B lights On (using B1 as the starting point)
04 66 06 66       // All A lights Off (using A1 as the starting point)
04 e6 06 66       // All B lights Off (using A1 as the starting point)

04 66 06 64 2a    // A1 Dim 20
04 66 06 64 2c    // A1 Dim 21
04 66 06 64 2e    // A1 Dim 22

04 66 06 65 2a    // A1 Bright 20
04 66 06 65 69    // A1 Bright 50

我需要做的是逆向工程,以便我可以通过程序制作串行调用,或者更好地找出人类可读的值或二进制值如何被序列化为原始串行命令。
是的,我可以嗅探所有命令并单独存储每个值,但我想知道是如何实现的。
这是我目前的观察结果。
1. 调用被分成两部分。 - "04"被启动并告诉设备要查找什么 - "**"告诉系统正在控制哪个设备 [HouseCode和DeviceCode] - 十六进制数"55"返回给你,表示它已准备就绪 - "06"被启动并告诉设备要期望什么 - "**"告诉系统房屋代码和命令[HouseCode和FunctionCode] - "**"可选发送,是0到100之间的值,用于引用亮度级别 - 十六进制数"55"再次发送回来告诉你它已准备就绪
2. 第二对使用第一个字符作为字母代码(HouseCode = A、B、C等),第二个字符是地址(DeviceCode = 1、2、3等) - 根据这些信息,我个人的猜测是... - "6"必须直接对应于"A" - "e"必须直接对应于"B"
3. 第四对以第二对的HouseCode开头 4. 第四对以FunctionCode结尾 - 1 = 全部打开 - 2 = 打开 - 3 = 关闭 - 4 = 调暗 - 5 = 调亮 - 6 = 全部关闭 - 等等...
5. 第五对仅在明/暗命令上显示,并表示0到100之间的数字。
最后,在文档中,每个命令都与二进制数据相关,因此它可能不是将"A1"转换为"hex"的问题,而是将二进制转换为"hex"的问题。
HouseCode       DeviceCode      Binary Value
    A               1               0110
    B               2               1110
    C               3               0010
    D               4               1010
    E               5               0001
    F               6               1001
    G               7               0101
    H               8               1101
    I               9               0111
    J               10              1111
    K               11              0011
    L               12              1011
    M               13              0000
    N               14              1000
    O               15              0100
    P               16              1100

FunctionCode                    Binary Value
All Units Off                   0000
All Lights On                   0001
On                              0010
Off                             0011
Dim                             0100
Bright                          0101
All Lights Off                  0110
Extended Code                   0111
Hail Request                    1000
Hail Acknowledge                1001
Pre-set Dim (1)                 1010
Pre-set Dim (2)                 1011
Extended Data Transfer          1100
Status On                       1101    
Status Off                      1110
Status Request                  1111

有人知道我如何实现这一点吗?


你不能只是使用他们的SDK吗?http://www.x10.com/activehomepro/sdk/index.html 那里还有一个论坛,是提问的最佳地点。 - Hans Passant
我正在使用SDK。这就是sendplcsendrawplc的来源。不幸的是,它们的文档没有告诉我们如何生成这些十六进制调用。 - Chase Florell
我的意思是 不太懂 [英语:(] - Chase Florell
1
额,那不算是一个很好的SDK。您可以使用SysInternals的PortMon实用程序来监视串口流量。 - Hans Passant
是的,我目前实际上正在使用Device Monitoring Studio来嗅探流量。我可以手动推断出每个命令,但我更想知道它是如何生成的。 - Chase Florell
ps:@HansPassant,我在他们的论坛上也有一个开放的主题。不幸的是,看起来嗅探每个命令将是最简单的方法,但不幸的是它并不完全符合DRY原则。 - Chase Florell
1个回答

1

Heyu是一款非常棒的开源应用程序,可用于处理X10设备。他们基于X10的原始文档发布了一个非常全面的X10协议规范

这将消除您工作中的猜测。重要的是,housecode和unitcode是静态映射,无法计算。协议规范准确地指定了比特流的形成方式。例如:

PC      Interface   Description
0x04,0x66           Address A1
        0x6a        Checksum ((0x04 + 0x66)&0xff)
0x00                OK for transmission.
        0x55        Interface ready.

0x86,0x64           Function: A Dim 16/22*100%
        0xea        Checksum ((0x86 + 0x64)&0xff)
0x00                OK for transmission.
        0x55        Interface ready.

第1.1节正是我所需要的。据我所见... [6=a=1] 和 [e=b=2].. 这就是我缺失的部分。现在只需找出数字 1100 的编码方法以进行调光。 - Chase Florell
@ChaseFlorell,我认为大家都误解了你的问题。你是想将二进制转换成十六进制吗?串行监视器中的十六进制输出只是二进制的表示形式。虽然我不是C#编码人员,但显然你可以这样做:byte b = Convert.ToByte("1110", 2),然后将b与十六进制进行比较。例如0xE或直接发送b - Alastair McCormack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接