Python: Kópia snímok z IP kamery / 9. časť

0

Mnohí z nás majú doma či v práci nainštalované tzv. IP kamery najrôznejšieho typu a využitia. Môže ísť pritom o jednoduché lacné kamery alebo o zložitý a drahý kamerový systém. V každom prípade, pokiaľ hovoríme o technológii IP, takéto kamery pripájame k bežnej počítačovej sieti, prostredníctvom ktorej následne využívame poskytované služby. Najčastejšie ide o sledovanie obrazu snímaného kamerou. Ak chceme obraz sledovať mimo lokálnej počítačovej siete, často sa stretávame s pojmami ako PortForwarding, Public IP, DDNS, IPsec, Onvif, rtsp... Dôležitá otázka je počítačová bezpečnosť. Ďalšou je napr. ukladanie záznamu v lokálnom (domácom) pro­stredí, ktoré môže byť pri incidente kompletne kompromitované vrátane zničenia záznamu.

Program imgcpy

Spomenuté otázky dokážeme riešiť rôznymi sofistikovanými spôsobmi, ale dajú sa vyriešiť aj úplne triviálne, a to pomocou veľmi jednoduchého programu napísaného v jazyku Python. Princíp riešenia tkvie v kopírovaní snímok z kamery na FTP server. Odpadá tak akákoľvek konfigurácia na rozhraní LAN/WAN sieťového routera či potreba verejnej IP adresy. Navyše dôjde k zvýšeniu bezpečnosti ukladaného záznamu, pretože ten sa nenachádza na mieste incidentu, ale na externom médiu, ku ktorému nemá narušiteľ prístup.

Algoritmus programu je nasledujúci:

1. Špecifikujeme URL snímky, ktorú vytvára (sníma) IP kamera, otestujeme, či sa na zadanom URL nachádza binárny súbor.

2. Z dôvodu testu stlačenia klávesu inicializujeme modul pygame.

3. Špecifikujeme údaje potrebné na prihlásenie sa na FTP server, vytvoríme spojenie, vyberieme zložku, do ktorej budeme ukladať snímky.

4. Spustíme nekonečnú slučku, v rámci ktorej:

a) otestujeme stlačenie klávesu – v prípade stlačenia klávesu q ukončíme program,

b) v špecifikovanom intervale (napr. každých 20 sekúnd) získame súbor so snímkou z IP kamery a uložíme ho na FTP server.


Obr. 1 Cesta snímok z IP kamery na FTP server

Program imgcpy využíva pri svojej činnosti nasledujúce moduly:

sys (docs.python.org/3/library/sys.html)

Systémový modul, ktorý obsahuje špecifické systémové parametre a funkcie používané interpreterom. Použitá funkcia sys.exit(arg) ukončuje vykonávanie programu. Vyvoláva pritom výnimku SystemExit, čím sa vykoná blok uvedený klauzulou finally výkonných prvkov try. Voliteľný argument môže mať nulovú (štandardné ukončenie) alebo nenulovú hodnotu reprezentujúcu neštandardné ukončenie programu. V prípade uvedenia reťazca je ten vypísaný na štandardný výstup stderr, pričom výstupná hodnota (exit code) funkcie exit sa automaticky nastaví na 1.

io (docs.python.org/3/library/io.html)

Systémový modul io poskytuje najrôznejšiu funkcionalitu, ktorá súvisí so vstupno-výstupnými (Input/Output) zariadeniami (textové, binárne, nespracované – raw). I/O objekt, ktorý môže byť určený iba na čítanie, iba na zápis alebo na čítanie aj zápis, sa nazýva súborovým objektom (file object), resp. prúdom (stream) alebo objektom „totožným“ so súborom (file-like object). Prístup k jeho obsahu môže byť sekvenčný alebo ľubovoľný. Použitá trieda io.BytesIO(bytes-like object) transformuje bytes-like objekt vytvorený v pamäťovom zásobníku (buffer) na objekt bytes, a to bez aplikácie akéhokoľvek prekódovania.

requests (2.python-requests.org/en/master)

Pomocou doplnkovej knižnice requests môžeme vytvárať a posielať HTTP/1.1 požiadavky ako:

requests.head(URL,**kwargs) – funkcia vráti requests.Response objekt obsahujúci odpoveď servera na HTTP HEAD požiadavku. Súčasťou tohto objektu je aj slovník (Dict) s názvom ­headers, ktorý obsahuje informácie o HTTP hlavičke. Získané informácie sú vo formáte, ktorý v súlade s RFC 7230 nerozlišuje veľké a malé písmená (case-insensitive). V slovníku možno okrem iných nájsť aj kľúče Content-Type a Content-Length, ktoré špecifikujú MIME typ (RFC 6838) a veľkosť údajov nachádzajúcich sa na zadanom URL.

requests.get(URL,params,**kwargs) – funkcia rovnako ako v prípade requests.head() vráti Response objekt obsahujúci odpoveď servera na HTTP GET požiadavku. Jeho súčasťou je okrem iného aj obsah súboru nachádzajúceho sa na zadanom URL. Konkrétne bajty obsahu sú označené atribútom content.

ftplib (docs.python.org/3/library/ftplib.html)

Systémový modul FTP implementuje funkcie klienta protokolu FTP (RFC 959). Použitá je trieda ftplib.FTP(HOST,USER,PSWD,ACCT,TIMEOUT,SOURCE_ADDRESS). Vytvorením jej inštancie dochádza k automatickému volaniu metód:

connect(HOST) – vytvorenie spojenia s HOSTom,

login(USER,PSWD,ACCT) – špecifikácia prihlasovacích údajov.

Nepovinné argumenty TIMEOUT a SOURCE_ADDRESS predstavujú povolený čas na vytvorenie spojenia a sieťovú adresu (host:port) zdroja, ktorý vytvára spojenie.

Ďalšie z použitých metód sú FTP.cwd() – zmena aktuálnej zložky v rámci súborového systému FTP servera a FTP.storbinary(CMD,FP,BLOCKSIZE,CALLBACK,REST) – uloženie súboru na FTP server v binárnom tvare, pričom:

CMD = STOR príkaz v tvare „STOR názov_súboru“,

FP = file objekt, resp. bytes objekt, ktorého obsah sa pri ukladaní načítava metódou read() po blokoch veľkosti BLOCKSIZE (štandardne 8192 bajtov),

CALLBACK = funkcia volaná po každom zápise bloku bajtov na FTP server,

REST = bajtový offset v prenášanom súbore, ktorý upozorňuje server na reštart prenosu údajov od požadovaného miesta.


Obr. 2 Príklad snímky uloženej na FTP serveri

pygame (pygame.org/news)

Knižnica pygame je doplnková knižnica Pythonu, ktorá je určená na tvorbu multimediálnych aplikácií. Ide o jednoduchú, rýchlu a efektívnu knižnicu, ktorá využíva služby multiplatformovej knižnice SDL a kód napísaný v jazyku C a Assembleri. Dokáže využiť viaceré grafické platformy, pričom nie vždy musí vytvárať prostredie GUI. Z množstva jej funkcií sme použili nasledujúce:

int() – inicializácia  všetkých importovaných pygame modulov,

display.set_mode() – inicializácia okna = vytvorenie zobrazovacej plochy (display surface),

event.get() – získanie a vymazanie správ (udalostí) zo zásobníka (queue) udalostí,

quit() – ukončenie (odinicializácia) všetkých inicializovaných pygame modulov.

datetime (docs.python.org/3/library/datetime.html)

Štandardný modul obsahujúci triedy určené na prácu s dátumom a časom. Použitá bola metóda datetime.today(), určená na získanie aktuálneho lokálneho dátumu (datetime objekt), ktorý korešponduje s časovou známkou (timestamp) zadanou vo formáte POSIX. Datetime objekt obsahuje všetky informácie zo samostatných objektov date a time, pričom sme využili jeho atribúty day (poradové číslo dňa v mesiaci počnúc od 1), hour (hodina v rozsahu 0 – 23), minute (minúta v rozsahu 0 – 59) a second (sekunda v rozsahu 0 – 59).

Súčasťou článku je zdrojový kód programu imgcpy.py

 

Zobrazit Galériu

Marek Sopko

Všetky autorove články

Pridať komentár

Mohlo by vás zaujímať

Mohlo by vás zaujímať