yêu cầu REGISTER được sử dụng để cập nhật vị trí hiện tại của người dùng trên server đăng ký. Ứng dụng này sẽ gửi một tin nhắn REGISTER thông báo cho máy chủ vị trí hiện tại của nó mà lần lượt được lưu trữ trong máy chủ vị trí. Khi người gọi gọi cho người dùng, máy chủ proxy sử dụng thông tin này để tìm vị trí của callee.
Yêu cầu đăng ký phải được khách hàng gửi định kỳ. Giá trị của yêu cầu REGISTER được xác định bởi tiêu đề Hết hạn.
luồng

Mẫu Yêu cầu
REGISTER sip:sip.linphone.org SIP/2.0
Call-ID: [email protected]
CSeq: 1 REGISTER
From: <sip:[email protected]>;tag=-1427592833
To: <sip:[email protected]>
Max-Forwards: 70
Via: SIP/2.0/TCP 223.1.1.128:5060;branch=z9hG4bK-323532-2a454f4ec2a4213f6d6928eba479521d
Contact: <sip:[email protected];transport=tcp>
Content-Length: 0
Bây giờ cho phép xem làm thế nào để xây dựng các yêu cầu trên bằng cách sử dụng NIST SIP Stack.
Bước đầu tiên là tạo lớp học triển khai SIPListener. Hãy thực hiện chắc chắn ngăn xếp SIP của bạn đang khởi chạy NIST JAIN SIP Stack.
Tạo tiêu đề Call-ID
CallIdHeader callIdHeader = this.sipProvider.getNewCallId();
Tạo tiêu đề CSeq
CSeqHeader cSeqHeader = this.headerFactory.createCSeqHeader (cseq, " REGISTER ");
Tạo từ tiêu đề
Địa chỉ fromAddress = addressFactory.createAddress ("sip:" + tên người dùng + '@' + máy chủ); FromHeader fromHeader = this.headerFactory.createFromHeader (fromAddress, String.valueOf (this.tag));
Tạo To
ToHeader toHeader = this.headerFactory.createToHeader (FROMADDRESS, null);
Tạo Max-Tiền đạo tiêu đề
MaxForwardsHeader maxForwardsHeader = this.headerFactory.createMaxForwardsHeader (70);
Tạo tiêu đề Via
ArrayList viaHeaders = new ArrayList(); ViaHeader viaHeader = this.headerFactory.createViaHeader (this.ip, this.port, "tcp", null); viaHeaders.add (viaHeader);
Tạo tiêu đề xúc
this.contactAddress = this.addressFactory.createAddress ("ngụm:" + this.username + '@' + this.ip + "vận chuyển = tcp");
// Tạo tiêu đề liên hệ được sử dụng cho tất cả các tin nhắn SIP. this.contactHeader = this.headerFactory.createContactHeader (contactAddress);
Khi tất cả các tiêu đề được tạo, đã đến lúc tạo yêu cầu .
request = this.messageFactory.createRequest("REGISTER sip:" + server + "SIP/2.0\r\n\r\n");
request.addHeader(callIdHeader);
request.addHeader(cSeqHeader);
request.addHeader(fromHeader);
request.addHeader(toHeader);
request.addHeader(maxForwardsHeader);
request.addHeader(viaHeader);
request.addHeader(contactHeader);
Bây giờ các đối tượng yêu cầu được tạo ra với tất cả các tiêu đề cần thiết đó là thời gian để gửi yêu cầu.
inviteTid = sipProvider.getNewClientTransaction(request); // send the request out.
inviteTid.sendRequest();
Khi yêu cầu được gửi thành công phản ứng sẽ được chuyển đến các ứng dụng sử dụng callback processResponse trong SIPListener.
public void processResponse(ResponseEvent responseEvent) {
int statusCode = responseEvent.getResponse().getStatusCode();
}
Mã
public void register(Response response) {
try {
cseq++;
ArrayList viaHeaders = new ArrayList();
ViaHeader viaHeader = this.headerFactory.createViaHeader(this.ip,
this.port, "tcp", null);
viaHeaders.add(viaHeader);
// The "Max-Forwards" header.
MaxForwardsHeader maxForwardsHeader = this.headerFactory
.createMaxForwardsHeader(70);
// The "Call-Id" header.
CallIdHeader callIdHeader = this.sipProvider.getNewCallId();
// The "CSeq" header.
CSeqHeader cSeqHeader = this.headerFactory.createCSeqHeader(cseq,
"REGISTER");
Address fromAddress = addressFactory.createAddress("sip:"
+ username + '@' + server);
FromHeader fromHeader = this.headerFactory.createFromHeader(
fromAddress, String.valueOf(this.tag));
// The "To" header.
ToHeader toHeader = this.headerFactory.createToHeader(fromAddress,
null);
// this.contactHeader = this.headerFactory
// .createContactHeader(contactAddress);
request = this.messageFactory.createRequest("REGISTER sip:"
+ server + " SIP/2.0\r\n\r\n");
request.addHeader(callIdHeader);
request.addHeader(cSeqHeader);
request.addHeader(fromHeader);
request.addHeader(toHeader);
request.addHeader(maxForwardsHeader);
request.addHeader(viaHeader);
request.addHeader(contactHeader);
if (response != null) {
retry = true;
AuthorizationHeader authHeader = Utils.makeAuthHeader(headerFactory, response,
request, username, password);
request.addHeader(authHeader);
}
inviteTid = sipProvider.getNewClientTransaction(request);
// send the request out.
inviteTid.sendRequest();
this.dialog = inviteTid.getDialog();
// Send the request statelessly through the SIP provider.
// this.sipProvider.sendRequest(request);
// Display the message in the text area.
logger.debug("Request sent:\n" + request.toString() + "\n\n");
} catch (Exception e) {
// If an error occurred, display the error.
e.printStackTrace();
logger.debug("Request sent failed: " + e.getMessage() + "\n");
}
}
Trong một yêu cầu SIP nếu máy chủ đáp ứng với 401 Proxy xác thực yêu cầu hoặc 401 trái phép sau đó nó có nghĩa là khách hàng có để phát lại cùng một yêu cầu một lần nữa với thử thách MD5.
Khách hàng nên sử dụng giá trị nonce từ tiêu đề phản hồi WWW-Authenticate.
WWW-Authenticate: Digest realm = "sip.linphone.org", nonce = "JbAO1QAAAAA3aDI0AADMobiT7toAAAAA", đục = "+ GNywA ==", thuật toán = MD5, QoP = "auth"
Các khách hàng nên sử dụng nonce để tạo ra các thách thức MD5 và thực hiện yêu cầu ban đầu lại với tiêu đề Authorization
bước để tạo MD5 Challenge
tạo băm MD5 đầu tiên sử dụng username +. “:” + vương + “:” + mật khẩu
Chuỗi a1 = tên người dùng + ":" + realm + ":" + mật khẩu; Chuỗi ha1 = toHexString (mdigest.digest (a1.getBytes()));
Tạo băm MD5 thứ hai sử dụng REQUEST_METHOD + “:” + REQUEST_URI
Chuỗi a2 = request_method.toUpperCase() + ":" + REQUEST_URI; Chuỗi ha2 = toHexString (mdigest.digest (a2.getBytes()));
Nếu qop trong tiêu đề phản hồi là “auth” thì giá trị băm MD5 cuối cùng được tính bằng bước 3a nếu nó không được xác định hoặc tham chiếu trống 3b.
3a. Tạo chuỗi MD5 thức sử dụng ha1 + “:” + nonce + “:” + nonceCount + “:” + cNonce + “:” + QoP + “:” + HA2
String finalStr = ha1 + ":" + nonce + ":" + nonceCount + ":" + cNonce + ":" + qop + ":" + ha2;
String response = toHexString(mdigest.digest(finalStr.getBytes()));
3b. Tạo chuỗi thức MD5 sử dụng ha1 + “:” + nonce + “:” + HA2
String finalStr = ha1 + ":" + nonce + ":" + ha2;
String response = toHexString(mdigest.digest(finalStr.getBytes()));
Khi tôi cố gắng sử dụng mã từ bài này, tôi nhận NPE dòng: 'ViaHeader viaHeader = this.headerFactory.createViaHeader (this.ip, this.port, "tcp", null); ' – skywalker
@ johndaw16 là headerFactory của bạn null? Bạn phải tạo nó. Ví dụ: SipFactory sipFactory = SipFactory.getInstance(); sipFactory.setPathName ("gov.nist"); headerFactory = sipFactory.createHeaderFactory(); – 11101101b
'ViaHeader viaHeader = this.headerFactory.createViaHeader (this.ip, this.port," tcp ", null)' Tham số cuối cùng phải là chuỗi branchID. Hãy thử nó theo cách đó. – Bobzone