3

環境は次のとおりです。ネットワークには、PC と Cisco VoIP 電話の両方があります。ネットワーク上には VoIP 電話を発信できる電話交換機がありますが、この交換機はプロジェクトのこの部分には関係ないと思います。

VoIP をソフトウェアに組み込むのはこれが初めてなので、PC から VoIP 電話に電話をかけることから始めようとしています。PC から電話の IP アドレスに ping を送信して応答が返ってくるので、通信できるはずです。

これまでのところ、電話が鳴り始めることを望んでいました。Java で mjsip を使用していますが、「Request Timeout」という理由で呼び出しに失敗したというメッセージが表示され、呼び出し音が鳴りません。電話に出た後に何が起こるかについては、まだコードを作成していませんが、少なくとも最初は鳴るようにしたいと考えています。

VoIP の経験が豊富な人が、私がこれを不適切に行っていることを検証または除外してくれるか、あるいはさらに多くの落とし穴を明らかにしてくれることを願っています。たとえば、電話が VoIP 電話であるという理由だけで、電話が sip 呼び出しに応答することを期待できますか? 同じネットワーク上の VoIP 電話ですが、電話交換機を経由する必要がありますか? それは私のコードの問題ですか?

コードは、私が適切に行ったと仮定すると、sip スタックを開始し、ユーザー プロファイルを設定し、電話の IP とポート 5060 に対応する sip アドレスに電話をかけようとします (Google によると、sip ポートは多くの場合 5060 です)。

public class SIPTest implements UserAgentListener, SipProviderListener
{
    public static void main(String[] args)
    {
        if(!SipStack.isInit())
            SipStack.init();

        SipProvider sipProvider = new SipProvider("127.0.0.1", 5060);
        UserAgentProfile profile = new UserAgentProfile();
        profile.audio = true;
        profile.hangup_time = 10;
        profile.user = "testuser";
        profile.keepalive_time = 8000;

        final UserAgent userAgent = new UserAgent(sipProvider, profile, new     SIPTest());

        sipProvider.addPromiscuousListener(new SIPTest());
        userAgent.call(new NameAddress(new SipURL("172.16.1.250", 5060)));
        System.out.println("end ...");
    }


    /**
     * begin SipProviderListener
     **/

    public void onReceivedMessage(SipProvider sip_provider,
                    Message message)
    {
        if (message.isInfo())
        {
            System.out.println("Promisque onReceivedMessage ... message " + message.getMethodId().toString() + "\n body = " + message.getBody());
        }
    }

    /**
     * end SipProviderListener
     **/


    /**
     * begin UserAgentListener
     **/

    public void onUaCallAccepted(UserAgent arg0)
    {
        System.out.println("onUaCallAccepted ...");
    }

    public void onUaCallCancelled(UserAgent arg0)
    {
        System.out.println("onUaCallCancelled ...");
    }

    public void onUaCallClosed(UserAgent arg0)
    {
        System.out.println("onUaCallClosed ...");
    }

    public void onUaCallFailed(UserAgent arg0, String reason)
    {
        System.out.println("onUaCallFailed ...");
        System.out.println("\t" + arg0);
        System.out.println("\t" + reason);
    }

    public void onUaCallIncoming(UserAgent arg0,
                            NameAddress arg1, NameAddress arg2)
    {
        System.out.println("onUaCallIncoming ...");
        System.out.println("from " + arg2.toString());
        System.out.println("to " + arg1.toString());

        arg0.accept();
        System.out.println("Call accepted ...");
    }

    public void onUaCallProgress(UserAgent ua)
    {
        System.out.println("onUaCallProgress ...");
    }

    public void onUaCallRinging(UserAgent arg0)
    {
        System.out.println("onUaCallRinging ...");
    }

    public void onUaCallTransferred(UserAgent arg0)
    {
        System.out.println("onUaCallTrasferred ...");
    }

    public void onUaIncomingCall(UserAgent ua, NameAddress callee, NameAddress caller, Vector media_descs)
    {
        System.out.println("onUaIncomingCall ...");
    }

    public void onUaMediaSessionStarted(UserAgent ua, String type, String codec)
    {
        System.out.println("onUaMediaSessionStopped ...");
    }

    public void onUaMediaSessionStopped(UserAgent ua, String type)
    {
        System.out.println("onUaMediaSessionStopped ...");
    }

    public void onUaRegistrationFailed(UserAgent ua, String result)
    {
        System.out.println("onUaRegistrationFailed ...");
    }

    public void onUaRegistrationSucceeded(UserAgent ua, String result)
    {
        System.out.println("onUaRegistrationSucceeded ...");
    }

    /**
     * end UserAgent
     **/
}

それを実行すると、次のような出力が得られます。

ExtendedAudioSystem: Supported: PCM_SIGNED PCM_UNSIGNED ALAW ULAW PCM_SIGNED PCM
_UNSIGNED PCM_FLOAT
ExtendedAudioSystem: TargetDataLine: PCM_SIGNED 8000.0 Hz, 16 bit, mono, 2 bytes
/frame, little-endian
ExtendedAudioSystem: Supported: PCM_SIGNED PCM_UNSIGNED ALAW ULAW PCM_SIGNED PCM
_UNSIGNED PCM_FLOAT
ExtendedAudioSystem: SourceDataLine: PCM_SIGNED 8000.0 Hz, 16 bit, mono, 2 bytes
/frame, little-endian
end ...
onUaCallFailed ...
        local.ua.UserAgent@283bbb6
        Request Timeout
4

1 に答える 1

1

私の意見では、基礎となる SIP INVITE メッセージ (userAgent.call に対応) は sip スタックによって送信されたと見なされますが、応答は受信されません。したがって、この (408) "Request Timeout" メッセージが表示されます。408 リクエスト タイムアウトは、リモート パーティ (またはプロキシ) から応答が受信されない場合に、sip スタックによって自動的に生成される SIP 応答です。奇妙な理由で、ファイアウォールが発信要求をブロックし、パケットの送信中に問題が発生したことを Java に通知しないことがあります。したがって、例外はスローされず、アプリケーション (ここでは sip スタック) はパケットを再送信することも、ユーザーにネットワークの問題を通知することもできません。

同じホストから別の sip クライアントを使用して sip:172.16.1.250 を呼び出すことができることを確認しましたか? sippを使用してすばやくテストできます (オプション -m 1 を使用して、1 つの呼び出しのみを開始します)。別の sip クライアントを使用して電話をかけることができる場合、ファイアウォールの問題はありません。

于 2013-11-27T14:45:31.733 に答える