Получение NMEA DATA в android - PullRequest
       33

Получение NMEA DATA в android

0 голосов
/ 26 февраля 2020

Текущая проблема, которую я получаю, заключается в том, что OnNmeaListener не возвращает правильные данные из NMEA с помощью GpsStatus.Listener, поэтому я попробовал GNSS Status для душевного спокойствия, в итоге он вернул данные gibberi sh , поэтому мне пришлось вернуться к GpsStatus Listener. Я также до использования OnNmeaListener пробовал GpsStatus.NmeaListner и при использовании пытался добавить его в слушатель GpsStatus, он показывался как ошибка и предлагал, чтобы я привел его к OnNmeaListener, когда это будет сделано, и приложение будет создано и все, а затем Выполненный из приложения, он обработал бы sh, а затем не работал бы вообще, и именно поэтому я перешел на OnNmeaListener в первую очередь. Теперь, к его чести, OnNmeaListener работает просто отлично и вообще не обрабатывает sh, но данные, которые он выдает, не совсем точны, я подумал, что, возможно, это может быть какая-то ошибка / ошибка на стороне устройства Затем я приступил к тестированию на двух устройствах с разными уровнями API 25 и 28. На устройстве 25 уровня он просто не дал половину данных, тогда как на устройстве 28 уровня данные полны, но не точны и не корректны.

Это метод, который я сейчас использую:

OnNmeaMessageListener nmeaMessageListener = new OnNmeaMessageListener () {
    @Override
    public void onNmeaMessage(String nmea , long timestamp) {
        if (trackStarted == true && trackPaused == false) {
            if (nmea.startsWith ( "$GPGGA" ) || nmea.startsWith ( "$GPRMC" )) {
                //Log.d("TrackManagerService","NMEA:" + nmea);
                try {
                    // out.write(nmea.getBytes());

                    if (continuesMode) {
                        dataOut.write ( nmea.getBytes () );
                        bufferedNMEALines++;
                        if (bufferedNMEALines >= 10) {
                            flushContinuesTrack ();
                            //dataOut.reset();
                            bufferedNMEALines = 0;
                        }
                    } else {
                        outCompressed.write ( nmea.getBytes () );
                    }

                    // Log.d("TrackManagerService","NMEA:" + nmea);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace ();
                }

                if (nmea.startsWith ( "$GPGGA" )) {
                    String[] nmeaSplit = nmea.split ( "," );
                    if (nmeaSplit.length > 10) {
                        if (nmeaSplit[9].length () > 0) {
                            try {
                                mslAltitude = Float.parseFloat ( nmeaSplit[9] );
                            } catch (NumberFormatException ex) {
                                mslAltitude = 0;
                            }
                        } else {
                            mslAltitude = 0.0f;
                        }
                    }
                }
            }

            //if (markStarted && hasFix() && nmea.startsWith("$GPGGA")) {
            if (markStarted && hasFix () && nmea.startsWith ( "$GPRMC" )) {
                markProgress++;
                trackListener.onMarkProgress ( markProgress );
                if (markProgress >= markMax) {
                    stopMark ();
                }
            }
        }
    }
};

И это вывод, который он выдает при вызове:

$Start,082719,260220;
$GPGGA,082721.42,2654.2979,N,08056.6065,E,0,100.000,0.000,M,M,0,*44
$GPRMC,082721.42,V,2654.2979,N,08056.6065,E,0.000,0.000,260220,E,N*01
$GPGGA,082722.41,2654.2979,N,08056.6065,E,0,100.000,0.000,M,M,0,*44
$GPRMC,082722.41,V,2654.2979,N,08056.6065,E,0.000,0.000,260220,E,N*01
$End,082802,260220;
$Start,082804,260220;
$GPGGA,082837.42,2654.2979,N,08056.6065,E,0,100.000,0.000,M,M,0,*4C
$GPRMC,082837.42,V,2654.2979,N,08056.6065,E,0.000,0.000,260220,E,N*09
$GPGGA,082838.42,2654.2979,N,08056.6065,E,0,100.000,0.000,M,M,0,*43
$GPGGA,082840.42,2654.2979,N,08056.6065,E,0,100.000,0.000,M,M,0,*4C
$End,082841,260220;
$Start,082921,260220;
$GPGGA,082923.40,2654.2982,N,08056.6059,E,0,100.000,0.000,M,M,0,*41
$GPRMC,082923.40,V,2654.2982,N,08056.6059,E,0.000,0.000,260220,E,N*04
$GPGGA,082924.40,2654.2982,N,08056.6059,E,0,100.000,0.000,M,M,0,*46
$GPRMC,082945.40,V,2654.2982,N,08056.6059,E,0.000,0.000,260220,E,N*04
$End,082945,260220;

И это вывод при вызове с использованием прослушивателя GNSS:

$ Start, 080450,260220; ���������������������������� 101

Есть какой-нибудь способ заставить это работать?

[РЕДАКТИРОВАТЬ]

Это ответ от * Устройство 1030 *, которое было принято сервером:

$Start,150403,250220;
$GPGGA,150403.69,2654.29986954,N,8056.60312653,E,1,00,0.0,0.0,0,0.0,0,0.0,0000*42;
$GPRMC,150743.99,A,2654.29986954,N,8056.60260391,E,0.0,0.0,250220,0.0,E,A*5;
$GPRMC,150844.26,A,2654.29986954,N,8056.60260391,E,0.0,0.0,250220,0.0,E,A*9;

$GPRMC,150937.91,A,2654.30012894,N,8056.60312653,E,0.0,0.0,250220,0.0,E,A*e;
$GPGGA,150945.04,2654.30429840,N,8056.60781097,E,1,00,0.0,0.0,0,0.0,0000*42;
$GPRMC,150952.01,A,2654.29921722,N,8056.60364532,E,0.0,0.0,250220,0.0,E,A*2;
$End,150953,250220;
$GPGGA,150953.00,2654.29921722,N,8056.60364532,E,1,00,0.0,0.0,0,0.0,0000*42;
$GPRMC,150953.00,A,2654.29921722,N,8056.60364532,E,0.0,0.0,250220,0.0,E,A*2;

Теперь у меня нет ни малейшего представления, как это работает на устройстве iOS, (мой старший работал над этим и дал мне эти данные) , но каким-то образом это сработало, и когда тот же лог c был реализован на Android и данные были загружены на сервер, он не принял бы его, тогда как когда iOS с данными манипулировали любым способом (удаляя строки, надстрочные знаки, удаляя точки с запятой, запятые и т. д. c.), это все равно будет работать.

...