{"id":216039,"date":"2014-03-17T09:34:03","date_gmt":"2014-03-17T05:34:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=216039"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=216039","title":{"rendered":"<span class=\"post_title\">Transcend WiFi. \u041f\u0438\u0448\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442 Shoot&#038;View \u0434\u043b\u044f Windows, Mac \u0438 Linux<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" width=\"400\" align=\"left\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/16b\/e18\/a55\/16be18a553ec0063b4fd4c36013923c0.jpg\"\/> \u041d\u0430 \u0445\u0430\u0431\u0440\u0435 \u043d\u0435\u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e <a href=\"http:\/\/habrahabr.ru\/post\/191742\/\">\u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438<\/a> \u043e \u043a\u0430\u0440\u0442\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 SDHC \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c WiFi \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a\u043e\u043c. \u041a\u0443\u043f\u0438\u0432 \u044d\u0442\u0443 \u043a\u0430\u0440\u0442\u0443, \u044f \u0431\u044b\u043b \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u0430\u043d \u0443\u0436\u0430\u0441\u043d\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438\u0434\u0435\u0442 \u00ab\u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435\u00bb \u0441 \u043a\u0430\u0440\u0442\u043e\u0439. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f iOS \u0438 Android \u0445\u043e\u0442\u044c \u043a\u0430\u043a \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0442\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043f\u043e\u0434 windows \u0438 macos, \u043b\u0438\u0448\u0430\u0435\u0442 \u043a\u0430\u0440\u0442\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0435 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u0430\u043c\u0438. \u0422\u043e\u0447\u043d\u0435\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043d\u0430 PC \u0435\u0441\u0442\u044c \u0432\u0435\u0431 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043d\u043e \u043a\u0440\u043e\u043c\u0435 \u0443\u0436\u0430\u0441\u043d\u043e\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430, \u043c\u0435\u043d\u044f \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u0430\u043b\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0443 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Shoot&#038;View, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u044a\u0435\u043c\u043a\u0438.<\/p>\n<p>  \u041b\u044e\u0431\u0438\u0442\u0435\u043b\u0438 geek-porno \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u0443\u044e\u0442\u0441\u044f \u2014 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443, \u0445\u0430\u043a\u0430\u0442\u044c \u0435\u0435, \u0432\u0441\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u0443 \u043a\u0430\u0440\u0442\u0443 \u043f\u0430\u043c\u044f\u0442\u0438. \u041c\u044b \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u00ab\u0441\u0442\u043e\u043a\u043e\u0432\u043e\u0439\u00bb \u043a\u0430\u0440\u0442\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445 \u043b\u0438\u0431\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0441 \u0432\u0430\u043c\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b Shoot&#038;View \u043a\u0430\u0440\u0442 \u043f\u0430\u043c\u044f\u0442\u0438 Transcend WiFi \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0430 python \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f \u043d\u0430 windows, linux \u0438 MacOS. \u0410 \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043d\u0435\u0442\u0435\u0440\u043f\u0435\u043b\u0438\u0432\u044b\u0445, \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0430\u0441 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 python \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442, \u0430 \u0442\u0430\u043a \u0436\u0435 GUI \u0443\u0442\u0438\u043b\u0438\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 windows, linux \u0438 macos.<\/p>\n<p>  <a name=\"habracut\"><\/a><\/p>\n<h4>\u041f\u043e\u0438\u0441\u043a \u043a\u0430\u0440\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u0441\u0435\u0442\u0438.<\/h4>\n<p>  \u041a\u0430\u0440\u0442\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0434\u0432\u0443\u0445 \u0440\u0435\u0436\u0438\u043c\u0430\u0445 \u2014 \u0440\u0435\u0436\u0438\u043c \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u0440\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u0442\u043e\u0447\u043a\u0443 \u0434\u043e\u0441\u0442\u0430\u043f\u0430, \u0438 \u0440\u0435\u0436\u0438\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0442\u043e\u0447\u043a\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u0440\u0442\u0430 \u00ab\u0446\u0435\u043f\u043b\u044f\u0435\u0442\u0441\u044f\u00bb \u043a \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0432 \u0435\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0442\u043e\u0447\u043a\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u0414\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432, \u043b\u0443\u0447\u0448\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0442\u043e\u0447\u043a\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0432 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 android \u0438\u043b\u0438 ios. \u0422\u0430\u043a \u0436\u0435 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u00abTurn Off WiFi\u00bb, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0432 Never. \u042d\u0442\u0430 \u043e\u043f\u0446\u0438\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 WiFi, \u0435\u0441\u043b\u0438 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043a \u043a\u0430\u0440\u0442\u0435. \u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u044d\u0442\u0430\u043f\u0435, \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u043a \u043a\u0430\u0440\u0434-\u0440\u0438\u0434\u0435\u0440\u0443, \u043b\u0438\u0431\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0444\u043e\u0442\u043e\u0430\u043f\u043f\u0430\u0440\u0430\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431 \u043e\u043d \u043d\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u043b\u0441\u044f \u043f\u0440\u0438 \u0431\u0435\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438. <\/p>\n<p>  \u041f\u043e\u0436\u0430\u043b\u0443\u0439 \u043d\u0430\u0447\u043d\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0414\u043b\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u0435 \u043b\u0438\u0431\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u0442\u043e\u043b\u044c\u043a\u043e \u00ab\u0431\u0430\u0442\u0430\u0440\u0435\u0439\u043a\u0438 \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435\u00bb. \u0410 \u043d\u0430\u0447\u043d\u0435\u043c \u043c\u044b \u0441:<\/p>\n<pre><code class=\"python\">import socket  class SDCard: \tdef __init__(self,home_dir=''): \t\tself.home_dir=home_dir \t\t# \u0443\u0437\u043d\u0430\u0435\u043c ip \u0430\u0434\u0440\u0435\u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \t\tself.ip=socket.gethostbyname(socket.gethostname())                 # \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f ip \u043a\u0430\u0440\u0442\u044b \t\tself.card_ip=None   if __name__=='__main__':  \t# \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u043f\u0430\u043f\u043a\u0443 \u0434\u043b\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0445 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \tHOME_DIR=os.path.expanduser('~') \tif not os.path.exists(HOME_DIR+'\/'+'ShootAndView'): \t\tos.mkdir(HOME_DIR+'\/'+'ShootAndView') \tHOME_DIR=HOME_DIR+'\/ShootAndView\/'  \tsd=SDCard(home_dir=HOME_DIR) <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043a\u0430\u0440\u0442\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043a \u0442\u043e\u0447\u043a\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u0435\u0435 ip-\u0430\u0434\u0440\u0435\u0441 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 web \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0440\u043e\u0443\u0442\u0435\u0440\u0430, \u0430 \u0435\u0441\u043b\u0438 \u0436\u0435 \u0443 \u043d\u0430\u0441 \u043f\u0440\u044f\u043c\u043e\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u043a\u0430\u0440\u0442\u0435, \u0442\u043e \u0435\u0435 ip-\u0430\u0434\u0440\u0435\u0441 \u0440\u0430\u0432\u0435\u043d 192.168.11.254 (\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438). <br \/>  \u041d\u043e \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0438\u0441\u043a\u0430\u0442\u044c \u0435\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 \u043a\u0430\u0440\u0442\u044b \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043f\u043e\u0438\u0441\u043a \u0435\u0435 \u0432 \u0441\u0435\u0442\u0438, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e:  <\/p>\n<ol>\n<li>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u043a\u0435\u0442 \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 58255<\/li>\n<li>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441 \u043d\u0435\u0433\u043e \u043f\u0443\u0441\u0442\u043e\u0439 \u0448\u0438\u0440\u043e\u043a\u043e\u0432\u0435\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u0440\u0442 55777<\/li>\n<li>\u041e\u0436\u0438\u0434\u0430\u0442\u044c <s>\u0447\u0443\u0434\u0430<\/s> \u043e\u0442\u0432\u0435\u0442\u0430 \u043a\u0430\u0440\u0442\u044b<\/li>\n<\/ol>\n<p>  \u0415\u0441\u043b\u0438 \u043d\u0430\u043c \u043f\u043e\u0432\u0435\u0437\u0435\u0442, \u0442\u043e \u0432 \u043e\u0442\u0432\u0435\u0442 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0442\u0435\u043a\u0441\u0442:  <\/p>\n<pre><code>Transcend WiFiSD - interface=mlan0 ip=192.168.0.16 netmask=255.255.255.0 router=192.168.0.1 mode=client essid=WiFiSDCard apmac=CE:5D:4E:5B:70:48 <\/code><\/pre>\n<p>  \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e ip \u0430\u0434\u0440\u0435\u0441. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u043e:  <\/p>\n<pre><code class=\"python\">import os import socket import thread import time  class SDCard: \tdef __init__(self,home_dir=''): \t\tself.home_dir=home_dir \t\tself.ip=socket.gethostbyname(socket.gethostname()) \t\tself.card_ip=None \t\t\t\t \tdef find_card(self,callback=None): \t\t&quot;&quot;&quot;\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0443&quot;&quot;&quot; \t\tthread.start_new_thread(self.find_card_thread,(callback,)) \t\t \tdef find_card_thread(self,callback=None): \t\t \t\twhile not self.card_ip: \t\t\t&quot;&quot;&quot;\u0441\u043e\u0437\u0434\u0430\u0435\u043c UDP \u0441\u043e\u043a\u0435\u0442 &quot;&quot;&quot; \t\t\ts = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) \t\t\ts.settimeout(5) \t\t\ts.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) \t\t\ts.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)\t \t\t\t&quot;&quot;&quot; \u0438 \u0431\u0438\u043d\u0434\u0438\u043c\u0441\u044f \u043d\u0430 \u043d\u0443\u0436\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 &quot;&quot;&quot; \t\t\ttry:s.bind((self.ip, 58255)) \t\t\texcept socket.error: \t\t\t\ts.close() \t\t\t\ttime.sleep(1) \t\t\t\tcontinue  \t\t\t&quot;&quot;&quot;\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u0448\u0438\u0440\u043e\u043a\u043e\u0432\u0435\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u0440\u0442 55777&quot;&quot;&quot; \t\t\ts.sendto('', ('&lt;broadcast&gt;', 55777)) \t\t\ttry:\t\t\t\t \t\t\t\tresp=s.recv(400) \t\t\t\ts.close() \t\t\t\ttry: \t\t\t\t\t&quot;&quot;&quot;\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432 \u043b\u043e\u0431 \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442&quot;&quot;&quot; \t\t\t\t\tself.card_ip=resp.split('ip=')[1].split('\\n')[0] \t\t\t\texcept IndexError: \t\t\t\t\t&quot;&quot;&quot;\u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u043c \u043e\u0431 \u044d\u0442\u043e\u043c&quot;&quot;&quot; \t\t\t\t\tif callback:callback(None)\t\t\t\t\t \t\t\t\t \t\t\t\t&quot;&quot;&quot;\u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u043c ip&quot;&quot;&quot; \t\t\t\tif callback:callback(self.card_ip)\t\t\t \t\t\texcept socket.timeout: \t\t\t\tcallback(self.card_ip) \t\t\tfinally: \t\t\t\ttime.sleep(2)  def monitor(ip): \tif not ip:return \tprint 'Find card on ip:',ip \t \t\t if __name__=='__main__': \tHOME_DIR=os.path.expanduser('~') \tif not os.path.exists(HOME_DIR+'\/'+'ShootAndView'): \t\tos.mkdir(HOME_DIR+'\/'+'ShootAndView') \tHOME_DIR=HOME_DIR+'\/ShootAndView\/' \tif options.dir:HOME_DIR=options.dir\t \t \tsd=SDCard(home_dir=HOME_DIR) \t# \u043c\u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0430 &quot;\u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0430\u0445&quot;, \t# \u0442\u0430\u043a \u043a\u0430\u043a \u0441 GUI \u043f\u043e\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0449\u0435 \tsd.find_card(callback=monitor) \t \t# \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u0438\u0441\u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435,  \t# \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c\u0441\u044f \twhile 1: \t\ttime.sleep(1) <\/code><\/pre>\n<p>  \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0441\u0430\u043c\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u0443\u0436\u0435 \u043f\u043e\u0437\u0430\u0434\u0438. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a \u043d\u0430\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u00ab\u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0438\u00bb \u043d\u043e\u0432\u044b\u0445 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0438\u0445. <\/p>\n<h4>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439.<\/h4>\n<p>  \u0421 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435\u043c \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0432\u0441\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u043a\u0430\u0440\u0442\u0443, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043a \u043a\u0430\u0440\u0442\u0435 \u043d\u0430 \u043f\u043e\u0440\u0442 5566. <br \/>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u043e\u0442\u043e\u0430\u043f\u043f\u0430\u0440\u0430\u0442 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u043a\u0430\u0434\u0440, \u0447\u0435\u0440\u0435\u0437 7-8 \u0441\u0435\u043a\u0443\u043d\u0434 \u043a \u043d\u0430\u043c \u0447\u0435\u0440\u0435\u0437 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0441\u043e\u043a\u0435\u0442 \u043f\u0440\u0438\u0434\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043d\u043e\u0432\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u043a\u0430\u0440\u0442\u0435, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0442\u0430\u043a:<br \/>  <code> &gt;\/mnt\/DCIM\/101CANON\/IMG_1754.JPG <\/code><br \/>  \u0415\u0441\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439, \u0442\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u044d\u0442\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b \u043d\u0443\u043b\u0435\u0432\u044b\u043c \u0431\u0430\u0439\u0442\u043e\u043c (0x00)<\/p>\n<p>  \u0425\u043e\u0447\u0443 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044c \u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u0447\u0435\u0440\u0435\u0437 7-8 \u0441\u0435\u043a\u0443\u043d\u0434. \u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043d\u043e, \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043d\u043e \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u044d\u0442\u043e \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c. \u0422\u0430\u043a \u0436\u0435, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043d\u043e\u0432\u044b\u0445 \u0441\u043d\u0438\u043c\u043a\u0430\u0445 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 jpeg, \u043f\u0440\u0438\u0447\u0435\u043c \u041f\u041e \u043a\u0430\u0440\u0442\u044b \u0438\u043c\u0435\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0442\u044c \u0432\u0448\u0438\u0442\u0443\u044e jpg \u043f\u0440\u0435\u0432\u044c\u044e\u0448\u043a\u0443 \u0438\u0437 RAW \u0444\u0430\u0439\u043b\u0430 (\u043e\u0431 \u044d\u0442\u043e\u043c \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435), \u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u043b\u0438 \u043b\u0438\u0448\u0438\u0442\u044c \u043d\u0430\u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043d\u0438\u043c\u0430\u0442\u044c \u0432 jpg, \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0441\u043d\u0438\u043c\u0430\u0442\u044c \u0432 RAW+jpg, \u043b\u0438\u0431\u043e \u043f\u0438\u0441\u0430\u0442\u044c RAW \u043d\u0430 \u043e\u0434\u043d\u0443 \u043a\u0430\u0440\u0442\u0443, \u0430 jpg \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e. \u0422\u0430\u043a \u0436\u0435, \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u043e\u0441\u044c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441 \u043a\u0430\u0440\u0434-\u0440\u0438\u0434\u0435\u0440\u0430, Shoot&#038;View \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043d\u043e\u0432\u044b\u0435 \u0441\u043d\u0438\u043c\u043a\u0438, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043c\u0435\u0440\u043e\u0439.<\/p>\n<p>  \u0417\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u043f\u0440\u043e\u0449\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e. \u042f \u043f\u043e\u0436\u0430\u043b\u0443\u0439 \u043d\u0430\u0447\u043d\u0443 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0442\u0440\u044b\u0432\u043a\u0438 \u043a\u043e\u0434\u0430, \u0430 \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438:  <\/p>\n<pre><code class=\"python\">\tdef listener_thread(self,callback): \t\t \t\tsock=socket.socket(socket.AF_INET, socket.SOCK_STREAM) \t\t# \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0438\u043c\u0441\u044f \u043a \u043a\u0430\u0440\u0442\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \t\tsock.connect((self.card_ip, 5566)) \t\twhile self.listen_flag: \t\t\tmessage=sock.recv(1024) \t\t\t# \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u043e \u043d\u0443\u043b\u0435\u0432\u043e\u043c\u0443 \u0431\u0430\u0439\u0442\u0443 (\u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u0448\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439) \t\t\tnew_files=message.split('\\00') \t\t\tfor x in new_files: \t\t\t\tif x: \t\t\t\t\t# \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u043a \t\t\t\t\tself.all_files.append(x[1:]) # x[1:] - \u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b &quot;&gt;&quot;, \u043e\u043d \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \t\t\t# \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0444\u0430\u0439\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u043a \t\t\tself.download_list.put(self.all_files[-1])  \t\t\tif callback:callback(self.all_files[-1]) <\/code><\/pre>\n<h4>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0441 \u043a\u0430\u0440\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438<\/h4>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u043e\u0432\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0448\u0430\u0433 \u2014 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440. \u0421\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u0431 \u0441\u0435\u0440\u0432\u0435\u0440 \u043a\u0430\u0440\u0442\u044b. \u0423\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u0444\u0430\u043a\u0442 \u2014 \u0432\u0441\u0435 \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u0440\u0430\u043d\u044c\u0448\u0435, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0432\u044c\u044e \u0438 \u043f\u0440., \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u041d\u0415 \u0422\u0420\u0415\u0411\u0423\u042e\u0422 \u0410\u0412\u0422\u041e\u0420\u0418\u0417\u0410\u0426\u0418\u0418. \u0422\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u043a\u0430\u0440\u0442\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043a\u0430\u043a \u0442\u043e\u0447\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0441\u043c\u0435\u043d\u0438\u043b \u043f\u0430\u0440\u043e\u043b\u044c WiFi, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u0439, \u0438 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0432\u0441\u0435 \u0447\u0442\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c. \u041d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u043a \u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043b\u0435\u0442\u043e\u043c \u043f\u043e \u0442\u0443\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u0430\u043c \u0438 \u043f\u043e\u0438\u0441\u043a\u0430\u0442\u044c WiFi \u0441\u0435\u0442\u0438 \u0441\u0440\u0435\u0434\u0438 \u0442\u0443\u0440\u0438\u0441\u0442\u043e\u0432 \u0441 \u0444\u043e\u0442\u043e\u0430\u043f\u043f\u0430\u0440\u0430\u0442\u0430\u043c\u0438. <\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u043f\u0430\u043f\u043a\u0443 cgi-bin, \u0442\u043e \u043c\u044b \u043d\u0430\u0439\u0434\u0435\u043c \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445. \u0417\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u043d\u0435\u0435 \u043b\u0435\u0433\u043a\u043e, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 telnet, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c <a href=\"http:\/\/wwwstud.informatik.uni-rostock.de\/ad001\/inf\/transcend-wifi-ftpd.html\">\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c<\/a>. \u0410 \u0432\u043d\u0443\u0442\u0440\u0438 \u0443 \u043d\u0430\u0441:<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/a5b\/463\/620\/a5b463620a2c7e3ab6961adf8fbabb54.png\"\/><\/p>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a wifi_filelist \u043e\u0442\u0434\u0430\u0441\u0442 \u043d\u0430\u0441 \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 (\u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 XML), \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u043c\u0443 \u0442\u0430\u043a: <a href=\"http:\/\/CARD_IP\/cgi-bin\/wifi_filelist?fn=DIR\">CARD_IP\/cgi-bin\/wifi_filelist?fn=DIR<\/a>, \u0433\u0434\u0435 CARD_IP \u2014 ip \u0430\u0434\u0440\u0435\u0441 \u043a\u0430\u0440\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0443\u0436\u0435 \u043d\u0430\u0448\u043b\u0438, \u0430 DIR \u2014 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \/mnt\/DCIM). \u0411\u0438\u043d\u0430\u0440\u043d\u0438\u043a thumbNail \u043e\u0442\u0434\u0430\u0441\u0442 \u043d\u0430\u043c \u043f\u0440\u0435\u0432\u044c\u044e\u0448\u043a\u0443 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043a\u043e\u0440\u043c\u0438\u0442\u044c \u0435\u043c\u0443 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443. \u041f\u0440\u0438\u0447\u0435\u043c \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0435\u043c\u043a\u0438\u0439 \u0440\u0435\u0437\u0430\u0439\u0441 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u0430 \u0432\u044b\u0434\u0435\u0440\u0433\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0448\u0438\u0442\u0430\u044f \u0432 jpg \u0438\u043b\u0438 \u0432 raw \u043f\u0440\u0435\u0432\u044c\u044e\u0448\u043a\u0430.<\/p>\n<p>  \u041d\u043e \u043d\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u043e\u0439 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u043c GET \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 <a href=\"http:\/\/CARD_IP\/cgi-bin\/wifi_download?fn=IMAGE_PATH\">CARD_IP\/cgi-bin\/wifi_download?fn=IMAGE_PATH<\/a>, \u0433\u0434\u0435 IMAGE_PATH \u043f\u0443\u0442\u044c \u043a \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0441\u043e\u043a\u0435\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0432\u044b\u0448\u0435. \u0414\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 python&#8217;e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f urlretrieve \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 urllib. \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u0444\u0430\u0439\u043b, \u0438 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u0447\u0442\u043e \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0432 GUI. <br \/>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"python\">\tdef download_thread(self,download_callback,download_complete): \t\twhile self.listen_flag: \t\t\t# \u0435\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0435 \u043f\u0443\u0441\u0442\u0430 \t\t\tif not self.download_list.empty(): \t\t\t\t# \u0431\u0435\u0440\u0435\u043c \u043f\u0443\u0442\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \t\t\t\tfl=self.download_list.get(block=0) \t\t\t\t# \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0443 \u0441 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f\u043c\u0438 \t\t\t\turllib.urlretrieve('http:\/\/%s\/cgi-bin\/wifi_download?fn=%s'%(self.card_ip,fl),self.home_dir+fl.split('\/')[-1],download_callback if download_callback else None) \t\t\t\tif download_complete:download_complete(self.download_now) \t\t\ttime.sleep(0.1) <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u043c \u0432\u0441\u0435 \u0432\u043e\u0435\u0434\u0438\u043d\u043e, \u0441\u043e\u0437\u0434\u0430\u0432 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 windows, linux \u0438 macos.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">sdwificard.py<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">#coding:utf-8 &quot;&quot;&quot;     Copyright (C) 2010 Igor zalomskij &lt;igor.kaist@gmail.com&gt;      This program is free software; you can redistribute it and\/or modify     it under the terms of the GNU General Public License as published by     the Free Software Foundation; either version 2 of the License, or     (at your option) any later version.      This program is distributed in the hope that it will be useful,     but WITHOUT ANY WARRANTY; without even the implied warranty of     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     GNU General Public License for more details.      You should have received a copy of the GNU General Public License along     with this program; if not, write to the Free Software Foundation, Inc.,     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. &quot;&quot;&quot;  import os import socket import thread import time import ping import Queue import urllib import sys    class SDCard: \tdef __init__(self,home_dir=''): \t\tself.home_dir=home_dir \t\t# \u0432\u044b\u044f\u0441\u043d\u044f\u0435\u043c ip \u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \t\tself.ip=socket.gethostbyname(socket.gethostname()) \t\tself.card_ip=None #\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441 ip \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u043a\u0430\u0440\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \t\tself.all_files=[] # \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \t\t \t\tself.download_list=Queue.Queue() # \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \t\tself.in_queue=[] # \u0447\u0442\u043e \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443, \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0432 GUI \t\t  \t\t \t\t \tdef find_card(self,callback=None): \t\t# \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u043a\u0430\u0440\u0442\u044b \t\tthread.start_new_thread(self.find_card_thread,(callback,))  \t\t \tdef find_card_thread(self,callback=None): \t\t&quot;&quot;&quot; \u043f\u043e\u0442\u043e\u043a \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u0430\u0440\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438 &quot;&quot;&quot; \t\twhile not self.card_ip: \t\t\t# \u0441\u043e\u0437\u0434\u0430\u0435\u043c UDP \u0441\u043e\u043a\u0435\u0442 \t\t\ts = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) \t\t\ts.settimeout(5) \t\t\ts.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) \t\t\ts.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)\t\t\t \t\t\ttry:s.bind((self.ip, 58255)) #\u0431\u0438\u043d\u0434\u0438\u043c \u0435\u0433\u043e \u043d\u0430 \u043d\u0443\u0436\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 \t\t\texcept socket.error: \t\t\t\ts.close() \t\t\t\ttime.sleep(1) \t\t\t\tcontinue   \t\t\t# \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u043c \u0448\u0438\u0440\u043e\u043a\u043e\u0432\u0435\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u0440\u0442 55777 \t\t\ts.sendto('', ('&lt;broadcast&gt;', 55777)) \t\t\ttry: \t\t\t\tresp=s.recv(400) \t\t\t\ts.close() \t\t\t\ttry: \t\t\t\t\t# \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442  \t\t\t\t\tself.card_ip=resp.split('ip=')[1].split('\\n')[0] \t\t\t\texcept IndexError: \t\t\t\t\t# \u0438\u043d\u0430\u0447\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u043c \u043e \u043d\u0435\u0443\u0434\u0430\u0447\u0435 \t\t\t\t\tif callback:callback(None) \t\t \t\t\t\tif callback:callback(self.card_ip) \t\t\t \t\t\texcept socket.timeout: \t\t\t\tcallback(None) \t\t\tfinally: \t\t\t\ttime.sleep(2) \t\t\t \t\t\t \tdef start_listen(self,callback=None,download_callback=None,download_complete=None): \t\t&quot;&quot;&quot; \u0417\u0430\u043f\u0443\u0441\u043a \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043d\u043e\u0432\u044b\u0445 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439. \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0440\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 &quot;&quot;&quot; \t\tself.listen_flag=True \t\t# \u043f\u043e\u0442\u043e\u043a \u0441\u043e\u043a\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0441\u043e\u043a\u0435\u0442 \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f\u043c\u0438 \t\tthread.start_new_thread(self.listener_thread,(callback,)) \t\t \t\t# \u0432\u0440\u0435\u043c\u044f \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043f\u0438\u043d\u0433\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0443, \u0447\u0442\u043e\u0431 \u043e\u043d\u0430 \u043d\u0435 \u043e\u0442\u0432\u0435\u043b\u0438\u043b\u0430\u0441\u044c. \t\tthread.start_new_thread(self.ping_card,()) \t\t \t\t# \u043f\u043e\u0442\u043e\u043a \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \t\tthread.start_new_thread(self.download_thread,(download_callback,download_complete)) \t\t  \t\t \tdef ping_card(self): \t\t# \u043f\u0438\u043d\u0433\u0443\u0435\u043c \u043a\u0430\u0440\u0442\u0443 \u0441 \u043f\u0435\u0440\u0435\u043e\u0434\u0438\u0447\u043d\u043e\u0441\u0442\u044c 20 \u0441\u0435\u043a\u0443\u043d\u0434. \t\twhile self.listen_flag: \t\t\ttry: \t\t\t\tresp=ping.do_one(self.card_ip) \t\t\texcept socket.error: # \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u043a\u0430\u0440\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u043f\u0438\u043d\u0433\u0438, \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \t\t\t\t \t\t\t\tpass \t\t\ttime.sleep(20) \t\t\t\t \t\t\t \tdef listener_thread(self,callback): \t\t# \u043f\u043e\u0442\u043e\u043a \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043d\u043e\u0432\u044b\u0445 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f\u0445 \t\t \t\tsock=socket.socket(socket.AF_INET, socket.SOCK_STREAM) \t\t# \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u0438\u043c\u0441\u044f \u043a \u043a\u0430\u0440\u0442\u0435 \u043d\u0430 \u043f\u043e\u0440\u0442 5566 \t\tsock.connect((self.card_ip, 5566)) \t\twhile self.listen_flag: \t\t\tmessage=sock.recv(1024) \t\t\tnew_files=message.split('\\00') # \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u043e \u043d\u0443\u043b\u0435\u0432\u043e\u043c\u0443 \u0431\u0430\u0439\u0442\u0443 (\u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u0448\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439) \t\t\tfor x in new_files: \t\t\t\tif x: \t\t\t\t\t# \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 ;) \t\t\t\t\tself.all_files.append(x[1:]) # x[1:] \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b &quot;&gt;&quot;, \u043e\u043d \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \t\t\t \t\t\tself.download_list.put(self.all_files[-1]) # \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0444\u0430\u0439\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \t\t\tself.in_queue.append(self.all_files[-1]) # \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0430\u043a \u0436\u0435 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f GUI \t\t\tif callback:callback(self.all_files[-1])   \t\t\t \tdef download_thread(self,download_callback,download_complete): \t\t# \u043f\u043e\u0442\u043e\u043a \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \t\twhile self.listen_flag: \t\t\tif not self.download_list.empty(): # \u0435\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u0430 \t\t\t\tfl=self.download_list.get(block=0) \t\t\t\tself.download_now=fl # \u0447\u0442\u043e \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f, \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f GUI \t\t\t\t \t\t\t\t# \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c  \t\t\t\turllib.urlretrieve('http:\/\/%s\/cgi-bin\/wifi_download?fn=%s'%(self.card_ip,fl),self.home_dir+fl.split('\/')[-1],download_callback if download_callback else None) \t\t\t\tif download_complete:download_complete(self.download_now) \t\t\ttime.sleep(0.1)   def find_callback(ip): \tif not ip:return \tprint 'Find card on ip:',ip \t# \u0435\u0441\u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d IP \u0430\u0434\u0440\u0435\u0441 \u043a\u0430\u0440\u0442\u044b, \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u043c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043d\u043e\u0432\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \tsd.start_listen(download_complete=download_complete) \t  def download_complete(fname): \tprint 'New image: %s'%(HOME_DIR+fname.split('\/')[-1]) \t \t\t if __name__=='__main__': \t&quot;&quot;&quot; \u0414\u043b\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u043f\u0430\u0440\u0441\u0438\u043c \u043e\u043f\u0446\u0438\u0438. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \t\u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043b\u0438\u0431\u043e ip \u0430\u0434\u0440\u0435\u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \t&quot;&quot;&quot; \tfrom optparse import OptionParser \tparser = OptionParser() \tparser.add_option(&quot;-d&quot;, &quot;--dir&quot;, dest=&quot;dir&quot;,default=None,help=&quot;directory for storing images&quot;) \tparser.add_option(&quot;-i&quot;, &quot;--ip&quot;, dest=&quot;ip&quot;,default=None,help=&quot;ip address of the computer (default %s)&quot;%(socket.gethostbyname(socket.gethostname()))) \t(options, args) = parser.parse_args() \t# \u0433\u043e\u0442\u043e\u0432\u0438\u043c \u043f\u0430\u043f\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \tHOME_DIR=os.path.expanduser('~') \tif not os.path.exists(HOME_DIR+'\/'+'ShootAndView'): \t\tos.mkdir(HOME_DIR+'\/'+'ShootAndView') \tHOME_DIR=HOME_DIR+'\/ShootAndView\/' \tif options.dir:HOME_DIR=options.dir \t\t \tsd=SDCard(home_dir=HOME_DIR)\t \t\t \tif options.ip:sd.ip=options.ip \tprint 'Finding sd card...' \t# \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u043a\u0430\u0440\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \tsd.find_card(callback=find_callback) \t\t \twhile 1: \t\ttime.sleep(1) <\/code><\/pre>\n<\/p><\/div>\n<\/div>\n<p>  \u042f \u043f\u0440\u043e\u0448\u0443 \u043d\u0435 \u0440\u0443\u0433\u0430\u0442\u044c \u043c\u0435\u043d\u044f \u0437\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043e\u0442 pep-8, \u0441\u0435\u0439\u0447\u0430\u0441 \u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0435\u0434\u043a\u043e, \u0434\u0430 \u0438 \u043b\u044e\u0431\u043b\u044e \u043f\u0440\u043e \u0441\u0435\u0431\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c: \u00ab\u0412 \u0433\u043e\u043b\u043e\u0432\u0435 \u043c\u043e\u0435\u0439 \u043e\u043f\u0438\u043b\u043a\u0438 \u043d\u0435-\u0431\u0435-\u0434\u0430, pep-8 \u043d\u0435 \u0447\u0438\u0442\u0430\u043b \u044f, \u0434\u0430-\u0434\u0430-\u0434\u0430\u00bb.<br \/>  \u0412\u0441\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0437\u044f\u0442\u044c \u043d\u0430 <a href=\"https:\/\/github.com\/kaist\/shoot-and-view\">github.com\/kaist\/shoot-and-view<\/a><\/p>\n<p>  \u0417\u0430\u0431\u044b\u043b \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c, \u0447\u0442\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u0430\u0440\u0442\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0435\u0435 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0438\u043d\u0433\u043e\u0432\u0430\u0442\u044c. \u0412 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u044f \u043d\u0435 \u0441\u0442\u0430\u043b \u0438\u0441\u043a\u0430\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0434\u0435\u043b\u0430\u0442\u044c ping \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 ping \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430. \u042f \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b <a href=\"https:\/\/gist.github.com\/pklaus\/856268\">\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e<\/a> ping \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c \u043f\u0438\u0442\u043e\u043d\u0435. \u042d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0440\u044f\u0434\u043e\u043c \u0441\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c.<\/p>\n<h4>GUI<\/h4>\n<p>  \u0414\u043b\u044f GUI \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u0432 \u043f\u0438\u0442\u043e\u043d\u0435, \u044d\u0442\u043e Tkinter. \u041e\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u0432 windows \u0438 MacOS, \u0438 \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u0430\u043b\u043e \u043c\u0435\u0441\u0442\u0430, \u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c standalone \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f GUI, \u043f\u043e\u0436\u0430\u043b\u0443\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0443\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439:<\/p>\n<ol>\n<li> \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0439\u0442\u0435 Tkinter<br \/> \n<pre><code class=\"python\">from Tkinter import * <\/code><\/pre>\n<p>  <\/li>\n<li> \u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 GUI<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/0ef\/ad7\/768\/0efad776809cee2a032ed0afaf4f390c.png\"\/>  <\/li>\n<\/ol>\n<p>  \u041a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0430 \u0432\u043e\u0442 GUI \u0432\u0435\u0440\u0441\u0438\u044f \u0445\u043e\u0447\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u044e\u0448\u0435\u043a, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u0447\u0442\u0435\u043d\u0438\u0435 exif, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u043f\u0440. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 (\u0438\u0437\u0432\u0438\u043d\u0438\u0442\u0435, \u043d\u0430 Linux \u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442), \u0442\u043e \u0432\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f:<br \/>  <code>sudo apt-get install python-tk python-imagetk python-imaging libimage-exiftool-perl<\/code><br \/>  \u0410 \u0442\u0430\u043a \u0436\u0435, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e <a href=\"https:\/\/github.com\/smarnach\/pyexiftool\">\u0431\u0438\u043d\u0434\u0438\u043d\u0433 \u043a exiftool<\/a> (<code>sudo python setup.py install<\/code>)<br \/>  \u0412 windows, \u043a\u0440\u043e\u043c\u0435 python 2.7 \u0438 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0430 \u043a exiftool, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f <a href=\"http:\/\/www.pythonware.com\/products\/pil\/\">PIL<\/a> \u0438 <a href=\"http:\/\/www.sno.phy.queensu.ca\/~phil\/exiftool\/\">exiftool<\/a>.<br \/>  \u0422\u0430\u043a \u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 exiftool \u0438 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0430 \u043a \u043d\u0435\u043c\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430 MacOS, \u0441\u043c. \u0441\u0441\u044b\u043b\u043a\u0438 \u0432\u044b\u0448\u0435. <\/p>\n<p>  \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 py2exe \u043d\u0430 windows \u0438 py2app \u043d\u0430 MacOS, \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0442\u0430\u043a \u0436\u0435 \u043d\u0430\u0439\u0442\u0438 \u0441\u0440\u0435\u0434\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432.<\/p>\n<h4>\u0418\u0442\u043e\u0433<\/h4>\n<p>  \u041a\u0430\u043a \u0438 \u043e\u0431\u0435\u0449\u0430\u043b, \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043b\u0435\u043d\u0438\u0432\u044b\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u0434\u043b\u044f Windows \u0438 MacOS. \u0412\u0437\u044f\u0442\u044c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u0439 <a href=\"http:\/\/shootandview.zalomskij.ru\">\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435<\/a>. <br \/>  \u041a\u043e\u0435 \u0447\u0442\u043e \u0438\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439:  <\/p>\n<ul>\n<li>\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u044a\u0435\u043c\u043a\u0438 \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0430\u0432\u0438\u0448\u0430\u043c\u0438 \u0432\u043b\u0435\u0432\u043e-\u043f\u0440\u0430\u0432\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0438\u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043e\u0442\u0441\u043d\u044f\u0442\u0443\u044e \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e.<\/li>\n<li>\u0417\u0443\u043c \u2014 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u00ab\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u00bb, \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u0437\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u043e 100%<\/li>\n<li>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0438\u0441\u043a \u043a\u0430\u0440\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438<\/li>\n<li>\u041d\u0443 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0432\u0441\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e \u0434\u043b\u044f \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438 \u043d\u0435\u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 GPL v2<\/li>\n<\/ul>\n<p>  \u041d\u0443 \u0438 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u043f\u0430\u0440\u0443 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432:<\/p>\n<p>  <img decoding=\"async\" width=\"800\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/95d\/4e5\/8ce\/95d4e58ce4cb1f782d717d30b5efeb30.jpg\"\/><\/p>\n<p>  <img decoding=\"async\" width=\"800\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/72b\/574\/bfa\/72b574bfa3cf53fcab54a3a360dd5e30.jpg\"\/><\/p>\n<p>  <img decoding=\"async\" width=\"800\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/aba\/52d\/707\/aba52d707c2b869f679552d285eab79a.jpg\"\/><\/p>\n<p>  P.S. \u042f \u0441\u043e\u0431\u0438\u0440\u0430\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f MacOS \u0432\u043f\u0435\u0440\u0432\u044b\u0435, \u043f\u0440\u043e\u0448\u0443 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0438, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0435 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 python \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 )<\/p>\n<p>  <i>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 <a href=\"http:\/\/creativecommons.org\/licenses\/by\/3.0\/\">Creative Commons Attribution 3.0 Unported (CC BY 3.0)<\/a><\/i>    \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/216039\/\"> http:\/\/habrahabr.ru\/post\/216039\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" width=\"400\" align=\"left\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/16b\/e18\/a55\/16be18a553ec0063b4fd4c36013923c0.jpg\"\/> \u041d\u0430 \u0445\u0430\u0431\u0440\u0435 \u043d\u0435\u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e <a href=\"http:\/\/habrahabr.ru\/post\/191742\/\">\u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438<\/a> \u043e \u043a\u0430\u0440\u0442\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 SDHC \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c WiFi \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a\u043e\u043c. \u041a\u0443\u043f\u0438\u0432 \u044d\u0442\u0443 \u043a\u0430\u0440\u0442\u0443, \u044f \u0431\u044b\u043b \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u0430\u043d \u0443\u0436\u0430\u0441\u043d\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438\u0434\u0435\u0442 \u00ab\u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435\u00bb \u0441 \u043a\u0430\u0440\u0442\u043e\u0439. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f iOS \u0438 Android \u0445\u043e\u0442\u044c \u043a\u0430\u043a \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0442\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043f\u043e\u0434 windows \u0438 macos, \u043b\u0438\u0448\u0430\u0435\u0442 \u043a\u0430\u0440\u0442\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0435 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u0430\u043c\u0438. \u0422\u043e\u0447\u043d\u0435\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043d\u0430 PC \u0435\u0441\u0442\u044c \u0432\u0435\u0431 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043d\u043e \u043a\u0440\u043e\u043c\u0435 \u0443\u0436\u0430\u0441\u043d\u043e\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430, \u043c\u0435\u043d\u044f \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u0430\u043b\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0443 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Shoot&#038;View, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u044a\u0435\u043c\u043a\u0438.<\/p>\n<p>  \u041b\u044e\u0431\u0438\u0442\u0435\u043b\u0438 geek-porno \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u0443\u044e\u0442\u0441\u044f \u2014 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443, \u0445\u0430\u043a\u0430\u0442\u044c \u0435\u0435, \u0432\u0441\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u0443 \u043a\u0430\u0440\u0442\u0443 \u043f\u0430\u043c\u044f\u0442\u0438. \u041c\u044b \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u00ab\u0441\u0442\u043e\u043a\u043e\u0432\u043e\u0439\u00bb \u043a\u0430\u0440\u0442\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445 \u043b\u0438\u0431\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0441 \u0432\u0430\u043c\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b Shoot&#038;View \u043a\u0430\u0440\u0442 \u043f\u0430\u043c\u044f\u0442\u0438 Transcend WiFi \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0430 python \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f \u043d\u0430 windows, linux \u0438 MacOS. \u0410 \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043d\u0435\u0442\u0435\u0440\u043f\u0435\u043b\u0438\u0432\u044b\u0445, \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0430\u0441 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 python \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442, \u0430 \u0442\u0430\u043a \u0436\u0435 GUI \u0443\u0442\u0438\u043b\u0438\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 windows, linux \u0438 macos.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-216039","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/216039","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=216039"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/216039\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=216039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=216039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=216039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}