直接先上手,协议、代码、工具在下面。
以最广泛的UL33后台协议V150进行分析:
发送命令:7e 31 37 30 31 32 41 43 30 45 30 30 32 30 30 46 44 31 41 0d
命令拆分:
序号 | 符号 | 表示意义 | 字节数 | 命令 | 备注 |
1 | SOI | 起始标志位 | 1 | 7E | 7E |
2 | VER | 通讯协议版本号 | 1 | 31 37 | 版本号为1.7 |
3 | ADR | 设备地址描述 | 1 | 30 31 | 通讯地址为01 |
4 | CID1 | 控制标识码 | 1 | 32 41 | 2A |
5 | CID2 | 命令信息:控制标识码 响应信息:返回码RTN | 1 | 43 30 | C0 |
6 | LENGTH | INFO字节长度 | 2 | 45 30 30 32 | E002 |
7 | INFO | 命令信息:控制数据信息 应答信息:应答数据信息 | 1 | 30 30 | 00 |
8 | CHKSUM | 校验和码 | 2 | 46 44 31 41 | 通过计算工具进行计算 |
9 | EOI | 结束码 | 1 | 0D | 0D |
LENGTH 计算代码:
//@感谢冰思雨博主支持
public class LeetCode {
private final byte chkSum;
private final short lenId;
public LeetCode(short value) {
this.lenId = (short) (value & 0x0FFF);
this.chkSum = (byte) ((~((( (value >>> 8) & 0x0F) + ((value >>> 4) & 0x0F) + (value & 0x0F)) % 16) + 1) & 0x0F);
}
public byte getChkSum(){
return chkSum;
}
public short getLenId() {
return lenId;
}
public short getValue() {
return (short) (chkSum << 12 | lenId);
}
private String toBinaryString() {
return String.format("%04d %04d %04d %04d",
Integer.parseInt(Integer.toBinaryString(getChkSum())),
Integer.parseInt(Integer.toBinaryString(getLenId()>>>8)),
Integer.parseInt(Integer.toBinaryString((getLenId() >>> 4) & 0x0F)),
Integer.parseInt(Integer.toBinaryString(getLenId() & 0x0F)));
}
public String toHexString() {
return Integer.toHexString(getValue() & 0xFFFF);
}
@Override
public String toString() {
return toHexString().toUpperCase() + "H";
}
public static void main(String[] args) {
LeetCode leetCode = new LeetCode(Short.parseShort("000000000010", 2));//000000000010为INFO的字节数,若为4字节则为,000000000100
System.out.println(Integer.toBinaryString(leetCode.getChkSum()));
System.out.println(Integer.toBinaryString(leetCode.getLenId()));
System.out.println(leetCode.toBinaryString());
System.out.println(leetCode);
}
}
CHKSUM计算工具: 电总协议校验和工具(免费电总协议校验助手)V1.1绿色免费版.rar-嵌入式文档类资源-CSDN下载