[PJSIP / Python]: адрес уже используется - невозможно выполнить более 100 вызовов одновременно - PullRequest
0 голосов
/ 10 декабря 2018

У меня были проблемы, когда я пытался сделать более 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.

...