У меня были проблемы, когда я пытался сделать более 100 звонков на Asterisk через PJSIP.Я создаю агентов (1000 - 1100), и я попытался в одном из них сделать простой вызов MusicOnHold из Asterisk.
Я уже пробовал зарегистрироваться с именем пользователя / паролем и без имени пользователя / пароля.Результат тот же:
Объект: {Sip аккаунта: 1091@192.168.0.56}, операция = make_call (), ошибка = адрес уже используется
Вот код:
def loadSip(self, agent):
try:
self.lib = pj.Lib()
self.lib.init(log_cfg = pj.LogConfig(level=3, callback=self.log_cb))
self.lib.set_null_snd_dev()
transport = self.lib.create_transport(pj.TransportType.UDP, pj.TransportConfig(0))
self.lib.start()
# acc = self.lib.create_account_for_transport(transport)
acc_cb = FlowAccountCallback(str(agent), None)
acc_cfg = pj.AccountConfig()
acc_cfg.id = "sip:" + str(agent) + "@" + '192.168.0.56'
acc_cfg.reg_uri = "sip:" + '192.168.0.56'
acc_cfg.auth_cred = [ pj.AuthCred("*", str(agent), 'XXXXXX')]
acc = self.lib.create_account(acc_cfg, cb=acc_cb)
return acc
except pj.Error as e:
Discador.log.loggarError(sys.exc_info())
# self.lib.destroy()
# self.lib = None
sys.exit()
def dial(self, sip, agent, fila=None, id_cd=None, id_campanha=None, cod_cnl=None, nomeCampanha=None, op=None, nomeCliente=None, doc=None):
try:
acc = self.loadSip(agent)
call = acc.make_call("sip:" + sip, MyCallBack(lib=self.lib, acc=acc, fila=fila, id_cd=id_cd), hdr_list=self.fillHeader(id_campanha, id_cd, cod_cnl, nomeCampanha, op, nomeCliente, doc))
while call.is_valid():
time.sleep(0.5)
self.lib.destroy()
self.lib = None
except pj.Error as e:
Discador.log.loggarError(sys.exc_info())
self.lib.destroy()
self.lib = None
sys.exit()
ramalAgent = sys.argv[2]
Dialer().dial('9999@192.168.0.56', ramalAgent)
Метод "dial" вызывается внутри a более 101 раза.
Кто-нибудь может помочь мне изменить это ограничение?
Редактировать: Другая часть кода
Код, который вызывает метод набора номера:
for i in range(1000, 1101):
try:
print(i)
p = subprocess.Popen(["python", "Dialer.py", str(i) + "@" + "192.168.0.56", str(i)], stdout=subprocess.PIPE,)
except Exception as e:
print(e)
Код обратного вызова:
class MyCallBack(pj.CallCallback):
def on_transfer_status(self, code, reason, final, cont):
if code == 200:
print("OK_200")
self.call.hangup()
def bridge(self, call, pj):
call_slot = call.info().conf_slot
pj.Lib.instance().conf_connect(call_slot, 0)
pj.Lib.instance().conf_connect(0, call_slot)
def __init__(self, lib, acc, fila, id_cd, call=None, sip=None):
pj.CallCallback.__init__(self, call)
self.sip = sip
self.acc = acc
self.lib = lib
self.fila = fila
self.id_cd = id_cd
def on_state(self):
if self.call.info().state == pj.CallState.DISCONNECTED:
self.call.code = self.call.info().last_code
print("ERROR" + str(self.call.info().last_code))
def on_media_state(self):
if self.call.info().media_state == pj.MediaState.ACTIVE and self.call.info().state_text == "CONFIRMED":
# self.bridge(self.call, pj) # Se eu completar uma chamada eu atendo!
self.playAlo()
def on_dtmf_digit(self, digits):
if self.call.dtmf:
self.call.dtmf_read.append(digits)
self.call.dtmf_count = self.call.dtmf_count + 1
def playAlo(self):
# player = pj.Lib.instance().create_player("alo.wav", loop=False)
# self.lib.conf_connect(self.lib.player_get_slot(player), self.call.info().conf_slot)
# self.lib.conf_connect(self.call.info().conf_slot, self.lib.player_get_slot(player))
# while 1:
# time.sleep(0.5)
# if self.call.is_valid():
# audio = self.lib.conf_get_signal_level(self.call.info().conf_slot)
# if audio[0] == 0:
# break
# else:
# lib.player_destroy(player)
# return -1
# #TODO:passar id asterisk
self.transferir(str(self.id_cd) + "#" + str(self.fila))
def transferir(self, addr):
pass
# self.call.transfer("sip:" + "9999@192.168.0.56")
# self.call.transfer("sip:" + str(addr))
Примечание: агент "9999" является контекстом MusicOnHold в Asterisk.