コード例 #1
0
	def __init__(self):
		self.number = '+4917621929963'
		self.pictureInterval = 20
		self.temperatureInterval = 60
		self.smsListeningInterval = 10
		self.gpsReportingInterval = 120
		self.threadLockNumberReports = 0
		self.threadLockNumberPictures = 0
		self.threadLockNumberTemperature = 0
		self.threadLockNumberGpsTime = 0
		self.sendGPSSMS = False
		self.pictureDir = "/root/pictures"
		self.sendTemperature = False
		self.getTimeFromGpsLoop = True
		self.gpsParser = GpsParser()
		self.temperatureClass = Temperature()
		
		try:
			# Create state machine object
			self.sm = gammu.StateMachine()
			# Read ~/.gammurc
			self.sm.ReadConfig(Filename = "/root/.gammurc")
			# Connect to phone
			self.sm.Init()
		except Exception as e:
			# Unplugging the UMTS stick requires a restart
			print e
			self.logMessage(e, "__init__")
			if e.Code == 4:
				print "restarting in 300 sec..."
				time.sleep(300)
				os.system("reboot")
コード例 #2
0
	def __init__(self):
		self.pictureInterval = 20
		self.temperatureInterval = 60
		self.smsListeningInterval = 10
		self.gpsReportingInterval = 120
		self.threadLockNumberReports = 0
		self.threadLockNumberPictures = 0
		self.threadLockNumberTemperature = 0
		self.sendGPSSMS = False
		self.pictureDir = "/root/pictures"
		self.sendTemperature = False
		self.temperature = Temperature()
		self.gpsParser = GpsParser() # also sets the date/time via gps
		
		try:
			# Create state machine object
			self.sm = gammu.StateMachine()
			# Read ~/.gammurc
			self.sm.ReadConfig(Filename = "/root/.gammurc")
			# Connect to phone
			self.sm.Init()
		except Exception as e:
			# Unplugging the UMTS stick requires a restart
			print e
			self.logMessage(e, "__init__")
			print "restarting in 300 sec..."
			time.sleep(300)
			os.system("reboot")
コード例 #3
0
class Listener(object):

	def __init__(self):
		self.pictureInterval = 20
		self.temperatureInterval = 60
		self.smsListeningInterval = 10
		self.gpsReportingInterval = 120
		self.threadLockNumberReports = 0
		self.threadLockNumberPictures = 0
		self.threadLockNumberTemperature = 0
		self.sendGPSSMS = False
		self.pictureDir = "/root/pictures"
		self.sendTemperature = False
		self.temperature = Temperature()
		self.gpsParser = GpsParser() # also sets the date/time via gps
		
		try:
			# Create state machine object
			self.sm = gammu.StateMachine()
			# Read ~/.gammurc
			self.sm.ReadConfig(Filename = "/root/.gammurc")
			# Connect to phone
			self.sm.Init()
		except Exception as e:
			# Unplugging the UMTS stick requires a restart
			print e
			self.logMessage(e, "__init__")
			print "restarting in 300 sec..."
			time.sleep(300)
			os.system("reboot")


	def sendSMS(self, text):
		try:
			number = '+4917621929963'
			message = {
				'Text': text, 
				'SMSC': {'Location': 1},
				'Number': number,
			}
			self.sm.SendSMS(message)

		except Exception as e:
			print e
			self.logMessage(e, "sendSMS")
			

	def getAllSMS(self):
		smslist = []

		for folder in [3]:		# 1=Inbox SIM, 3=Inbox Device (maybe inversed)
			lastloc = 0
			start = True

			while 1:
				try:
					if start:
						sms = self.sm.GetNextSMS(Start = True, Folder=folder)
						if len(sms) > 0:
							lastloc = sms[0]['Location']
							smslist.append(sms[0])
							start = False
						else:
							break
					else:
						sms = self.sm.GetNextSMS(Location = lastloc, Folder=folder)
						if len(sms) > 0:
							lastloc = sms[0]['Location']
							smslist.append(sms[0])
						else:
							break
				except Exception:
					break

		return smslist


	def deleteReadSMS(self, smslist):
		for sms in smslist:
			try:
				folder = sms['Folder']
				location = sms['Location'] - 100000  # in our case theres somehow a large offset
				self.sm.DeleteSMS(Folder = folder, Location = location)
				
			except Exception as e:
				print e
				self.logMessage(e, "deleteReadSMS")


	# parameter must be a string
	def logCoords(self, coords):
		try:
			with open("/root/logs/coordinates.log", "a") as myfile:
				s = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
				s += "	" + coords + "\n"
				myfile.write(s)

		except Exception as e:
			print e
			self.logMessage(e, "logCoords")


	# first parameter must be something convertable to s, second parameter must be a string
	def logMessage(self, message, origin):
		try:
			with open("/root/logs/messages.log", "a") as myfile:
				s = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
				s += "	" + str(origin) + "		" + str(message) + "\n"
				myfile.write(s)

		except Exception as e:
			print "Error while logging, can't be logged ..."
			print e
			
	# first parameter must be something convertable to s, second parameter must be a string
	def logTemperature(self, message, origin):
		try:
			with open("/root/logs/temperatures.log", "a") as myfile:
				s = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
				s += "	" + str(origin) + "		" + str(message) + "\n"
				myfile.write(s)

		except Exception as e:
			print e
			self.logMessage(e, "logCoords")
			
	
	# get gps coordinates on demand
	def getGPScoordinates(self):
		try:
			coords, height = self.gpsParser.getGpsCoordinates()
			if coords == "-":
				raise Exception("coordinates invalid: -")
				
			self.sendSMS(coords + ": " + height + "m\n" + "http://maps.google.de/maps?q=" + coords)
				
		except Exception as e:
			print e
			self.logMessage(e, "getGPScoordinates")
			
			
	# thread that loops and logs/sends gps coordinates
	def logGPScoordinates(self, myThreadLockNumber, seconds):
		interval = self.gpsReportingInterval
		try:
			interval = int(seconds)
		except Exception as e:
			print e
			self.logMessage(e, "logGPScoordinates-interval")
			interval = self.gpsReportingInterval
			
		# to avoid multiple threads, there'a lock number
		while (myThreadLockNumber == self.threadLockNumberReports):
			try:
				coords, height = self.gpsParser.getGpsCoordinates()
				if coords == "-":
					raise Exception("coordinates invalid: -")
					
				self.logCoords(coords + ": " + height + "m")
				
				if self.sendGPSSMS:
					self.sendSMS(coords + ": " + height + "m\n" + "http://maps.google.de/maps?q=" + coords)
				
				time.sleep(interval)
				
			except Exception as e:
				print e
				self.logMessage(e, "logGPScoordinates-report")


	def setSystemTime(self, datetime):
		#expects a string in format 20130717121400
		try:
			year = datetime[0:4]
			month = datetime[4:6]
			day = datetime[6:8]
			hour = datetime[8:10]
			min = datetime[10:12]
			sec = datetime [12:14]
			s = 'date -s "{0}-{1}-{2} {3}:{4}:{5}"'.format(year, month, day, hour, min, sec)
			os.system(s)
			print "date set:"
			os.system("date")
			
		except Exception as e:
			print e
			self.logMessage(e, "setSystemTime")
			

	def getSystemTime(self):
		try:
			time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
			self.sendSMS(time)

		except Exception as e:
			print e
			self.logMessage(e, "getSystemTime")
			

	def getNetworkInfo(self):
		# Reads network information from phone
		try:
			self.netinfo = self.sm.GetNetworkInfo()		# 'State': 'NoNetwork' = no signal
			signalQuality = self.sm.GetSignalQuality()
			s = "Signal: " + signalQuality['SignalPercent'] + "% \n"
			
			for key in netinfo:
				s += key + ": " + netinfo[key] + "\n"
			
			print s
			self.sendSMS(s)
		except Exception as e:
			print e
			self.logMessage(e, "getNetworkInfo")

	
	def initCapturing(self, interval):
		newThreadLockNumber = random.randint(1,99999)
		self.threadLockNumberPictures = newThreadLockNumber
		thread.start_new_thread( self.takePictures, (newThreadLockNumber, interval) )
		print "thread gestartet: " + str(newThreadLockNumber)
	
	
	def takePictures(self, myThreadLockNumber, seconds):
		if not os.path.isdir(self.pictureDir):
			print "pictures directory does not exist"
			return
			
		interval = self.pictureInterval
		try:
			interval = int(seconds)
		except Exception as e:
			print e
			self.logMessage(e, "takePictures-interval")
			interval = self.pictureInterval
			
		# continue with file numbers
		try:
			if len(os.listdir(self.pictureDir)) > 0:
				# get largest file number
				# assuming file names like 1.jpg, 2.jpg, ...
				numbers = []
				index = 0
				#iterate over all files and retrieve file names
				for i,file_name in enumerate(sorted(os.listdir(self.pictureDir))):
					try:
						s = file_name.split(".")
						n = s[0]
						o = int(n)
						numbers.append(o)
						# sort the list descending
						numbers.sort(reverse=True)		
						# the highest file number plus one is the new image index
						index = numbers[0] + 1
						
					except Exception as e:
						print e
						self.logMessage(e, "takePictures-filenames")
						index = 0
			else:
				index = 0
			
			# capture pictures
			while (myThreadLockNumber == self.threadLockNumberPictures):
				filename = "{0}/{1}.jpg".format(self.pictureDir, index)
				command = "uvccapture -o{0} -m -x640 -y480 2> /dev/null".format(filename)
				print "capture picture " + str(index)
				os.system(command)
				if os.path.exists(filename):
					index += 1
				time.sleep(interval)
		
		except Exception as e:
				print e
				self.logMessage(e, "takePictures")			

				
	def initTemperature(self, seconds):
		newThreadLockNumber = random.randint(1, 99999)
		self.threadLockNumberTemperature = newThreadLockNumber
		thread.start_new_thread(self.calculateTemperatureStart, (newThreadLockNumber, seconds))
		print "thread gestartet: " + str(newThreadLockNumber)

		
	def calculateTemperatureStart(self, myThreadLockNumber, seconds):
		tempLib = CDLL("temperature.so")
		tempLib.calculateTemperature.restype = c_float
		interval = self.temperatureInterval
		try:
			interval = int(seconds)
		except Exception as e:
			print e
			self.logMessage(e, "calculateTemperatureStart-interval")
			interval = self.temperatureInterval
		try:
			while (myThreadLockNumber == self.threadLockNumberTemperature):
				celsius = tempLib.calculateTemperature()
				fahrenheit = celsius * 33.8
				tempString = "{0} Celsius / {1} Fahrenheit".format(celsius, fahrenheit)
				self.logTemperature(tempString, "calculateTemperatureStart")
				if self.sendTemperature:
					self.sendSMS(tempString)
				time.sleep(interval)
		
		except Exception as e:
			print e
			self.logMessage(e, "calculateTemperatureStart")


	def processCommands(self, smslist):
		for sms in smslist:
			try:
				cmd = sms['Text'].lower()
				print "cmd: " + cmd

				# stop gps logging
				if cmd == 'loggpsstop':
					self.logMessage("cmd: " + cmd, "processCommands")
					self.threadLockNumberReports = 0
					print "thread gestoppt"
				
				# start sending gps coordinates via sms
				elif cmd == 'repgpsstart':
					self.sendGPSSMS = True
				
				# stop sending gps coordinates via sms
				elif cmd == 'repgpsstop':
					self.sendGPSSMS = False
				
				# get gps coordinates on demand
				elif cmd == 'getgps':
					self.getGPScoordinates()
				
				# stop capturing images with camera
				elif cmd == 'capstop':
					self.logMessage("cmd: " + cmd, "processCommands")
					self.threadLockNumberPictures = 0
					print "thread gestoppt"
				
				# stop logging temperature
				elif cmd == 'logtempstop':
					self.logMessage("cmd: " + cmd, "processCommands")
					self.threadLockNumberTemperature = 0
					print "thread gestoppt"
				
				# start sending temperatures via sms
				elif cmd == 'sendtempstart':
					self.logMessage("cmd: " + cmd, "processCommands")
					self.sendTemperature = True
					
				# stop sending temperatures via sms
				elif cmd == 'sendtempstop':
					self.logMessage("cmd: " + cmd, "processCommands")
					self.sendTemperature = False
					
				# send the time via sms
				elif cmd == 'gettime':
					self.logMessage("cmd: " + cmd, "processCommands")
					self.getSystemTime()
				
				# send network information via sms
				elif cmd == 'getnetwork':
					self.logMessage("cmd: " + cmd, "processCommands")
					self.getNetworkInfo()
					
				# reboot system
				elif cmd == 'restart_system' or cmd == 'reboot_system':
					self.logMessage("cmd: " + cmd, "processCommands")
					os.system("reboot")
			
				# set time to a value specified in a sms
				elif cmd[0:7] == 'settime':		#e.g. settime20130802120500
					self.logMessage("cmd: " + cmd, "processCommands")
					datetime = cmd[7:]
					self.setSystemTime(datetime)
				
				# run any system command
				elif cmd[0:7] == 'system_':		#e.g. system_reboot
					print "executing command: " + cmd
					self.logMessage("cmd: " + cmd, "processCommands")
					os.system(cmd[7:])
				
				# start capturing pictures with camera
				elif cmd[0:8] == 'capstart':	#e.g. capstart30
					self.logMessage("cmd: " + cmd, "processCommands")
					self.initCapturing(cmd[8:])
					
				# start logging temperatures
				elif cmd[0:9] == 'logtempstart':	#e.g. tempstart30
					self.logMessage("cmd: " + cmd, "processCommands")
					self.initTemperature(cmd[9:])
					
				# start logging gps coordinates
				elif cmd[0:11] == 'loggpsstart':	#e.g. loggpsstart30
					self.logMessage("cmd: " + cmd, "processCommands")
					newThreadLockNumber = random.randint(1,99999)
					self.threadLockNumberReports = newThreadLockNumber
					thread.start_new_thread( self.logGPScoordinates, (newThreadLockNumber, cmd[11:]) )
					print "thread gestartet: " + str(newThreadLockNumber)
				
				else:
					print "command not recognized"
					self.logMessage("unknown command: " + cmd, "processCommands")
				
			except Exception as e:
				print e
				self.logMessage(e, "processCommands")
			

	def listenForCommands(self):
		while 1:
			try:
				time.sleep(self.smsListeningInterval)
				smslist = self.getAllSMS()
				if len(smslist) > 0:
					self.processCommands(smslist)
					self.deleteReadSMS(smslist)
				else:
					self.sm.GetNetworkInfo() #just to detect if stick is unplugged

			# Unplugging the UMTS stick requires a restart
			except gammu.ERR_DEVICEWRITEERROR as e:
				print e
				self.logMessage(e, "listenForCommands")
				print "restarting in 300 sec..."
				time.sleep(300)
				os.system("reboot")
				
			except Exception as e:
				print e
				self.logMessage(e, "listenForCommands")
コード例 #4
0
class Listener(object):

	def __init__(self):
		self.number = '+4917621929963'
		self.pictureInterval = 20
		self.temperatureInterval = 60
		self.smsListeningInterval = 10
		self.gpsReportingInterval = 120
		self.threadLockNumberReports = 0
		self.threadLockNumberPictures = 0
		self.threadLockNumberTemperature = 0
		self.threadLockNumberGpsTime = 0
		self.sendGPSSMS = False
		self.pictureDir = "/root/pictures"
		self.sendTemperature = False
		self.getTimeFromGpsLoop = True
		self.gpsParser = GpsParser()
		self.temperatureClass = Temperature()
		
		try:
			# Create state machine object
			self.sm = gammu.StateMachine()
			# Read ~/.gammurc
			self.sm.ReadConfig(Filename = "/root/.gammurc")
			# Connect to phone
			self.sm.Init()
		except Exception as e:
			# Unplugging the UMTS stick requires a restart
			print e
			self.logMessage(e, "__init__")
			if e.Code == 4:
				print "restarting in 300 sec..."
				time.sleep(300)
				os.system("reboot")


	def sendSMS(self, text):
		try:
			message = {
				'Text': text, 
				'SMSC': {'Location': 1},
				'Number': self.number,
			}
			self.sm.SendSMS(message)

		except Exception as e:
			print "sendSMS"
			print e
			self.logMessage(e, "sendSMS")
			

	def getAllSMS(self):
		smslist = []

		for folder in [3]:		# 1=Inbox SIM, 3=Inbox Device (maybe inversed)
			lastloc = 0
			start = True

			while 1:
				try:
					if start:
						sms = self.sm.GetNextSMS(Start = True, Folder=folder)
						if len(sms) > 0:
							lastloc = sms[0]['Location']
							smslist.append(sms[0])
							start = False
						else:
							break
					else:
						sms = self.sm.GetNextSMS(Location = lastloc, Folder=folder)
						if len(sms) > 0:
							lastloc = sms[0]['Location']
							smslist.append(sms[0])
						else:
							break
				except Exception:
					break

		return smslist


	def deleteReadSMS(self, smslist):
		for sms in smslist:
			try:
				folder = sms['Folder']
				location = sms['Location'] - 100000  # in our case theres somehow a large offset
				self.sm.DeleteSMS(Folder = folder, Location = location)
				
			except Exception as e:
				print "deleteReadSMS"
				print e
				self.logMessage(e, "deleteReadSMS")


	# parameter must be a string
	def logAllRecords(self, temperatureExternal, temperatureInternal, gpsInfo, coords, height, networkInfo):
		try:
			with open("/root/logs/allRecords.log", "a") as myfile:
				s = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
				s += "	" + temperatureExternal + "\n"
				s += "	" + temperatureInternal + "\n"
				s += "	" + str(gpsInfo) + "\n"
				s += "	" + coords + "\n"
				s += "	" + height + "\n"
				s += "	" + str(networkInfo) + "\n\n"
				
				print ""
				print temperatureExternal
				print temperatureInternal
				print str(gpsInfo)
				print coords
				print height
				print str(networkInfo)
				print ""
				
				myfile.write(s)

		except Exception as e:
			print "logAllRecords"
			print e
			self.logMessage(e, "logAllRecords")
			
			
	# parameter must be a string
	def logCoords(self, coords):
		try:
			with open("/root/logs/coordinates.log", "a") as myfile:
				s = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
				s += "	" + coords + "\n"
				myfile.write(s)

		except Exception as e:
			print "logCoords"
			print e
			self.logMessage(e, "logCoords")


	# first parameter must be something convertable to s, second parameter must be a string
	def logMessage(self, message, origin):
		try:
			with open("/root/logs/messages.log", "a") as myfile:
				s = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
				s += "	" + str(origin) + "		" + str(message) + "\n"
				myfile.write(s)

		except Exception as e:
			print "Error while logging, can't be logged ..."
			print e
			
	# first parameter must be something convertable to s, second parameter must be a string
	def logTemperature(self, message, origin):
		try:
			with open("/root/logs/temperatures.log", "a") as myfile:
				s = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
				s += "	" + str(origin) + "		" + str(message) + "\n"
				myfile.write(s)

		except Exception as e:
			print "logTemperature"
			print e
			self.logMessage(e, "logCoords")
			
	
	# thread that loops and logs/sends gps coordinates
	def logGPScoordinates(self, myThreadLockNumber, seconds):
		interval = self.gpsReportingInterval
		try:
			interval = int(seconds)
		except Exception as e:
			#print "logGPScoordinates-listener"
			#print e
			self.logMessage(e, "logGPScoordinates-interval")
			interval = self.gpsReportingInterval
			
		# to avoid multiple threads, there'a lock number
		while (myThreadLockNumber == self.threadLockNumberReports):
			try:
				lines = self.gpsParser.readGpsData(timeout=6)
				coords, height = self.gpsParser.getGpsCoordinatesParser(lines, sendSMS=self.sendGPSSMS)
					
				self.logCoords(coords + ": " + height + "m")
				
				if self.sendGPSSMS:
					self.sendSMS(coords + ": " + height + "m\n" + "http://maps.google.de/maps?q=" + coords)
				
				time.sleep(interval)
				
			except Exception as e:
				print "logGPScoordinates-listener-loop"
				print e
				self.logMessage(e, "logGPScoordinates-report")


	def initGetTimeFromGPS(self, interval):
		newThreadLockNumber = random.randint(1,99999)
		self.threadLockNumberGpsTime = newThreadLockNumber
		thread.start_new_thread( self.getTimeFromGPS, (newThreadLockNumber, interval) )

	# thread to get the gps timestamp and set the system clock 
	def getTimeFromGPS(self, myThreadLockNumber, interval=300):
		while self.getTimeFromGpsLoop and myThreadLockNumber == self.threadLockNumberGpsTime:
			try:
				# set the system date/time
				gpsData = self.gpsParser.readGpsData(timeout=2)
				success = self.gpsParser.parseAndSetDateTime(gpsData)
				time.sleep(interval)
			except Exception as e:
				#print e
				self.logMessage(e, "getTimeFromGPS")
				time.sleep(interval)
			

	# parse various gps information from NMEA output
	def getGpsInfo(self):
		try:
			gpsLines = self.gpsParser.readGpsData(timeout = 6)
			gps_info = self.gpsParser.parseGpsData(gpsLines)
			coords, height = self.getGPScoordinates(lines=gpsLines, sendSMS=False)
			return gps_info, coords, height
		except Exception as e:
			print "getGpsInfo"
			print e
			self.logMessage(e, "parseGpsData")
			return "-","-","-"
			
			
	# get gps coordinates on demand
	def getGPScoordinates(self, lines = [], sendSMS=False):
		try:
			if not lines:
				lines = self.gpsParser.readGpsData(timeout=6)
				
			coords, height = self.gpsParser.getGpsCoordinatesParser(lines)
			if coords == "-":
				raise Exception("coordinates invalid: -")
				
			if sendSMS:
				self.sendSMS(coords + ": " + height + "m\n" + "http://maps.google.de/maps?q=" + coords)
			return coords, height
				
		except Exception as e:
			#print "getGPScoordinates-listener"
			#print e
			self.logMessage(e, "getGPScoordinates")
			return "-","-"
			
			
	def setSystemTime(self, datetime):
		#expects a string in format 20130717121400
		try:
			year = datetime[0:4]
			month = datetime[4:6]
			day = datetime[6:8]
			hour = datetime[8:10]
			min = datetime[10:12]
			sec = datetime [12:14]
			s = 'date -s "{0}-{1}-{2} {3}:{4}:{5}"'.format(year, month, day, hour, min, sec)
			os.system(s)
			print "date set:"
			os.system("date")
			
		except Exception as e:
			print "setSystemTime"
			print e
			self.logMessage(e, "setSystemTime")
			

	def getSystemTime(self):
		try:
			time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
			self.sendSMS(time)

		except Exception as e:
			print "getSystemTime"
			print e
			self.logMessage(e, "getSystemTime")
			

	def getNetworkInfo(self, sendSMS=False):
		# Reads network information from phone
		try:
			netinfo = self.sm.GetNetworkInfo()		# 'State': 'NoNetwork' = no signal
			signalQuality = self.sm.GetSignalQuality()
			
			if sendSMS:
				s = "Signal: " + signalQuality['SignalPercent'] + "% \n"
				for key in netinfo:
					s += key + ": " + netinfo[key] + "\n"
				print s
				self.sendSMS(s)
				
			return dict(netinfo, **signalQuality)
			
		except Exception as e:
			print "getNetworkInfo"
			print e
			self.logMessage(e, "getNetworkInfo")

	
	def initCapturing(self, interval):
		newThreadLockNumber = random.randint(1,99999)
		self.threadLockNumberPictures = newThreadLockNumber
		thread.start_new_thread( self.takePictures, (newThreadLockNumber, interval) )
		print "thread gestartet: " + str(newThreadLockNumber)
	
	
	def takePictures(self, myThreadLockNumber, seconds):
		if not os.path.isdir(self.pictureDir):
			print "pictures directory does not exist"
			return
			
		interval = self.pictureInterval
		try:
			interval = int(seconds)
		except Exception as e:
			print "takePicutes-upper"
			print e
			self.logMessage(e, "takePictures-interval")
			interval = self.pictureInterval
			
		# continue with file numbers
		try:
			if len(os.listdir(self.pictureDir)) > 0:
				# get largest file number
				# assuming file names like 1.jpg, 2.jpg, ...
				numbers = []
				index = 0
				#iterate over all files and retrieve file names
				for i,file_name in enumerate(sorted(os.listdir(self.pictureDir))):
					try:
						s = file_name.split(".")
						n = s[0]
						o = int(n)
						numbers.append(o)
						# sort the list descending
						numbers.sort(reverse=True)		
						# the highest file number plus one is the new image index
						index = numbers[0] + 1
						
					except Exception as e:
						print "takePictures-inner"
						print e
						self.logMessage(e, "takePictures-filenames")
						index = 0
			else:
				index = 0
			
			# capture pictures
			while (myThreadLockNumber == self.threadLockNumberPictures):
				filename = "{0}/{1}.jpg".format(self.pictureDir, index)
				command = "uvccapture -o{0} -m -x640 -y480 2> /dev/null".format(filename)
				print "capture picture " + str(index)
				os.system(command)
				if os.path.exists(filename):
					index += 1
				time.sleep(interval)
		
		except Exception as e:
				print "takePictures"
				print e
				self.logMessage(e, "takePictures")	
				time.sleep(60)		

	
	# start thread for logging PT1000 temperature
	def initLogTemperature(self, seconds):
		newThreadLockNumber = random.randint(1, 99999)
		self.threadLockNumberTemperature = newThreadLockNumber
		thread.start_new_thread(self.logTemperatureStart, (newThreadLockNumber, seconds))
		print "thread gestartet: " + str(newThreadLockNumber)

	
	# thread for logging PT1000 temperature
	def logTemperatureStart(self, myThreadLockNumber, seconds):
		try:
			tempLib = CDLL("/usr/local/lib/temperature.so")
			tempLib.calculateTemperature.restype = c_float
			interval = self.temperatureInterval
			interval = int(seconds)
		except Exception as e:
			print "logTemperatureStart"
			print e
			self.logMessage(e, "logTemperatureStart-init")
			interval = self.temperatureInterval
		try:
			while (myThreadLockNumber == self.threadLockNumberTemperature):
				celsius = tempLib.calculateTemperature()
				fahrenheit = celsius * 33.8
				tempString = "{0} Celsius / {1} Fahrenheit".format(celsius, fahrenheit)
				self.logTemperature(tempString, "logTemperatureStart")
				if self.sendTemperature:
					self.sendSMS(tempString)
				time.sleep(interval)
		
		except Exception as e:
			print "logTemperatureStart-loop"
			print e
			self.logMessage(e, "logTemperatureStart")


	# return PT1000 temperature
	def getTemperatureExternal(self):
		try:
			#tempLib = CDLL("/usr/local/lib/temperature.so")
			#tempLib.calculateTemperature.restype = c_float
			#celsius = tempLib.calculateTemperature()
			#return str(celsius)
			t = self.temperatureClass.calculateTemperature()
			return str(t)
		except Exception as e:
			print "getTemperatureExternal"
			print e
			self.logMessage(e, "getTemperatureExtern")
			return "-"
	

	# return Gnublin temperature module temperature
	def getTemperatureInternal(self):
		try:
			(stdout, stderr) = Popen(["gnublin-lm75", "-b"], stdout=PIPE).communicate()
			return stdout
		except Exception as e:
			print "getTemperatureInternal"
			print e
			self.logMessage(e, "getTemperatureIntern")
			return "-"
	

	def processCommands(self, smslist):
		for sms in smslist:
			try:
				cmd = sms['Text'].lower()
				print "cmd: " + cmd

				# stop gps logging
				if cmd == 'loggpsstop':
					self.logMessage("cmd: " + cmd, "processCommands")
					self.threadLockNumberReports = 0
					print "thread gestoppt"
				
				# start sending gps coordinates via sms
				elif cmd == 'repgpsstart':
					self.sendGPSSMS = True
				
				# stop sending gps coordinates via sms
				elif cmd == 'repgpsstop':
					self.sendGPSSMS = False
				
				# stop setting time via gps
				elif cmd == 'gpstimestop':
					self.logMessage("cmd: " + cmd, "processCommands")
					self.threadLockNumberGpsTime = 0
					print "thread gestoppt"
				
				# get gps coordinates on demand
				elif cmd == 'getgps':
					self.getGPScoordinates(lines=[], sendSMS=True)
				
				# stop capturing images with camera
				elif cmd == 'capstop':
					self.logMessage("cmd: " + cmd, "processCommands")
					self.threadLockNumberPictures = 0
					print "thread gestoppt"
				
				# stop logging temperature
				elif cmd == 'logtempstop':
					self.logMessage("cmd: " + cmd, "processCommands")
					self.threadLockNumberTemperature = 0
					print "thread gestoppt"
				
				# start sending temperatures via sms
				elif cmd == 'sendtempstart':
					self.logMessage("cmd: " + cmd, "processCommands")
					self.sendTemperature = True
					
				# stop sending temperatures via sms
				elif cmd == 'sendtempstop':
					self.logMessage("cmd: " + cmd, "processCommands")
					self.sendTemperature = False
					
				# send the time via sms
				elif cmd == 'gettime':
					self.logMessage("cmd: " + cmd, "processCommands")
					self.getSystemTime()
				
				# send network information via sms
				elif cmd == 'getnetwork':
					self.logMessage("cmd: " + cmd, "processCommands")
					self.getNetworkInfo(sendSMS=True)
					
				# reboot system
				elif cmd == 'restart_system' or cmd == 'reboot_system':
					self.logMessage("cmd: " + cmd, "processCommands")
					os.system("reboot")
			
				# set time to a value specified in a sms
				elif cmd[0:7] == 'settime':		#e.g. settime20130802120500
					self.logMessage("cmd: " + cmd, "processCommands")
					datetime = cmd[7:]
					self.setSystemTime(datetime)
				
				# run any system command
				elif cmd[0:7] == 'system_':		#e.g. system_reboot
					print "executing command: " + cmd
					self.logMessage("cmd: " + cmd, "processCommands")
					os.system(cmd[7:])
				
				# start capturing pictures with camera
				elif cmd[0:8] == 'capstart':	#e.g. capstart30
					self.logMessage("cmd: " + cmd, "processCommands")
					self.initCapturing(cmd[8:])
					
				# start logging temperatures
				elif cmd[0:9] == 'logtempstart':	#e.g. tempstart30
					self.logMessage("cmd: " + cmd, "processCommands")
					self.initLogTemperature(cmd[9:])
					
				# start logging gps coordinates
				elif cmd[0:11] == 'loggpsstart':	#e.g. loggpsstart30
					self.logMessage("cmd: " + cmd, "processCommands")
					newThreadLockNumber = random.randint(1,99999)
					self.threadLockNumberReports = newThreadLockNumber
					thread.start_new_thread( self.logGPScoordinates, (newThreadLockNumber, cmd[11:]) )
					print "thread gestartet: " + str(newThreadLockNumber)
					
				# start retrieving timestamp from GPS and set the system clock
				elif cmd[0:12] == 'gpstimestart':	#e.g. gpstimestart300
					self.initGetTimeFromGPS(cmd[0:12])
					self.logMessage("cmd: " + cmd, "processCommands")
					print "thread gestartet: " + str(newThreadLockNumber)
				
				# change sms sending phone number
				elif cmd[0:12] == 'changenumber':	#e.g. changenumber+491703939393
					self.number = cmd[12:]
				
				else:
					print "command not recognized"
					self.logMessage("unknown command: " + cmd, "processCommands")
				
			except Exception as e:
				print "processCommands"
				print e
				self.logMessage(e, "processCommands")
			

	def listenForCommands(self):
		while 1:
			try:
				time.sleep(self.smsListeningInterval)
				smslist = self.getAllSMS()
				if len(smslist) > 0:
					self.processCommands(smslist)
					self.deleteReadSMS(smslist)
				else:
					self.sm.GetNetworkInfo() #just to detect if stick is unplugged

			# Unplugging the UMTS stick requires a restart
			except gammu.ERR_DEVICEWRITEERROR as e:
				print "listenForCommands-DEVICEWRITEERR"
				print e
				self.logMessage(e, "listenForCommands")
				print "restarting in 300 sec..."
				time.sleep(300)
				os.system("reboot")
				
			except Exception as e:
				print "listenForCommands-Exception"
				print e
				self.logMessage(e, "listenForCommands")