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