9.4. Bağlantıyı kurmak¶
Önceki sayfada ele alınan bağlantı katmanı çoğunlukla otomatiktir, ancak bir Python betiğinin devreye girmesi gereken tek bir yer vardır: kameraya hangi ağa katılacağını söylemek. Bu adım başarılı olana kadar, bu bölümün geri kalanının kapsadığı hiçbir ağ özelliği çalışmaz.
9.4.1. network modülü¶
network modülü, kameranın ağ donanımını Python’a açar. Tam arabirim kümesi karta bağlıdır: birçok kamerada bir kablosuz çip bulunur ve bir WLAN sınıfı sunar (Wireless Local Area Network için adlandırılmıştır); bazı kartlarda ayrıca yerleşik bir Ethernet portu bulunur ve bir LAN sınıfı sunarlar (Local Area Network, yani kablolu sürüm için adlandırılmıştır). Kullanım deseni her ikisi için de aynıdır, önemli bir farkla: bir kablosuz arabirime hangi ağa katılacağı söylenmelidir, oysa Ethernet kablodaki her ne varsa onu alır.
9.4.2. Wi-Fi akışı¶
Bir Wi-Fi ağına katılmak üç adımdır: arabirimi oluşturmak, onu etkinleştirmek ve bir parolayla adlandırılmış bir ağa bağlanmasını istemek. Arabirim, erişim noktasıyla arka planda anlaşır; bir isconnected() çağrısı, bağlantı kurulması tamamlandığında bunu bildirir:
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")
IF_STA argümanı istasyon modunu seçer – kamera, başka birinin barındırdığı bir ağa katılır. Karşıt mod olan IF_AP ise kameranın, diğer cihazların katılabileceği kendi küçük ağını barındırmasını sağlar; yapılandırma arabirimleri ve sahada kurulum için yararlıdır, ancak yaygın durum değildir.
Bir kez isconnected() True döndürdüğünde, kamera ağdadır. Üst katmanların kendilerini kurmak için ihtiyaç duyduğu diğer her şey, bağlantı kurulurken otomatik olarak gerçekleşmiştir; ilerideki sayfalar bu parçaları tek tek açıklar.
9.4.3. Neler ters gidebilir¶
Bu adımda birkaç pratik hata modu ortaya çıkar.
Yanlış ağ adı veya parola. Bağlantı denemesi, uygulama vazgeçene kadar sessizce yeniden dener. Yukarıdaki döngünün sonsuza kadar bloklamaması için beklemeyi bir zaman aşımıyla sarın:
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)
Menzil dışı. Kamera ile erişim noktasının, bir bağlantıyı sürdürecek kadar sinyalin güçlü olması için yeterince yakın olmaları gerekir.
status(), bağlantının neden kurulmadığını gösteren bir kod döndürür;scan()ise radyonun görebildiği ağların listesini döndürür ve bu,connectbaşarılı olmadığında çalıştırılacak tanılama aracıdır.Erişim noktası bir paroladan fazlasını ister. Açık ağlar (parolasız) ve yaygın parola korumalı ağlar, yukarıda gösterildiği gibi
connecttarafından kapsanır. İş yerlerindeki ve okullardaki daha büyük ağlar bazen kameranın ayrı bir oturum açma sunucusuna karşı kimlik doğrulaması yapması gereken farklı bir şema kullanır; bunlarconnectiçin ek argümanlara ihtiyaç duyar. Yüzeyin tamamı için class WLAN – yerleşik WiFi arayüzlerini denetler sayfasına bakın.
9.4.4. Bağlı kalmak¶
Bağlantıyı kurmak sorunun yarısıdır. Bağlı kalmak ise diğer yarısıdır – erişim noktaları yeniden başlar, kamera menzil dışına dolaşır, DHCP kiraları sona erer, radyo aygıt yazılımı (firmware) zaman zaman takılır. Aylarca ağda yaşayacak bir kameranın bunu fark etmesi ve kendi kendine toparlanması gerekir.
Tespit deseni, ana döngünün her yinelemesinde bir kez isconnected() çağırmak ve False döndürdüğünde tepki vermektir. Bir bağlantı, radyo henüz fark etmeden düştüğünde isconnected() kısa süreliğine yanıltabilir – bağlantının “olması gereken” durumdayken başarısız olan bir soket gönderimi, uygulamanın bir düşüşe dair sahip olduğu diğer kanıttır. İkisi anlaşmazlığa düştüğünde status() daha yetkili kaynaktır.
Yeniden bağlanma deseni, başlangıçtaki bağlantıdaki gibi bekleme bir zaman aşımıyla sarılmış olarak, aynı kimlik bilgileriyle disconnect() ardından connect() çağırmaktır. Denemeler arasında geri çekilin – bir saniye, iki, dört, bir dakika kadar katlanarak – böylece uzun bir kesinti AP’yi yormaz ve radyonun güç bütçesini boş döngülerde tüketmez:
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
O yardımcı sürekli False döndürmeye devam ederse, radyo aygıt yazılımının (firmware) kendisi takılmış olabilir. Son çare, radyoyu yeniden güç döngüsünden geçirmektir: active(False), kısa bir duraklama, active(True), sıfırdan yeniden bağlanma. Bu, fazladan birkaç saniyelik kesinti pahasına radyo aygıt yazılımını bilinen bir duruma geri getirir:
def radio_power_cycle(wlan, ssid, password):
wlan.active(False)
time.sleep(1)
wlan.active(True)
return reconnect(wlan, ssid, password)
Dakikalarca ağ dışında kalmış bir kamera, uygulamanın görmesi gereken gerçek bir hatadır. Kurtarma kodu bu durumu açığa çıkarmalıdır – ağı, ana döngünün kontrol ettiği bir bayrakta sağlıksız olarak işaretleyin ve bayrak temiz olmadığı sürece uygulamanın yapacağı ağ gönderimlerini atlamasına izin verin – böylece uzun bir kesinti, asla yazmayacak soketleri bekleyerek uygulamayı durdurmaz.
9.4.5. Ethernet, mevcut olduğunda¶
Yerleşik Ethernet’e sahip kartlar, connect adımı olmadan aynı deseni sunar. LAN arabirimi active() ile etkinleştirilir ve kablo takılır takılmaz arabirim kullanıma hazırdır:
import network
lan = network.LAN()
lan.active(True)
print("link up")
Bu noktadan sonra, kamerayı ağa hangi arabirimin getirdiğine bakılmaksızın bu bölümün geri kalan sayfaları aynı şekilde uygulanır. Üst katmanlar, altlarındaki bağlantının Wi-Fi mi yoksa Ethernet mi olduğunu umursamaz – “bağlı” “bağlıdır”.
WLAN ve LAN başvurusunun tamamı için, buraya sığmayan yapılandırma ayar düğmeleri dahil, network — ağ yapılandırması sayfasına bakın.