如何获取NMEA消息** RMC或** GGA或** GSA Android

问题描述 投票:0回答:1

在这种情况下,我知道如何获取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

android kotlin gps location nmea
1个回答
0
投票

[如果您好奇如何获取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)
    }
}
}
© www.soinside.com 2019 - 2024. All rights reserved.