def consumeEvents(self): while self.running: self.sock.listen(0) cSock, cAddr = self.sock.accept() #print("[Event Consumer] Accepted connection from %s." % str(cAddr)) connAlive = True event = [] pictureSize = None filename = None timeStarted = datetime.now(); try: while connAlive: data = cSock.recv(self.buffSize) event.extend(data) if (event[0] >> 6) == 1: # heartbeat message connAlive = False if (event[0] & 0x0F) == 0: # no picture (should be exactly 8 bytes) if len(event) >= 8: connAlive = False elif len(event) >= 12: pictureSize = event[8] << 24 pictureSize = pictureSize | (event[9] << 16) pictureSize = pictureSize | (event[10] << 8) pictureSize = pictureSize | event[11] if len(event) >= pictureSize + 12: connAlive = False # Organize event data timeReceived = datetime.now() packetType = event[0] >> 6 if packetType == 1: # heartbeat hbType = (event[0] & 0x30) >> 4; hbMessage = event[0] & 0x0F; # Heartbeat Type: 1=Request, 2=Response if hbType == 1: cSock.send(self.getHBResponse()) cSock.close() elif packetType == 2: # event eventType = (event[0] & 0x30) >> 4 seqNum = event[4] << 24 seqNum = seqNum | (event[5] << 16) seqNum = seqNum | (event[6] << 8) seqNum = seqNum | event[7] # this is (I think) the earliest we can ACK the event cSock.send(self.getACK(eventType, seqNum)) cSock.close() e = Event(self.dbConfig, eventType, timeStarted, timeReceived, seqNum) userID = event[1] >> 8 userID = userID | (event[2] & 0x0FF) e.setUser(userID) sensors = [ False for _ in range(0,8) ] sensors[0] = ((event[3] & 128) >> 7) == 1 sensors[1] = ((event[3] & 64) >> 6) == 1 sensors[2] = ((event[3] & 32) >> 5) == 1 sensors[3] = ((event[3] & 16) >> 4) == 1 sensors[4] = ((event[3] & 8) >> 3) == 1 sensors[5] = ((event[3] & 4) >> 2) == 1 sensors[6] = ((event[3] & 2) >> 1) == 1 sensors[7] = (event[3] & 1) == 1 e.setSensor(sensors) pictureType = event[0] & 0x0F if pictureSize: filename = self.getImageName() with open(self.mediaDir + filename, 'wb') as f: for i in range(0, pictureSize - 1): f.write(bytes([event[12 + i]])) e.setImage(pictureType, pictureSize, filename) # Store record in db then print info to console e.storeEvent() print(e) except sock_error as err: if err.errno != errno.ECONNRESET: print("[Event Consumer] An unexpected socket error occured.") print(err) else: print("[Event Consumer] Connection was reset, resuming to allow new connections.") print("[Event Consumer] %i bytes received before reset." % len(event))