破解胜利万用电表RS232转USB,通讯协议

本文详细记录了解密Victor 70C电表通过RS232转USB通信协议的过程。通过分析数据文件wendu.dm和dianya.dm,发现数据加密且与时间戳相关。在尝试编辑文件后,确认协议加密,时间跨度异常。作者提供了Linux下分析数据的路径及可能的反向工程方法,表明电表数据包括温度、电阻等信息,并已成功在Windows和Linux平台上破解协议。
买了一个VC86D万用电表,支持RS232转USB,可以通过串口在电脑上显示读数。

采用的官方软件,读表的结果是

例如:温度采集进行中:



将采集的温度数据保存到wendu.dm 文件中

将采集的电压数据保存到dianya.dm文件中



wendu.dm文件


温度采集过的数据结果:





dianya.dm文件

电压实时采集数据结果




用EditPlus 以十六进制查看文件wendu.dm 和 dianya.dm


这个是温度的



推测在十六进制里面00是标志开始位,E4 40 是每条消息停止位。00 ~ E4 40 中间的这些消息是一条信息。

通过用查看wendu.dm文件


每条信息的内容为

序号数值        单位档位时间                           
1004.8·C温度2012-12-30 13:01:43
推测:

00 2B 30 30 34 38 20 34  20 00 00 02 3D 0D 0A 6B
4B 31 5F 31 27 E4 40 
这是一条温度信息。以00开始,以E4 40 结束。

对应的能显示的数据为:

.+0048 4 ...=..kK1_1'@
这是一条完整的信息,点是由于不能显示成可见的ASCII码。

推测 上面的0048 是显示数据 4 是数据单位符,这里代表摄氏度C。后面代表的是时间内容,或者包含序号。或者序号是按照文件读取顺序递归增大的。

这里用EditPlus将上面的数据条,复制第二条数据,替换成第三条数据后保存。这样第三条数据也成了第二条

再用软件打开文件查看,是否序列号仍然是1,2,3,4 排列,还是1,2,2,4,5.。。。排列

发现。协议是经过加密的。

不是简单的删除就能继续读。加密后的协议,
查看wendu.dm


发现时间跨度出现异常。这可能是由于editplus操作十六进制文件造成的。不过可以肯定的一点是,序列号是不包含在协议内的。因为从序号1到序号3,中间缺少很多数据。因为是每秒读取多次数据的。第一行与第三行数据中间,其实还穿插着更多的读取数据。

只是由于editplus操作16进制文件的时候出现问题。

推测:

列中:

单位是由于 +0048 4 中的4决定的,也同时决定了档位“温度”。协议中,4这个位,被识别为温度,并且有单位。

同样,我们可以得知在电压中,




也是这个道理,在十六进制中

20

代表空格。

上图信息中,红色框中,推测

00 40
代表 数据信息一般结束位。将一条数据分割为两条数据。左边数据依次是 电压,单位(单位同时决定了档位)。被00 40 分割后,右边代表 时间日期,以

E4 40

结尾

日期格式是

80 00 0D 0A E9
9E FF CA 31 27 
解码后的时间是:

2012-12-30 13:20:41

利用Unix时间戳

将上面时间转换为Unix时间戳为: 1356844841(十位)

上面日期格式正好是10位。推测是协议里时间戳的表示位。
也许被加密了。


相比较 温度数据中,


在第一列中有位:

00 00

之后,也有10位16进制数据:

02 3D 0D 0A 6B
4B 31 5F 31 27 
而用官方自带软件打开的数据日期为:

2012-12-30 13:01:43

转换成Unix时间戳为:

1356843703

推测,这也可能是在时间上进行加密处理了。

这里有16进制转换器:http://www.xiazaiba.com/html/427.html



本人有用到的windows串口调试软件:文件名:调试助手.rar, 访问地址:http://www.kuaipan.cn/file/id_6055547405074991.htm

文件名:Setup_70C_中文版.rar, 访问地址:http://www.kuaipan.cn/file/id_6055547405075399.htm

文件名:dianya.dm, 访问地址:http://www.kuaipan.cn/file/id_6055547405075398.htm

文件名:wendu.dm, 访问地址:http://www.kuaipan.cn/file/id_6055547405075397.htm


++++++++++++++++++++++++++++++++++++更新 2013年1月12日++++++++++++++++++++++++++++++++++++++++++++++++++++

在linux下,有数据如下:

Victor 70C/Info

Jump to: navigation, search

lsusb

$ lsusb -v -d 1244:d237
Bus 001 Device 090: ID 1244:d237 
Device Descriptor:
 bLength                18
 bDescriptorType         1
 bcdUSB               1.10
 bDeviceClass            0 (Defined at Interface level)
 bDeviceSubClass         0 
 bDeviceProtocol         0 
 bMaxPacketSize0         8
 idVendor           0x1244 
 idProduct          0xd237 
 bcdDevice            1.00
 iManufacturer           1 Shenzhen VICTOR HI- TECH CO. LTD.
 iProduct                2 VICTOR Multimeter
 iSerial                 0 
 bNumConfigurations      1
 Configuration Descriptor:
   bLength                 9
   bDescriptorType         2
   wTotalLength           34
   bNumInterfaces          1
   bConfigurationValue     1
   iConfiguration          0 
   bmAttributes         0xa0
     (Bus Powered)
     Remote Wakeup
   MaxPower              100mA
   Interface Descriptor:
     bLength                 9
     bDescriptorType         4
     bInterfaceNumber        0
     bAlternateSetting       0
     bNumEndpoints           1
     bInterfaceClass         3 Human Interface Device
     bInterfaceSubClass      1 Boot Interface Subclass
     bInterfaceProtocol      0 None
     iInterface              2 VICTOR Multimeter
       HID Device Descriptor:
         bLength                 9
         bDescriptorType        33
         bcdHID               1.10
         bCountryCode            0 Not supported
         bNumDescriptors         1
         bDescriptorType        34 Report
         wDescriptorLength      19
         Report Descriptor: (length is 19)
           Item(Global): Usage Page, data= [ 0x01 ] 1
                           Generic Desktop Controls
           Item(Local ): Usage, data= [ 0x00 ] 0
                           Undefined
           Item(Main  ): Collection, data= [ 0x01 ] 1
                           Application
           Item(Local ): Usage, data= [ 0x00 ] 0
                           Undefined
           Item(Global): Logical Minimum, data= [ 0x80 ] 128
           Item(Global): Logical Maximum, data= [ 0x7f ] 127
           Item(Global): Report Size, data= [ 0x08 ] 8
           Item(Global): Report Count, data= [ 0x0e ] 14
           Item(Main  ): Input, data= [ 0x02 ] 2
                           Data Variable Absolute No_Wrap Linear
                           Preferred_State No_Null_Position Non_Volatile Bitfield
           Item(Main  ): End Collection, data=none
     Endpoint Descriptor:
       bLength                 7
       bDescriptorType         5
       bEndpointAddress     0x81  EP 1 IN
       bmAttributes            3
         Transfer Type            Interrupt
         Synch Type               None
         Usage Type               Data
       wMaxPacketSize     0x0008  1x 8 bytes
       bInterval              10
Device Status:     0x0000
 (Bus Powered)

进入

cd /dev/input

发现插上USB后,多出了一个even12

通过上面用

lsusb -v -d 1244:d237
#v for vander, d for device

 查出是深圳胜利VC70C的芯片。也就是说VC86D, VC86C, VC70C都是一样的HDI转USB接口。而不是传说中的RS232,不会像Arduino中一样在有显示/dev/ttyACM0

实际上是

/dev/input/event12

通过

cat /dev/input/event12

得到一串乱七八糟的循环数据,推测是万用电表的数据。这时候,算是明白了。把这些万用电表的数据转成16进制,在linux下查看,跟windows下是一样的。

利用以往的方法minicom 却不能显示/dev/input/even12的数据,因为根本不是串口

通过裁剪/dev/input/even12的数据

就可以反向推出其原来协议了。

有温度,都有电阻,有电压,有占空比,有电流,有电容,有二极管。等等吧。都可以显示在LED上。也都可以通过USB传到电脑里。HDI方式。

好了。很简单了。理论已经被破解了。linux平台也可破解了。windows平台也被破解了。

剩下就是写方法,建造了。



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值