예제 #1
41
파일: gsm.py 프로젝트: senghoo/operator
class GSM(object):
    def __init__(self, port, baudrate, pin=None):
        self.sms_callbacks = []
        self.port = port
        self.baudrate = baudrate
        self.pin = pin

    def run(self):
        self.modem = GsmModem(self.port, self.baudrate,
                              smsReceivedCallbackFunc=self.sms_callback)
        self.modem.smsTextMode = False
        self.modem.connect(self.pin)

    def sms_callback(self, sms):
        logger.info(sms_receive_log_template.format(sms.number,
                                                    sms.time, sms.text))
        for callback in self.sms_callbacks:
            tornado.ioloop.IOLoop.instance().add_callback(callback, sms)

    def add_sms_callback(self, callback):
        self.sms_callbacks.append(callback)

    def process_stored_sms(self, delete=False):
        self.modem.processStoredSms()
예제 #2
0
class GSM(object):
    def __init__(self, port, baudrate, pin=None):
        self.sms_callbacks = []
        self.port = port
        self.baudrate = baudrate
        self.pin = pin

    def run(self):
        self.modem = GsmModem(self.port,
                              self.baudrate,
                              smsReceivedCallbackFunc=self.sms_callback)
        self.modem.smsTextMode = False
        self.modem.connect(self.pin)

    def sms_callback(self, sms):
        logger.info(
            sms_receive_log_template.format(sms.number, sms.time, sms.text))
        for callback in self.sms_callbacks:
            tornado.ioloop.IOLoop.instance().add_callback(callback, sms)

    def add_sms_callback(self, callback):
        self.sms_callbacks.append(callback)

    def process_stored_sms(self, delete=False):
        self.modem.processStoredSms()
예제 #3
0
    def run(self):

        # initialize modem
        modem = GsmModem(self._modem_device,
                         self._modem_baud,
                         smsReceivedCallbackFunc=self._handleSms)
        modem.connect(self._modem_pin)

        # try to sycn clock with GSM network time
        self.set_clock_from_network(modem)

        # handle SMS
        self._pon_requested = False
        modem.smsTextMode = False
        modem.processStoredSms()

        # wait for completion
        try:
            modem.rxThread.join(1)
        finally:
            modem.close()

        # handle asynchronous sms request
        if self._pon_requested:
            self._pon_requested = False
            self.setup_connection()
예제 #4
0
def main():
    global modem
    global phonebook

    config.read('config.ini')

    # Create the phonebook
    tmpPhonebook = config.items('phonebook')
    for row in tmpPhonebook:
        phonebook[row[0]] = row[1]

    # Initialize the modem
    print('Initializing modem...')
    modem = GsmModem(config.get('modem', 'port'),
                     config.getint('modem', 'baudrate'),
                     smsReceivedCallbackFunc=on_gsm_handleSms)
    modem.smsTextMode = True

    # Connect to the modem
    try:
        modem.connect(config.get('modem', 'pin'))
    except PinRequiredError:
        print('Pin required')
        sys.exit(1)
    except IncorrectPinError:
        print('Wrong pin')
        sys.exit(1)

    # Print information about modem and network
    print(u'Connected to modem: {0} {1}'.format(modem.manufacturer,
                                                modem.model))
    print(u'Connected to network: {0}'.format(modem.networkName))
    print(u'Signal strenght: {0}'.format(str(modem.signalStrength)))
    print('Ready!')
    print('===')

    # Make sure to empty incoming sms bucket
    modem.processStoredSms()

    # Initialize MQTT
    client.on_connect = on_mqtt_connect
    client.on_message = on_mqtt_message

    client.username_pw_set(config.get('mqtt', 'user'),
                           config.get('mqtt', 'pass'))
    client.connect(config.get('mqtt', 'server'), config.getint('mqtt', 'port'),
                   60)

    client.loop_start()

    # Keep running forever
    try:
        modem.rxThread.join(
            2**31
        )  # Specify a (huge) timeout so that it essentially blocks indefinitely, but still receives CTRL+C interrupt signal
    finally:
        modem.close()
예제 #5
0
def main():
    logging.basicConfig(format="%(levelname)s: %(message)s",
                        level=logging.INFO)
    modem = GsmModem(PORT, BAUDRATE, smsReceivedCallbackFunc=handleSms)
    modem.smsTextMode = False
    modem.connect(PIN)
    try:
        if modem.ownNumber:
            print("Modem phone number:", modem.ownNumber)
        print("IMSI:", modem.imsi)
        print("IMEI:", modem.imei)
        modem.processStoredSms()
        while True:
            print("--- Network: {0} / Signal: {1} ---".format(
                modem.networkName, modem.signalStrength))
            modem.rxThread.join(60 * 60)
    finally:
        modem.close()
예제 #6
0
파일: main.py 프로젝트: mac-canada/smack
def main():
    init_modem()
    time.sleep(POST_INIT_DELAY)

    modem = GsmModem(
        PORT,
        BAUDRATE,
        smsReceivedCallbackFunc=handle_sms,
        incomingCallCallbackFunc=handle_call,
    )

    modem.connect(PIN)

    # prevent `SMS FULL` URC, just process them
    # now if we still have old unprocessed SMS
    modem.processStoredSms()

    logger.info(" ✓ Waiting for calls / sms...")
    Event().wait()
예제 #7
0
	def start(self):
		"""	Samotne jadro daemona: setupneme GmailAPI, setupneme GSM modem a zacneme provadet nekonecnou smycku """
		self.running = True

		# (0) SETUP VIRTUAL SERIAL PORT FOR MODEM
		if "virtualPortInitCommand" in myconfig['modem']:
			try:
				virtualSerialPortInstance = virtualSerialPort(myconfig['modem']['virtualPortInitCommand'])
				virtualSerialPortInstance.start()
			except:
				pass
		else:
			virtualSerialPortInstance = None

		# (1) SETUP GMAIL ACCESS
		logging.info('Initializing GMAIL access...')
		try:
			gmailService = gmailUtils.get_service(self.cwd)
		except RuntimeError as e:
			print(str(e))
			logging.critical(str(e))
			if (virtualSerialPortInstance is not None):
				virtualSerialPortInstance.stop()
			#sys.exit(1)
			self.stop()
		
		######################################################################################################################################################
		# (2) SETUP GSM MODEM + bind a "smsReceived" callback + poll gmail inbox
		logging.info('Initializing GSM modem on {0} port @ {1} speed...'.format(myconfig['modem']['port'], myconfig['modem']['baudrate']))
		modem = GsmModem(myconfig['modem']['port'], myconfig['modem']['baudrate'], smsReceivedCallbackFunc=self.incomingSmsHandler)
		modem.smsTextMode = False

		while self.running:
			# start of gsm init loop
			try:
				modem.connect(myconfig['modem']['pin'])
			except serial.SerialException:
				logging.error('Error: Cannot connect to modem on serial port %s @ %s. Trying again in %d sec...' % (myconfig['modem']['port'], myconfig['modem']['baudrate'], myconfig['modem']['errorRetryWaitTime']))
				time.sleep(myconfig['modem']['errorRetryWaitTime'])
			except TimeoutException:
				logging.error('Error: Serial device %s @ %s timeout. Trying again in %d sec...' % (myconfig['modem']['port'], myconfig['modem']['baudrate'], myconfig['modem']['errorRetryWaitTime']))
				time.sleep(myconfig['modem']['errorRetryWaitTime'])
			except PinRequiredError:
				# Fatal error
				logging.critical('Error: SIM card PIN required. Please provide PIN in the config file.')
				self.stop()
				return 1
			except IncorrectPinError:
				# Fatal error
				logging.critical('Error: Incorrect SIM card PIN entered!')
				self.stop()
				return 1
			else:
				logging.info('Modem connected.')
				try:
					logging.info('Checking for network coverage...')
					modem.waitForNetworkCoverage(8) # of seconds
				except TimeoutException:
					logging.warning('We can now start gmail inbox polling infinite loop.')
					print('Network signal strength is not sufficient, please adjust modem position/antenna and try again.')
					modem.close()
				else:
					logging.info('GSM modem is ready.')  
					logging.info('We are now handling all incoming SMS messages.') 

					try:
						if (myconfig['incomingSmsHandlerSetup']['processStoredSms'] == "all"):
							modem.processStoredSms(unreadOnly=False)
						elif (myconfig['incomingSmsHandlerSetup']['processStoredSms'] == "unread"):
							modem.processStoredSms(unreadOnly=True)
					except Exception as e:
						logging.critical("Nastal problem pri zpracovani drivejsich neprectenych SMS:")
						raise
						sys.exit(0)
					else:
						logging.info('We can now start gmail inbox polling infinite loop.')

						try:
							while self.running:
								# start of main gmail loop
								logging.debug('Checking incoming emails...') 
								newMessagesCount = self.incomingGmailHandler(gmailService, modem)
								time.sleep(myconfig['general']['gmailQueueWaitingPeriod'] if newMessagesCount > 0 else myconfig['general']['gmailPollingInterval'])
								# end of main gmail loop
						except KeyboardInterrupt:
							#sys.exit(0)
							self.stop()
							return 0
						except Exception as e:
							print("Nastala vyjimka v hlavni smycce daemona, viz log.")
							logging.exception("Nastal problem v hlavni smycce:")
							raise
						finally:
							print("Bye gmail loop.")
					finally:
						print("Bye stored sms handling try-cache.")
				finally:
					print("Bye.")
					modem.close()
					if (virtualSerialPortInstance is not None):
						virtualSerialPortInstance.stop()
						
			finally:
				print("end of gsm init loop")

			# end of gsm init loop
			# normally we won't reach this place, but when a non-fatal error happens
			# (like 'No modem found', 'No GSM signal', etc.), we can continue the loop to
			# try it again in the new iteration of the main loop
			
		# TODO - move kill socat here. Move socat init to try finally

		######################################################################################################################################################
		return 0 # just for make sure, the program should never end up on this line