Membaca Kalimat NMEA 0183: Panduan Lengkap GGA, RMC, VTG, DBT & MWV di Kapal

Kalau alat elektronik di kapalmu sudah saling tersambung, entah itu GPS, fishfinder, kompas, sampai OpenCPN di laptop, ada satu bahasa yang hampir pasti mereka pakai untuk saling bicara: NMEA 0183. Bahasa ini bentuknya baris-baris teks pendek yang dikirim terus-menerus lewat kabel serial. Sekali kamu bisa membacanya, troubleshooting jadi jauh lebih gampang: kamu tahu apakah GPS benar-benar mengirim posisi, apakah fishfinder benar-benar mengirim kedalaman, dan di mana letak masalahnya kalau data tidak muncul di layar.

Artikel ini membedah lima kalimat NMEA 0183 yang paling sering kamu temui di kapal: GGA (posisi dan kualitas fix), RMC (posisi, kecepatan, dan tanggal), VTG (arah dan kecepatan gerak), DBT (kedalaman air), dan MWV (arah dan kecepatan angin). Di akhir ada decoder Python lengkap yang bisa kamu copy-paste dan langsung jalankan untuk membaca file data NMEA-mu sendiri.

1. Anatomi Satu Kalimat NMEA 0183

Setiap kalimat NMEA 0183 punya pola yang sama. Contoh kalimat posisi dari GPS:

$GPGGA,081523.00,0610.5000,S,10650.2000,E,1,08,0.9,12.5,M,2.1,M,,*7A

Mari dibedah dari kiri ke kanan. Tanda $ menandakan awal kalimat. Dua huruf berikutnya adalah talker ID, yaitu siapa pengirimnya: GP berarti GPS, GL berarti GLONASS, GN berarti gabungan GNSS, II berarti instrumen terpadu, dan WI berarti instrumen cuaca. Tiga huruf berikutnya adalah sentence ID, yaitu jenis datanya, misalnya GGA, RMC, atau VTG.

Setelah itu, semua field dipisahkan koma. Field yang kosong, seperti dua koma berurutan, artinya data itu tidak tersedia, bukan nol. Di ujung kalimat ada tanda bintang, lalu dua digit heksadesimal: itu checksum, hasil XOR dari semua karakter antara tanda $ dan tanda bintang. Penerima yang benar akan menghitung ulang checksum ini dan membuang kalimat yang tidak cocok. Itu sebabnya satu karakter rusak saja cukup membuat satu baris data dibuang diam-diam.

Tiga aturan praktis yang wajib diingat: kecepatan standar NMEA 0183 adalah 4800 baud untuk kebanyakan GPS dan instrumen lama (AIS memakai 38400 baud dan itu cerita lain), setiap kalimat diakhiri carriage return dan line feed, dan satuan kecepatan di NMEA 0183 adalah knot, bukan km/jam. Satu knot sama dengan 1,852 km/jam.

2. GGA: Posisi, Kualitas Fix, dan Jumlah Satelit

GGA adalah kalimat posisi paling lengkap untuk kebutuhan sehari-hari. Contohnya:

$GPGGA,081523.00,0610.5000,S,10650.2000,E,1,08,0.9,12.5,M,2.1,M,,*7A

Field demi field artinya begini: 081523.00 adalah jam UTC, yaitu 08 jam 15 menit 23 detik. 0610.5000,S adalah lintang: 06 derajat 10,5000 menit, Selatan. 10650.2000,E adalah bujur: 106 derajat 50,2000 menit, Timur. Angka 1 setelah bujur adalah indikator kualitas fix: 0 berarti tidak ada fix, 1 berarti fix GPS biasa, 2 berarti fix DGPS. Angka 08 adalah jumlah satelit yang dipakai. Angka 0.9 adalah HDOP, ukuran ketelitian horizontal: makin kecil makin bagus, di bawah 1 sudah sangat baik, di atas 5 patut dicurigai. Angka 12.5,M adalah ketinggian antena di atas permukaan laut dalam meter, dan 2.1,M adalah selisih geoid, yang untuk navigasi praktis bisa kamu abaikan.

Perhatikan format lintang dan bujur: ini bukan derajat desimal. Cara mengubahnya ke derajat desimal yang dipakai Google Maps dan OpenCPN adalah: ambil derajatnya (2 digit untuk lintang, 3 digit untuk bujur), lalu menitnya dibagi 60. Contoh di atas: lintang 06 derajat + (10,5000 / 60) = 6,175 derajat, dan karena Selatan maka tandanya negatif: -6,175. Bujur 106 derajat + (50,2000 / 60) = 106,8367 derajat Timur, tetap positif. Kalau kamu memasukkan 0610.5000 mentah-mentah sebagai derajat desimal, posisimu akan meleset ratusan kilometer.

3. RMC: Posisi Plus Kecepatan dan Tanggal, dalam Satu Kalimat

Kalau GGA adalah kartu identitas posisi, RMC adalah laporan perjalanan. Contohnya:

$GPRMC,081523.00,A,0610.5000,S,10650.2000,E,5.4,125.5,261026,,,A*4F

Artinya: jam UTC 08:15:23, status A yang berarti data aktif dan valid (kalau V berarti void alias tidak valid, jangan dipakai navigasi), lintang dan bujur sama seperti di GGA, kecepatan 5.4 knot, arah gerak 125.5 derajat, dan tanggal 261026 yang dibaca tanggal-bulan-tahun: 26 Oktober 2026. Huruf A terakhir adalah mode: A berarti otonom, D berarti diferensial, N berarti tidak ada fix.

Kenapa RMC penting? Karena satu kalimat ini saja sudah cukup untuk plotter menggambar jejak kapalmu: posisi, kecepatan, arah, dan tanggal sekaligus. Kalau di OpenCPN jejak kapalmu tidak bergerak padahal GPS menyala, cek dulu: apakah kalimat RMC yang masuk berstatus A atau V? Status V adalah penyebab paling sering yang luput dari perhatian.

4. VTG: Arah dan Kecepatan Gerak, Tanpa Posisi

VTG adalah kalimat yang khusus membawa arah dan kecepatan gerak kapal di atas permukaan tanah (course over ground dan speed over ground). Contohnya:

$GPVTG,125.5,T,,M,5.4,N,10.0,K*53

Artinya: arah gerak 125.5 derajat terhadap utara sejati (huruf T), field arah magnetik kosong karena kompas tidak tersambung, kecepatan 5.4 knot (huruf N), dan kecepatan yang sama dalam km/jam: 10.0 km/jam (huruf K). Perkalian 5,4 x 1,852 memang 10,0, jadi angkanya konsisten.

Bedakan VTG dengan data kompas. VTG memberitahu ke mana kapalmu bergerak, sedangkan kompas memberitahu ke mana haluan kapalmu menghadap. Saat kapal hanyut kena arus tanpa mesin, keduanya bisa berbeda jauh, dan itu normal. Untuk autopilot, yang dipakai sebagai acuan biasanya haluan kompas, sedangkan untuk menghitung ETA ke waypoint, yang dipakai adalah kecepatan dari VTG atau RMC.

5. DBT: Kedalaman Air dari Fishfinder

DBT membawa kedalaman air di bawah transduser, dan ini kalimat yang paling sering membuat bingung karena satuannya tiga macam sekaligus. Contohnya:

$SDDBT,8.5,f,2.6,M,,*67

Artinya: kedalaman 8.5 feet (huruf f), sama dengan 2.6 meter (huruf M), dan field fathom kosong. Talker ID SD menandakan sumbernya sounder atau fishfinder. Praktik terbaik: selalu pakai field meternya, karena itu yang dipakai OpenCPN dan kebanyakan plotter, dan jangan pernah mencampur feet dan meter dalam satu perhitungan.

Satu hal yang wajib kamu ketahui tentang DBT: angka ini adalah kedalaman di bawah transduser, bukan di bawah permukaan air dan bukan di bawah lunas kapal. Kalau transduser terpasang 0,5 meter di bawah permukaan air, maka kedalaman air sebenarnya adalah angka DBT ditambah 0,5 meter. Kalau kamu ingin angka kedalaman terhadap lunas, kurangi jarak transduser ke lunas dari angka DBT. Banyak kecelakaan kandas berawal dari salah baca offset kecil ini, jadi catat offset transdusermu di dekat fishfinder.

6. MWV: Arah dan Kecepatan Angin dari Sensor Cuaca

MWV membawa data angin, dan kalimat ini punya satu jebakan klasik: ada angin relatif dan angin sejati. Contohnya:

$WIMWV,045,R,12.5,N,A*0A

Artinya: angin datang dari arah 45 derajat relatif terhadap haluan kapal (huruf R berarti relative), kecepatan 12.5 knot (huruf N), status A berarti valid. Kalau hurufnya T, berarti angin sejati (true), yaitu arah angin terhadap utara sejati setelah dikoreksi kecepatan dan arah gerak kapal.

Untuk nelayan, angin relatif sudah cukup untuk memutuskan kapan menurunkan jangkar atau kapan menepi: angin 15 knot dari depan terasa sangat berbeda dengan angin 15 knot dari belakang. Untuk perencanaan rute, pakailah angin sejati, karena itulah kondisi cuaca sebenarnya di atas laut. Kalau sensor anginmu hanya mengirim MWV relatif dan plotter menampilkan angin sejati yang aneh, kemungkinan besar plotter tidak mendapat data kecepatan kapal dari RMC atau VTG untuk mengoreksinya.

7. Cara Menghitung Checksum Sendiri

Checksum NMEA 0183 dihitung dengan XOR semua karakter antara $ dan bintang. Kamu bisa memeriksanya dengan kalkulator atau dengan potongan kode pendek berikut. Hasilnya ditulis dalam dua digit heksadesimal huruf besar.

def nmea_checksum(sentence):
    body = sentence.strip().lstrip("$").split("*")[0]
    value = 0
    for ch in body:
        value = value ^ ord(ch)
    return format(value, "02X")

print(nmea_checksum("$GPGGA,081523.00,0610.5000,S,10650.2000,E,1,08,0.9,12.5,M,2.1,M,,*7A"))

Kalau hasil cetakannya 7A, berarti cocok dengan checksum di kalimat contoh. Kalau tidak cocok, kalimat itu rusak di jalan, biasanya karena kabel longgar, baud rate salah, atau dua alat mengirim bersamaan ke satu input tanpa multiplexer.

8. Decoder Python Lengkap: Copy-Paste dan Langsung Jalan

Ini bagian yang paling berguna. Simpan kode di bawah sebagai nmea_reader.py. Program ini membaca file teks berisi kalimat NMEA, memeriksa checksum setiap baris, mengubah lintang dan bujur ke derajat desimal, lalu mencetak ringkasan yang gampang dibaca. Tidak ada library tambahan yang perlu diinstal, cukup Python 3.

import sys


def nmea_checksum_ok(line):
    line = line.strip()
    if line.startswith("$") == False:
        return False
    if "*" not in line:
        return False
    body, given = line[1:].split("*", 1)
    value = 0
    for ch in body:
        value = value ^ ord(ch)
    return format(value, "02X") == given.strip().upper()


def to_decimal(raw, hemi):
    raw = raw.strip()
    if raw == "":
        return None
    if hemi in ("S", "W"):
        sign = -1
    else:
        sign = 1
    if len(raw.split(".")[0]) == 4:
        deg_digits = 2
    else:
        deg_digits = 3
    degrees = float(raw[0:deg_digits])
    minutes = float(raw[deg_digits:])
    return sign * (degrees + minutes / 60.0)


def parse_gga(fields):
    lat = to_decimal(fields[2], fields[3])
    lon = to_decimal(fields[4], fields[5])
    fix = fields[6]
    sats = fields[7]
    hdop = fields[8]
    alt = fields[9]
    print("GGA : lat " + str(lat) + " lon " + str(lon) + " fix " + fix + " satelit " + sats + " HDOP " + hdop + " tinggi " + alt + " m")


def parse_rmc(fields):
    status = fields[2]
    lat = to_decimal(fields[3], fields[4])
    lon = to_decimal(fields[5], fields[6])
    speed = fields[7]
    course = fields[8]
    date = fields[9]
    if status == "A":
        note = "valid"
    else:
        note = "TIDAK VALID, jangan dipakai navigasi"
    print("RMC : lat " + str(lat) + " lon " + str(lon) + " speed " + speed + " knot course " + course + " derajat tanggal " + date + " (" + note + ")")


def parse_vtg(fields):
    course = fields[1]
    speed_knot = fields[5]
    speed_kmh = fields[7]
    print("VTG : course " + course + " derajat speed " + speed_knot + " knot (" + speed_kmh + " km/jam)")


def parse_dbt(fields):
    feet = fields[1]
    meter = fields[3]
    print("DBT : kedalaman " + meter + " meter (" + feet + " feet) di bawah transduser")


def parse_mwv(fields):
    angle = fields[1]
    ref = fields[2]
    speed = fields[3]
    unit = fields[4]
    status = fields[5]
    if ref == "R":
        kind = "relatif terhadap haluan"
    else:
        kind = "sejati"
    print("MWV : angin " + angle + " derajat " + kind + " kecepatan " + speed + " " + unit + " status " + status)


def main():
    if len(sys.argv) != 2:
        print("Pakai: python3 nmea_reader.py data_nmea.txt")
        return
    path = sys.argv[1]
    handlers = {"GGA": parse_gga, "RMC": parse_rmc, "VTG": parse_vtg, "DBT": parse_dbt, "MWV": parse_mwv}
    good = 0
    bad = 0
    with open(path, "r", encoding="utf-8", errors="replace") as handle:
        for line in handle:
            line = line.strip()
            if line == "":
                continue
            if nmea_checksum_ok(line) == False:
                print("Checksum salah, baris dibuang: " + line)
                bad = bad + 1
                continue
            body = line[1:].split("*")[0]
            fields = body.split(",")
            kind = fields[0][2:]
            if kind in handlers:
                handlers[kind](fields)
                good = good + 1
            else:
                print("Kalimat belum ditangani: " + line)
    print("Selesai. Kalimat terbaca: " + str(good) + ", dibuang: " + str(bad))


if __name__ == "__main__":
    main()

Perlu dicatat: fungsi to_decimal di atas membedakan lintang dan bujur dari panjang digit derajatnya. Lintang selalu 2 digit derajat di depan koma desimal menitnya, sedangkan bujur 3 digit. Selama datamu berasal dari GPS normal, aturan ini aman.

9. Contoh File Data dan Contoh Keluaran

Simpan contoh berikut sebagai data_nmea.txt, di folder yang sama dengan programnya. Semua checksum di bawah ini sudah dihitung dengan benar, jadi program harus membaca kelimanya tanpa membuang satu pun.

$GPGGA,081523.00,0610.5000,S,10650.2000,E,1,08,0.9,12.5,M,2.1,M,,*7A
$GPRMC,081523.00,A,0610.5000,S,10650.2000,E,5.4,125.5,261026,,,A*4F
$GPVTG,125.5,T,,M,5.4,N,10.0,K*53
$SDDBT,8.5,f,2.6,M,,*67
$WIMWV,045,R,12.5,N,A*0A

Jalankan dari terminal atau command prompt dengan perintah ini:

python3 nmea_reader.py data_nmea.txt

Keluaran yang benar kurang lebih seperti ini:

GGA : lat -6.175 lon 106.83666666666667 fix 1 satelit 08 HDOP 0.9 tinggi 12.5 m
RMC : lat -6.175 lon 106.83666666666667 speed 5.4 knot course 125.5 derajat tanggal 261026 (valid)
VTG : course 125.5 derajat speed 5.4 knot (10.0 km/jam)
DBT : kedalaman 2.6 meter (8.5 feet) di bawah transduser
MWV : angin 045 derajat relatif terhadap haluan kecepatan 12.5 N status A
Selesai. Kalimat terbaca: 5, dibuang: 0

Kalau ada baris di filemu sendiri yang dibuang karena checksum, jangan panik: hitung ulang checksum kalimat itu dengan fungsi di bagian 7, ganti dua digit setelah bintang dengan hasil yang benar, lalu jalankan lagi. Seringnya, contoh yang disalin dari internet memang punya checksum yang tidak cocok dengan isi kalimatnya.

10. Memakai Decoder Ini dengan Data Kapal Asli

Langkah pertama, sambungkan GPS atau instrumen ke laptop dengan kabel USB serial. Di Windows, lihat nomor port COM di Device Manager. Di Linux dan Mac, perangkat biasanya muncul sebagai /dev/ttyUSB0. Atur baud rate ke 4800 untuk NMEA 0183 standar, 8 data bit, tanpa parity, 1 stop bit.

Langkah kedua, rekam data mentah selama satu menit dengan perintah seperti ini di Linux atau Mac:

stty -F /dev/ttyUSB0 4800 raw
cat /dev/ttyUSB0 > rekaman_nmea.txt

Tekan Ctrl+C setelah satu menit, lalu jalankan decoder pada file rekaman itu. Kalau hampir semua baris dibuang karena checksum, turunkan dulu kemungkinan penyebabnya secara berurutan: baud rate salah adalah tersangka pertama, kabel dan konektor longgar tersangka kedua, dan dua pengirim berebut satu input tanpa multiplexer tersangka ketiga.

Langkah ketiga, verifikasi di OpenCPN. Buka OpenCPN, masuk ke Options, lalu Connections, dan tambahkan koneksi serial dengan baud 4800. Kalau posisi kapal muncul di peta dan jejaknya bergerak, berarti rantai datamu sehat dari ujung ke ujung. Kalau NMEA Debug Window di OpenCPN menampilkan kalimat tapi posisi tidak muncul, cek status RMC: kemungkinan besar statusnya V, atau kalimat GGA membawa fix 0 karena antena belum mendapat sinyal satelit yang cukup.

11. Kesalahan Membaca yang Paling Sering Terjadi

Pertama, mengira angka lintang dan bujur mentah adalah derajat desimal. Ini kesalahan paling mahal: posisi bisa meleset puluhan sampai ratusan kilometer, dan waypoint yang dibuat dari angka mentah akan menyesatkan.

Kedua, mencampur knot dan km/jam. Kecepatan di RMC dan VTG selalu knot. Kalau plotter menampilkan 10 dan kamu mengira itu knot padahal itu km/jam, ETA-mu akan meleset hampir separuhnya.

Ketiga, memakai DBT mentah sebagai kedalaman air. Ingat offset transduser: tambah jarak transduser ke permukaan untuk kedalaman air sebenarnya, atau kurangi jarak transduser ke lunas untuk sisa air di bawah lunas.

Keempat, memakai RMC berstatus V untuk navigasi. Status V berarti penerima sendiri menyatakan datanya tidak bisa dipercaya. Plotter yang baik akan menolaknya, tetapi alat yang asal menampilkan angka bisa menyesatkanmu.

Kelima, mengabaikan field kosong. Field kosong bukan nol: HDOP kosong bukan berarti ketelitian sempurna, dan arah magnetik kosong bukan berarti arahnya nol derajat. Program yang baik, seperti decoder di atas, harus membedakan keduanya, dan kamu pun begitu saat membaca layar instrumen.

Penutup: Dari Bisa Membaca ke Bisa Memperbaiki

Menguasai lima kalimat ini saja sudah mengubah cara kamu menghadapi elektronik kapal. Saat data tidak masuk, kamu tidak lagi menebak-nebak: kamu bisa membuka rekaman NMEA, melihat kalimat mana yang hilang, kalimat mana yang checksum-nya rusak, dan kalimat mana yang statusnya tidak valid. Dari sana, perbaikan menjadi urutan yang logis: cek antena, cek kabel, cek baud rate, cek multiplexer, baru curiga ke alatnya.

Coba malam ini juga: rekam satu menit data NMEA dari GPS-mu, jalankan decoder di atas, dan cocokkan posisi derajat desimalnya dengan posisi di OpenCPN. Kalau cocok sampai tiga angka di belakang koma, berarti kamu sudah benar-benar membaca bahasa kapalmu sendiri. Selamat berlayar, dan semoga laut selalu bersahabat.

Komentar