環境は次のとおりです。ネットワークには、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