summaryrefslogtreecommitdiffstats
path: root/Handler
diff options
context:
space:
mode:
authortriatmoko2011-07-06 17:55:29 +0200
committertriatmoko2011-07-06 17:55:29 +0200
commit643e5d3bc738098ed73721378ffc2f34204d3453 (patch)
treed49c63becd65e5dcab183d9501b702473c2ec562 /Handler
parentedit and put db class. (diff)
downloadgsm-selftest-643e5d3bc738098ed73721378ffc2f34204d3453.tar.gz
gsm-selftest-643e5d3bc738098ed73721378ffc2f34204d3453.tar.xz
gsm-selftest-643e5d3bc738098ed73721378ffc2f34204d3453.zip
SIP FINAL HANDLER!!!
Diffstat (limited to 'Handler')
-rw-r--r--Handler/SIPCall.py154
-rw-r--r--Handler/SIPIncoming.py139
2 files changed, 220 insertions, 73 deletions
diff --git a/Handler/SIPCall.py b/Handler/SIPCall.py
index 45fdca2..8dca811 100644
--- a/Handler/SIPCall.py
+++ b/Handler/SIPCall.py
@@ -9,11 +9,6 @@ from datetime import datetime
import string
-
-HOST = None
-PORT = 50099
-s = None
-
stop ="false"
server = "132.230.4.8"
username = "mpselftest1"
@@ -24,7 +19,89 @@ current_call = None
success = ""
+class ServerHandler:
+
+ def __init__(self,p):
+ self.port = p
+ self.host = None #symbolic name meaning all available interfaces
+ self.s = None
+ self.connected = 0
+ self.address = "127.0.0.1" #address of the main controller
+ self.onceConnected = 0
+ self.error = 'No error'
+
+ def openSocket(self):
+ self.error = 'No error'
+ for res in socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC,
+ socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
+ af, socktype, proto, canonname, sa = res
+
+ try:
+ self.s = socket.socket(af, socktype, proto)
+ self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #this resolves the bug with live packets
+ except socket.error, msg:
+ self.s = None
+ self.connected = 0
+ self.error = str(msg)
+ continue
+
+ try:
+ self.s.bind(sa)
+ self.s.listen(1)
+ except socket.error, msg:
+ self.s.close()
+ self.s = None
+ self.connected = 0
+ self.error = str(msg)
+ continue
+ break
+
+ if self.s is None:
+ self.connected = 0
+ return 0
+ else: #accept the connection
+ self.connection, self.address = self.s.accept()
+ self.connected = 1
+ self.onceConnected = 1
+ return 1
+
+ def connectedTo(self):
+ return self.address
+
+ def receiveData(self):
+ if self.connected == 1:
+ while 1:
+ data = self.connection.recv(1024)
+ if not data:
+ return 'NO DATA'
+ else:
+ return data
+ else:
+ return 0
+ def sendData(self, data):
+ if self.connected == 1:
+ self.connection.send(data)
+ return 1
+ else:
+ return 0
+
+ def closeConnection(self):
+ if self.onceConnected == 1:
+ self.connection.close()
+ return 1
+ else:
+ return 0
+
+ def killPort(self):
+ killResult = os.popen('lsof -i tcp:' + str(self.port) + ' | grep "python " | awk -F" " ' + "'{print $2}'").read()
+ killResult = killResult.replace('\n','')
+ print killResult
+ if killResult!='':
+ print killResult
+ killPort = os.popen("kill -9 " + killResult).read()
+ return 1
+ return 0
# Logging callback
def log_cb(level, str, len):
@@ -60,7 +137,7 @@ class MyCallCallback(pj.CallCallback):
sleep(5)
current_call.hangup()
success = "true"
- connection.send(success)
+ server.sendData(success)
else:
sleep(1)
#print ""
@@ -72,7 +149,7 @@ class MyCallCallback(pj.CallCallback):
print "Destination Number is Busy or offline"
print ""
success = "false"
- connection.send(success)
+ server.sendData(success)
#print self.call.info().state_text
@@ -98,28 +175,6 @@ lib = pj.Lib()
while stop <> "true":
- for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
- af, socktype, proto, canonname, sa = res
- try:
- s = socket.socket(af, socktype, proto)
- except socket.error, msg:
- s = None
- continue
-
- try:
- s.bind(sa)
- s.listen(1)
- except socket.error, msg:
- s.close()
- s = None
- continue
- break
-
- if s is None:
- print 'could not open socket'
- sys.exit(1)
-
-
lib.init(log_cfg = pj.LogConfig(level=LOG_LEVEL, callback=log_cb))
transport = lib.create_transport(pj.TransportType.UDP, pj.TransportConfig(0))
@@ -127,44 +182,55 @@ while stop <> "true":
print "port", transport.info().port, "\n"
lib.start()
lib.set_null_snd_dev()
+
+ # open socket connection and connect to the controller
+ server = ServerHandler(50097)
+ tried = server.openSocket()
+
+ if server.error != 'No error':
+ print server.error
+ if server.error == '[Errno 98] Address already in use':
+ print 'one should try to kill the port'
+ print server.killPort()
+ server.closeConection()
try:
- acc_cfg = pj.AccountConfig(server, username, password)
+ acc_cfg = pj.AccountConfig("132.230.4.8","mpselftest1","1mpselftest")
acc = lib.create_account(acc_cfg, cb=MyAccountCallback())
+
if acc.info().reg_status < 700:
my_sip_uri = "sip:" + transport.info().host + ":" + str(transport.info().port)
- connection, addr = s.accept()
- print 'Connected by', addr
- connection.send('I am ready')
-
+ server.sendData('I am ready')#send message to controller
+ print "here:", server.connected
while 1:
try:
- data = connection.recv(1024)
+ data = server.receiveData() # waiting mode, until receiver start message or terminate message
- if data == "start":
+ if data == "start": # if receiver start message, handler start to call destination
while 1:
- num = connection.recv(1024)
+ num = server.receiveData() # waiting destination number
if num <> "":
number = "sip:"+num+"@132.230.4.8"
current_call = make_call(number)
break
- if data == "terminated":
+ if data == "terminated": # will terminate the handler if controller send terminate message
stop = "true"
break
except ValueError:
print "error when sending message"
- connection.close()
+ server.closeConnection()
+ del server
- connection.close()
-
+ server.closeConnection()
+ del server
else:
Regis_status= "Bad"
@@ -175,7 +241,8 @@ while stop <> "true":
acc = None
- connection.close()
+ server.closeConnection()
+ del server
except ValueError:
print "Exception: " + str(e)
@@ -183,7 +250,8 @@ print "Goodbye"
sleep(3)
acc.delete()
lib.destroy()
-connection.close()
+server.closeConnection()
+del server
lib = None
acc = None
diff --git a/Handler/SIPIncoming.py b/Handler/SIPIncoming.py
index 14b7837..4c9d1bc 100644
--- a/Handler/SIPIncoming.py
+++ b/Handler/SIPIncoming.py
@@ -2,6 +2,8 @@ import sys
import pjsua as pj
import socket
import time
+import os
+import string
from time import sleep
from datetime import datetime
@@ -21,7 +23,89 @@ current_call = None
success = ""
number = ""
-
+class ServerHandler:
+
+ def __init__(self,p):
+ self.port = p
+ self.host = None #symbolic name meaning all available interfaces
+ self.s = None
+ self.connected = 0
+ self.address = "127.0.0.1" #address of the main controller
+ self.onceConnected = 0
+ self.error = 'No error'
+
+ def openSocket(self):
+ self.error = 'No error'
+ for res in socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC,
+ socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
+ af, socktype, proto, canonname, sa = res
+
+ try:
+ self.s = socket.socket(af, socktype, proto)
+ self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #this resolves the bug with live packets
+ except socket.error, msg:
+ self.s = None
+ self.connected = 0
+ self.error = str(msg)
+ continue
+
+ try:
+ self.s.bind(sa)
+ self.s.listen(1)
+ except socket.error, msg:
+ self.s.close()
+ self.s = None
+ self.connected = 0
+ self.error = str(msg)
+ continue
+ break
+
+ if self.s is None:
+ self.connected = 0
+ return 0
+ else: #accept the connection
+ self.connection, self.address = self.s.accept()
+ self.connected = 1
+ self.onceConnected = 1
+ return 1
+
+ def connectedTo(self):
+ return self.address
+
+ def receiveData(self):
+ if self.connected == 1:
+ while 1:
+ data = self.connection.recv(1024)
+ if not data:
+ return 'NO DATA'
+ else:
+ return data
+ else:
+ return 0
+
+ def sendData(self, data):
+ if self.connected == 1:
+ self.connection.send(data)
+ return 1
+ else:
+ return 0
+
+ def closeConnection(self):
+ if self.onceConnected == 1:
+ self.connection.close()
+ return 1
+ else:
+ return 0
+
+ def killPort(self):
+ killResult = os.popen('lsof -i tcp:' + str(self.port) + ' | grep "python " | awk -F" " ' + "'{print $2}'").read()
+ killResult = killResult.replace('\n','')
+ print killResult
+ if killResult!='':
+ print killResult
+ killPort = os.popen("kill -9 " + killResult).read()
+ return 1
+ return 0
# Logging callback
def log_cb(level, str, len):
@@ -68,7 +152,7 @@ class MyCallCallback(pj.CallCallback):
if self.call.info().state_text == "CONNECTING":
success = "true"
- #connection.send(success)
+ server.sendData(success)
if self.call.info().state == pj.CallState.DISCONNECTED:
current_call = None
@@ -81,7 +165,7 @@ class MyCallCallback(pj.CallCallback):
call_slot = self.call.info().conf_slot
pj.Lib.instance().conf_connect(call_slot, 0)
pj.Lib.instance().conf_connect(0, call_slot)
- #connection.send('establish connection')
+ server.sendData('establish connection')
print "Media is now active"
@@ -94,26 +178,16 @@ class MyCallCallback(pj.CallCallback):
lib = pj.Lib()
try:
- for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
- af, socktype, proto, canonname, sa = res
- try:
- s = socket.socket(af, socktype, proto)
- except socket.error, msg:
- s = None
- continue
-
- try:
- s.bind(sa)
- s.listen(1)
- except socket.error, msg:
- s.close()
- s = None
- continue
- break
-
- if s is None:
- print 'could not open socket'
- sys.exit(1)
+ #open socket connection to the controller
+ server = ServerHandler(50103)
+ tried = server.openSocket()
+
+ if server.error != 'No error':
+ print server.error
+ if server.error == '[Errno 98] Address already in use':
+ print 'one should try to kill the port'
+ print server.killPort()
+ server.closeConection()
lib.init(log_cfg = pj.LogConfig(level=LOG_LEVEL, callback=log_cb))
@@ -126,6 +200,7 @@ try:
lib.start()
lib.set_null_snd_dev()
+
# Create local account
acc_cfg = pj.AccountConfig(server, username, password)
acc = lib.create_account(acc_cfg, cb=MyAccountCallback())
@@ -134,16 +209,14 @@ try:
my_sip_uri = "sip:" + transport.info().host + ":" + str(transport.info().port)
- #connection, addr = s.accept()
- #print 'Connected by', addr
- #connection.send('I am ready')
+ server.sendData('I am ready')#send message to controller that the handler ready
while stop <> "true":
- #data = connection.recv(1024)
- #if data == "terminated":
- # break
-
+ data = server.receiveData()#waiting message from controller
+ if data == "terminated":
+ break
+
if current_call == None:
continue
else:
@@ -157,6 +230,8 @@ try:
acc = None
lib.destroy()
lib = None
+ server.closeConnection()
+ del server
else:
Regis_status= "Bad"
print "error when register"
@@ -164,8 +239,12 @@ try:
lib.destroy()
lib = None
acc = None
+ server.closeConnection()
+ del server
except pj.Error, e:
print "Exception: " + str(e)
lib.destroy()
lib = None
+ server.closeConnection()
+ del server