9.3. Кабель и кадр¶
Два самых нижних уровня стека на камере проще всего воспринимать как должное, потому что всё, что они делают, происходит внутри чипа, и камера обрабатывает их без участия какого-либо кода на Python. Тем не менее, краткий обзор им стоит уделить, поскольку они объясняют, что означает «локальная сеть» и где начинается граница с остальной инфраструктурой.
9.3.1. Физический уровень¶
Нижний уровень – это собственно передача сигналов: провода, оптоволокно или радиоволны, переносящие биты между двумя устройствами. Ethernet по витой паре кодирует каждый бит как переход напряжения с фиксированной скоростью. Wi-Fi модулирует те же биты на радионесущую в диапазоне 2,4 ГГц или 5 ГГц. Оба формируют поток двоичных цифр между двумя аппаратными устройствами; оба относятся к тем деталям, которые кремний камеры обрабатывает без необходимости задумываться об этом на уровне программного обеспечения.
С точки зрения скрипта на Python физический уровень – это «канал поднят» или «канал не работает». Модуль network сообщает об этом состоянии через метод isconnected() на интерфейсе Wi-Fi и через состояние канала на проводном интерфейсе Ethernet. Всё остальное, что делает этот уровень, скрыто.
9.3.2. Канальный уровень¶
На одну ступень выше находится канальный уровень – правила отправки порции байтов (кадра) между двумя устройствами, которые используют один и тот же физический сегмент. Канальный уровень добавляет две вещи поверх простой передачи сигналов:
Аппаратная адресация. Каждый сетевой интерфейс имеет уникальный 48-битный идентификатор, называемый MAC-адресом (Media Access Control). В Ethernet он зашит в чип; в Wi-Fi это такой же идентификатор, зашитый в беспроводной модуль. MAC-адреса – это то, что коммутатор (устройство с несколькими портами Ethernet, к которым подключаются находящиеся рядом устройства) использует, чтобы решить, в какой порт следует отправить данный кадр. Точка доступа Wi-Fi играет ту же роль для беспроводных устройств на своём канале.
Формирование кадров. Байты, которые передаёт сверху более высокий уровень, упаковываются в кадр с небольшим заголовком, полезной нагрузкой и контрольной суммой в конце. Заголовок несёт MAC-адреса источника и назначения; контрольная сумма позволяет получателю обнаружить кадр, байты которого были повреждены при передаче. Кадры, не прошедшие проверку, молча отбрасываются – тот, кому важна надёжность, должен обеспечить её на более высоком уровне.
Локальный сегмент – это любая группа устройств, которые могут напрямую видеть кадры друг друга: проводные порты одного коммутатора, все устройства, связанные с одной точкой доступа Wi-Fi, или небольшая ячеистая сеть из соединённых между собой коммутаторов. Канальный уровень не может выйти за пределы этого сегмента. Как только получатель находится в другом сегменте, сообщение должно быть передано вышестоящему уровню.
9.3.3. Что предоставляет камера¶
У камеры есть MAC-адрес для каждого её сетевого интерфейса: адрес Wi-Fi, если камера поддерживает беспроводную связь, и адрес Ethernet, если на плате есть соответствующий порт. Модуль network даёт к нему доступ через network_interface.config("mac") на том объекте интерфейса, который использует приложение, когда нужно прочитать адрес. Некоторым приложениям это необходимо, например, чтобы зарегистрировать устройство в системе управления парком устройств. В остальном это единственный рычаг, который канальный уровень передаёт в распоряжение Python.
Всё остальное – формирование кадров, фактический MAC-трафик в проводе или в эфире, согласование между камерой и точкой доступа о том, какой канал и скорость использовать – происходит полностью внутри беспроводного или Ethernet-оборудования. На следующей странице рассматривается единственное место, где скрипт на Python действительно может повлиять на канальный уровень: указание камере, к какой сети подключиться.