예제 #1
6
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)
예제 #3
0
파일: main.py 프로젝트: akimtke/arke
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'
예제 #4
0
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.")
예제 #5
0
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.')
예제 #6
0
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()
예제 #7
0
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.')
예제 #8
0
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()
예제 #9
0
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')
예제 #10
0
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()
예제 #11
0
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.')
예제 #12
0
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')
예제 #13
0
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))
예제 #14
0
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)
예제 #15
0
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()
예제 #16
0
파일: sms.py 프로젝트: manhct/python-web2py
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
예제 #17
0
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
예제 #18
0
파일: smsd.py 프로젝트: jeedom/plugin-sms
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)
예제 #20
0
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()
예제 #21
0
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:
예제 #22
0
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:
예제 #23
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
예제 #24
0
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)
예제 #25
0
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
예제 #26
0
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)
예제 #27
-1
파일: main.py 프로젝트: akimtke/arke
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'
예제 #28
-6
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)