在这种情况下,我知道如何获取NMEA消息后,如何获取NMEA消息有问题,该消息看起来像这样
$GPGGA,073109.00,,,,,0,12,6.4,865.1,M,2.8,M,,*6B
$PGLOR,9,STA,073109.00,0.004,0.000,-2498,5,64,0,P,D,L,1,C,2,S,00100002,56,5,R,000833F4,TPEF,20,907631,LC,,,*64
$GPGSV,3,1,12,11,73,151,18,08,61,353,16,04,59,313,19,23,52,309,18*79
$GPGSV,3,2,12,01,37,182,15,22,34,193,15,27,31,019,26,03,31,220,15*77
$GPGSV,3,3,12,09,26,318,23,31,20,100,,14,16,146,19,16,04,027,*72
$GLGSV,2,1,07,68,43,211,15,81,34,040,21,69,33,280,15,67,12,163,18*69
$GLGSV,2,2,07,79,06,006,22,82,73,119,,83,34,192,*5D
$QZGSV,1,1,01,01,46,154,17*51
$GPGSA,A,1,,,,,,,,,,,,,10.3,8.0,6.4*08
$GNGSA,A,1,,,,,,,,,,,,,10.3,8.0,6.4*16
$GNGSA,A,1,,,,,,,,,,,,,10.3,8.0,6.4*16
$QZGSA,A,1,,,,,,,,,,,,,10.3,8.0,6.4*14
$IMGSA,A,1,,,,,,,,,,,,,10.3,8.0,6.4*1B
$GPRMC,073109.00,V,,,,,,,240220,,,N*77
以及如何获取NMEA消息以获取$-RMC,$-GGA,$-GSA
[如果您好奇如何获取NMEA消息,您可以查看此link,也许有些人不知道如何以最新方式获取NMEA,我将解释一下首先,您需要添加2个权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
您需要使用工具2制作一个类,看起来像这样两次
class NmeaActivity : AppCompatActivity(), LocationListener, OnNmeaMessageListener {
}
然后,您需要为权限和LocationManager创建2个变量
val PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION_ID = 0x10
lateinit var locationManager : LocationManager
var datanmea = ""
第三,您需要创建一种方法来调用NMEA侦听器,并且该方法的位置将如下所示:>
private fun initGPSgettingLogic() { this.locationManager = this.getSystemService(Context.LOCATION_SERVICE) as LocationManager val gpsEnabled: Boolean = locationManager.isProviderEnabled( LocationManager.GPS_PROVIDER ) if (gpsEnabled) { //GPS ON Log.d("NMEA_APP", javaClass.name + ":" + "GPS ON :)") if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // Permission is not granted Log.d("NMEA_APP", javaClass.name + ":" + "Request Permission ") // No explanation needed; request the permission ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION_ID) } locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 10000f, this) locationManager.addNmeaListener(this) } else { //GPS NOT ON Log.d("NMEA_APP", javaClass.name + ":" + "GPS NOT ON") } }
[第四,您需要调用
onNmeaMessage()
以获取NMEA消息,我们可以通过实现onNmeaMessage()
来获得OnNmeaMessageListener
,如果没有它,我们将无法调用该方法,并且代码如下所示
override fun onNmeaMessage(nmeamessage: String?, timestamp: Long) { Log.d( "NMEA_APP", javaClass.name + ":" + "[" + timestamp + "]" + nmeamessage+ "" ) sendData(nmeamessage) }
消息位于变量
onNmeaMessage(nmeamessage: String?, timestamp: Long)
上,我们只需要nmeamessage即可获取消息并处理将其发送给方法sendData()
的消息,如果要在TextView上显示NMEA消息而不处理数据,则可以在Textview上追加以显示所有消息TextView.append(nmeamessage)
sendData()
看起来像这样
private fun sendData(nmea: String?) { var data = nmea?.substringBefore(",") var title = data?.substringAfter("$") var gen = title?.substring(2,5) if(gen == "GGA"){ datanmea = "" datanmea += "$nmea\r\n" } if(gen == "GSA" || gen == "RMC"){ datanmea += "$nmea\r\n" } if(gen == "RMC"){ TextView.append(datanmea) } }
因为我们只关注$,所以我们需要在削减
,
之后将其削减$
,然后将其从char 2削减至5,如果我们找到了GGA,GSA和RMC,则将其添加到变量datanmea和消息将附加在一行中,因为RMC位于最后一个位置,我将在获取所有消息后附加在TextView上。
对于最后一步,您需要在方法initGPSgettingLogic()
上调用onCreate()
这是完整的代码
@RequiresApi(Build.VERSION_CODES.N)
class NmeaActivity : AppCompatActivity(), LocationListener, OnNmeaMessageListener {
val PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION_ID = 0x10
lateinit var locationManager : LocationManager
var datanmea = ""
override fun onCreate(savedInstanceState: Bundle?) {
this.initGPSgettingLogic()
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION_ID -> {
// If request is cancelled, the result arrays are empty.
if (grantResults.isNotEmpty()
&& grantResults[0] == PackageManager.PERMISSION_GRANTED
) { // granted
this.initGPSgettingLogic()
} else { // denied,
}
return
}
}
}
private fun initGPSgettingLogic() {
this.locationManager =
this.getSystemService(Context.LOCATION_SERVICE) as LocationManager
val gpsEnabled: Boolean = locationManager.isProviderEnabled(
LocationManager.GPS_PROVIDER
)
if (gpsEnabled) { //GPS ON
Log.d("NMEA_APP", javaClass.name + ":" + "GPS ON :)")
if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // Permission is not granted
Log.d("NMEA_APP", javaClass.name + ":" + "Request Permission ")
// No explanation needed; request the permission
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION_ID)
}
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 10000f, this)
locationManager.addNmeaListener(this)
} else { //GPS NOT ON
Log.d("NMEA_APP", javaClass.name + ":" + "GPS NOT ON")
}
}
override fun onLocationChanged(location: Location?) {
}
override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {
}
override fun onProviderEnabled(provider: String?) {
}
override fun onProviderDisabled(provider: String?) {
}
override fun onNmeaMessage(nmeamessage: String?, timestamp: Long) {
Log.d(
"NMEA_APP",
javaClass.name + ":" + "[" + timestamp + "]" + nmeamessage+ ""
)
sendData(nmeamessage)
}
private fun sendData(nmea: String?) {
var data = nmea?.substringBefore(",")
var title = data?.substringAfter("$")
var gen = title?.substring(2,5)
if(gen == "GGA"){
datanmea = ""
datanmea += "$nmea\r\n"
}
if(gen == "GSA" || gen == "RMC"){
datanmea += "$nmea\r\n"
}
if(gen == "RMC"){
TextView.append(datanmea)
}
}
}