zoukankan      html  css  js  c++  java
  • 破解胜利万用电表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平台也被破解了。

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

  • 相关阅读:
    20191224 Spring官方文档(Overview)
    20191224 Spring官方文档(启动)
    20191209 【归档】Linux就该这么学
    20191209 Linux就该这么学(6)
    20191209 Linux就该这么学(5)
    20191209 Linux就该这么学(4)
    20191209 Linux就该这么学(1-3)
    20191128 Spring Boot官方文档学习【目录】
    加密在卷积神经网络上的应用
    Federated Optimization: Distributed Machine Learning for On-Device Intelligence
  • 原文地址:https://www.cnblogs.com/spaceship9/p/2991242.html
Copyright © 2011-2022 走看看