
ããã«ã¯ãWiFiãã©ã³ã¹ããã¿ãŒãå
èµãããSDHC圢åŒã®ã¡ã¢ãªã«ãŒããç¹°ãè¿ã
èšåãããŠããŸããã ãã®ã«ãŒããè²·ã£ãŠãç§ã¯ã«ãŒãã«ä»å±ããŠããã²ã©ããœãããŠã§ã¢ã«å€±æããŸããã iOSãšAndroidã®ã¢ããªã±ãŒã·ã§ã³ãå°ãªããšãäœããã®æ¹æ³ã§äœ¿çšã§ããå ŽåãWindowsãšmacosã®ã¯ã©ã€ã¢ã³ããäžè¶³ããŠãããããã«ãŒããå°éå®¶ã䜿çšããå¯èœæ§ã奪ãããŸãã ããæ£ç¢ºã«ã¯ãPCã«ã¯Webã€ã³ã¿ãŒãã§ãŒã¹ããããŸããããã®ã²ã©ãå€èгã«å ããŠãæ®åœ±è
ã倧ããªã³ã³ãã¥ãŒã¿ãŒç»é¢ã§ã»ãŒç¬æã«æ®åœ±çµæãèŠãããšãã§ããæ®åœ±ïŒè¡šç€ºæ©èœã®äžè¶³ã«å€±æããŸããã
geek-pornoã®ãã¡ã³ã¯ãã£ããããã§ãããããã¡ãŒã ãŠã§ã¢ã®å€æŽããããã³ã°ãã¡ã¢ãªã«ãŒãèªäœã®ãªãŒãã³ã¯è¡ããŸããã 倿Žãå ããã«ããã¹ããã¯ãã¡ã¢ãªã«ãŒãã䜿çšããŸãã
ãã®ããããã®èšäºã§ã¯ããã©ã³ã»ã³ãWiFiã¡ã¢ãªã«ãŒãã®ShootïŒViewãããã³ã«ãåæããWindowsãLinuxãããã³MacOSã§å®è¡ãããã¯ãã¹ãã©ãããã©ãŒã ã¯ã©ã€ã¢ã³ããPythonã«æžã蟌ã¿ãŸãã ãããŠãæãçæ°ãªäººã®ããã«ãèšäºã®æåŸã«ããããžã§ã¯ãçšã®æ¢è£œã®pythonã¢ãžã¥ãŒã«ãã³ã³ãœãŒã«ã¯ã©ã€ã¢ã³ããããã³WindowsãLinuxãmacosã§åäœããGUIãŠãŒãã£ãªãã£ããããŸãã
ãããã¯ãŒã¯äžã®ã¡ã¢ãªã«ãŒããæ€çŽ¢ããŸãã
ã¡ã¢ãªã«ãŒãã¯2ã€ã®ã¢ãŒãã§åäœã§ããŸããã«ãŒããç¬èªã®ã¢ã¯ã»ã¹ãã€ã³ããäœæãããšãã®ã¢ã¯ã»ã¹ãã€ã³ãã¢ãŒããšãèšå®ã§æå®ãããã¢ã¯ã»ã¹ãã€ã³ãã«ããã£ã€ããã¢ã¯ã»ã¹ãã€ã³ããžã®æ¥ç¶ã¢ãŒãã§ãã å®éšã§ã¯ãã¢ããªã±ãŒã·ã§ã³ããAndroidãŸãã¯iOSãžã®æ¥ç¶ãèšå®ããåŸãã¢ã¯ã»ã¹ãã€ã³ããžã®æ¥ç¶ã¢ãŒãããªã³ã«ããããšããå§ãããŸãã ãŸããNeverãã€ã³ã¹ããŒã«ããŠãWiFiããªãã«ããããèšå®ããããšãå¿ããªãã§ãã ããã ãã®ãªãã·ã§ã³ã¯ã誰ãã«ãŒãã«æ¥ç¶ãããŠããªãå Žåã«WiFiãç¡å¹ã«ããŸãã æåã®æ®µéã§ã¯ãã«ãŒããã«ãŒããªãŒããŒã«æ¥ç¶ããããã¢ã€ãã«æã«é»æºãåããªãããã«ã«ã¡ã©ãèšå®ããããšããå§ãããŸãã
ããã°ã©ãã³ã°ãå§ããŸãããã ã³ã³ãœãŒã«ã¯ã©ã€ã¢ã³ãã®å Žåã远å ã¢ãžã¥ãŒã«ã¯äžèŠã§ãããããå
ã®ããããªãŒãã®ã¿ãå¿
èŠã§ãã ãããŠã次ã®ããšããå§ããŸãã
import socket class SDCard: def __init__(self,home_dir=''): self.home_dir=home_dir
ã«ãŒããã¢ã¯ã»ã¹ãã€ã³ãã«æ¥ç¶ãããŠããå Žåããã®IPã¢ãã¬ã¹ã¯ãããšãã°ã«ãŒã¿ãŒã®Webã€ã³ã¿ãŒãã§ã€ã¹ã§è¡šç€ºã§ããŸãããã«ãŒãã«çŽæ¥æ¥ç¶ããŠããå Žåããã®IPã¢ãã¬ã¹ã¯192.168.11.254ïŒæ¢å®ã®èšå®ã«åŸã£ãŠïŒã§ãã
ããããã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã§è¡ãããããã«ãç¹ã«ãããã®äœæè
ããããã¯ãŒã¯äžã§ã®æ€çŽ¢ãæäŸããŠãããããæåã§æ€çŽ¢ããããããŸããã ãã®ããã«å¿
èŠãªãã®ïŒ
- ããŒã58255ã«ãœã±ãããäœæããŸã
- ããããããŒã55777ã«ç©ºã®ãããŒããã£ã¹ãèŠæ±ãéä¿¡ããŸã
å¥è·¡ã«ãŒãã®åå¿ãæåŸ
ãã
幞éãªããããã«å¿ããŠæ¬¡ã®ããã¹ããåãåããŸãã
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
ããããã¹ãŠãããIPã¢ãã¬ã¹ã®ã¿ãå¿
èŠã§ãã ä»ã§ã¯ãã¹ãŠãããã°ã©ã ããããšãæ®ã£ãŠããŸãïŒ
import os import socket import thread import time class SDCard: def __init__(self,home_dir=''): self.home_dir=home_dir self.ip=socket.gethostbyname(socket.gethostname()) self.card_ip=None def find_card(self,callback=None): """ """ thread.start_new_thread(self.find_card_thread,(callback,)) def find_card_thread(self,callback=None): while not self.card_ip: """ UDP """ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.settimeout(5) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) """ """ try:s.bind((self.ip, 58255)) except socket.error: s.close() time.sleep(1) continue """ 55777""" s.sendto('', ('<broadcast>', 55777)) try: resp=s.recv(400) s.close() try: """ """ self.card_ip=resp.split('ip=')[1].split('\n')[0] except IndexError: """ """ if callback:callback(None) """ ip""" if callback:callback(self.card_ip) except socket.timeout: callback(self.card_ip) finally: time.sleep(2) def monitor(ip): if not ip:return print 'Find card on ip:',ip if __name__=='__main__': HOME_DIR=os.path.expanduser('~') if not os.path.exists(HOME_DIR+'/'+'ShootAndView'): os.mkdir(HOME_DIR+'/'+'ShootAndView') HOME_DIR=HOME_DIR+'/ShootAndView/' if options.dir:HOME_DIR=options.dir sd=SDCard(home_dir=HOME_DIR)
å®éãæãé£ããéšåã¯çµãããŸããã æ°ããåçã®ãé åæžãã«é¢ããæ
å ±ãã©ã®ããã«åä¿¡ããŠããŠã³ããŒãã§ããããèŠã€ããããšã ããæ®ã£ãŠããŸãã
æ°ããåçãååŸããŠããŸãã
åçãååŸããã®ã¯ç°¡åã§ãã ããããèŠã€ããããããŒã5566ã§ãããã«åå ããŸãã
ã«ã¡ã©ã7ã8ç§ã§æ°ãããã¬ãŒã ãååŸãããšããã«ããããã«è¡šç€ºãããæ°ãããã¡ã€ã«ã«é¢ããæ
å ±ããéããŠãããœã±ãããä»ããŠååŸãããŸããæ¬¡ã®ããã«ãªããŸãã
>/mnt/DCIM/101CANON/IMG_1754.JPG
è€æ°ã®åçãæ®åœ±ããå Žåã1ã€ã®ã¡ãã»ãŒãžã§ãããã®è¡ã¯ãŒããã€ãïŒ0x00ïŒã§åºåãããŸã
ç§ã¯åŒ·èª¿ããã-ããã¯7-8ç§ã§ãã ãããè¡ãããçç±ã¯å®å
šã«ã¯æããã§ã¯ãããŸãããã圱é¿ãäžããããšã¯ã§ããŸããã ãŸããjpeg圢åŒã®æ°ããåçã«é¢ããæ
å ±ã®ã¿ãæäŸãããŸããããã«ãã«ãŒããœãããŠã§ã¢ã«ã¯RAWãã¡ã€ã«ããæç·jpgãã¬ãã¥ãŒãæœåºããæ©èœããããŸãïŒè©³çްã¯ä»¥äžãåç
§ïŒããããã°ã©ããŒã¯jpgã§ã®æ®åœ±ãRAW + jpgã§ã®æ®åœ±ã匷å¶ããæ©èœã奪ãããšã奜ãRAWãããã«ãŒãã«æžã蟌ã¿ãjpgãå¥ã®ã«ãŒãã«æžã蟌ã¿ãŸãã ãŸããã«ãŒããªãŒããŒããåçãã³ããŒã§ããŸããã§ãããæ®åœ±ãšè¡šç€ºã¯ãã«ã¡ã©ã§æ®åœ±ãããæ°ããåçã«ã®ã¿å¿çããŸãã
ãã®ãã¹ãŠãããã°ã©ãã³ã°ããã®ã¯ç°¡åã§ãã ããããã³ãŒãã¹ããããã®è¡šç€ºãéå§ããŸããå®å
šãªã³ãŒãã¯èšäºã®æåŸã«ãããŸãã
def listener_thread(self,callback): sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ã¡ã¢ãªã«ãŒãããåçãããŠã³ããŒããã
ããã§æ°ãããã¡ã€ã«ã®ãªã¹ããã§ããŸãããæ®ã£ãŠããæåŸã®ã¹ãããã¯åçãã³ã³ãã¥ãŒã¿ãŒã«ã¢ããããŒãããããšã§ãã ããèªäœã§ã¯ãããŠã³ããŒãã¯ãããã®çµã¿èŸŒã¿WebãµãŒããŒãä»ããŠå®è£
ãããŸãã é©ãã¹ãããšã«ãäºå®-ãããŸã§ã«è¡ã£ããã¹ãŠã®æäœãåçã®ã¢ããããŒãããã¡ã€ã«ã®ãªã¹ãã®ååŸããã¬ãã¥ãŒã®åä¿¡ãªã©ã®ããã€ãã®ã¢ã¯ã·ã§ã³ã¯ãæ¿èªããŸã£ããå¿
èŠãšããŸããã ã€ãŸããã«ãŒããã¢ã¯ã»ã¹ãã€ã³ããšããŠèšå®ãããŠããŠããŠãŒã¶ãŒãWiFiãã¹ã¯ãŒãã倿ŽããŠããªãå Žåãå®å
šã«æ¥ç¶ããŠããã«ãããã¹ãŠã®ãã®ãããŠã³ããŒãã§ããŸãã å€ã«ã¯ã©ãã«ãããŠèгå
å°ãéããã«ã¡ã©ãæã£ã芳å
客ã®éã§WiFiãããã¯ãŒã¯ãæ¢ãå¿
èŠããããŸãã
cgi-binãã©ã«ããŒãèŠããšãä»ã®ãããžã§ã¯ãã§å¿
èŠã«ãªãå¯èœæ§ã®ããè峿·±ããã®ãããããèŠã€ãããŸãã ç°¡åã«èª¿ã¹ãããšãã§ããç°¡åãª
æç€ºã«åŸã£ãŠãtelnetã«ãŒãã§æã¡äžããã ãã§ååã§ãã ãããŠå
éšã«ã¯ïŒ

ããšãã°ãwifi_filelistãã€ããªã¯ããã£ã¬ã¯ããªå
ã®ãã¡ã€ã«ã®ãªã¹ãïŒXML圢åŒïŒãæäŸããæ¬¡ã®ããã«ã¢ã¯ã»ã¹ããŸãïŒ
CARD_IP / cgi-bin / wifi_filelistïŒFn = DIR ãCARD_IPã¯æ¢ã«èŠã€ãã£ãã¡ã¢ãªã«ãŒãã®IPã¢ãã¬ã¹ãDIRã¯ãã£ã¬ã¯ããªïŒ/ mnt / DCIMãªã©ïŒã thumbNailãã€ããªã¯åçã®ãã¬ãã¥ãŒãæäŸããåãæ¹æ³ã§ãã¡ã€ã«ãžã®ãã¹ããã£ãŒãããŸãã ããã«ããµãŒããŒåŽã§ã¯ããªãœãŒã¹ã倧éã«æ¶è²»ããåçã®ã«ããã¯è¡ãããŸãããããã¬ãã¥ãŒã¯jpgãŸãã¯rawã«é
ç·ãããŸãã
ããããåçãããŠã³ããŒãããããšã«èå³ããããŸãã ç®çã®åçãååŸããã«ã¯ãã¢ãã¬ã¹
CARD_IP / cgi-bin / wifi_downloadïŒFn = IMAGE_PATHãžã®ç°¡åãªGETãªã¯ãšã¹ãã䜿çšããŸãã Pythonã§ã¯ãurllibã©ã€ãã©ãªã®urlretrieve颿°ããã®å Žåã®èªã¿èŸŒã¿ã«é©ããŠããŸãã ããã«ããããªã¯ãšã¹ãã®çµæãããã«ãã¡ã€ã«ã«ä¿åããæãéèŠãªããšãšããŠãããŠã³ããŒãã®é²è¡ç¶æ³ãååŸã§ããŸããããã¯GUIã§åœ¹ç«ã¡ãŸãã
ããŠã³ããŒãæ©èœã¯æ¬¡ã®ããã«ãªããŸãã
def download_thread(self,download_callback,download_complete): while self.listen_flag:
次ã«ããã¹ãŠãæ¥ç¶ããŠæ¢è£œã®ã¢ãžã¥ãŒã«ãäœæããåæã«WindowsãLinuxãããã³MacOSã§åäœããã³ã³ãœãŒã«ã¯ã©ã€ã¢ã³ããåä¿¡ããŸãã
ç§ã¯ãpep-8ããã®éžè±ã®å¯èœæ§ã«ã€ããŠç§ãoldããªãããã«ãé¡ãããŸããçŸåšãç§ã¯éåžžã«ãŸãã«ããã°ã©ãã³ã°ãç·Žç¿ããŠããŸããç§ã¯èªåã«ããèšãããã®ã§ãããç§ã®é ã®äžã§pep-8ãèªãã§ããªãã ãã
github.com/kaist/shoot-and-viewã§ãã¹ãŠã®ãœãŒã¹ã³ãŒãã
ååŸã§ããŸã
ã¡ã¢ãªã«ãŒãã䜿çšããŠãããšãã«ãæã
pingãå®è¡ããããšããå§ãããŸãã ç¹ã«äžéšã®ãã©ãããã©ãŒã ã®ã³ã³ãœãŒã«pingãŠãŒãã£ãªãã£ã«ã¯ç®¡çè
æš©éãå¿
èŠãªãããã¹ã¯ãªããã§ã¯ãç°ãªããã©ãããã©ãŒã ã§pingãå®è¡ããæ¹æ³ãæ¢ããŸããã§ããã çŽç²ãªpythonã§ping
å®è£
ã䜿çšããŸã
ã ã ãã®ã¢ãžã¥ãŒã«ã¯ãã¹ã¯ãªããã®é£ã«é
眮ããå¿
èŠããããŸãã
GUI
GUIã«ã¯ãPythonã§æãåçŽãªããŒã«ã䜿çšããŸãããããã¯Tkinterã§ãã Windowsããã³MacOSã§ãããã«äœ¿çšå¯èœãã§ãããã¹ã¿ã³ãã¢ãã³ã¢ããªã±ãŒã·ã§ã³ããã«ãããå Žåã¯ã»ãšãã©ã¹ããŒã¹ãå æããŸããã ãããããGUIã®äœæããã»ã¹ã«ã€ããŠã¯èª¬æããŸããããã»ãã®å°ãã®æç€ºã«éå®ããŸãã
- Tkinterãã€ã³ããŒã
from Tkinter import *
- GUIãæžã

ã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ã«ã¯è¿œå ã®ã©ã€ãã©ãªã¯å¿
èŠãããŸããããGUIããŒãžã§ã³ã«ã¯exifã®èªã¿åããã€ã¡ãŒãžã®æäœãªã©ãããŸããŸãªæ©èœãå¿
èŠã§ãããœãŒã¹ããå®è¡ããå Žåã¯ïŒç³ãèš³ãããŸãããããã®ãªãã·ã§ã³ã¯Linuxã§ã®ã¿çšæãããŠããŸãïŒ
sudo apt-get install python-tk python-imagetk python-imaging libimage-exiftool-perl
ãŸãã
exiftoolãžã®æå
ãã€ã³ãã£ã³ã°ãã€ã³ã¹ããŒã«
ããŸã ïŒ
sudo python setup.py install
ïŒ
Windowsã§ã¯ãPython 2.7ãšexiftoolãžã®ãã€ã³ãã«å ããŠã
PILãš
exiftoolãå¿
èŠã§ã ã
ãŸããexiftoolãã€ã³ã¹ããŒã«ããŠMacOSã«ãã€ã³ãããå¿
èŠããããŸããäžèšã®ãªã³ã¯ãåç
§ããŠãã ããã
ãã®ã¢ããªã±ãŒã·ã§ã³ã¯ãWindowsã§ã¯py2exeã䜿çšããMacOSã§ã¯py2appã䜿çšããŠæ§ç¯ãããŠããŸãããœãŒã¹ã®äžããã¹ã¯ãªãããèŠã€ããããšãã§ããŸãã
ãŸãšã
çŽæã©ãããWindowsããã³MacOSåãã®æ¢è£œã®ãã«ãã¯ãæãæ forãªäººãå©çšã§ããŸãã ãã®
ããŒãžã§ããããåãããšãã§ã
ãŸã ã
æ©èœã®äžéšïŒ
- æ®åœ±å±¥æŽ-å·ŠãŸãã¯å³ã®ãã¿ã³ã䜿çšããŠãåãŸãã¯æ¬¡ã®ãã£ããã£ãããåçã衚瀺ããæ©èœã
- ãºãŒã -ãåé¡ãããŒãæŒããšãåçã100ïŒ
ã«ãºãŒã ãããŸã
- èªåã¡ã¢ãªãŒã«ãŒãæ€çŽ¢
- ãããŠãã¡ãããåçšããã³éåçšã§ã®äœ¿çšã¯ãã¹ãŠç¡æã§ãã GPL v2ã©ã€ã»ã³ã¹ã§å©çšå¯èœãªãœãŒã¹
æåŸã«ãããã€ãã®ã¹ã¯ãªãŒã³ã·ã§ããïŒ



PSç§ã¯åããŠMacOSã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠããŸãããç¹ã«éçºè
ã®pythonãã·ã³äžã§ã¯åäœããªããã©ããããã¹ãããŠãã ããïŒ
ãã®èšäºã¯ã Creative Commons Attribution 3.0 UnportedïŒCC BY 3.0ïŒã®äžã§ã©ã€ã»ã³ã¹ãããŠããŸã