예제 #1
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')
예제 #2
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()
예제 #3
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')
예제 #4
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()
예제 #5
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:
            logging.info("Call ended by remote party")
    else:
        time.sleep(0.5)
예제 #6
0
                    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:
            logging.info("Call ended by remote party")
    else:
        time.sleep(0.5)
예제 #7
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.connect()

logging.info("Waiting for network coverage...")
modem.waitForNetworkCoverage(30)

logging.info("Loading %s with %s %s", unit, cardcode, cardpin)
call = modem.dial( LOADCODE)

wasAnswered = False

while call.active:
    if call.answered:
        wasAnswered = True
        logging.info("Call answered")
        time.sleep(5.0)
        logging.info("DTMF card number")
        
        try:
            if call.active:
                call.sendDtmfTone( cardcode )
        except InterruptedException as e:
            logging.info("Card number DTMF playback interrupted: {0} ({1} Error {2})".format(e, e.cause.type, e.cause.code))
예제 #8
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)