AIS: Panduan Lengkap Memahami Data Kapal — dari Frekuensi VHF sampai Decode di OpenCPN
Kalau kamu pernah membuka situs pelacak kapal seperti MarineTraffic dan melihat ratusan titik kapal bergerak real-time di Selat Malaka atau Laut Jawa, data itu datang dari satu sistem: AIS (Automatic Identification System). AIS adalah "transponder" yang wajib dipasang di kapal-kapal besar — ia menyiarkan identitas, posisi, kecepatan, dan haluan kapal secara terus-menerus lewat radio VHF. Artikel ini mengupas AIS sampai tuntas: cara kerja radionya, beda Kelas A dan Kelas B, tipe-tipe pesan, sampai cara men-decode data AIS mentah (!AIVDM) dengan Python dan menampilkannya di OpenCPN.
1. Apa Itu AIS dan Bagaimana Cara Kerjanya?
AIS adalah sistem pelaporan otomatis antar kapal (ship-to-ship) dan kapal-ke-darat (ship-to-shore) yang bekerja di dua frekuensi VHF marine: 161,975 MHz (kanal AIS 1) dan 162,025 MHz (kanal AIS 2). Setiap kapal yang dilengkapi AIS punya transponder: perangkat yang bergantian menyiarkan dan menerima paket data digital lewat kedua frekuensi itu.
Cara berbaginya rapi: AIS memakai skema TDMA (Time Division Multiple Access). Satu menit dibagi menjadi 2250 slot waktu (masing-masing 26,7 milidetik), dan setiap kapal "memesan" slotnya sendiri untuk menyiarkan. Kapal yang bergerak cepat menyiarkan lebih sering — kapal Kelas A yang melaju di atas 23 knot menyiarkan posisi tiap 2 detik, kapal diam/labuh tiap 3 menit.
Jangkauannya mengikuti sifat VHF: line-of-sight, kira-kira 20–30 mil laut antar kapal (tergantung tinggi antena). Untuk cakupan global, ada SAT-AIS: satelit yang menangkap siaran AIS dari orbit. Itulah kenapa situs pelacak kapal bisa menampilkan kapal di tengah samudra.
Kenapa AIS penting? Tiga alasan utama: keselamatan (mencegah tabrakan — kamu tahu nama, haluan, dan kecepatan kapal yang mendekat sebelum terlihat mata), pengawasan lalu lintas (VTS pelabuhan memantau semua kapal), dan keamanan (otoritas bisa melacak kapal mencurigakan).
2. Kelas A vs Kelas B: Jangan Sampai Tertukar
Tidak semua AIS sama. Ada dua kelas transponder, dan perbedaannya besar:
KELAS A | KELAS B ---------------------------------|--------------------------------- Wajib (SOLAS): kapal >= 300 GT, | Sukarela / diwajibkan aturan kapal penumpang, kapal dagang | lokal (mis. kapal nelayan > 30 GT internasional | di Indonesia*). Daya pancar: 12,5 watt | Daya pancar: 2 watt (atau 5 watt) Update posisi: tiap 2-10 detik | Update posisi: tiap 30 detik - 3 mnt (tergantung kecepatan) | (tergantung kecepatan) Kirim data lengkap: nama kapal, | Kelas B "SO": mirip Kelas A. tujuan, ETA, draft, dsb. | Kelas B "CS": lebih sederhana. Bisa kirim pesan teks safety | Terima semua, tapi prioritas Harga: belasan-puluhan juta Rp | slot TDMA lebih rendah dari Kelas A ---------------------------------|--------------------------------- * Di Indonesia, Kemenhub mewajibkan AIS Kelas B untuk kapal-kapal tertentu lewat aturan PM Perhubungan (cek regulasi terbaru).
Intinya: Kelas A untuk kapal besar/wajib SOLAS, Kelas B untuk kapal kecil/nelayan yang ingin terlihat di sistem. Selain itu ada Base Station (stasiun pantai/VTS), AtoN (alat bantu navigasi seperti pelampung suar yang menyiarkan posisinya sendiri), dan SART (pemancar darurat).
3. Tipe Pesan AIS yang Wajib Dikenal
AIS punya 27 tipe pesan bernomor. Kamu tidak perlu hafal semua — cukup yang paling sering muncul di data mentah:
Tipe Pesan apa Seberapa sering
---- ------------------------------ ---------------------------
1,2,3 Laporan posisi Kelas A Tiap 2 detik - 3 menit
5 Data statis & voyage Kelas A Tiap 6 menit (2 kalimat!)
(nama kapal, call sign, tujuan,
ETA, draft, dimensi)
18 Laporan posisi Kelas B Tiap 30 detik - 3 menit
19 Posisi + data statis Kelas B Tiap 6 menit
24 Data statis Kelas B (nama, Tiap 6 menit (2 bagian: A & B)
call sign, dimensi)
21 AtoN (pelampung suar dsb.) Tiap 3 menit
4 Laporan base station Tiap 10 detik
8 Pesan binary (aplikasi khusus) Sesuai kebutuhan
14 Pesan teks safety Sesuai kebutuhan
Catatan penting: pesan tipe 5 dan tipe 24 dikirim dalam 2 kalimat (lihat bagian 4) — decoder harus menggabungkannya dulu sebelum di-decode.
4. Dari Antena ke Plotter: Kalimat !AIVDM
Receiver AIS (atau software seperti AIS-catcher) meneruskan paket radio ke chart plotter dalam format kalimat NMEA bernama VDM (data dari kapal lain) dan VDO (data kapal sendiri). Formatnya mirip NMEA 0183 yang dibahas di artikel sebelumnya:
!AIVDM,1,1,,A,17ldJl@07fNTId7ijPP>9;Ap0000,0*21
Arti tiap field (dipisah koma):
!AIVDM = kalimat AIS dari kapal lain (!AIVDO = kapal sendiri)
1 = jumlah kalimat total untuk pesan ini
1 = nomor urut kalimat ini
(kosong)= nomor urut pesan multi-kalimat (diisi untuk tipe 5/24)
A = kanal radio penerima (A atau B)
17ldJl@07fNTId7ijPP>9;Ap0000
= PAYLOAD: data biner dikemas ASCII 6-bit
0 = fill bits: jumlah bit padding di akhir (0-5)
*21 = checksum NMEA (XOR, sama seperti NMEA 0183)
Payload-nya bukan teks biasa. Setiap karakter dikodekan sebagai 6 bit menurut tabel khusus AIS:
Karakter Nilai 6-bit '0'-'9' 0-9 ':'-'?' 10-15 '@'-'W' 16-39 '`'-'w' 40-63 Rumus cepat: v = ord(karakter) - 48; kalau v > 40, kurangi 8.
Setelah jadi deretan bit, tiap field dibaca per posisi bit sesuai standar (tipe pesan 1 = 168 bit, tipe 5 = 424 bit). Koordinat disimpan sebagai integer signed dalam satuan 1/600.000 derajat — jadi bujur 106,8456° disimpan sebagai 64107360.
5. Kode Python: Decode AIS Lengkap (Terverifikasi)
Copy-paste kode ini — sudah termasuk decode posisi (tipe 1/2/3) dan data statis kapal (tipe 5, multi-kalimat). Contoh kalimat di bawah sudah saya verifikasi decode-nya benar:
def ais_ke_bits(payload: str) -> str:
bitstr = ""
for c in payload:
v = ord(c) - 48
if v > 40:
v -= 8
bitstr += format(v, "06b")
return bitstr
def bits_ke_int(bitstr: str, mulai: int, panjang: int, signed=False) -> int:
pot = bitstr[mulai:mulai + panjang]
v = int(pot, 2)
if signed and pot[0] == "1":
v -= (1 << panjang)
return v
def teks_ais(bitstr: str, mulai: int, panjang: int) -> str:
out = ""
for i in range(mulai, mulai + panjang, 6):
v = bits_ke_int(bitstr, i, 6)
out += chr(v + 64) if v < 32 else chr(v)
return out.rstrip(" @").strip()
def checksum_ok(kalimat: str) -> bool:
isi, _, check = kalimat[1:].partition("*")
c = 0
for ch in isi:
c ^= ord(ch)
return f"{c:02X}" == check.upper()
def decode_posisi(kalimat: str):
"""Decode pesan tipe 1/2/3 (laporan posisi Kelas A)."""
assert checksum_ok(kalimat), "checksum tidak cocok!"
isi = kalimat.split("*")[0]
field = isi.split(",")
bitstr = ais_ke_bits(field[5])
fill = int(field[6])
if fill:
bitstr = bitstr[:-fill]
tipe = bits_ke_int(bitstr, 0, 6)
mmsi = bits_ke_int(bitstr, 8, 30)
sog = bits_ke_int(bitstr, 50, 8)
sog = None if sog == 1023 else sog / 10
lon = bits_ke_int(bitstr, 59, 28, signed=True)
lon = None if lon == 0x6791AC0 else lon / 600000
lat = bits_ke_int(bitstr, 87, 27, signed=True)
lat = None if lat == 0x3412140 else lat / 600000
cog = bits_ke_int(bitstr, 114, 12)
cog = None if cog == 3600 else cog / 10
hdg = bits_ke_int(bitstr, 126, 9)
hdg = None if hdg == 511 else hdg
return {"tipe": tipe, "mmsi": mmsi, "sog_knot": sog,
"bujur": lon, "lintang": lat,
"cog_derajat": cog, "heading": hdg}
def decode_statis(daftar_kalimat):
"""Decode pesan tipe 5 / 24B (data statis, bisa 2 kalimat)."""
for k in daftar_kalimat:
assert checksum_ok(k), "checksum tidak cocok!"
payload = "".join(k.split("*")[0].split(",")[5]
for k in daftar_kalimat)
bitstr = ais_ke_bits(payload)
tipe = bits_ke_int(bitstr, 0, 6)
mmsi = bits_ke_int(bitstr, 8, 30)
return {"tipe": tipe, "mmsi": mmsi,
"nama": teks_ais(bitstr, 112, 120),
"call_sign": teks_ais(bitstr, 70, 42),
"tujuan": teks_ais(bitstr, 302, 120)}
# ---------- contoh pemakaian ----------
k1 = "!AIVDM,1,1,,A,17ldJl@07fNTId7ijPP>9;Ap0000,0*21"
print(decode_posisi(k1))
# {'tipe': 1, 'mmsi': 525015761, 'sog_knot': 12.3,
# 'bujur': 106.8456, 'lintang': -6.2088,
# 'cog_derajat': 90.5, 'heading': 90}
k5a = "!AIVDM,2,1,3,A,57ldJl@2;=`1T95cV20dn1<Tp5:0`5T622222216:0,0*56"
k5b = "!AIVDM,2,2,3,A,D::6V8N@BPBhDU0H8888888888888,2*6C"
print(decode_statis([k5a, k5b]))
# {'tipe': 5, 'mmsi': 525015761, 'nama': 'KM SINAR JAYA',
# 'call_sign': 'YBQZ9', 'tujuan': 'JAKARTA'}
Angka 525 di awal MMSI adalah MID (Maritime Identification Digits) Indonesia — semua kapal berbendera Indonesia memakai awalan 525. MMSI sendiri adalah nomor identitas unik 9 digit yang diprogram ke transponder (di Indonesia diterbitkan oleh SDPPI Kominfo).
6. Cara Melihat Kapal di Sekitarmu: 3 Cara Praktis
Cara 1 — Gratis, tanpa alat: situs web AIS. Buka MarineTraffic atau VesselFinder, cari area perairan Indonesia (mis. Selat Sunda, Selat Malaka). Data ini dikumpulkan dari jaringan receiver relawan + satelit. Keterbatasannya: ada jeda waktu dan detail kapal besar saja di versi gratis.
Cara 2 — Receiver sendiri dengan RTL-SDR (sekitar Rp300–500 ribu). Dongle RTL-SDR + antena VHF + software gratis AIS-catcher atau SDR++ sudah cukup menangkap siaran AIS kapal dalam radius puluhan kilometer — ideal kalau rumahmu dekat pantai/pelabuhan. Outputnya kalimat !AIVDM yang bisa langsung di-decode pakai kode di bagian 5.
Cara 3 — Tampilkan di OpenCPN. OpenCPN (chart plotter open-source yang dibahas di artikel sebelumnya) bisa menampilkan target AIS langsung di atas peta laut. Caranya:
1. Buka OpenCPN > Options (ikon kunci inggris) > tab Connections.
2. Klik "Add Connection", pilih tipe sumber datamu:
- Receiver hardware (dAISy, Quark-elec, dsb.): pilih Serial,
isi port (mis. /dev/ttyUSB0) & baudrate sesuai manual alat.
- AIS-catcher / software: pilih Network, protokol TCP,
alamat 127.0.0.1, port sesuai output software (mis. 10110).
3. Centang "AIS" sebagai tipe data, klik Apply > OK.
4. Target AIS muncul sebagai segitiga hijau di peta.
Klik target untuk info lengkap: nama, MMSI, SOG, COG,
CPA (jarak terdekat) & TCPA (waktu menuju titik terdekat).
5. Aktifkan alarm tabrakan: Options > Ships > AIS Targets >
centang "Alert on CPA/TCPA" dan atur batas amannya.
Fitur CPA/TCPA inilah yang membuat AIS sangat berharga: OpenCPN menghitung kapan dan sedekat apa kapal lain akan berpapasan denganmu, lalu membunyikan alarm sebelum situasi berbahaya.
7. Keterbatasan AIS yang Perlu Diingat
AIS itu alat bantu, bukan pengganti kewaspadaan. Ingat empat hal ini:
1. Tidak semua kapal terlihat. Kapal kecil tanpa AIS (perahu nelayan tradisional, kapal kayu) tidak muncul sama sekali — radar dan mata tetap wajib.
2. AIS bisa dimatikan. Kapal yang ingin "gelap" (mis. terlibat aktivitas ilegal) tinggal mematikan transpondernya. Istilahnya going dark.
3. Data bisa salah/spoofing. Posisi AIS berasal dari GPS kapal itu sendiri — kalau GPS-nya error atau datanya dipalsukan (spoofing, marak di zona konflik), yang tampil di layarmu ikut salah. Selalu cross-check dengan radar.
4. Ada jeda (latency). Data satelit (SAT-AIS) bisa tertinggal beberapa menit sampai jam. Jangan pakai data web untuk navigasi real-time jarak dekat.
Penutup
AIS mengubah cara pelaut "melihat" — dari sekadar titik di radar menjadi identitas lengkap: kapal apa, milik siapa, mau ke mana, secepat apa. Dengan memahami frekuensi VHF-nya, perbedaan Kelas A/B, dan format data !AIVDM, kamu tidak cuma jadi pengguna pasif: kamu bisa men-decode datanya sendiri, membangun receiver murah dengan RTL-SDR, dan mengintegrasikannya ke OpenCPN untuk navigasi yang lebih aman. Di artikel berikutnya kita akan bahas radar kapal: cara kerja, tuning (gain, sea clutter, rain clutter), dan cara membaca target di layarnya.
Komentar
Posting Komentar