Как получить сообщение NMEA ** RM C или ** GGA или ** GSA Android - PullRequest
0 голосов
/ 09 марта 2020

в этом случае у меня проблема с тем, как получить сообщение 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, чтобы получить $ - RM C, $ - GGA, $ - GSA

1 Ответ

0 голосов
/ 09 марта 2020

если вам интересно, как получить сообщение NMEA, вы можете посмотреть по этой ссылке возможно, некоторые люди не знают, как получить NMEA самым последним способом, и я объясню это в первую очередь, вам нужно чтобы добавить 2 разрешения

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />

дважды, вам нужно создать класс с классом реализации 2, который выглядит следующим образом

class NmeaActivity : AppCompatActivity(), LocationListener, OnNmeaMessageListener {
}

, и после этого вам нужно сделать 2 переменные, которые предназначены для разрешение и для LocationManager

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(), если вы хотите показать сообщение NMEA в TextView без обработки данных, которые вы можете добавить в 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, RM C, мы просто добавили его в переменную datanmea, и сообщение в одной строке добавится, потому что RM C находится на последнем месте, где я буду добавить в 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)
    }
}
}
...