9.4. Mengaktifkan tautan¶
Lapisan tautan yang dibahas di halaman sebelumnya sebagian besar berjalan otomatis, tetapi ada satu tempat di mana skrip Python harus ikut campur: memberi tahu kamera jaringan mana yang akan bergabung. Hingga langkah tersebut berhasil, tidak ada fitur jaringan yang dibahas di bagian selanjutnya yang akan berfungsi.
9.4.1. Modul network¶
Modul network mengekspos perangkat keras jaringan kamera ke Python. Kumpulan antarmuka yang tepat bergantung pada board: banyak kamera memiliki chip nirkabel dan mengekspos kelas WLAN (dinamai untuk Wireless Local Area Network); beberapa board juga memiliki port Ethernet bawaan dan mengekspos kelas LAN (dinamai untuk Local Area Network, yaitu versi kabel). Pola penggunaannya sama untuk keduanya, dengan satu perbedaan penting: antarmuka nirkabel harus diberitahu jaringan mana yang akan bergabung, sementara Ethernet mengambil apa pun yang ada di kabel.
9.4.2. Alur Wi-Fi¶
Bergabung dengan jaringan Wi-Fi terdiri dari tiga langkah: buat antarmuka, aktifkan, minta untuk terhubung ke jaringan bernama dengan kata sandi. Antarmuka bernegosiasi dengan titik akses di latar belakang; panggilan isconnected() melaporkan ketika tautan telah selesai aktif:
import network
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)
print("link up")
Argumen IF_STA memilih mode station -- kamera bergabung ke jaringan yang dihosting orang lain. Mode sebaliknya, IF_AP, membuat kamera menghosting jaringan kecilnya sendiri yang dapat diikuti oleh perangkat lain; berguna untuk antarmuka konfigurasi dan pengaturan di lokasi, tetapi bukan kasus umum.
Setelah isconnected() mengembalikan True, kamera berada di jaringan. Semua yang diperlukan oleh lapisan yang lebih tinggi untuk menyiapkan diri telah terjadi secara otomatis saat tautan aktif; halaman-halaman berikutnya menjelaskan potongan-potongan itu satu per satu.
9.4.3. Apa yang bisa salah¶
Beberapa mode kegagalan praktis muncul pada langkah ini.
Nama jaringan atau kata sandi salah. Upaya koneksi secara diam-diam mencoba ulang hingga aplikasi menyerah. Bungkus penantian dengan batas waktu agar loop di atas tidak memblokir selamanya:
start = time.ticks_ms() while not wlan.isconnected(): if time.ticks_diff(time.ticks_ms(), start) > 10000: raise OSError("Wi-Fi did not come up in 10 s") time.sleep_ms(100)
Diluar jangkauan. Kamera dan titik akses harus cukup dekat agar sinyal cukup kuat untuk mempertahankan tautan.
status()mengembalikan kode yang menunjukkan mengapa tautan tidak aktif;scan()mengembalikan daftar jaringan yang dapat dilihat oleh radio, yang merupakan diagnostik untuk dijalankan ketikaconnecttidak akan berhasil.Titik akses meminta lebih dari sekadar kata sandi. Jaringan terbuka (tanpa kata sandi) dan jaringan yang dilindungi kata sandi umum dicakup oleh
connectseperti yang ditunjukkan di atas. Jaringan yang lebih besar di tempat kerja dan sekolah terkadang menggunakan skema berbeda di mana kamera harus mengautentikasi terhadap server login terpisah; itu memerlukan argumen tambahan keconnect. Lihat kelas WLAN -- mengendalikan antarmuka WiFi bawaan untuk permukaan lengkapnya.
9.4.4. Tetap terhubung¶
Mengaktifkan tautan adalah setengah dari masalah. Tetap terhubung adalah setengah lainnya -- titik akses reboot, kamera keluar dari jangkauan, sewa DHCP kedaluwarsa, firmware radio sesekali macet. Kamera yang akan hidup di jaringan selama berbulan-bulan harus memperhatikan hal itu dan pulih sendiri.
Pola deteksinya adalah memanggil isconnected() sekali per iterasi main-loop dan bereaksi ketika mengembalikan False. isconnected() dapat berbohong sebentar ketika koneksi telah terputus tanpa radio menyadarinya -- pengiriman socket yang gagal ketika tautan "seharusnya" aktif adalah bukti lain aplikasi tentang pemutusan. status() adalah sumber yang lebih otoritatif ketika keduanya tidak setuju.
Pola reconnect adalah disconnect() diikuti oleh connect() dengan kredensial yang sama, dengan penantian yang dibungkus dalam batas waktu seperti pada koneksi awal. Mundur di antara upaya -- satu detik, dua, empat, berlipat ganda hingga sekitar satu menit -- agar pemadaman panjang tidak membebani AP dan tidak membakar anggaran daya radio pada spin loop:
import network
import time
_BACKOFF_S = (1, 2, 4, 8, 16, 32, 60)
def reconnect(wlan, ssid, password):
for delay in _BACKOFF_S:
wlan.disconnect()
wlan.connect(ssid, password)
deadline = time.ticks_add(time.ticks_ms(), 10_000)
while not wlan.isconnected():
if time.ticks_diff(deadline, time.ticks_ms()) < 0:
break
time.sleep_ms(100)
if wlan.isconnected():
return True
time.sleep(delay)
return False
Ketika helper tersebut terus mengembalikan False, firmware radio itu sendiri mungkin macet. Jalan terakhir adalah mengaktifkan ulang daya radio: active(False), jeda singkat, active(True), reconnect dari awal. Ini mengembalikan firmware radio ke keadaan yang diketahui dengan biaya beberapa detik tambahan downtime:
def radio_power_cycle(wlan, ssid, password):
wlan.active(False)
time.sleep(1)
wlan.active(True)
return reconnect(wlan, ssid, password)
Kamera yang telah offline selama menit-menit adalah kegagalan nyata yang harus dilihat aplikasi. Kode pemulihan harus menampilkan keadaan tersebut -- tandai jaringan sebagai tidak sehat dalam flag yang diperiksa main loop, dan biarkan aplikasi melewatkan pengiriman jaringan yang seharusnya dilakukan saat flag bersih -- agar pemadaman panjang tidak membuat aplikasi macet menunggu socket yang tidak akan pernah menulis.
9.4.5. Ethernet, bila ada¶
Board dengan Ethernet bawaan mengekspos pola yang sama tanpa langkah connect. Antarmuka LAN diaktifkan dengan active(), dan segera setelah kabel terpasang antarmuka siap digunakan:
import network
lan = network.LAN()
lan.active(True)
print("link up")
Setelah titik ini, halaman-halaman bagian selanjutnya berlaku dengan cara yang sama terlepas dari antarmuka mana yang membawa kamera ke jaringan. Lapisan yang lebih tinggi tidak peduli apakah tautan di bawahnya adalah Wi-Fi atau Ethernet -- "terhubung" adalah "terhubung".
Untuk referensi WLAN dan LAN lengkap, termasuk kenop konfigurasi yang tidak muat di sini, lihat network --- konfigurasi jaringan.