本文为看雪论坛优秀文章
看雪论坛作者ID:blck四
平时研究二进制漏洞和内核遇到的问题都在看雪得到了答案,也很感谢这些前辈将自己解决问题的思路共享出来,让后人少踩坑。
设备信息和结构组成
参数信息:
功能配置:
组成结构:
通讯方式
从电表的详细参数可以得知主要支持的通讯方式为脉冲通讯和载波通讯,该款电表支持使用载波RS485协议建立通讯连接,RS485是串口的一种,常见的还有RS232,RS422都属于串口,485是半双工通讯,传输速率在10Mbps左右,发送数据的时候,控制CTRL为高电平,数据通过TXD发送出去(这个在电表图中右下角的位置),要接收数据的时候,控制CTRL为低电平,数据通过RXD(这个在电表图中右下角第二的位置)接收回来实现收发,简单说就是把TTL的“0-3.3V/5V之间摆动”的信号,转换为“5V压差颠倒反转的AB线信号”。
最左侧的编号从5开始到12分别代表了对外的接口,每个接口都各自对应在PCB上。
我使用了RS485用子线接A/B后进行异步串行通信,如下图所示。 正对正负对负(data+ data-)。
如果出现部分通信不正常,可以确定问题是否出现在转接器中(我在实际实验过程中就出现了转接器故障最后通过短接测试才发现问题出在哪,最后买了一个新的转接器)转换器子线正接正、负接负进行短接测试。
通过系统设备管理器查看是否有COM口已经接入,如果有就可以串口通信了,一般波特率可以设置在2400或者9600其中一个,校验位改成“偶校验”。
波特率的字节格式每字节含8位二进制码,传输时加上一个起始位(0)、一个偶校验位和一个停止位(1)共11位。如下图,D0是字节的最低有效位,D7是字节的最高有效位。先传低位,后传高位。
尝试发送数据看看是否能够正常接收到数据,因为是短接测试所以发送什么数据就会收到什么数据。
如果收不到数据可能你的转换接口或者子线接入是有问题的。以上测试完成后就可以给电表上电了,先将转接器一头接入电脑USB,然后将子线接入电表RS485 A/B口,记住:正对正负对负。
我这款就是单相电能表,单相电表从左到右有四个接线端依次为1、2、3、4,通过单相电表的剖析图可以得知分火、零两线(1、3为进,2、4为出,1火3零)。
这里我自己制作了简单的一条电线,我使用了1和4口构成电回路(1接3和4都行,别接2火线接火线会跳闸。)
插入插座上电后就可以通过USB打开串口和电表通讯了。
电表有专用的电力通讯标准,也是国家的一个标准统称叫645《DL/T 645》最早在1997年发布一个《DL/T 645-1997》的通讯标准,而后在2007发布《DL/T 645-2007》,现在2007已经替代了1997的标准了,从信息头可以看到。
电力协议是一个相对比较复杂的协议,光看完标准得半个月-1个月。
电表数据读取
目前新表主流还是07版的,下面就解析这两种表通信协议:
标准中提到协议为主/从结构的半双工通信方式。每帧由前导符、帧长度、特征域、地址域、控制域、数据域、校验域、结束符等8个域组成。
那么依据此标准的格式域就可以对电表数据进行读取,在实际应用场景从主节点到基表 MCU 之间的下行和上行数据传输格式如下:
还会遇到中继路由的情况,可能还存在其他场景也挺复杂的,通过串口方式实现一个数据读写的代码来实现数据读取,这里我使用C/C++来完成了。
先尝试读取电表的地址,通过标准可以发现在不知道电表地址的情况下可以使用AAH去替代地址
发送数据:68H AAH AAH AAH AAH AAH AAH 68H 13H 00H DFH 16H
因为写代码花的时间比较少,这里没有把串口同步的代码写上不过没有关系,根据标准的要求提到16H为结束符。(代码写的丑就不贴了)
整理后的数据为:68 89 41 53 20 51 17 68 93 06 BC 74 86 53 84 4A E5 16
根据传输次序-低在前,高在后得到175120534189 为电表的地址,后来我发现该地址其实就是外壳贴条上的那一串No.号。
也可获取如电量数据、电表时间、峰平谷值、用电总量、金额等。
看雪ID:blck四
https://bbs.pediy.com/user-home-748627.htm
*本文由看雪论坛 blck四 原创,转载请注明来自看雪社区
原文始发于微信公众号(看雪学苑):智能电表安全之通讯分析