/
sender.py
91 lines (77 loc) · 2.69 KB
/
sender.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import sys
import time
import os
import socket
import struct
from threading import Thread
from socketserver import ThreadingMixIn
from picamera import PiCamera
import io
from PIL import Image
from PIL import ImageChops
hostname = ''
hostport = 30002
MAXBUFLEN = 1024
ack = 33
class SenderThread(Thread):
def __init__(self, ip,port,sock):
''' Constructor. '''
Thread.__init__(self)
self.ip = ip
self.port = port
self.sock = sock
print("New thread started")
def run(self):
f = self.sock.makefile('rwb')
camera = PiCamera()
camera.resolution = (1280,720)
camera.start_preview()
time.sleep(2)
camera.stop_preview()
camera.capture('foo.jpg')
stream = io.BytesIO()
count = 0
print('start sending image')
try:
for frame in camera.capture_continuous(stream,'jpeg'):
#check whether image has changed
prev_image = Image.open('foo.jpg')
curr_image = Image.open(stream)
diff = ImageChops.difference(prev_image,curr_image)
if True:#diff.getbbox(): #if images are different, send size of file
print("images are different")
f.write(struct.pack('<L',stream.tell())) #get size in little endian unsigned long
f.flush()
stream.seek(0)
#waiting for request from receiver
request = f.read(struct.calcsize('<L'))
if(request == struct.pack('<L',ack)): #get request
f.write(stream.read()) #send simage data
curr_image.save('foo.jpg')
print('sending image ',count)
stream.seek(0)
stream.truncate()
count+=1
else: #no request, buffer file
print('no request received, buffer file')
else:
print("images are the same")
except:
print('Oops!',sys.exc_info()[0],'occured')
f.close()
self.sock.close()
sockfd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sockfd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sockfd.bind((hostname,hostport))
threads = []
while True:
sockfd.listen(5)
print('Listening ....')
conn, (ip,port) = sockfd.accept()
print('Connected by', (ip,port))
newthread = SenderThread(ip,port,conn)
newthread.start()
threads.append(newthread)
break
for t in threads:
t.join()