使用netty自定义协议

该博客详细介绍了如何使用Netty实现一个自定义TCP协议,该协议包含帧头、BCD码时间、功能码、可变长度的数据、CRC16-modbus校验、消息唯一标识以及帧尾。时间字段以BCD码表示,年份仅发送后两位。协议编码器和解码器、TCP服务器、心跳检查以及服务器端处理逻辑的实现也进行了说明。
摘要由CSDN通过智能技术生成
  1. 报文采用CRC16-modbus校验,低字节在前,高字节在后;校验范围从时间开始到数据结束
  2. 时间采用BCD码格式,年份只发后两个数字,如2019年只发19年:具体为:年、月、日、时、分、秒;如2019年10月17日22时07分32秒发送的数据为:0x19 0x10 0x17 0x22 0x07 0x32
  3. 协议格式:帧头+时间+功能码+数据+CRC16校验+消息唯一标识+帧尾,消息唯一标识采用8字节

  4. 帧头 0x7E 0x7F     2字节

  5. 时间为BCD码    6字节

  6. 功能码为0xA1    1字节

  7. 数据为0x00     字节数不固定 

  8. crc16校验    2两字节

  9. 消息唯一标识是 8字节 long类型

  10. 帧尾 0x16  1字节

  11. 消息最短是 2+6+1+1+2+8+1

  12. 自定义协议消息封装

    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 = 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非ban必选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值