PJSUA2 python swig 模块

问题描述 投票:0回答:1

我正在尝试编写一个简单的 SIP 代理来使用 PJSUA2 python swig 模块接收呼叫,但看不到这个 swig 模块是如何工作的。我有以下代码

import pjsua2 as pj
import time


class Endpoint(pj.Endpoint):
    """
    This is high level Python object inherited from pj.Endpoint
    """
    instance = None

    def __init__(self):
        pj.Endpoint.__init__(self)
        Endpoint.instance = self


def validateUri(uri):
    return Endpoint.instance.utilVerifyUri(uri) == pj.PJ_SUCCESS


def validateSipUri(uri):
    return Endpoint.instance.utilVerifySipUri(uri) == pj.PJ_SUCCESS


# Call class
class Call(pj.Call):
    """
    High level Python Call object, derived from pjsua2's Call object.
    """
    def __init__(self, acc, peer_uri='', call_id=pj.PJSUA_INVALID_ID):
        pj.Call.__init__(self, acc, call_id)
        self.acc = acc
        self.peerUri = peer_uri
        self.connected = False
        self.onhold = False

    def onCallState(self, prm):
        ci = self.getInfo()
        self.connected = ci.state == pj.PJSIP_INV_STATE_CONFIRMED

    def onCallMediaState(self, prm):
        ci = self.getInfo()
        for mi in ci.media:
            if mi.type == pj.PJMEDIA_TYPE_AUDIO and \
              (mi.status == pj.PJSUA_CALL_MEDIA_ACTIVE or
               mi.status == pj.PJSUA_CALL_MEDIA_REMOTE_HOLD):
                m = self.getMedia(mi.index)
                am = pj.AudioMedia.typecastFromMedia(m)
                # connect ports
                Endpoint.instance.audDevManager().getCaptureDevMedia().startTransmit(am)
                am.startTransmit(Endpoint.instance.audDevManager().getPlaybackDevMedia())

                if mi.status == pj.PJSUA_CALL_MEDIA_REMOTE_HOLD and not self.onhold:
                    print("'%s' sets call onhold" % self.peerUri)
                    self.onhold = True
                elif mi.status == pj.PJSUA_CALL_MEDIA_ACTIVE and self.onhold:
                    print("'%s' sets call active" % self.peerUri)
                    self.onhold = False

    def onDtmfDigit(self, prm):
        # print("Got DTMF:" + prm.digit)
        pass

    def onCallMediaTransportState(self, prm):
        # print("Media transport state")
        pass


class Account(pj.Account):
    def onRegState(self, prm):
        print("***OnRegState: " + prm.reason)

    def onMwiInfo(self, prm):
        print("OnMwiState: " + prm.reason)

    def onBuddyState(self, prm):
        print("OnBuddyState: " + prm.reason)

    def onIncommingSubscribe(self, prm):
        print("OnSubscribeState: " + prm.reason)

    def OnIncomingCall(self, prm):
        c = Call(self, call_id=prm.callId)
        call_prm = pj.CallOpParam()
        call_prm.statusCode = 180
        c.answer(call_prm)
        ci = c.getInfo()
        if input(f"Accept call from {ci.remoteUri}?") == u'yes':
            call_prm.statusCode = 200
            c.answer(call_prm)
        else:
            c.hangup(call_prm)


def initalise_sip_stack():

    ep_cfg = pj.EpConfig()
    ep = Endpoint()
    ep.libCreate()
    ep.libInit(ep_cfg)

    sip_tp_config = pj.TransportConfig()
    sip_tp_config.port = 5060
    ep.transportCreate(pj.PJSIP_TRANSPORT_UDP, sip_tp_config)
    ep.libStart()

    acfg = pj.AccountConfig()
    acfg.idUri = "sip:[email protected]"
    acfg.regConfig.registrarUri = "sip:172.20.1.8"
    creds = pj.AuthCredInfo("digest", "*", "056004", 0, "somepass")
    acfg.sipConfig.authCreds.append(creds)

    acc = Account()
    acc.create(acfg)

    return ep


if __name__ == "__main__":

    endpoint = initalise_sip_stack()

    time.sleep(600)

    endpoint.libDestroy()

这个小客户端能够在我的星号服务器中注册,如您所见

raspberrypi*CLI> pjsip show contacts

  Contact:  <Aor/ContactUri..............................> <Hash....> <Status> <RTT(ms)..>
==========================================================================================

  Contact:  056003/sip:[email protected]:5060             058bca1427 Avail        41.057
  Contact:  056004/sip:[email protected]:5060;ob           e8ff0c4e2b Avail         2.358

Objects found: 2

但是,当我从

056003
联系人拨打电话时,我可以从 pjsua2 看到以下跟踪:

16:52:37.918           pjsua_core.c  .RX 947 bytes Request msg INVITE/cseq=23923 (rdata0x7f5f6c001c48) from UDP 172.20.1.8:5060:
INVITE sip:[email protected]:5060;ob SIP/2.0
Via: SIP/2.0/UDP 0.0.0.0:5060;rport;branch=z9hG4bKPjada6202d-813b-499c-9b5c-2ad5abf6706e
From: "MI 3" <sip:[email protected]>;tag=91efaf53-e6fb-45dc-b2d4-ddc99a6c3c36
To: <sip:[email protected];ob>
Contact: <sip:[email protected]:5060>
Call-ID: 1bf35bec-1a88-468e-bd17-dfa99086c457
CSeq: 23923 INVITE
Allow: OPTIONS, REGISTER, SUBSCRIBE, NOTIFY, PUBLISH, INVITE, ACK, BYE, CANCEL, UPDATE, PRACK, MESSAGE, REFER
Supported: 100rel, timer, replaces, norefersub, histinfo
Session-Expires: 1800
Min-SE: 90
P-Asserted-Identity: "MI 3" <sip:[email protected]>
Max-Forwards: 70
User-Agent: FPBX-15.0.23(16.16.1)
Content-Type: application/sdp
Content-Length:   231

v=0
o=- 519853527 519853527 IN IP4 172.20.1.8
s=Asterisk
c=IN IP4 172.20.1.8
t=0 0
m=audio 14490 RTP/AVP 9 101
a=rtpmap:9 G722/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=ptime:20
a=maxptime:150
a=sendrecv

--end msg--
16:52:37.918           pjsua_call.c  .Incoming Request msg INVITE/cseq=23923 (rdata0x7f5f6c001c48)
16:52:37.919            pjsua_acc.c  ..No available account to handle Request msg INVITE/cseq=23923 (rdata0x7f5f6c001c48)
16:52:37.919           pjsua_core.c  ..TX 402 bytes Response msg 480/INVITE/cseq=23923 (tdta0x7f5f6c006b78) to UDP 172.20.1.8:5060:
SIP/2.0 480 Temporarily Unavailable
Via: SIP/2.0/UDP 0.0.0.0:5060;rport=5060;received=172.20.1.8;branch=z9hG4bKPjada6202d-813b-499c-9b5c-2ad5abf6706e
Call-ID: 1bf35bec-1a88-468e-bd17-dfa99086c457
From: "MI 3" <sip:[email protected]>;tag=91efaf53-e6fb-45dc-b2d4-ddc99a6c3c36
To: <sip:[email protected];ob>;tag=z9hG4bKPjada6202d-813b-499c-9b5c-2ad5abf6706e
CSeq: 23923 INVITE
Content-Length:  0


--end msg--
16:52:37.919           pjsua_call.c  ..Unable to accept incoming call (no available account)
16:52:37.921           pjsua_core.c  .RX 433 bytes Request msg ACK/cseq=23923 (rdata0x7f5f6c001c48) from UDP 172.20.1.8:5060:
ACK sip:[email protected]:5060;ob SIP/2.0
Via: SIP/2.0/UDP 0.0.0.0:5060;rport;branch=z9hG4bKPjada6202d-813b-499c-9b5c-2ad5abf6706e
From: "MI 3" <sip:[email protected]>;tag=91efaf53-e6fb-45dc-b2d4-ddc99a6c3c36
To: <sip:[email protected];ob>;tag=z9hG4bKPjada6202d-813b-499c-9b5c-2ad5abf6706e
Call-ID: 1bf35bec-1a88-468e-bd17-dfa99086c457
CSeq: 23923 ACK
Max-Forwards: 70
User-Agent: FPBX-15.0.23(16.16.1)
Content-Length:  0


--end msg--
16:52:41.382           pjsua_core.c  .RX 419 bytes Request msg OPTIONS/cseq=9130 (rdata0x7f5f6c001c48) from UDP 172.20.1.8:5060:
OPTIONS sip:[email protected]:5060;ob SIP/2.0
Via: SIP/2.0/UDP 0.0.0.0:5060;rport;branch=z9hG4bKPj54cf9751-5357-4887-91d3-b8d97ea6d2f4
From: <sip:[email protected]>;tag=9a799201-1424-418d-b5c4-44997fc40829
To: <sip:[email protected];ob>
Contact: <sip:[email protected]:5060>
Call-ID: 84c421ff-ae98-475f-b11e-ac7cd27caa66
CSeq: 9130 OPTIONS
Max-Forwards: 70
User-Agent: FPBX-15.0.23(16.16.1)
Content-Length:  0


--end msg--
16:52:41.382           pjsua_core.c  .TX 760 bytes Response msg 200/OPTIONS/cseq=9130 (tdta0x7f5f6c003c18) to UDP 172.20.1.8:5060:
SIP/2.0 200 OK
Via: SIP/2.0/UDP 0.0.0.0:5060;rport=5060;received=172.20.1.8;branch=z9hG4bKPj54cf9751-5357-4887-91d3-b8d97ea6d2f4
Call-ID: 84c421ff-ae98-475f-b11e-ac7cd27caa66
From: <sip:[email protected]>;tag=9a799201-1424-418d-b5c4-44997fc40829
To: <sip:[email protected];ob>;tag=z9hG4bKPj54cf9751-5357-4887-91d3-b8d97ea6d2f4
CSeq: 9130 OPTIONS
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
Accept: application/sdp, application/pidf+xml, application/xpidf+xml, application/simple-message-summary, message/sipfrag;version=2.0, application/im-iscomposing+xml, text/plain
Supported: replaces, 100rel, timer, norefersub, trickle-ice
Allow-Events: presence, message-summary, refer
Content-Length:  0


--end msg--

不知道为什么它说

pjsua_acc.c  ..No available account to handle Request msg INVITE/cseq=23923 (rdata0x7f5f6c001c48)

有什么想法吗?我的代码中哪一部分实现得不好?也许我应该将

initalise_sip_stack()
函数作为线程/进程处理?

非常感谢!

python asterisk sip pjsua2
1个回答
0
投票

您是否收到错误消息:

“endpoint.cpp pjsua_transport_create(type, &tcfg, &tid) 错误:地址已在使用中”?

类型 须藤 netstat -nlp|grep 5060 如果此端口被阻止,这可能是您在创建帐户时遇到的问题。

© www.soinside.com 2019 - 2024. All rights reserved.