2010-07-20 15 views
0

我在抨击android本地化,并已经想出了如何接收NMEA数据。不幸的是,结果似乎非常混乱。我只需要GPRMC的句子,但得到GPGGA,GPVTG等返回。有什么办法来控制onNmeaReceived()函数吗?Android位置:来自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); 
} 

}

回答

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

at本网站

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

问候, 马丁

+0

收到的句子往往是无效的吗?通过我的答案中的“过滤器”,我在考虑更多'sentence.startsWith(“$ GPRMC”);':)无论如何,肯定是一个有用的正则表达式! – 2010-08-04 18:31:13

+0

如果使用我的应用程序,请使用requestLocationUpdates(..)“激活”手机中的GPS设备,然后添加NmeaListener。实际上,NmeaListner在初始化时会立即产生输出(无坐标的句子),并且在处理时遇到一些无效的句子。这就是完整正则表达式解决方案的原因。 – 2010-08-04 19:47:48

1

只是为了确保..由 “乱”,你只是意味着你得到所有的NMEA句子?即系统没有奇怪的行为?

由于该行为似乎与记录的—一样,您可以从GPS获得所有NMEA数据。

由于NMEA是纯文本,你不能只过滤出你不想要的前缀吗?

+0

我的意思是“混乱”,是因为我连续四次获得GPGSV,然后是GPVTG,有时是有效的GPRMC,然后是两次GPGSV等。我看不到返回数据背后的结构,这就是是什么让它很难处理。我希望能够设置某种间隔或过滤器。但似乎我必须自己做:-( – 2010-07-22 06:12:30

0

接受连续的多个GPGSV句子是可以预料的,我认为如果你检查他们不完全相同,但是单个消息的一部分,因为卫星的所有信息都不适合单个NMEA句子。在消息的前两个位置有一个句子序列号和构成该消息的总句子数。

GPRMC只是单个句子,每个句子都包含“推荐的最小”修复数据。