张世豪
18 小时以前 a541fbdc8812337de120aad3792a2033a5dd7afe
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package Mqttmessage.Util;
 
 
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import Mqttmessage.Entity.GPSData;
import Mqttmessage.Entity.ResponseData;
 
/**
 * 设备消息解析工具类 - 支持GPS数据、状态数据和响应数据的解析
 */
public class DeviceMessageParser {
 
    private static final ObjectMapper objectMapper = new ObjectMapper();
 
    static {
        // 配置ObjectMapper
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }
 
 
    /**
     * 解析为GPS数据对象(支持新协议格式,包含GPS、IMU和状态数据)
     * @param jsonStr JSON字符串
     * @return GPSData对象
     * @throws JsonProcessingException 解析异常
     */
    public static GPSData parseGPSData(String jsonStr) throws JsonProcessingException {
        GPSData gpsData = objectMapper.readValue(jsonStr, GPSData.class);
 
        // 可选:解析GGA数据
       /* if (gpsData.getGps_raw() != null && gpsData.getGps_raw().startsWith("$GNGGA")) {
            GPSData.GGAData ggaData = parseGGA(gpsData.getGps_raw());
            gpsData.setGgaData(ggaData);
        }*/
 
        return gpsData;
    }
 
 
 
    /**
     * 解析为响应数据对象
     * @param jsonStr JSON字符串
     * @return ResponseData对象
     * @throws JsonProcessingException 解析异常
     */
    public static ResponseData parseResponseData(String jsonStr) throws JsonProcessingException {
        return objectMapper.readValue(jsonStr, ResponseData.class);
    }
 
    /**
     * 解析GGA格式的GPS数据(可选功能)
     * @param ggaString GGA格式字符串
     * @return GGAData对象
     */
    /*public static GPSData.GGAData parseGGA(String ggaString) {
        // 移除可能的校验和部分
        String cleanString = ggaString.split("\\*")[0];
        String[] fields = cleanString.split(",");
 
        if (fields.length < 15) {
            return null;
        }
 
        GPSData.GGAData ggaData = new GPSData.GGAData();
 
        try {
            ggaData.setUtcTime(fields[1]);
            ggaData.setLatitude(fields[2]);
            ggaData.setLatitudeDir(fields[3]);
            ggaData.setLongitude(fields[4]);
            ggaData.setLongitudeDir(fields[5]);
 
            if (!fields[6].isEmpty()) {
                ggaData.setGpsQuality(Integer.parseInt(fields[6]));
            }
 
            if (!fields[7].isEmpty()) {
                ggaData.setSatellites(Integer.parseInt(fields[7]));
            }
 
            if (!fields[8].isEmpty()) {
                ggaData.setHdop(Double.parseDouble(fields[8]));
            }
 
            if (!fields[9].isEmpty()) {
                ggaData.setAltitude(Double.parseDouble(fields[9]));
            }
 
            ggaData.setAltitudeUnit(fields[10]);
 
            if (!fields[11].isEmpty()) {
                ggaData.setGeoidSep(Double.parseDouble(fields[11]));
            }
 
            ggaData.setGeoidSepUnit(fields[12]);
 
            if (fields.length > 13) {
                ggaData.setAge(fields[13]);
            }
 
            if (fields.length > 14) {
                ggaData.setStationId(fields[14]);
            }
 
        } catch (Exception e) {
            // 解析异常,返回部分解析的数据或null
            System.err.println("解析GGA数据时出错: " + e.getMessage());
        }
 
        return ggaData;
    }*/
 
    /**
     * 将消息对象转换为JSON字符串
     * @param message 消息对象(GPSData、StatusData或ResponseData)
     * @return JSON字符串
     * @throws JsonProcessingException 转换异常
     */
    public static String toJson(Object message) throws JsonProcessingException {
        return objectMapper.writeValueAsString(message);
    }
 
    /**
     * 获取ObjectMapper实例(用于高级操作)
     * @return ObjectMapper实例
     */
    public static ObjectMapper getObjectMapper() {
        return objectMapper;
    }
 
    /**
     * 消息类型枚举
     */
    public enum MessageType {
        GPS("gps"),
        STATUS("status"),
        RESPONSE("response");
 
        private final String type;
 
        MessageType(String type) {
            this.type = type;
        }
 
        public String getType() {
            return type;
        }
 
        public static MessageType fromString(String type) {
            for (MessageType mt : MessageType.values()) {
                if (mt.type.equalsIgnoreCase(type)) {
                    return mt;
                }
            }
            throw new IllegalArgumentException("未知的消息类型: " + type);
        }
    }
}