From b99193ba68f947802245a288940e54904ecbee61 Mon Sep 17 00:00:00 2001 From: Triatmoko Date: Fri, 18 Nov 2011 13:23:49 +0100 Subject: final version --- Code/Server-Code/SIPHandler.py | 138 ++++++++++++++++++++++------------------- 1 file changed, 75 insertions(+), 63 deletions(-) mode change 100755 => 100644 Code/Server-Code/SIPHandler.py (limited to 'Code/Server-Code/SIPHandler.py') diff --git a/Code/Server-Code/SIPHandler.py b/Code/Server-Code/SIPHandler.py old mode 100755 new mode 100644 index e446e1a..eb5302c --- a/Code/Server-Code/SIPHandler.py +++ b/Code/Server-Code/SIPHandler.py @@ -5,6 +5,7 @@ import ServerClass import LogFileClass import setproctitle from time import sleep +import csv def log_cb(level, str, len): @@ -13,23 +14,22 @@ def log_cb(level, str, len): # Receive events from incoming Call class Account(pj.AccountCallback): + def __init__(self, account=None): + pj.AccountCallback.__init__(self, account) + def on_incoming_call(self, call): global current_call - print 'Incoming Call' + #print 'Incoming Call' current_call = call call_cb = Calling(current_call) current_call.set_callback(call_cb) - logger.logEvent(current_call) + logger.logEvent('Incoming Call') call.answer(200) - logger.logEvent("Answer call") - print 'Answer Call' - if current_call <> None: - logger.logEvent("Hangup call") - print 'Hangup Call' - call.hangup() + + sleep(2) logger.logEvent('CALL OK') @@ -44,20 +44,23 @@ class Calling(pj.CallCallback): if self.call.info().state <> pj.CallState.DISCONNECTED: if self.call.info().state_text == "CONNECTING": - print 'Call Connecting' logger.logEvent("Call Connecting") - logger.logEvent('200') + try: + logger.logEvent('Try to hangup the call') + self.call.hangup() + logger.logEvent('Hangup OK') + except ValueError: + logger.logEvent('hangup failed, waiting destination hangup the call') + server.sendData('CALL OK') if self.call.info().last_reason == "Busy Here": - print 'Number busy or offline' logger.logEvent('Number busy or Offline') server.sendData('CALL NOT OK') logger.logEvent('CALL NOT OK') if self.call.info().state == pj.CallState.DISCONNECTED: logger.logEvent('Call Disconnected') - print 'Call Discont' current_call = None #function to make a call @@ -68,19 +71,41 @@ def make_call(uri): return acc.make_call(uri, cb) except pj.Error, e: - print "408 " + str(e) - logger.logEvent('408') + logger.logEvent('Error when trying to call, 408') + server.sendData('CALL NOT OK') return None +def writeToFile(): + try: + string = '--' + with open('handler.txt', 'w') as F: + writer = csv.writer(F) + writer.writerow([string]) + F.close() + except ValueError: + print "can't write to file" + +def openFile(): + global sipServer, username, password, ip, portadd + global port + + #file format: 'Account:username:password:server:handler:PortName:portCommunication + File = open('handler.txt') + reader = csv.reader(File, delimiter=':') + for row in reader: + if str(row[0]) == 'Account': + username = str(row[1]) + password = str(row[2]) + sipServer = str(row[3]) + port = int(row[6]) + File.close() + writeToFile() + #send greeting message to the controller def greeting(): - global server - global status - global port - port = sys.argv[2] + global server server = None - status = None # create socket communication object server = ServerClass.ServerHandler(port) @@ -88,15 +113,15 @@ def greeting(): conn = server.openSocket() if server.connected == 1: - #connection to the controller esatablish + #connection to the controller establish + logger.logEvent('Connection Establish') if server.receiveData(25) == 'HELLO HANDLER': - print 'GREETING' server.sendData('HELLO CONTROLLER') - status = 'OK' + return 1 else: - status = 'NOT OK' logger.logEvent('Cant connect to Controller') - sys.exit(1) + del server + return 0 def initLogFile(sipServer): @@ -104,15 +129,15 @@ def initLogFile(sipServer): if sipServer == '132.230.4.8': nameOfLogFile = 'SIP handler.log' - print '--SIP Asterisk--' + #print '--SIP Asterisk--' elif sipServer == 'sipgate.de': nameOfLogFile = 'Landline handler.log' - print '--Landline--' + #print '--Landline--' elif sipServer == '132.230.252.228': nameOfLogFile = 'University SIP handler.log' - print '--university tephone network--' + #print '--university tephone network--' logger = LogFileClass.Logging(nameOfLogFile) @@ -127,7 +152,6 @@ def initState(): if message == 'RECEIVER': state = 'RECEIVER' - elif message[0:6] == 'CALLER': state = 'CALLER' no = message[7:] @@ -137,30 +161,13 @@ def initState(): num = no[7:] else: num = no - print 'INIT STATE', state - -def initHandler(): - global sipServer - global username - global password - - - accConf = sys.argv[1] - username = accConf[0:accConf.find(':')] - - line = accConf[accConf.find(':')+1:] - password = line[0:line.find(':')] - - newLine = line[line.find(':')+1:] - sipServer = newLine[0:newLine.find(':')] - lib = pj.Lib() stop = False print 'INIT SYSTEM' -initHandler() +openFile() setproctitle.setproctitle('SIP Handler') initLogFile(sipServer) @@ -176,9 +183,9 @@ while stop <> True: lib.start() lib.set_null_snd_dev() - greeting() - - + if greeting() != 1: + lib.destroy() + break try: initState() acc_cfg = pj.AccountConfig(str(sipServer),str(username),str(password)) @@ -201,7 +208,7 @@ while stop <> True: print data logger.logEvent(data) - #shutting down message + #get shutting down message if data == 'TERMINATE CONNECTION': print data logger.logEvent('Terminate') @@ -218,13 +225,12 @@ while stop <> True: #start the call if data == 'CALL START': - print data + #print data if num <> '': sleep(3) logger.logEvent(data) logger.logEvent('Make a call to: ' + num) number = "sip:"+num+"@"+sipServer - print number make_call(number) else: logger.logEvent('No number to call') @@ -232,7 +238,7 @@ while stop <> True: #shutting down message if data == 'TERMINATE CONNECTION': - print data + #print data stop = True logger.logEvent('Terminate') break @@ -240,21 +246,27 @@ while stop <> True: else: logger.logEvent('Unknow Message') server.sendData('Unknow Message') - server.closeConnection() - sys.exit(0.5) + break else: logger.logEvent("488 Not Acceptable Here") - lib.destroy() + server.sendData('DEVICE NOT READY') + break - except ValueError: - print "401 Unauthorized " + str(e) + except ValueError: logger.logEvent("401 Unauthorized ") + break logger.logEvent("Goodbye") -acc.delete() -lib.destroy() -server.closeConnection() -lib = None -acc = None +logger.closeLogging() +# trying to clean everything before shutting down +try: + acc.delete() + lib.destroy() + lib = None + acc = None + server.closeConnection() + del server +except ValueError: + message = 'trying failure' -- cgit v1.2.3-55-g7522