pjsua2 аккаунт перезвонил не всегда звонил - PullRequest
0 голосов
/ 26 марта 2020

Я запускаю тест библиотеки pjsua (pjsip) для Python. Пример кода ниже.
Это особенное, потому что pjsip написан на C, а swig использовался для создания интерфейса.

Объект pj.Endpoint () важен, но на него нет ссылок другим кодом в Python. Тем не менее, разница в том, где я вызываю функцию _EndPoint,

. Если _EndPoint вызывается внутри pjsua2_test, то вызывается обратный вызов onRegState. Но если _EndPoint выполняется снаружи, то обратный вызов не вызывается.

В обоих случаях поток SIP выглядит правильным, хотя и не идентичным. Если _EndPoint вызывается внутри pjsua2_test, некоторые сообщения в потоке повторяются, что является законным.

Это какая-то особенность Python, которую я пропустил? Это особенность глотка? или это стек pjsip?

import time
import pjsua2 as pj
from pjsua2 import Account

# Subclass to extend the Account and get notifications etc.
class myAccount(Account):
  def onRegState(self, prm):
      print ("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX***OnRegState: " + prm.reason)

def _EndPoint():
        # Create and initialize the library
        ep_cfg = pj.EpConfig()
        ep_cfg.uaConfig.threadCnt = 0
        ep = pj.Endpoint()
        ep.libCreate()
        ep.libInit(ep_cfg)

        # Create SIP transport. Error handling sample is shown
        sipTpConfig = pj.TransportConfig();
        sipTpConfig.port = 5060;
        ep.transportCreate(pj.PJSIP_TRANSPORT_UDP, sipTpConfig);
        # Start the library
        ep.libStart();
        return ep

e = _EndPoint() # outside pjsua2_test
def pjsua2_test():
  e = _EndPoint() # inside pjsua2_test
  acfg = pj.AccountConfig();
  acfg.idUri = "sip:test@pjsip.org";
  acfg.regConfig.registrarUri = "sip:pjsip.org";
  acfg.idUri = "sip:u1@192.168.2.9:5069";
  acfg.regConfig.registrarUri = "sip:192.168.2.9:5069";
  cred = pj.AuthCredInfo("digest", "*", "test", 0, "pwtest");
  acfg.sipConfig.authCreds.append( cred );
  # Create the account
  acc = myAccount();
  acc.create(acfg);
  # Here we don't have anything else to do..
  time.sleep(10);

if __name__ == "__main__":
  pjsua2_test()

РЕДАКТИРОВАТЬ:

Я нашел решение, запустив pjsua2_test в потоке и нажав на очередь для получения инструкций. Очевидно, я нахожу это решение громоздким.

...