我正在抨击Android本地化,并已经找到了如何接收NMEA数据。不幸的是,结果似乎非常混乱。我只需要GPRMC句子,但返回GPGGA,GPVTG等。有没有办法控制onNmeaReceived()函数?
public class TrackingService extends Service {
private Intent broadcastIntent = new Intent("com.example.locationlogger.TestBroadcastReceiver");
private LocationManager lm;
private LocationListener ll = new LocationListener(){
//sample listener...
};
GpsStatus.NmeaListener nl = new GpsStatus.NmeaListener() {
@Override
public void onNmeaReceived(long timestamp, String nmea) {
/*
* Broadcast a message..
*/
broadcastIntent.putExtra("TESTVAR", "Received some nmea strings: " + nmea);
sendBroadcast(broadcastIntent);
}
};
@Override
public void onCreate() {
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
}
@Override
public void onStart(Intent intent, int startId) {
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, interval * 1000, 0, ll);
lm.addNmeaListener(nl);
}
}
答案 0 :(得分:2)
感谢您的回答 - 所有有效点。实际上我用正则表达式模式解决了它并使用matcher.find()来过滤相关的句子。在我的情况下,这是GPRMC句子,只有它包括有效数据。这是java正则表达式字符串 - 也许有人可以重复使用它。
public static Pattern p = Pattern.compile("(\\$GPRMC)\\,((\\d{6})\\.?\\d*)\\,([AV]{1})\\,(\\d*\\.?\\d*)\\,([NS]{1})\\,(\\d*\\.?\\d*)\\,([EW]{1})\\,([0-9]*\\.?[0-9]*)\\,([0-9]*\\.?[0-9]*)\\,([0-9]{6})\\,([0-9]*\\.?[0-9]*)\\,([EW]?)\\,([ADEMSN]{1}.*.[0-9A-F]{2})");
要了解我如何对正则表达式进行分组,请使用此正则表达式字符串
(\ $ GPRMC)\,((\ d {6})。?\ d *)\,([AV] {1})\,(\ d *。?\ d *)\,([ NS] {1})\,(\ d *。?\ d *)\,([EW] {1})\,([0-9]的。?[0-9] )\,([0-9]的。?[0-9] )\,([0-9] {6})\,([0-9]的。?[ 0-9] )\,([EW])\,([ADEMSN] {1}。* [0-9A-F] {2})
在这个网站
http://www.regexplanet.com/simple/index.html
这个NMEA句子
$ GPRMC,090248,A,4745.012742,N,01304.143827,E,0.0,0.0,310710,5.3,E,A * 48
此致 马丁
答案 1 :(得分:1)
只是为了确保...“混乱”,你只是意味着你得到所有的NMEA句子?即系统没有奇怪的行为?
因为这种行为似乎是记录在案的 - 你可以从GPS获得所有NMEA数据。
由于NMEA是纯文本,你不能只过滤掉你不想要的前缀吗?
答案 2 :(得分:0)
预计连续接收多个GPGSV句子,我认为如果你检查它们不相同,但是单个消息的一部分作为卫星的所有信息都不适合单个NMEA句子。在消息的前两个位置有一个句子序列号和构成消息的总句子数。
GPRMC只是单个句子,每个句子都包含“建议的最小”修正数据。