# needed for GTK GUI import gtk import gtk.glade import gobject # needed for camera- connection from socket import * from struct import pack, unpack_from from PIL import Image import sys import StringIO # talk to the camera class CamConnector: def __init__(self, host, port, path): self.host = host self.port = port self.buf = 1022 self.addr = (self.host, self.port) self.socket = socket(AF_INET,SOCK_DGRAM) self.socket.settimeout(2) self.counter = 12 self.img_cnt = 1 self.img_save_path = path self.alive = False self.verbose = False self.init_cam() def set_verbose(self): self.verbose = True def init_cam(self): self.init_send("20432101admin\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00admin\x00\x00\x00\x00\x00\x00\x00\x00\x00") self.init_send("\x38\x39\x36\x32\x30\x32") self.init_send("\x38\x39\x36\x32\x30\x34") self.init_send("\x38\x39\x36\x32\x30\x36") self.init_send("\x38\x39\x36\x32\x30\x38") self.init_send("\x39\x32\x35\x30\x30\x32") self.init_send("\x38\x39\x35\x31\x30\x32") def init_send(self, s): try: self.socket.sendto(s, self.addr) self.buf = self.socket.recv(1022) self.alive = True except: print "camera not responding!" self.alive = False def save_image(self, image_data): # calc new filename new_filename = "%s/%s.jpg" % (self.img_save_path, self.img_cnt) if self.verbose: print "save to %s" % new_filename # save image fd = file(new_filename, "w") fd.write(image_data) fd.close() # inc internal image counter self.img_cnt += 1 # return new filename return new_filename def save_image(self): return save_image(self.get_data()) def get_pixbuf(self): try: im = Image.open(StringIO.StringIO(self.get_data())) file1 = StringIO.StringIO() im.save(file1, "ppm") contents = file1.getvalue() file1.close() loader = gtk.gdk.PixbufLoader("pnm") loader.write(contents, len(contents)) pixbuf = loader.get_pixbuf() loader.close() return pixbuf except: if self.verbose: print "ui, error loading image" return 0 def get_data(self): next = str(self.counter) + "3003" self.socket.sendto(r"%s" % str(next), self.addr) if self.verbose: print "get %s: " % str(next), while 1: try: p = self.socket.recv(1022) except: if self.verbose: print " Timeout!" break (id, offset, rest) = unpack_from("2s6s%ss" % (len(p)-2-6), p) id, offset = int(id), int(offset) if offset == 0: # header packet (size, datetime, more, data) = unpack_from("8s8s13s%ss" % (len(rest)-8-8-13), rest) size = int(size) if self.verbose: print "Paketsize: %s, Datasize " % size, all = data else: data = rest all += data if self.verbose: print "%s " % len(data), size -= len(data) if offset != 0 and size == 0: if self.counter == 99: self.counter = 11 else: self.counter += 1 print "" return all # GUI class GUI: def __init__(self, camera): self.gl = gtk.glade.XML("gui.glade") self.main_win = self.gl.get_widget("window1") self.main_win.show_all() self.gtkimg = self.gl.get_widget("image1") self.camera = camera gobject.threads_init() def main(self): gtk.gdk.threads_enter() gtk.main() gtk.gdk.threads_leave() def set_auto_refresh(self, interval): gobject.timeout_add(interval, self.refresh_image) def refresh_image(self): pixbuf = self.camera.get_pixbuf() if pixbuf: self.gtkimg.set_from_pixbuf(pixbuf) return True # Main Program Camera = CamConnector("192.168.1.200", 9001, "/tmp/output") if Camera.alive: Camera.set_verbose() Gui = GUI(Camera) Gui.set_auto_refresh(200) Gui.main() else: print "no response from camera! exiting..." sys.exit(0)