YAYPM:Bridge and then unbridge
From Yate Documentation
(Difference between revisions)
(Created page with "This script is given as an example, don't forget to change some information such as yate's extmodule binding ip address and port. This script will: 1 - make a phone call to...") |
|||
| Line 3: | Line 3: | ||
This script will: | This script will: | ||
| − | + | * 1 - make a phone call to 'jmfoucher' | |
| − | + | * 2 - play a sound to jmfoucher | |
| − | + | * 3 - wait for DTMF "1" | |
| − | + | * 4 - once "1" is pressed, toto is called | |
| − | + | * 5 - when toto answers, toto and jmfoucher are bridged | |
| − | + | * 6 - after 3 seconds, toto and jmfoucher will be unbridged (the two new channels are independant) | |
| − | + | * 7 - two different sounds are played on the different channels | |
#!/usr/bin/python | #!/usr/bin/python | ||
| Line 15: | Line 15: | ||
from yaypm import TCPDispatcherFactory, AbandonedException | from yaypm import TCPDispatcherFactory, AbandonedException | ||
from yaypm.flow import go, getResult | from yaypm.flow import go, getResult | ||
| − | + | ||
from yaypm.utils import ConsoleFormatter | from yaypm.utils import ConsoleFormatter | ||
| − | + | ||
import logging, yaypm | import logging, yaypm | ||
| − | + | ||
logger = logging.getLogger("test3") | logger = logging.getLogger("test3") | ||
| − | + | ||
class myTest(object): | class myTest(object): | ||
| − | + | ||
def __init__(self, client): | def __init__(self, client): | ||
logger.debug(">>> myTest.__init__()") | logger.debug(">>> myTest.__init__()") | ||
| Line 83: | Line 83: | ||
"id": callid, | "id": callid, | ||
"source": "wave/play/../../sounds/wp_star_seller_ask.wav"}).enqueue() | "source": "wave/play/../../sounds/wp_star_seller_ask.wav"}).enqueue() | ||
| − | + | ||
logger.debug("le son est parti") | logger.debug("le son est parti") | ||
| − | + | ||
| − | + | ||
while True: | while True: | ||
| − | + | ||
logger.debug("dans le while True") | logger.debug("dans le while True") | ||
| Line 97: | Line 97: | ||
end) | end) | ||
dtmf = getResult() | dtmf = getResult() | ||
| − | + | ||
logger.debug("Dtmf dtmf["text"]) | logger.debug("Dtmf dtmf["text"]) | ||
| − | + | ||
dtmf.ret(True) | dtmf.ret(True) | ||
| − | + | ||
if dtmf["text"] == "1": | if dtmf["text"] == "1": | ||
if firsttime: | if firsttime: | ||
| Line 174: | Line 174: | ||
#yield yate.msg("call.drop", {"id": targetid}).dispatch() | #yield yate.msg("call.drop", {"id": targetid}).dispatch() | ||
#getResult() | #getResult() | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
except AbandonedException, e: | except AbandonedException, e: | ||
logger.debug("Call callid) | logger.debug("Call callid) | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
def start(host, port): | def start(host, port): | ||
logger.debug("dans start") | logger.debug("dans start") | ||
| Line 194: | Line 194: | ||
logger.debug("client started"); | logger.debug("client started"); | ||
myTest(client_yate) | myTest(client_yate) | ||
| − | + | ||
client_factory = TCPDispatcherFactory(start_client) | client_factory = TCPDispatcherFactory(start_client) | ||
| − | + | ||
reactor.connectTCP(local_addr, local_port, client_factory) | reactor.connectTCP(local_addr, local_port, client_factory) | ||
| − | + | ||
if __name__ == _main_: | if __name__ == _main_: | ||
| Line 204: | Line 204: | ||
formatter = ConsoleFormatter('%(name)s %(levelname)s %(message)s') | formatter = ConsoleFormatter('%(name)s %(levelname)s %(message)s') | ||
hdlr.setFormatter(formatter) | hdlr.setFormatter(formatter) | ||
| − | + | ||
yaypm.logger.addHandler(hdlr) | yaypm.logger.addHandler(hdlr) | ||
yaypm.logger.setLevel(logging.DEBUG) | yaypm.logger.setLevel(logging.DEBUG) | ||
| Line 210: | Line 210: | ||
yaypm.logger_messages.setLevel(logging.DEBUG) | yaypm.logger_messages.setLevel(logging.DEBUG) | ||
yaypm.logger_messages.setLevel(logging.INFO) | yaypm.logger_messages.setLevel(logging.INFO) | ||
| − | + | ||
logger.setLevel(logging.DEBUG) | logger.setLevel(logging.DEBUG) | ||
logger.addHandler(hdlr) | logger.addHandler(hdlr) | ||
| − | + | ||
#f = TCPDispatcherFactory(start) | #f = TCPDispatcherFactory(start) | ||
#reactor.connectTCP("192.168.4.87", 5039, f) | #reactor.connectTCP("192.168.4.87", 5039, f) | ||
start("192.168.4.87", 5039) | start("192.168.4.87", 5039) | ||
reactor.run() | reactor.run() | ||
Revision as of 12:50, 1 November 2012
This script is given as an example, don't forget to change some information such as yate's extmodule binding ip address and port.
This script will:
- 1 - make a phone call to 'jmfoucher'
- 2 - play a sound to jmfoucher
- 3 - wait for DTMF "1"
- 4 - once "1" is pressed, toto is called
- 5 - when toto answers, toto and jmfoucher are bridged
- 6 - after 3 seconds, toto and jmfoucher will be unbridged (the two new channels are independant)
- 7 - two different sounds are played on the different channels
#!/usr/bin/python
from twisted.internet import reactor, defer
from yaypm import TCPDispatcherFactory, AbandonedException
from yaypm.flow import go, getResult
from yaypm.utils import ConsoleFormatter
import logging, yaypm
logger = logging.getLogger("test3")
class myTest(object):
def __init__(self, client):
logger.debug(">>> myTest.__init__()")
self.client = client
self.run()
def run(self):
logger.debug(">>> myTest.run()")
go(self.test())
def test(self):
logger.debug(">>> myTest.test()")
firsttime = True
yield self.client.installMsgHandler("call.route", prio = 50)
getResult()
yield self.client.installWatchHandler("call.answered")
getResult()
yield self.client.installWatchHandler("chan.hangup")
getResult()
execute = self.client.msg("call.execute",
{"callto": "dumb/",
"caller": "appelant",
"target": "jmfoucher",
"sip_prout": "value",
"osip_toto": "tata"
})
yield execute.dispatch()
if not getResult():
logger.warn("can't create monitor connection on jmfoucher")
monitor = None
else:
logger.debug("can monitor jmfoucher")
try:
end = self.client.onwatch(
"chan.hangup",
lambda m, callid = execute["id"] : m["id"] == callid)
yield self.client.onwatch(
"call.answered",
lambda m : m["id"] == execute["targetid"],
until = end)
getResult()
logger.debug("Monitor connection answered.")
dumbid = execute["id"]
monitorid = execute["targetid"]
callid = execute["id"]
logger.debug("callid = s" % (callid, monitorid))
logger.debug("on joue le son")
self.client.msg("chan.masquerade",
{"message" : "chan.attach",
#"id": monitorid,
"id": callid,
"source": "wave/play/../../sounds/wp_star_seller_ask.wav"}).enqueue()
logger.debug("le son est parti")
while True:
logger.debug("dans le while True")
yield self.client.onmsg(
"chan.dtmf",
#lambda m : m["id"] == callid,
lambda m : m["id"] == monitorid,
end)
dtmf = getResult()
logger.debug("Dtmf dtmf["text"])
dtmf.ret(True)
if dtmf["text"] == "1":
if firsttime:
firsttime = False
self.client.msg("chan.masquerade",
{"message" : "chan.attach",
"id": callid,
"source": "wave/play/../../sounds/wp_star_seller_wait.wav"}).enqueue()
execute = self.client.msg("call.execute",
{"callto": "dumb/",
"caller": "jmfoucher",
"target": 'toto'})
yield execute.dispatch()
if not getResult():
logger.debug("FAILURE")
else:
logger.debug("SUCCESS")
callid2 = execute["id"]
targetid2 = execute["targetid"]
logger.debug("callid=s" % (callid, monitorid))
logger.debug("callid2=s" % (callid2, targetid2))
end = self.client.onmsg("chan.hangup",
lambda m, callid = targetid2 : m["id"] == callid, autoreturn = True)
yield self.client.onwatch("call.answered",
lambda m : m["targetid"] == callid2, until = end)
answered = getResult()
logger.debug("answered= answered)
logger.debug("on appelle self.conf")
logger.debug("callid = s" % (callid, callid2))
connect = self.client.msg(
"chan.connect",
{"id": monitorid,
"targetid": targetid2})
yield connect.dispatch()
if getResult():
logger.debug("connect SUCCESS")
else:
logger.debug("connect FAILURE")
def sound():
go(sound2())
def sound2():
logger.debug("dans sound")
transfer = self.client.msg("chan.masquerade",
{"message": "call.transfer",
"id": monitorid,
"to": "wave/play/../../sounds/accueil_court.wav",
"peerto": "wave/play/../../sounds/wp_star_seller_wait.wav"
})
yield transfer.dispatch()
if not getResult():
logger.debug("transfer failure")
else:
logger.debug("transfer success")
reactor.callLater(3, sound)
#yield yate.msg("call.drop", {"id": targetid}).dispatch()
#getResult()
except AbandonedException, e:
logger.debug("Call callid)
def start(host, port):
logger.debug("dans start")
local_addr = remote_addr = host
local_port = remote_port = port
#go(route(yate))
def start_client(client_yate):
logger.debug("client started");
myTest(client_yate)
client_factory = TCPDispatcherFactory(start_client)
reactor.connectTCP(local_addr, local_port, client_factory)
if __name__ == _main_:
hdlr = logging.StreamHandler()
formatter = ConsoleFormatter('%(name)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
yaypm.logger.addHandler(hdlr)
yaypm.logger.setLevel(logging.DEBUG)
#yaypm.flow.logger_flow.setLevel(logging.DEBUG)
yaypm.logger_messages.setLevel(logging.DEBUG)
yaypm.logger_messages.setLevel(logging.INFO)
logger.setLevel(logging.DEBUG)
logger.addHandler(hdlr)
#f = TCPDispatcherFactory(start)
#reactor.connectTCP("192.168.4.87", 5039, f)
start("192.168.4.87", 5039)
reactor.run()