破解胜利万用电表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 |
推测:
- 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
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平台也被破解了。
剩下就是写方法,建造了。