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