From 8d662de2fd262b3a485f16e197cb4d0ca2a61cdf Mon Sep 17 00:00:00 2001
From: zsh_root <979909237@qq.com>
Date: 星期三, 10 十二月 2025 17:03:47 +0800
Subject: [PATCH] 发布版V1.0
---
src/jiexi/Dell55AA1FParser.java | 88 ++++++++++++++++++++++----------------------
1 files changed, 44 insertions(+), 44 deletions(-)
diff --git a/src/jiexi/Dell55AA1FParser.java b/src/jiexi/Dell55AA1FParser.java
index e448df6..118fcad 100644
--- a/src/jiexi/Dell55AA1FParser.java
+++ b/src/jiexi/Dell55AA1FParser.java
@@ -2,26 +2,26 @@
import java.util.Arrays;
public class Dell55AA1FParser {
- // 常量定义
- private static final String EXPECTED_HEADER = "55AA1F"; // 协议头
- private static final int MIN_PACKET_LENGTH = 36; // 最小包长度(字符数): 固定字段18字节=36字符
- private static final int FIXED_FIELDS_LENGTH = 11; // 从标签ID到保留字段的固定长度(字节)
+ // 甯搁噺瀹氫箟
+ private static final String EXPECTED_HEADER = "55AA1F"; // 鍗忚澶�
+ private static final int MIN_PACKET_LENGTH = 36; // 鏈�灏忓寘闀垮害(瀛楃鏁�): 鍥哄畾瀛楁18瀛楄妭=36瀛楃
+ private static final int FIXED_FIELDS_LENGTH = 11; // 浠庢爣绛綢D鍒颁繚鐣欏瓧娈电殑鍥哄畾闀垮害(瀛楄妭)
private static final ThreadLocal<ParseResult> RESULT_CACHE =
ThreadLocal.withInitial(ParseResult::new);
- // 解析结果类
+ // 瑙f瀽缁撴灉绫�
public static class ParseResult {
- public int dataLength; // 数据长度
- public int messageType; // 消息类型
- public String tagId; // 标签ID(2字节)
- public int distance; // 距离(厘米)
- public int angle; // 角度(度)
- public int signalQuality; // 信号质量(0-255)
- public int buttonPressed; // 按钮状态
- public int power; // 电量
- public String reserved; // 保留字段
- public String userData; // 用户数据
- public String checksum; // 校验和
+ public int dataLength; // 鏁版嵁闀垮害
+ public int messageType; // 娑堟伅绫诲瀷
+ public String tagId; // 鏍囩ID(2瀛楄妭)
+ public int distance; // 璺濈(鍘樼背)
+ public int angle; // 瑙掑害(搴�)
+ public int signalQuality; // 淇″彿璐ㄩ噺(0-255)
+ public int buttonPressed; // 鎸夐挳鐘舵��
+ public int power; // 鐢甸噺
+ public String reserved; // 淇濈暀瀛楁
+ public String userData; // 鐢ㄦ埛鏁版嵁
+ public String checksum; // 鏍¢獙鍜�
public void reset() {
dataLength = 0;
@@ -39,9 +39,9 @@
}
/**
- * 解析55AA1F协议数据
- * @param message 十六进制字符串
- * @return 解析结果(错误时返回null)
+ * 瑙f瀽55AA1F鍗忚鏁版嵁
+ * @param message 鍗佸叚杩涘埗瀛楃涓�
+ * @return 瑙f瀽缁撴灉(閿欒鏃惰繑鍥瀗ull)
*/
public static ParseResult parse(String message, String ip, int port) {
if (message == null || message.isEmpty()) {
@@ -49,7 +49,7 @@
return null;
}
- // 清洗数据:移除所有非十六进制字符
+ // 娓呮礂鏁版嵁锛氱Щ闄ゆ墍鏈夐潪鍗佸叚杩涘埗瀛楃
char[] cleanedMessage = cleanMessage(message);
if (cleanedMessage == null) {
@@ -57,7 +57,7 @@
return null;
}
- // 检查最小长度
+ // 妫�鏌ユ渶灏忛暱搴�
if (cleanedMessage.length < MIN_PACKET_LENGTH) {
System.err.println("Message too short from " + ip + ":" + port +
". Expected at least " + MIN_PACKET_LENGTH +
@@ -65,7 +65,7 @@
return null;
}
- // 协议头校验 (55AA1F)
+ // 鍗忚澶存牎楠� (55AA1F)
if (cleanedMessage.length < 6 ||
!new String(cleanedMessage, 0, 6).equals(EXPECTED_HEADER)) {
System.err.println("Invalid header in message from " + ip + ":" + port);
@@ -76,11 +76,11 @@
result.reset();
try {
- // 解析数据长度 (位置6-7)
+ // 瑙f瀽鏁版嵁闀垮害 (浣嶇疆6-7)
result.dataLength = HexUtils.fastHexToByte(cleanedMessage[6], cleanedMessage[7]);
- // 计算期望的总字符长度
- int expectedCharLength = 14 + result.dataLength * 2; // 14=包头6+消息类型2+数据长度2+校验和4
+ // 璁$畻鏈熸湜鐨勬�诲瓧绗﹂暱搴�
+ int expectedCharLength = 14 + result.dataLength * 2; // 14=鍖呭ご6+娑堟伅绫诲瀷2+鏁版嵁闀垮害2+鏍¢獙鍜�4
// if (cleanedMessage.length < expectedCharLength) {
// System.err.println("Incomplete message from " + ip + ":" + port +
@@ -89,42 +89,42 @@
// return null;
// }
- // 解析消息类型 (位置4-5)
+ // 瑙f瀽娑堟伅绫诲瀷 (浣嶇疆4-5)
result.messageType = HexUtils.fastHexToByte(cleanedMessage[4], cleanedMessage[5]);
- // 解析标签ID (位置8-11),直接取字符串
+ // 瑙f瀽鏍囩ID (浣嶇疆8-11)锛岀洿鎺ュ彇瀛楃涓�
result.tagId = new String(cleanedMessage, 8, 4);
- // 检查是否有足够长度解析固定字段
- if (cleanedMessage.length < 30) { // 需要至少15字节=30字符
+ // 妫�鏌ユ槸鍚︽湁瓒冲闀垮害瑙f瀽鍥哄畾瀛楁
+ if (cleanedMessage.length < 30) { // 闇�瑕佽嚦灏�15瀛楄妭=30瀛楃
System.err.println("Message too short for fixed fields from " + ip + ":" + port);
return null;
}
- // 解析距离 (位置12-15, 2字节小端整数)
+ // 瑙f瀽璺濈 (浣嶇疆12-15, 2瀛楄妭灏忕鏁存暟)
int distLow = HexUtils.fastHexToByte(cleanedMessage[12], cleanedMessage[13]);
int distHigh = HexUtils.fastHexToByte(cleanedMessage[14], cleanedMessage[15]);
result.distance = (distHigh << 8) | distLow;
- // 解析角度 (位置16-19, 2字节小端有符号整数)
+ // 瑙f瀽瑙掑害 (浣嶇疆16-19, 2瀛楄妭灏忕鏈夌鍙锋暣鏁�)
int angleLow = HexUtils.fastHexToByte(cleanedMessage[16], cleanedMessage[17]);
int angleHigh = HexUtils.fastHexToByte(cleanedMessage[18], cleanedMessage[19]);
short angleShort = (short) ((angleHigh << 8) | angleLow);
result.angle = angleShort;
- // 解析信号质量 (位置20-21)
+ // 瑙f瀽淇″彿璐ㄩ噺 (浣嶇疆20-21)
result.signalQuality = HexUtils.fastHexToByte(cleanedMessage[20], cleanedMessage[21]);
- // 解析按钮状态 (位置22-23)
+ // 瑙f瀽鎸夐挳鐘舵�� (浣嶇疆22-23)
result.buttonPressed = HexUtils.fastHexToByte(cleanedMessage[22], cleanedMessage[23]);
- // 解析电量 (位置24-25)
+ // 瑙f瀽鐢甸噺 (浣嶇疆24-25)
result.power = HexUtils.fastHexToByte(cleanedMessage[24], cleanedMessage[25]);
- // 解析保留字段 (位置26-29)
+ // 瑙f瀽淇濈暀瀛楁 (浣嶇疆26-29)
result.reserved = new String(cleanedMessage, 26, 4);
- // 解析用户数据
+ // 瑙f瀽鐢ㄦ埛鏁版嵁
// int userDataStart = 30;
// int userDataCharLength = (result.dataLength - FIXED_FIELDS_LENGTH) * 2;
// if (userDataCharLength > 0) {
@@ -138,10 +138,10 @@
// result.userData = "";
// }
- // 解析校验和 (最后4个字符)
+ // 瑙f瀽鏍¢獙鍜� (鏈�鍚�4涓瓧绗�)
result.checksum = new String(cleanedMessage, cleanedMessage.length - 4, 4);
- // 验证校验和
+ // 楠岃瘉鏍¢獙鍜�
// byte[] packetBytes = hexStringToByteArray(new String(cleanedMessage));
// if (!verifyChecksum(packetBytes)) {
// System.err.println("Checksum verification failed for packet from " + ip + ":" + port);
@@ -158,7 +158,7 @@
}
/**
- * 将十六进制字符串转换为字节数组
+ * 灏嗗崄鍏繘鍒跺瓧绗︿覆杞崲涓哄瓧鑺傛暟缁�
*/
private static byte[] hexStringToByteArray(String s) {
int len = s.length();
@@ -171,21 +171,21 @@
}
/**
- * 校验数据包
- * 去掉包头求和取反,校验码为小端模式
+ * 鏍¢獙鏁版嵁鍖�
+ * 鍘绘帀鍖呭ご姹傚拰鍙栧弽锛屾牎楠岀爜涓哄皬绔ā寮�
*/
private static boolean verifyChecksum(byte[] packet) {
int len = packet.length;
if (len < 4) return false;
int sum = 0;
- // 从消息类型开始到校验码前结束 (跳过包头2字节)
+ // 浠庢秷鎭被鍨嬪紑濮嬪埌鏍¢獙鐮佸墠缁撴潫 (璺宠繃鍖呭ご2瀛楄妭)
for (int i = 2; i < len - 2; i++) {
sum += packet[i] & 0xFF;
}
- sum = ~sum & 0xFFFF; // 取反并保留16位
+ sum = ~sum & 0xFFFF; // 鍙栧弽骞朵繚鐣�16浣�
- // 获取包中的校验码 (小端模式)
+ // 鑾峰彇鍖呬腑鐨勬牎楠岀爜 (灏忕妯″紡)
int receivedChecksum = ((packet[len - 2] & 0xFF) << 8) | (packet[len - 1] & 0xFF);
return sum == receivedChecksum;
--
Gitblit v1.10.0