826220679@qq.com
10 天以前 176cfa1a137d2050d4e8a105dfdbdc8f1b32afb2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package dell_system;
import dell55AAData.Dell55AA12HighPerf;
import dell55AAData.Dell55AA12HighPerf.ParseResult;
import dell55AAData.Dell55AA01Parser;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ResourceBundle;
 
/**
 * ¹«¹²½âÎöÆ÷£º¸ù¾Ý°üͷͳһ½âÎö 55AA01 / 55AA12 / Î´ÖªÐ­Òé
 * ¿É±»ÈκΠUI »òÒµÎñÀàÖ±½Óµ÷ÓÃ
 */
public final class SerialPacketParser {
 
    private static final SimpleDateFormat SDF = new SimpleDateFormat("HH:mm:ss.SSS");
 
    private SerialPacketParser() { /* ¹¤¾ßÀ࣬½ûֹʵÀý»¯ */ }
 
    /**
     * ½âÎöÈë¿Ú
     *
     * @param data     ÍêÕû×Ö½ÚÊý×é
     * @param bundle   ¹ú¼Ê»¯×ÊÔ´
     * @param showTime ÊÇ·ñÔÚ½á¹ûǰ¼Óʱ¼ä´Á
     * @return ½âÎöºóµÄ¿É¶Á×Ö·û´®£¬Èô½âÎöʧ°Ü·µ»ØÌáʾ
     */
    public static String parse(byte[] data,ResourceBundle bundle,boolean showTime) {
        String hex = bytesToHex(data).toUpperCase();
        StringBuilder sb = new StringBuilder();
        if (showTime) {
            sb.append('[').append(SDF.format(new Date())).append("]");
        }
 
        if (hex.startsWith("55AA01")) {
            Dell55AA01Parser.ParseResult r = Dell55AA01Parser.parse(hex,"127.0.0.1", 0);
            if (r == null) {
                sb.append(bundle.getString("parser.invalid")).append(" 55AA01");
                return sb.toString();
            }
 
            String button = r.buttonPressed ? bundle.getString("yes") : bundle.getString("no");
            sb.append(bundle.getString("label.sequence")).append(": ").append(r.sequenceNum).append(',')
              .append(bundle.getString("label.id")).append(": ").append(r.tagId).append(',')
              .append(bundle.getString("label.anchor_ids")).append(": ").append(r.anchorId).append(',')
              .append(bundle.getString("label.distances")).append(": ").append(r.distance).append(',')
              .append(bundle.getString("label.power")).append(": ").append(r.power).append("%,")
              .append(bundle.getString("status.button")).append(": ").append(button);
 
        } else if (hex.startsWith("55AA12")) {
            ParseResult r = Dell55AA12HighPerf.parse(hex);
            if (r == null) {
                sb.append(bundle.getString("parser.invalid")).append(" 55AA12");
                return sb.toString();
            }
 
            // ×é×°»ùÕ¾ÐÅÏ¢
            StringBuilder ids = new StringBuilder();
            StringBuilder dists = new StringBuilder();
            StringBuilder powers = new StringBuilder();
            for (int i = 0; i < r.anchorCount; i++) {
                if (i > 0) {
                    ids.append(',');
                    dists.append(',');
                    powers.append(',');
                }
                ids.append(r.anchorIds[i]);
                dists.append(r.distances[i]);
                powers.append(r.anchorPowers[i]);
            }
 
            String button   = r.sosButtonPressed ? bundle.getString("yes") : bundle.getString("no");
            String stat     = r.isStatic        ? bundle.getString("yes") : bundle.getString("no");
            String sleep    = r.isSleeping      ? bundle.getString("yes") : bundle.getString("no");
            String vibrate  = (r.vibrationState == 1) ? bundle.getString("on") : bundle.getString("off");
            String uwb      = r.tagRemoved      ? bundle.getString("off") : bundle.getString("on");
 
            sb.append(bundle.getString("label.id")).append(": ").append(r.tagId).append('\n')
              .append(bundle.getString("label.sequence")).append(": ").append(r.sequenceNum).append('\n')
              .append(bundle.getString("label.power")).append(": ").append(r.power).append("%\n")
              .append(bundle.getString("label.status")).append(": ")
              .append(bundle.getString("status.button")).append('[').append(button).append("], ")
              .append(bundle.getString("status.static")).append('[').append(stat).append("], ")
              .append(bundle.getString("status.sleeping")).append('[').append(sleep).append("], ")
              .append(bundle.getString("status.vibration")).append('[').append(vibrate).append("], ")
              .append(bundle.getString("status.uwb_switch")).append('[').append(uwb).append("]\n")
              .append(bundle.getString("label.tag_height")).append(": ").append(r.tagHeight).append('\n')
              .append(bundle.getString("label.anchor_count")).append(": ").append(r.anchorCount).append('\n')
              .append(bundle.getString("label.anchor_ids")).append(": (").append(ids).append(")\n")
              .append(bundle.getString("label.distances")).append(": (").append(dists).append(")\n")
              .append(bundle.getString("label.anchor_powers")).append(": (").append(powers).append(")\n");
 
        } else {
            sb.append(bundle.getString("parser.unknown"));
        }
 
        sb.append("\n");
        return sb.toString();
    }
 
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 2);
        for (byte b : bytes) sb.append(String.format("%02X", b));
        return sb.toString();
    }
}