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

浙公网安备 33010602011771号