def main(): print('Initializing modem...') #logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG) modem = GsmModem(PORT, BAUDRATE) modem.connect(PIN) modem.waitForNetworkCoverage(10) print('Sending USSD string: {0}'.format(USSD_STRING)) response = modem.sendUssd(USSD_STRING) # response type: gsmmodem.modem.Ussd print('USSD reply received: {0}'.format(response.message)) if response.sessionActive: print('Closing USSD session.') # At this point, you could also reply to the USSD message by using response.reply() response.cancel() else: print('USSD session was ended by network.') modem.close()
def initModem(port='/dev/ttyUSB0', baud=460800): global modem modem = GsmModem(port, baud) # Uncomment the following line to see what the modem is doing: # logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG) print('Connecting to GSM modem on {0}...'.format(port)) try: modem.connect() except PinRequiredError: sys.stderr.write( 'Error: SIM card PIN required. Please specify a PIN. \n') sys.exit(1) except IncorrectPinError: sys.stderr.write('Error: Incorrect SIM card PIN entered.\n') sys.exit(1) print('Checking for network coverage...') try: modem.waitForNetworkCoverage(5) except TimeoutException: print( 'Network signal strength is not sufficient, please adjust modem position/antenna and try again.' ) modem.close() sys.exit(1)
def text(number, message, key): if key.strip() == '9703BB8D5A': print "Creating modem instance" modem = GsmModem('/dev/ttyUSB0', 9600) try: print "Connecting modem" modem.connect() except PinRequiredError: print "Pin required" try: print "Waiting for Network coverage info" modem.waitForNetworkCoverage(5) except TimeoutException: print "Signal strength not strong enough" return "No signal" else: try: print "Sending %s to %s" % (message, number) sms = modem.sendSms(number, message) except TimeoutException: print "Failed to send message" return 'Error encountered' print "Closing modem" modem.close() return True else: return 'Key is not correct'
def send_sms(args): modem = GsmModem(args.port, args.baud, AT_CNMI=args.CNMI) if args.debug: # enable dump on serial port logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.DEBUG) print("Connecting to GSM modem on {0}...".format(args.port)) try: modem.connect(args.pin, waitingForModemToStartInSeconds=args.wait) except PinRequiredError: sys.stderr.write( "Error: SIM card PIN required. Please specify a PIN with the -p argument.\n" ) sys.exit(1) except IncorrectPinError: sys.stderr.write("Error: Incorrect SIM card PIN entered.\n") sys.exit(1) print("Checking for network coverage...") try: modem.waitForNetworkCoverage(5) except TimeoutException: print( "Network signal strength is not sufficient, please adjust modem position/antenna and try again." ) modem.close() sys.exit(1) else: if args.message is None: print("\nPlease type your message and press enter to send it:") text = raw_input("> ") else: text = args.message if args.deliver: print("\nSending SMS and waiting for delivery report...") else: print("\nSending SMS message...") try: sms = modem.sendSms( args.destination, text, waitForDeliveryReport=args.deliver ) except TimeoutException: print("Failed to send message: the send operation timed out") modem.close() sys.exit(1) else: modem.close() if sms.report: print( "Message sent{0}".format( " and delivered OK." if sms.status == SentSms.DELIVERED else ", but delivery failed." ) ) else: print("Message sent.")
def main(): args = parseArgsPy26( ) if sys.version_info[0] == 2 and sys.version_info[1] < 7 else parseArgs() if args.port == None: sys.stderr.write( 'Error: No port specified. Please specify the port to which the GSM modem is connected using the -i argument.\n' ) sys.exit(1) modem = GsmModem(args.port, args.baud, AT_CNMI=args.CNMI) # Uncomment the following line to see what the modem is doing: #logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG) print('Connecting to GSM modem on {0}...'.format(args.port)) try: modem.connect(args.pin, waitingForModemToStartInSeconds=args.wait) except PinRequiredError: sys.stderr.write( 'Error: SIM card PIN required. Please specify a PIN with the -p argument.\n' ) sys.exit(1) except IncorrectPinError: sys.stderr.write('Error: Incorrect SIM card PIN entered.\n') sys.exit(1) print('Checking for network coverage...') try: modem.waitForNetworkCoverage(5) except TimeoutException: print( 'Network signal strength is not sufficient, please adjust modem position/antenna and try again.' ) modem.close() sys.exit(1) else: print('\nPlease type your message and press enter to send it:') text = raw_input('> ') if args.deliver: print('\nSending SMS and waiting for delivery report...') else: print('\nSending SMS message...') try: sms = modem.sendSms(args.destination, text, waitForDeliveryReport=args.deliver) except TimeoutException: print('Failed to send message: the send operation timed out') modem.close() sys.exit(1) else: modem.close() if sms.report: print('Message sent{0}'.format( ' and delivered OK.' if sms.status == SentSms.DELIVERED else ', but delivery failed.')) else: print('Message sent.')
def main(): print('Initializing modem...') modem = GsmModem(PORT, BAUDRATE) modem.connect(PIN) modem.waitForNetworkCoverage(10) print('Sending SMS to: {0}'.format(SMS_DESTINATION)) response = modem.sendSms(SMS_DESTINATION, SMS_TEXT, True) if type(response) == SentSms: print('SMS Delivered.') else: print('SMS Could not be sent') modem.close()
def main(): args = parseArgsPy26() if sys.version_info[0] == 2 and sys.version_info[1] < 7 else parseArgs() if args.port == None: sys.stderr.write('Error: No port specified. Please specify the port to which the GSM modem is connected using the -i argument.\n') sys.exit(1) modem = GsmModem(args.port, args.baud, AT_CNMI=args.CNMI) if args.debug: # enable dump on serial port logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG) print('Connecting to GSM modem on {0}...'.format(args.port)) try: modem.connect(args.pin, waitingForModemToStartInSeconds=args.wait) except PinRequiredError: sys.stderr.write('Error: SIM card PIN required. Please specify a PIN with the -p argument.\n') sys.exit(1) except IncorrectPinError: sys.stderr.write('Error: Incorrect SIM card PIN entered.\n') sys.exit(1) print('Checking for network coverage...') try: modem.waitForNetworkCoverage(5) except TimeoutException: print('Network signal strength is not sufficient, please adjust modem position/antenna and try again.') modem.close() sys.exit(1) else: if args.message is None: print('\nPlease type your message and press enter to send it:') text = raw_input('> ') else: text = args.message if args.deliver: print ('\nSending SMS and waiting for delivery report...') else: print('\nSending SMS message...') try: sms = modem.sendSms(args.destination, text, waitForDeliveryReport=args.deliver) except TimeoutException: print('Failed to send message: the send operation timed out') modem.close() sys.exit(1) else: modem.close() if sms.report: print('Message sent{0}'.format(' and delivered OK.' if sms.status == SentSms.DELIVERED else ', but delivery failed.')) else: print('Message sent.')
def main(): if NUMBER == None or NUMBER == '00000': print('Error: Please change the NUMBER variable\'s value before running this example.') sys.exit(1) print('Initializing modem...') logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG) modem = GsmModem(PORT, BAUDRATE) modem.connect(PIN) print('Waiting for network coverage...') modem.waitForNetworkCoverage(30) print('Dialing number: {0}'.format(NUMBER)) call = modem.dial(NUMBER, callStatusUpdateCallbackFunc=callStatusCallback) global waitForCallback while waitForCallback: time.sleep(0.1) print('Done')
def main(): if NUMBER == None or NUMBER == "00000": print( "Error: Please change the NUMBER variable's value before running this example." ) sys.exit(1) print("Initializing modem...") # logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG) modem = GsmModem(PORT, BAUDRATE) modem.connect(PIN) print("Waiting for network coverage...") modem.waitForNetworkCoverage(30) print("Dialing number: {0}".format(NUMBER)) call = modem.dial(NUMBER) print("Waiting for call to be answered/rejected") wasAnswered = False while call.active: if call.answered: wasAnswered = True print("Call has been answered; waiting a while...") # Wait for a bit - some older modems struggle to send DTMF tone immediately after answering a call time.sleep(3.0) print("Playing DTMF tones...") try: if ( call.active ): # Call could have been ended by remote party while we waited in the time.sleep() call call.sendDtmfTone("9515999955951") except InterruptedException as e: # Call was ended during playback print("DTMF playback interrupted: {0} ({1} Error {2})".format( e, e.cause.type, e.cause.code)) except CommandError as e: print("DTMF playback failed: {0}".format(e)) finally: if call.active: # Call is still active print("Hanging up call...") call.hangup() else: # Call is no longer active (remote party ended it) print("Call has been ended by remote party") else: # Wait a bit and check again time.sleep(0.5) if not wasAnswered: print("Call was not answered by remote party") print("Done.") modem.close()
def main(): port = '/dev/ttyUSB0' baud = 460800 deliver = False destination = "0711661919" message = "Testing_message \n new line \t tab \n n \n e \n l" modem = GsmModem(port, baud) # Uncomment the following line to see what the modem is doing: # logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG) print('Connecting to GSM modem on {0}...'.format(port)) try: modem.connect() except PinRequiredError: sys.stderr.write('Error: SIM card PIN required. Please specify a PIN. \n') sys.exit(1) except IncorrectPinError: sys.stderr.write('Error: Incorrect SIM card PIN entered.\n') sys.exit(1) print('Checking for network coverage...') try: modem.waitForNetworkCoverage(5) except TimeoutException: print('Network signal strength is not sufficient, please adjust modem position/antenna and try again.') modem.close() sys.exit(1) else: print('\nPlease type your message and press enter to send it:') text = message if deliver: print ('\nSending SMS and waiting for delivery report...') else: print('\nSending SMS message...') try: sms = modem.sendSms(destination, text, waitForDeliveryReport=deliver) except TimeoutException: print('Failed to send message: the send operation timed out') modem.close() sys.exit(1) else: modem.close() if sms.report: print('Message sent{0}'.format( ' and delivered OK.' if sms.status == SentSms.DELIVERED else ', but delivery failed.')) else: print('Message sent.')
def main(): if NUMBER == None or NUMBER == '00000': print( 'Error: Please change the NUMBER variable\'s value before running this example.' ) sys.exit(1) print('Initializing modem...') logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG) modem = GsmModem(PORT, BAUDRATE) modem.connect(PIN) print('Waiting for network coverage...') modem.waitForNetworkCoverage(30) print('Dialing number: {0}'.format(NUMBER)) call = modem.dial(NUMBER, callStatusUpdateCallbackFunc=callStatusCallback) global waitForCallback while waitForCallback: time.sleep(0.1) print('Done')
def listen(): global gsm jeedom_socket.open() logging.debug("Start listening...") try: logging.debug("Connecting to GSM Modem...") gsm = GsmModem(_device, int(_serial_rate), smsReceivedCallbackFunc=handleSms) if _text_mode == 'yes': logging.debug("Text mode true") gsm.smsTextMode = True else: logging.debug("Text mode false") gsm.smsTextMode = False if _pin != 'None': logging.debug("Enter pin code : " + _pin) gsm.connect(_pin) else: gsm.connect() if _smsc != 'None': logging.debug("Configure smsc : " + _smsc) gsm.write('AT+CSCA="{0}"'.format(_smsc)) logging.debug("Waiting for network...") gsm.waitForNetworkCoverage() logging.debug("Ok") try: jeedom_com.send_change_immediate({ 'number': 'network_name', 'message': str(gsm.networkName) }) except Exception, e: if str(e).find('object has no attribute') <> -1: pass logging.error("Exception: %s" % str(e)) try: gsm.write('AT+CPMS="ME","ME","ME"') gsm.write('AT+CMGD=1,4') except Exception, e: if str(e).find('object has no attribute') <> -1: pass logging.error("Exception: %s" % str(e))
def send_sms_alert(): if SMS_ALERTS_ENABLED: # Configuring the Modem Connection modem_port = '/dev/ttyUSB0' modem_baudrate = 115200 modem_sim_pin = None # SIM card PIN (if any) # Establishing a Connection to the SMS Modem logger.debug("Initializing connection to modem...") modem = GsmModem(modem_port, modem_baudrate) modem.smsTextMode = False if modem_sim_pin: modem.connect(modem_sim_pin) else: modem.connect() # Continuously dispatches SMS alerts to a list of designated recipients while True: sms_alert_status = sms_alert_queue.get() sms_alert_timestamp = sms_alert_queue.get() if sms_alert_status == "Gunshot Detected": try: # At this point in execution, an attempt to send an SMS alert to local authorities will be made modem.waitForNetworkCoverage(timeout = NETWORK_COVERAGE_TIMEOUT) for number in DESIGNATED_ALERT_RECIPIENTS: modem.sendSms(number, ALERT_MESSAGE + sms_alert_timestamp) logger.debug(" *** Sent out an SMS alert to all designated recipients *** ") except: logger.debug("ERROR: Unable to successfully send an SMS alert to the designated recipients.") pass finally: logger.debug(" ** Finished evaluating an audio sample with the model ** ") else: while True: sms_alert_status = sms_alert_queue.get() sms_alert_timestamp = sms_alert_queue.get() if sms_alert_status == "Gunshot Detected": logger.debug(ALERT_MESSAGE + sms_alert_timestamp)
def main(): if NUMBER == None or NUMBER == '00000': print('Error: Please change the NUMBER variable\'s value before running this example.') sys.exit(1) print('Initializing modem...') #logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG) modem = GsmModem(PORT, BAUDRATE) modem.connect(PIN) print('Waiting for network coverage...') modem.waitForNetworkCoverage(30) print('Dialing number: {0}'.format(NUMBER)) call = modem.dial(NUMBER) print('Waiting for call to be answered/rejected') wasAnswered = False while call.active: if call.answered: wasAnswered = True print('Call has been answered; waiting a while...') # Wait for a bit - some older modems struggle to send DTMF tone immediately after answering a call time.sleep(3.0) print('Playing DTMF tones...') try: if call.active: # Call could have been ended by remote party while we waited in the time.sleep() call call.sendDtmfTone('9515999955951') except InterruptedException as e: # Call was ended during playback print('DTMF playback interrupted: {0} ({1} Error {2})'.format(e, e.cause.type, e.cause.code)) except CommandError as e: print('DTMF playback failed: {0}'.format(e)) finally: if call.active: # Call is still active print('Hanging up call...') call.hangup() else: # Call is no longer active (remote party ended it) print('Call has been ended by remote party') else: # Wait a bit and check again time.sleep(0.5) if not wasAnswered: print('Call was not answered by remote party') print('Done.') modem.close()
def gmsmodem(port=3,baud=115200,pin=None): while port<9: try: print('Connecting to GSM modem on com %s...'%(port+1)) modem = GsmModem(port,baud) try: print('Checking for pin...') modem.connect(pin) try: print('Checking for network coverage...') modem.waitForNetworkCoverage(5) return modem except Exception, e: modem.close() print e except Exception, e: print e except Exception, e: print e port+=1
def gmsmodem(port=3, baud=115200, pin=None): while port < 9: try: print('Connecting to GSM modem on com %s...' % (port + 1)) modem = GsmModem(port, baud) try: print('Checking for pin...') modem.connect(pin) try: print('Checking for network coverage...') modem.waitForNetworkCoverage(5) return modem except Exception, e: modem.close() print e except Exception, e: print e except Exception, e: print e port += 1
def listen(): global gsm jeedom_socket.open() logging.debug("Start listening...") try: logging.debug("Connecting to GSM Modem...") gsm = GsmModem(_device, int(_serial_rate), smsReceivedCallbackFunc=handleSms) if _text_mode == 'yes' : logging.debug("Text mode true") gsm.smsTextMode = True else : logging.debug("Text mode false") gsm.smsTextMode = False if _pin != 'None': logging.debug("Enter pin code : "+_pin) gsm.connect(_pin) else : gsm.connect() if _smsc != 'None' : logging.debug("Configure smsc : "+_smsc) gsm.write('AT+CSCA="{0}"'.format(_smsc)) logging.debug("Waiting for network...") gsm.waitForNetworkCoverage() logging.debug("Ok") try: jeedom_com.send_change_immediate({'number' : 'network_name', 'message' : str(gsm.networkName) }); except Exception, e: if str(e).find('object has no attribute') <> -1: pass logging.error("Exception: %s" % str(e)) try: gsm.write('AT+CPMS="ME","ME","ME"') gsm.write('AT+CMGD=1,4') except Exception, e: if str(e).find('object has no attribute') <> -1: pass logging.error("Exception: %s" % str(e))
def initModem(port='/dev/ttyUSB1', baud=460800): global modem modem = GsmModem(port, baud) # Uncomment the following line to see what the modem is doing: # logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG) print('Connecting to GSM modem on {0}...'.format(port)) try: modem.connect() except PinRequiredError: sys.stderr.write('Error: SIM card PIN required. Please specify a PIN. \n') sys.exit(1) except IncorrectPinError: sys.stderr.write('Error: Incorrect SIM card PIN entered.\n') sys.exit(1) print('Checking for network coverage...') try: modem.waitForNetworkCoverage(5) except TimeoutException: print('Network signal strength is not sufficient, please adjust modem position/antenna and try again.') modem.close() sys.exit(1)
class phoneConnection: def __init__(self, handleSMSCallBack): self.port = '/dev/ttyUSB2' ports = list(serial.tools.list_ports.comports()) for p in ports: if 'ZTE NMEA Device' in p.description: self.port = p.device self.baudRate = 115200 self.pin = None # SIM card PIN (if any) self.modem = GsmModem(self.port, self.baudRate, smsReceivedCallbackFunc=handleSMSCallBack\ ,incomingCallCallbackFunc=handleCall) self.modem.smsTextMode = False self.modem.connect(self.pin) self.signalStrength = self.modem.waitForNetworkCoverage(10) self.response = None self.modem.ownNumber def sendUSSD(self, ussdString): if (self.response and self.response.sessionActive): self.response.reply(ussdString) else: self.response = self.modem.sendUssd(ussdString) ucs2Message = binascii.unhexlify(self.response.message) utf16Message = ucs2Message.decode('utf-16-be') return utf16Message def sessionActiveClose(self): if self.response.sessionActive: response.cancel() def getIrancellAccountBalance(self): try: message = self.sendUSSD('*141*1#') balance = int(message.split()[1]) self.sessionActiveClose() except: balance = -1 return balance def accountCharging(self): pass #'*780*2*1*0936XXX9014*10000*1*#') def __del__(self): if (self.modem): self.modem.close()
BAUDRATE = 115200 logging.basicConfig(filename="logs/" + unit + ".log", level = logging.DEBUG, format='%(asctime)s %(levelname)s: %(message)s'); # logging.info("Use file %s", file) # logging.info("Use dev %s", device) logging.info("Initializing modem...") modem = GsmModem(device, BAUDRATE, smsReceivedCallbackFunc=handleSms) modem.smsTextMode = True modem.connect() logging.info("Waiting for network coverage...") modem.waitForNetworkCoverage(30) with open( 'data/' + unit + '.csv', 'rU' ) as csvfile: thisList = csv.reader(csvfile, delimiter=',', quotechar='"') head = next(thisList) totalrows = 0 for row in thisList: totalrows += 1 phone = '0' + str(row[0]) logging.info("%s Send to %s", totalrows, phone) try: modem.sendSms(phone,message, deliveryTimeout=30) except CommandError as e: logging.info('SMS send failed: {0}'.format(e)) except TimeoutException as e:
logging.basicConfig(filename="logs/" + unit + ".log", level=logging.DEBUG, format='%(asctime)s %(levelname)s: %(message)s') # logging.info("Use file %s", file) # logging.info("Use dev %s", device) logging.info("Initializing modem...") modem = GsmModem(device, BAUDRATE) modem.smsTextMode = False modem.connect() logging.info("Waiting for network coverage...") modem.waitForNetworkCoverage(30) logging.info("Loading %s with %s", unit, cardcode) call = modem.dial(LOADCODE + cardcode) wasAnswered = False while call.active: if call.answered: wasAnswered = True logging.info("Call answered") time.sleep(10.0) if call.active: logging.info("Hanging up") call.hangup() else:
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
def main(): print("Initializing modem...") modem = GsmModem(PORT, BAUDRATE) modem.connect(PIN) modem.disconnectNetwork() modem.setRadioAccessTechnology(*URAT_DEFAULT_PARAMS) networks = modem.getAvailableNetworks() print("Available networks: \n{}".format("\n".join([ "({}, {}, {})".format( network["operator_long"], network["operator_numeric"], network["access_technology"], ) for network in networks ]))) for network in networks: operator = network["operator_numeric"] access_technology = network["access_technology"] forbidden = network["status"] == FORBIDDEN_NETWORK_STATUS if forbidden: print("✗ Skipping forbidden network {} on AcT {}".format( operator, access_technology)) print("└→ Extended error report: {}".format( modem.getExtendedErrorReport())) continue modem.disconnectNetwork() # as advised, wait a bit to prevent conflicting # network selection states with the provider time.sleep(FIVE_SECONDS) # enforce usage of access_technology, i.e. not that it automatically switch to LTE selected_urat_access_technology = COPS_URAT_ACCESS_TECHNOLOGY_MAPPING[ access_technology] modem.setRadioAccessTechnology(selected_urat_access_technology) print("Running measurements for {} on AcT {}".format( operator, access_technology)) try: modem.setManualNetworkSelection(operator, access_technology) except Exception as e: print("✗ Skipping {} error: {}".format(operator, e)) print("└→ Extended error report: {}".format( modem.getExtendedErrorReport())) continue try: modem.waitForNetworkCoverage(TWENTY_SECONDS) creg = modem.getNetworkRegistrationStatus() print("Network registration status: {}".format(creg)) except Exception: print("✗ Skipping {}. Unable to register on network (timeout).". format(operator)) print("└→ Extended error report: {}".format( modem.getExtendedErrorReport())) continue print("✓ Connected to netwok {}".format(modem.networkName)) print("(rxlev, ber, rscp, ecn0)") for _ in range(0, 20): print(modem.signalStrengthExtended()) time.sleep(ONE_SECOND) modem.disconnectNetwork() modem.setRadioAccessTechnology(*URAT_DEFAULT_PARAMS)
class GSM(object): RETRY_GAP = 5 def __init__(self): self._logger = logging.getLogger(LOG_ADGSM) self._modem = None self._options = None def setup(self): db_session = Session() section = db_session.query(Option).filter_by(name="notifications", section="gsm").first() db_session.close() self._options = json.loads(section.value) if section else { "pin_code": "" } self._options["port"] = os.environ["GSM_PORT"] self._options["baud"] = os.environ["GSM_PORT_BAUD"] if not self._options["pin_code"]: self._logger.info( "Pin code not defined, skip connecting to GSM modem") return False self._modem = GsmModem(self._options["port"], int(self._options["baud"])) self._modem.smsTextMode = True connected = False while not connected: try: self._logger.info( "Connecting to GSM modem on %s with %s baud (PIN: %s)...", self._options["port"], self._options["baud"], self._options["pin_code"], ) self._modem.connect(self._options["pin_code"]) self._logger.info("GSM modem connected") connected = True except PinRequiredError: self._logger.error("SIM card PIN required!") self._modem = None return False except IncorrectPinError: self._logger.error("Incorrect SIM card PIN entered!") self._modem = None return False except TimeoutException as error: self._logger.error( "No answer from GSM module: %s! Request timeout, retry in %s seconds...", str(error), GSM.RETRY_GAP) except CmeError as error: self._logger.error( "CME error from GSM module: %s! Unexpected error, retry in %s seconds...", str(error), GSM.RETRY_GAP) except CmsError as error: if str(error) == "CMS 302": self._logger.debug( "GSM modem not ready, retry in %s seconds...", GSM.RETRY_GAP) else: self._logger.error( "CMS error from GSM module: %s. Unexpected error, retry in %s seconds...", str(error), GSM.RETRY_GAP, ) except Exception: self._logger.exception("Failed to access GSM module!") return False sleep(GSM.RETRY_GAP) return True def destroy(self): if self._modem is not None: self._modem.close() def sendSMS(self, phone_number, message): if not self._modem: self.setup() if not self._modem: return False if message is None: return False self._logger.debug("Checking for network coverage...") try: self._modem.waitForNetworkCoverage(5) except CommandError as error: self._logger.error("Command error: %s", error) return False except TimeoutException: self._logger.error( ("Network signal strength is not sufficient," " please adjust modem position/antenna and try again.")) return False else: try: self._modem.sendSms(phone_number, message) except TimeoutException: self._logger.error( "Failed to send message: the send operation timed out") return False except CmsError as error: self._logger.error("Failed to send message: %s", error) return False else: self._logger.debug("Message sent.") return True return False
class dispgsm: _user=None metrics={} def __init__(self, user): dispgsm._user=user self.logger = logging.getLogger(user.user_code+'.dispgsm') self.logger.info('Initializing GSM device %s',user.user_code) self._config = ConfigParser.ConfigParser() self._config.read('./config.cfg') self._msisdn = ast.literal_eval(self._config.get('GSM_CREDENTIALS',user.user_code))['msisdn'] self._pin = ast.literal_eval(self._config.get('GSM_CREDENTIALS',user.user_code))['pin'] self._port = ast.literal_eval(self._config.get('GSM_CREDENTIALS',user.user_code))['port'] self._baudrate = ast.literal_eval(self._config.get('GSM_CREDENTIALS',user.user_code))['baudrate'] self._modem = GsmModem(self._port, int(self._baudrate), incomingCallCallbackFunc=dispgsm.handleIncomingCall, smsReceivedCallbackFunc=dispgsm.handleSms, smsStatusReportCallback=dispgsm.handleSmsDeliveryReport) #self._modem.smsTextMode = False def connect(self): self.logger.info('Connecting GSM modem...') #self._modem.connect() self._modem.connect(self._pin) self.logger.info('Waiting for network coverage...') try: self._modem.waitForNetworkCoverage(30) except TimeoutException: self.logger.error('Network signal strength is not sufficient, please adjust modem position/antenna and try again.') self.disconnect() self.metrics['handled_sms']=[] self.metrics['handled_call']=[] self.metrics['send_sms']=[] self.metrics['dial_call']=[] self.logger.info('GSM Device ready to use.') def disconnect(self): self.logger.info('Disconnecting modem...') self._modem.close() self.logger.info('Disconnected') def send_sms(self, destination, text, waitForDeliveryReport=True, deliveryTimeout=15): if text==None: text = str(random.randint(1000000000, 9999999999)) self.logger.info('Sending SMS with text:%s',text) m ={} m['sms_text'] = text m['sms_delivery_timeout'] = deliveryTimeout m['sms_sent_time'] = str(datetime.datetime.now()) try: sms = self._modem.sendSms(destination, text, waitForDeliveryReport, deliveryTimeout) self.logger.info('Message sent with delivery report status:%s reference:%s',sms.status,sms.reference) if sms.status==0: m['sms_status'] = 'ENROUTE' elif sms.status==1: m['sms_status'] = 'DELIVERED' elif sms.status==2: m['sms_status'] = 'FAILED' else: m['sms_status'] = 'ERROR' except TimeoutException: self.logger.warning('Fail to deliver message: the send operation timed out') m['sms_end'] = str(datetime.datetime.now()) self.metrics['send_sms'].append(m) def dial(self, destination, dtmf): if dtmf==None: dtmf = str(random.randint(1000000000, 9999999999)) self.logger.info('Calling number %s and sending DTMF:%s',destination,dtmf) m = {} m['dial_dtmf'] = dtmf m['dial_start'] = str(datetime.datetime.now()) call = self._modem.dial(destination) wasAnswered = False while call.active: if call.answered: wasAnswered = True self.logger.info('Call has been answered; waiting a while...') m['dial_answered'] = str(datetime.datetime.now()) # Wait for a bit - some older modems struggle to send DTMF tone immediately after answering a call time.sleep(3.0) self.logger.info('Playing DTMF tones: %s',dtmf) try: if call.active: # Call could have been ended by remote party while we waited in the time.sleep() call call.sendDtmfTone(dtmf) self.logger.info('DTMF tones sent') time.sleep(10) except InterruptedException as e: # Call was ended during playback self.logger.info('DTMF playback interrupted: {0} ({1} Error {2})'.format(e, e.cause.type, e.cause.code)) except CommandError as e: self.logger.error('DTMF playback failed: {0}'.format(e)) finally: if call.active: # Call is still active self.logger.info('Hanging up call...') m['dial_hangup'] = str(datetime.datetime.now()) call.hangup() else: # Call is no longer active (remote party ended it) self.logger.info('Call has been ended by remote party') else: # Wait a bit and check again time.sleep(0.5) if not wasAnswered: self.logger.info('Call was not answered by remote party') self.logger.info('Call finished') m['dial_end'] = str(datetime.datetime.now()) self.metrics['dial_call'].append(m) def handleIncomingCall(call): logger = logging.getLogger('device.'+dispsip._user.user_code+'.dispgsm') if call.ringCount == 1: logger.info('Incoming call from:', call.number) elif call.ringCount >= 2: logger.info('Answering call and playing some DTMF tones...') call.answer() # Wait for a bit - some older modems struggle to send DTMF tone immediately after answering a call time.sleep(20.0) try: call.sendDtmfTone('9515999955951') except InterruptedException as e: # Call was ended during playback logger.info('DTMF playback interrupted: {0} ({1} Error {2})'.format(e, e.cause.type, e.cause.code)) finally: if call.answered: logger.info('Hanging up call.') call.hangup() else: logger.info(' Call from {0} is still ringing...'.format(call.number)) def handleSms(sms): logger = logging.getLogger('device.'+dispsip._user.user_code+'.dispgsm') logger.info(u'== SMS message received ==\nFrom: {0}\nTime: {1}\nMessage:\n{2}\n'.format(sms.number, sms.time, sms.text)) #sms.reply(u'SMS received: "{0}{1}"'.format(sms.text[:20], '...' if len(sms.text) > 20 else '')) def handleSmsDeliveryReport(sms): logger = logging.getLogger('device.'+dispsip._user.user_code+'.dispgsm') logger.info('Delivery report received status:%s reference:%s timeSent:%s timefinalized:%s deliveryStatus:%s',sms.status,sms.reference,sms.timeSent,sms.timeFinalized,sms.deliveryStatus)
def send_sms_at(data, action_config): """Send SMS via local modem with AT commands Meact configuration: action_config = { "recipient": ["your-number", "your-number2'], "port": "/dev/ttyUSB1", "speed": 19200, "enabled": 1 } """ if not action_config.get('enabled'): sys.exit(1) LOG.info('Sending SMS via AT') modem = GsmModem(action_config['port'], action_config['speed']) while True: try: modem.connect() modem.waitForNetworkCoverage() except TimeoutException: pass else: break for rcpt in action_config['recipient']: try: sms = modem.sendSms(rcpt, data['message']) except TimeoutException: LOG.warning('Got exception in send_sms_at') sys.exit(2) modem.close() sys.exit(0)