安卓对一堆数据进行NMEA数组校验后进行解析代码
时间: 2023-08-22 21:08:22 浏览: 100
Android各种数据解析
5星 · 资源好评率100%
以下是一个简单的安卓代码示例,用于将NMEA数据进行校验并解析:
```java
public class NmeaParser {
private static final int MAX_LENGTH = 82;
private static final int CHECKSUM_LENGTH = 2;
public static boolean validateChecksum(String sentence) {
int starIndex = sentence.indexOf('*');
if (starIndex < 0 || starIndex + CHECKSUM_LENGTH >= sentence.length()) {
return false;
}
String checksumStr = sentence.substring(starIndex + 1, starIndex + CHECKSUM_LENGTH + 1);
int checksum = 0;
for (int i = 1; i < starIndex; i++) {
checksum ^= sentence.charAt(i);
}
String generatedChecksumStr = Integer.toHexString(checksum).toUpperCase();
return generatedChecksumStr.equals(checksumStr);
}
public static NmeaMessage parse(String sentence) {
if (!validateChecksum(sentence)) {
return null;
}
NmeaMessage message = new NmeaMessage();
String[] tokens = sentence.split(",");
if (tokens[0].startsWith("$GPGGA")) {
message.setMessageType(NmeaMessageType.GPGGA);
message.setUtcTime(tokens[1]);
message.setLatitude(tokens[2] + tokens[3]);
message.setLongitude(tokens[4] + tokens[5]);
message.setQualityIndicator(Integer.parseInt(tokens[6]));
message.setSatelliteCount(Integer.parseInt(tokens[7]));
message.setHdop(Double.parseDouble(tokens[8]));
message.setAltitude(Double.parseDouble(tokens[9]));
message.setAltitudeUnits(tokens[10]);
} else if (tokens[0].startsWith("$GPRMC")) {
message.setMessageType(NmeaMessageType.GPRMC);
message.setUtcTime(tokens[1]);
message.setStatus(tokens[2]);
message.setLatitude(tokens[3] + tokens[4]);
message.setLongitude(tokens[5] + tokens[6]);
message.setSpeed(Double.parseDouble(tokens[7]));
message.setCourse(Double.parseDouble(tokens[8]));
message.setDate(tokens[9]);
}
return message;
}
}
```
在这个例子中,`validateChecksum()` 方法用于检查给定的 NMEA 语句的校验和是否正确。如果校验和无效,则返回 `false`,否则返回 `true`。
`parse()` 方法被用来解析 NMEA 语句。它首先验证语句的校验和,然后根据语句的前缀来确定消息类型。在此示例中,我们只考虑了两种类型的消息:`GPGGA` 和 `GPRMC`。对于每种消息类型,我们从语句中提取必要的数据,并将其存储在一个 `NmeaMessage` 对象中。
希望这个例子能够帮助你更好地了解如何在安卓应用程序中对 NMEA 数据进行校验和解析。
阅读全文