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); } } }