package com.example.agvcontroller.protocol;
|
|
import io.netty.buffer.ByteBuf;
|
|
/**
|
* 校验工具类
|
* Created by vincent on 2019-04-03
|
*/
|
public class ValidUtil {
|
|
public static final Integer MAX_DEFAULT = 65531;
|
|
/**
|
* 校验消息中数值是否在对应允许的范围内
|
* @param item 被校验数据值
|
* @param min 允许的最小值
|
* @param max 允许的最大值
|
*/
|
public static boolean rangeValid(int item, int min, int max) {
|
return !(item < min || item > max);
|
}
|
|
/**
|
* 异或校验包完整
|
* 从命令单元(第三个字节)开始,一次与后一个字节异或,直至倒数第二个字节。
|
* 将异或的结果与报文中最后一个字节比较。
|
* -相等:报文完整
|
* -不相等:报文不完整
|
*/
|
public static boolean validPac(AgvPackage pac) {
|
ByteBuf buf = pac.getSourceBuff();
|
return getValdByteInMsg(pac) == calculateValidByteFromBuff(buf);
|
}
|
|
/**
|
* 从当前数据包计算校验码
|
*/
|
public static int calculateValidByteFromBuff(ByteBuf buf) {
|
buf.resetReaderIndex();
|
byte[] bytes = new byte[buf.readableBytes() - PackagePart.VALIDE_CODE.getLen()];
|
buf.readBytes(bytes);
|
int currValidByte = CRCUtils.crc16(bytes);
|
// 重置读指针
|
buf.resetReaderIndex();
|
return currValidByte;
|
}
|
|
/**
|
* 获取当前数据包中的校验码(最后一位字节)
|
*/
|
public static int getValdByteInMsg(AgvPackage pac) {
|
return pac.getValidCode();
|
}
|
|
}
|