- 报文采用CRC16-modbus校验,低字节在前,高字节在后;校验范围从时间开始到数据结束
- 时间采用BCD码格式,年份只发后两个数字,如2019年只发19年:具体为:年、月、日、时、分、秒;如2019年10月17日22时07分32秒发送的数据为:0x19 0x10 0x17 0x22 0x07 0x32
-
协议格式:帧头+时间+功能码+数据+CRC16校验+消息唯一标识+帧尾,消息唯一标识采用8字节
-
帧头 0x7E 0x7F 2字节
-
时间为BCD码 6字节
-
功能码为0xA1 1字节
-
数据为0x00 字节数不固定
-
crc16校验 2两字节
-
消息唯一标识是 8字节 long类型
-
帧尾 0x16 1字节
-
消息最短是 2+6+1+1+2+8+1
-
自定义协议消息封装
package com.pjmike.netty.server; public class SmartCarProtocolOne { /** * 消息的开头的信息标志 */ private byte[] head_data = new byte[]{0x7E, 0x7F}; /** * 时间bcd码 */ private byte[] date; /** * 消息的内容 */ private byte content; /** * 命令 */ private byte[] cmd; /** * crc16校验 */ private byte[] crc; /** * 消息id */ private long id; /** *消息尾 */ private byte tail = 0x16; public SmartCarProtocolOne() { } public SmartCarProtocolOne(byte[] date, byte content, byte[] cmd) { this.date = date; this.content = content; this.cmd = cmd; int length = date.length +1+cmd.length; byte[] b = new byte[length]; for (int i = 0; i < b.length;) { for (int j = 0; j < date.length; j++) { b[i] = date[j]; i = i+1; } b[i] = content; i = i+1; for (int k = 0; k < cmd.length; k++) { b[i] = cmd[k]; i = i+1; } } this.crc = CRC16MUtil.getCRC(b); } public byte[] getHead_data() { return head_data; } public void setHead_data(byte[] head_data) { this.head_data = head_data; } public byte[] getDate() { return date; } public void setDate(byte[] date) { this.date = date; } public byte getContent() { return content; } public void setContent(byte content) { this.content = content; } public byte[] getCmd() { return cmd; } public void setCmd(byte[] cmd) { this.cmd = cmd; } public byte getTail() { return tail; } public void setTail(byte tail) { this.tail = tail; } public byte[] getCrc() { return crc; } public void setCrc(byte[] crc) { this.crc = crc; } public long getId() { return id; } public void setId(long id) { this.id =
使用netty自定义协议
最新推荐文章于 2023-11-27 22:23:48 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)