【发布时间】:2012-11-01 09:28:01
【问题描述】:
tl;博士;
我需要做的是对串行命令进行逆向工程,这样我就可以弄清楚 human readable 值或 binary 值是如何被序列化为的原始串行命令。
IE:
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.
我正在开发一个开源自动化项目的包装器。
有一种方法可以发送raw 命令,理论上可以将多个命令串在一起。
我已经嗅探了一些串行命令,它们就是这个样子。
[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
我需要做的是对其进行逆向工程,以便我可以通过编程方式进行串行调用,或者更好的是,弄清楚 人类可读 值或 二进制 值被序列化为原始串行命令。
是的,我可以嗅探所有命令并分别存储每个值,但我想知道这是如何完成的。
这是我目前的观察结果。
- 呼叫分为两个。
-
04被启动并告诉设备要寻找什么 -
**告诉系统哪个设备正在被控制 [HouseCode&DeviceCode] - 返回十六进制
55告诉你它准备好了 -
06被启动并告诉设备会发生什么 -
**告诉系统房屋代码和命令 [HouseCode&FunctionCode]-
**是可选发送的,它是一个介于 0 和 100 之间的值,用于引用暗度级别
-
- hex
55再次被发送回来告诉你它准备好了
-
- 第二对使用第一个字符作为字母代码(
HouseCode= A、B、C 等),第二个字符是地址(DeviceCode= 1、2、3 等)- 有了这些信息,我个人的猜测是......
-
6必须直接对应A -
e必须直接对应B
-
- 有了这些信息,我个人的猜测是......
- 第四对以与第二对相同的
HouseCode开头 - 第四对以
FunctionCode结尾- 1 = 全部开启
- 2 = 开启
- 3 = 关闭
- 4 = 昏暗
- 5 = 明亮
- 6 = 全部关闭
- 等等..
- 第五对仅在亮/暗命令上显示,代表 0 到 100 之间的数字
最后,在文档中,每个命令都与二进制数据相关,因此可能不是将A1 转换为hex,而是将binary 转换为@987654348 @。
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吗? x10.com/activehomepro/sdk/index.html那里也有一个论坛,最好的地方问。
-
我正在使用 SDK。这就是
sendplc和sendrawplc的来源。不幸的是,他们的文档没有告诉我们这些十六进制调用是如何生成的。 -
我的意思是 ** 没有 ** [english much :(]
-
呃,这不是一个 SDK。您可以使用 SysInternals 的 PortMon 实用程序来监视串行端口流量。
-
是的,我实际上正在使用Device Monitoring Studio 来嗅探当前的流量。我可以手动推断每个命令,但我更想知道它是如何生成的。
标签: c# serial-port hex reverse-engineering x10