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

http://blog.csdn.net/spaceship20008/article/details/8452734

我原来的一篇博客,是用来破解胜利电表的。

破解好的代码使用地址:https://github.com/mvneves/victor70c

经常使用的bash tutorial http://www.tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html

原来的东西如下:

买了一个VC86D万用电表,支持RS232转USB,可以通过串口在电脑上显示读数。

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

例如:温度采集进行中:



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

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



wendu.dm文件


温度采集过的数据结果:





dianya.dm文件

电压实时采集数据结果




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


这个是温度的



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

通过用查看wendu.dm文件


每条信息的内容为

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

推测:

  1. 00 2B 30 30 34 38 20 34  20 00 00 02 3D 0D 0A 6B  
  2. 4B 31 5F 31 27 E4 40   

这是一条温度信息。以00开始,以E4 40 结束。

对应的能显示的数据为:

  1. .+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这个位,被识别为温度,并且有单位。

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




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

  1. 20  


代表空格。

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

  1. 00 40  

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

  1. E4 40  


结尾

日期格式是

  1. 80 00 0D 0A E9  
  1. 9E FF CA 31 27   

解码后的时间是:

2012-12-30 13:20:41

利用Unix时间戳

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

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


相比较 温度数据中,


  1.   

在第一列中有位:

  1. 00 00  


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

  1. 02 3D 0D 0A 6B  
  2. 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

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

通过上面用

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


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

实际上是

/dev/input/event12

通过

  1. cat /dev/input/event12  


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

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

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

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

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

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

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

原文地址:https://www.cnblogs.com/spaceship9/p/2991242.html