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-01sulit 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.hostadalah nama server yang akan dikueri. Ganti nilainya (ntptime.host = "time.google.com") sebelum memanggilsettime()untuk menunjuk ke server yang berbeda.ntptime.timeoutadalah 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()mengembalikanTrueterlebih 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()melemparOSErrorjika tidak dapat menjangkau server. Baik koneksi belum aktif, pencarian nama gagal, server tidak terjangkau, atau tidak ada balasan yang tiba dalamntptime.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.