NMEA协议报文长什么样,可以获取哪些主要信息

发布时间:2026/7/11 9:23:08
NMEA协议报文长什么样,可以获取哪些主要信息 原始的NMEA报文像这样是一段多行的字符串每行以\r\n换行符结尾每一句报文内部都以逗号分隔各字段每个字段都有自己的独立含义需要参考NMEA协议进行解析$GPGSA,A,2,12,23,25,31,14,37,41,63,30,168,34,25,57,1.8,1.2,2.5*2A\r\n $GPVTG,28.8,T,28.8,M,5.3,N,9.8,K,A*24\r\n $GPDTM,P90,,0000.000025,S,00000.000001,W,0.981,W84*54\r\n $GPRMC,050022.00,A,3932.6478,N,11614.0933,E,5.3,28.8,100726,6.5,W,A,V*61\r\n $GPGNS,050022.00,3932.6478,N,11614.0933,E,ANNNN,02,500.0,120.0,6.0,,,V*46\r\n $GPGGA,050022.00,3932.6478,N,11614.0933,E,1,02,1.8,120.0,M,6.0,M,,*5B\r\n $GPGSV,3,1,07,12,41,063,38,23,30,168,34,25,57,132,36,1*53\r\n $GPGSV,3,2,07,04,50,200,,07,29,315,,08,77,171,,09,52,271,,0*6E\r\n $GPGSV,3,3,07,16,36,045,,26,09,069,,31,11,116,,0*57\r\n $GAGSV,1,1,01,31,14,037,38*51\r\n $GLGSV,1,1,04,65,15,325,,71,26,208,,72,42,271,,73,33,052,,0*72\r\n $GBGSV,2,1,05,12,48,107,,14,16,200,,24,51,054,,25,45,316,,0*79\r\n $GBGSV,2,2,05,26,13,088,,0*44\r\n以上NMEA报文为例可以解析出以下信息UTC时间gnss utc time: 1783659622000换算为YYYY-mm-DD HHMMSS.mmm 格式后为2026-07-10 05:00:22.000 UTC纬度lat、经度lon、海拔alt、水平定位精度hacc、竖直定位精度vacclat:3932.6478(ddmm.mmmm),long:11614.0933(dddmm.mmmm),alt:120.000(m),hacc:5.400,vacc:3.600速度speed、加速度spdacc、航向bearing、航向精度baccspeed:2.727(m/s),spdacc:0.000(m/s),bearing:28.800(degrees),bacc:0.000(degrees)接收到的卫星信息GnssSvStatus[0] (svid12,elevation41.000,azimuth63.000,dbhz38.000,CX1,svFlag0x4) GnssSvStatus[1] (svid23,elevation30.000,azimuth168.000,dbhz34.000,CX1,svFlag0x4) GnssSvStatus[2] (svid25,elevation57.000,azimuth132.000,dbhz36.000,CX1,svFlag0x4) GnssSvStatus[3] (svid1,elevation0.000,azimuth0.000,dbhz0.000,CX1,svFlag0x0) GnssSvStatus[4] (svid4,elevation50.000,azimuth200.000,dbhz0.000,CX1,svFlag0x0) GnssSvStatus[5] (svid7,elevation29.000,azimuth315.000,dbhz0.000,CX1,svFlag0x0) GnssSvStatus[6] (svid8,elevation77.000,azimuth171.000,dbhz0.000,CX1,svFlag0x0) GnssSvStatus[7] (svid9,elevation52.000,azimuth271.000,dbhz0.000,CX1,svFlag0x0) GnssSvStatus[8] (svid16,elevation36.000,azimuth45.000,dbhz0.000,CX1,svFlag0x0) GnssSvStatus[9] (svid26,elevation9.000,azimuth69.000,dbhz0.000,CX1,svFlag0x0) GnssSvStatus[10] (svid31,elevation11.000,azimuth116.000,dbhz0.000,CX1,svFlag0x4) GnssSvStatus[11] (svid65,elevation15.000,azimuth325.000,dbhz0.000,CX3,svFlag0x0) GnssSvStatus[12] (svid71,elevation26.000,azimuth208.000,dbhz0.000,CX3,svFlag0x0) GnssSvStatus[13] (svid72,elevation42.000,azimuth271.000,dbhz0.000,CX3,svFlag0x0) GnssSvStatus[14] (svid73,elevation33.000,azimuth52.000,dbhz0.000,CX3,svFlag0x0) GnssSvStatus[15] (svid12,elevation48.000,azimuth107.000,dbhz0.000,CX5,svFlag0x4) GnssSvStatus[16] (svid14,elevation16.000,azimuth200.000,dbhz0.000,CX5,svFlag0x4) GnssSvStatus[17] (svid24,elevation51.000,azimuth54.000,dbhz0.000,CX5,svFlag0x0) GnssSvStatus[18] (svid25,elevation45.000,azimuth316.000,dbhz0.000,CX5,svFlag0x4) GnssSvStatus[19] (svid26,elevation13.000,azimuth88.000,dbhz0.000,CX5,svFlag0x0) GnssSvStatus[20] (svid31,elevation14.000,azimuth37.000,dbhz38.000,CX6,svFlag0x4)该信息会提供给Android Location Provider然后Android的 LocationService 会回调给所有注册的应用应用可以获取到的信息通过 LocationListener() 的 void onLocationChanged(Location location) 回调可以获取纬度 location.getLatitude(),经度 location.getLongitude(),海拔 location.getAltitude();速度 float speedKmh location.hasSpeed() ? location.getSpeed() * 3.6f : 0f;航向 float bearing location.hasBearing() ? location.getBearing() : 0f;时间 SimpleDateFormat sdf new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss.SSS”, Locale.US);sdf.setTimeZone(java.util.TimeZone.getTimeZone(“UTC”));String utcStr sdf.format(new Date(location.getTime()));通过 GnssStatus.Callback() 的 onSatelliteStatusChanged(GnssStatus status) 回调获取所有卫星信息通过 OnNmeaMessageListener() 的 void onNmeaMessage(String message, long timestamp) 回调获取原始NMEA报文