我正在尝试使用JAIN-SIP对SIP服务器进行身份验证。我使用以下代码:
public class CoreEngine implements javax.sip.SipListener {
//public localip=Inet4Address.getLocalHost().getHostAddress();
SipFactory sipFactory = null;
SipStack sipStack = null;
Properties properties;
HeaderFactory headerFactory;
AddressFactory addressFactory;
MessageFactory messageFactory;
SipProvider sipProvider;
ListeningPoint lp;
ContactHeader contactHeader;
ClientTransaction inviteTid;
public void init() throws Exception {
sipFactory = SipFactory.getInstance();
sipFactory.setPathName("gov.nist");
properties = new Properties();
properties.setProperty("javax.sip.STACK_NAME", "Sip_Test");
// Create SipStack object
sipStack = sipFactory.createSipStack(properties);
headerFactory = sipFactory.createHeaderFactory();
addressFactory = sipFactory.createAddressFactory();
messageFactory = sipFactory.createMessageFactory();
lp = sipStack.createListeningPoint("192.168.0.205", 5060, ListeningPoint.UDP);
sipProvider = sipStack.createSipProvider(lp);
}
public void register() throws Exception {
String fromName = "223344";
String fromSipAddress = "173.194.117.84";
String toSipAddress = "173.194.117.84";
String toUser = "223344";
SipURI fromAddress = addressFactory.createSipURI(fromName, fromSipAddress);
System.out.println("sipuri fromaddress"+fromAddress);
Address fromNameAddress = addressFactory.createAddress(fromAddress);
FromHeader fromHeader = headerFactory.createFromHeader(fromNameAddress, null);
SipURI toAddress = addressFactory.createSipURI(toUser, toSipAddress);
Address toNameAddress = addressFactory.createAddress(toAddress);
ToHeader toHeader = headerFactory.createToHeader(toNameAddress, null);
URI requestURI = addressFactory.createURI("sip:" + "173.194.117.84");
List<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
String ipAddress = lp.getIPAddress();
ViaHeader viaHeader = headerFactory.createViaHeader(ipAddress,
lp.getPort(), lp.getTransport(), null);
viaHeaders.add(viaHeader);
CallIdHeader callIdHeader = sipProvider.getNewCallId();
CSeqHeader cSeqHeader = headerFactory.createCSeqHeader(1L, Request.REGISTER);
MaxForwardsHeader maxForwards = headerFactory.createMaxForwardsHeader(70);
Request request = messageFactory.createRequest(requestURI,
Request.REGISTER, callIdHeader, cSeqHeader, fromHeader,
toHeader, viaHeaders, maxForwards);
SipURI contactURI = addressFactory.createSipURI(fromName, "173.194.117.84");
contactURI.setPort(sipProvider.getListeningPoint(lp.getTransport()).getPort());
Address contactAddress = addressFactory.createAddress(contactURI);
contactHeader = headerFactory.createContactHeader(contactAddress);
request.addHeader(contactHeader);
Header extensionHeader = headerFactory.createHeader("Expires", "120");
request.addHeader(extensionHeader);
System.out.println("request is"+ request);
inviteTid = sipProvider.getNewClientTransaction(request);
inviteTid.sendRequest();
}
public void processRequest(RequestEvent requestEvent) {
}
public void processResponse(ResponseEvent responseEvent) {
System.out.println("Response received");
System.out.println("response event"+ responseEvent.getResponse().getStatusCode());
/*call function to calculate MD5 challege and to recreate the challenge request here */
}
public void processTimeout(TimeoutEvent timeoutEvent) {
}
public void processIOException(IOExceptionEvent exceptionEvent) {
}
public void processTransactionTerminated(TransactionTerminatedEvent transactionTerminatedEvent) {
}
public void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) {
}
}
现在我发送了请求,然后使用processResponse(ResponseEvent responseEvent)
进行回复。我还有一个类来计算MD5挑战并重新创建请求数据包,包括我在processResponse()
函数内调用的授权标题。
如何将此质询请求再次发送到服务器?即使我发送了它,我如何处理回复,因为已经使用了processResponse()
回调?