9.3. Kabel i ramka¶
Dwie najniższe warstwy stosu najłatwiej w przypadku kamery uznać za oczywiste, ponieważ wszystko, co robią, dzieje się wewnątrz układu, a kamera obsługuje je bez udziału jakiegokolwiek kodu w Pythonie. Mimo to warto je pokrótce omówić, ponieważ wyjaśniają, co oznacza „sieć lokalna” i gdzie zaczyna się granica z resztą infrastruktury.
9.3.1. Warstwa fizyczna¶
Najniższa warstwa to faktyczna sygnalizacja – przewody, światłowody lub fale radiowe, które przenoszą bity między dwoma urządzeniami. Ethernet po skrętce koduje każdy bit jako przejście napięciowe ze stałą szybkością. Wi-Fi moduluje te same bity na nośnej radiowej w paśmie 2,4 GHz lub 5 GHz. Oba rozwiązania wytwarzają strumień cyfr binarnych między dwoma fragmentami sprzętu; oba są rodzajem szczegółu, którym krzem kamery zajmuje się bez konieczności myślenia o nim przez oprogramowanie.
Z perspektywy skryptu w Pythonie warstwa fizyczna to „łącze jest aktywne” albo „łącze jest nieaktywne”. Moduł network zgłasza ten stan poprzez metodę isconnected() na interfejsie Wi-Fi oraz poprzez status łącza na przewodowym interfejsie Ethernet. Poza tym wszystko inne, co robi ta warstwa, pozostaje ukryte.
9.3.2. Warstwa łącza¶
Jeden poziom wyżej znajduje się warstwa łącza – reguły wysyłania porcji bajtów (ramki) między dwoma urządzeniami, które dzielą ten sam segment fizyczny. Warstwa łącza dodaje dwie rzeczy ponad surową sygnalizację:
Adresowanie sprzętowe. Każdy interfejs sieciowy ma unikalny 48-bitowy identyfikator zwany adresem MAC (Media Access Control). W Ethernecie jest on wypalony w układzie; w Wi-Fi jest to ten sam rodzaj identyfikatora wypalony w module bezprzewodowym. Adresy MAC są tym, czego przełącznik – urządzenie z wieloma portami Ethernet, do których podłączają się pobliskie urządzenia – używa, aby zdecydować, którym portem dana ramka powinna zostać wysłana. Punkt dostępowy Wi-Fi pełni tę samą rolę dla urządzeń bezprzewodowych na swoim kanale.
Tworzenie ramek. Bajty przekazywane w dół przez wyższą warstwę są pakowane w ramkę z niewielkim nagłówkiem, ładunkiem oraz sumą kontrolną na końcu. Nagłówek niesie źródłowy i docelowy adres MAC; suma kontrolna pozwala odbiorcy wykryć ramkę, której bajty zostały uszkodzone w trakcie przesyłania. Ramki niezaliczające testu są po cichu odrzucane – ktokolwiek dba o niezawodność, musi ją odtworzyć w wyższej warstwie.
Segment lokalny to dowolna grupa urządzeń, które mogą bezpośrednio widzieć nawzajem swoje ramki – porty przewodowe na jednym przełączniku, wszystkie urządzenia powiązane z jednym punktem dostępowym Wi-Fi lub niewielka siatka połączonych ze sobą przełączników. Warstwa łącza nie może wykroczyć poza ten segment. Gdy tylko miejsce docelowe znajduje się w innym segmencie, wiadomość musi zostać przekazana do warstwy wyższej.
9.3.3. Co udostępnia kamera¶
Kamera ma adres MAC dla każdego posiadanego interfejsu sieciowego – adres Wi-Fi, jeśli kamera obsługuje łączność bezprzewodową, oraz adres Ethernet, jeśli płytka ma odpowiedni port. Moduł network daje do niego dostęp poprzez network_interface.config("mac") na dowolnym obiekcie interfejsu, którego używa aplikacja, gdy potrzebuje odczytać adres. Niektóre aplikacje tego potrzebują, na przykład aby zarejestrować urządzenie w systemie zarządzania flotą. Poza tym jest to jedyne pokrętło, które warstwa łącza oddaje Pythonowi.
Wszystko inne – tworzenie ramek, faktyczny ruch MAC w przewodzie lub w eterze, negocjacje między kamerą a punktem dostępowym dotyczące tego, którego kanału i szybkości użyć – dzieje się w całości wewnątrz sprzętu bezprzewodowego lub Ethernet. Następna strona omawia jedyne miejsce, w którym skrypt w Pythonie ma coś do powiedzenia w warstwie łącza: wskazanie kamerze, do której sieci ma dołączyć.