9.16. Waktu dan NTP

Kamera yang baru dinyalakan tidak mengetahui waktu saat itu. Jam internal mulai dari suatu saat yang tidak tentu (1970-01-01 pada sebagian besar board) dan terus berjalan dari sana hingga ada sesuatu yang memberi tahu sebaliknya. NTP -- Network Time Protocol -- adalah cara kamera meminta waktu nyata (jam dinding) dari jaringan dan menyetel jam internalnya berdasarkan jawaban tersebut.

9.16.1. Mengapa kamera perlu mengetahui waktu

Untuk banyak skrip, jam kamera tidak terlalu penting -- perulangan pengambilan bingkai tidak peduli hari apa. Namun untuk beberapa hal umum, waktu sangat penting:

  • Stempel waktu dalam log atau data yang diunggah. Entri yang semuanya mencantumkan 1970-01-01 sulit dipahami di kemudian hari.

  • Tugas terjadwal. "Jalankan pukul 03:00" mengharuskan kamera mengetahui apa itu pukul 03:00.

9.16.2. Apa yang dilakukan NTP

NTP adalah layanan publik kecil: sebuah jaringan server yang menjawab pertanyaan "jam berapa sekarang?" melalui satu pertukaran UDP. Kamera mengirimkan permintaan singkat ke server NTP yang diketahui; server membalas dengan stempel waktu yang tepat (akurat hingga beberapa milidetik untuk server publik mana pun); kamera menggunakan itu untuk menyetel jam internalnya. Server default yang digunakan kamera adalah pool.ntp.org, sebuah pool dengan load-balancing global yang dirancang khusus untuk jenis klien seperti ini.

9.16.3. API Python: ntptime

MicroPython membungkus protokol ini dalam satu panggilan. Pola umum adalah menghubungkan jaringan terlebih dahulu, kemudian meminta waktu dari NTP:

import network
import ntptime
import time

wlan = network.WLAN(network.WLAN.IF_STA)
wlan.active(True)
wlan.connect("my-network", "my-password")

while not wlan.isconnected():
    time.sleep_ms(100)

ntptime.settime()                 # cam's clock is now UTC
print(time.localtime())

Setelah ntptime.settime() selesai, jam waktu nyata internal dan time.localtime() mencerminkan waktu UTC saat ini. Dua parameter dapat menyesuaikan nilai default:

  • ntptime.host adalah nama server yang akan dikueri. Ganti nilainya (ntptime.host = "time.google.com") sebelum memanggil settime() untuk menunjuk ke server yang berbeda.

  • ntptime.timeout adalah jumlah detik untuk menunggu balasan sebelum menyerah; nilainya pendek secara default.

9.16.4. Kapan harus memanggilnya

  • Setelah koneksi jaringan terhubung. NTP berjalan di atas UDP, yang berjalan di atas pengaturan IP yang sudah terbentuk. Tunggu hingga isconnected() mengembalikan True terlebih dahulu.

  • Secara berkala pada kamera yang berjalan lama. Jam internal dapat menyimpang selama berjam-jam dan berhari-hari. Memanggil settime() setiap hari atau setiap minggu menjaga akurasinya.

9.16.5. Zona waktu

NTP mengembalikan UTC. MicroPython tidak menyertakan database zona waktu, sehingga konversi dari UTC ke waktu lokal adalah tugas skrip. Pendekatan umum adalah menggunakan offset tetap untuk zona penerapan:

import time

offset = -5 * 3600                  # hours -> seconds, US Eastern
local = time.localtime(time.time() + offset)
print(local)

Waktu Musim Panas (Daylight Saving Time), detik kabisat, dan perubahan zona historis tidak ditangani oleh pendekatan ini. Untuk sebagian besar penerapan kamera, offset tetap sudah cukup; jika skrip benar-benar memerlukan waktu sipil dengan Waktu Musim Panas, lakukan konversinya di sisi server.

9.16.6. Apa yang bisa salah

  • Jaringan belum tersambung. ntptime.settime() melempar OSError jika tidak dapat menjangkau server. Baik koneksi belum aktif, pencarian nama gagal, server tidak terjangkau, atau tidak ada balasan yang tiba dalam ntptime.timeout. Coba lagi setelah koneksi stabil.

  • Portal captive. Jaringan Wi-Fi yang mencegat DNS mungkin menjawab nama server NTP dengan IP portal itu sendiri, dan permintaan NTP ke sana menghasilkan data yang tidak masuk akal. Kamera akan mengira jaringan terhubung, tetapi penetapan waktu akan gagal atau sangat salah. Pindah ke jaringan yang bersih atau gunakan IP secara langsung.

  • Membanjiri pool publik. Pool NTP publik membatasi klien yang menyalahgunakan layanan. Sekali per jam sudah lebih dari cukup; sekali per menit akan membuat kamera diblokir.

Untuk referensi lengkap ntptime, lihat ntptime --- klien NTP sederhana.