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))