2012-10-23 23 views
7

मैं जैन सिप लाइब्रेरी के साथ काम कर रहा हूं, जो तारांकन सर्वर से कनेक्शन बनाने की कोशिश कर रहा है। मैं इस पृष्ठ से टेक्स्टक्लिएंट उदाहरण ऐप के साथ काम कर रहा हूं: http://www.oracle.com/technetwork/articles/entarch/introduction-jain-sip-090386.htmlजैन-सिप प्रमाणीकरण

लेकिन यह वास्तव में सर्वर के साथ प्रमाणित नहीं है। मैं सर्वर पर उपयोगकर्ताओं को संदेश भेज सकता हूं, लेकिन मुझे आमतौर पर सर्वर पर उपयोगकर्ता/पासवर्ड प्रमाणीकरण की आवश्यकता होती है।

जहाँ तक मैं कह सकता हूं कि मुझे "javax.sip.OUTBOUND_PROXY" संपत्ति का उपयोग करना है, लेकिन मुझे उपयोगकर्ता नाम या पासवर्ड सेट करने के तरीके पर कोई दस्तावेज नहीं मिल रहा है। क्या किसी और के साथ कोई सफलता मिली है?

उत्तर

7

सबसे अच्छा उदाहरण के रूप में इस तरह के मैं पर पाया है के साथ बंद बेहतर हो सकता है की जरूरत है पंजीकरण here मिला है।

रजिस्टर अनुरोध रजिस्ट्रार सर्वर पर उपयोगकर्ता की वर्तमान स्थान को अद्यतन करने के लिए किया जाता है: यहाँ अगर सिर्फ मामले में कड़ी सूख जाता है-अप एक दिन का सार है। एप्लिकेशन एक रजिस्ट्रार संदेश सर्वर को अपने वर्तमान स्थान को सूचित करता है जो बदले में स्थान सर्वर में संग्रहीत होता है। जब कोई कॉलर उपयोगकर्ता को कॉल करता है तो प्रॉक्सी सर्वर कैली के स्थान को खोजने के लिए इस जानकारी का उपयोग करता है।

पंजीकरण अनुरोध समय-समय पर ग्राहक द्वारा भेजा जाना चाहिए। रजिस्ट्रार अनुरोध की वैधता समाप्ति शीर्षलेख द्वारा निर्धारित की जाती है।

फ्लो

image

नमूना अनुरोध

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 

अब देखते हैं कि कैसे NIST एसआईपी ढेर का उपयोग करके उपरोक्त अनुरोध का निर्माण करने की सुविधा देता है।

पहला कदम एसआईपी लिस्टनर लागू करने वाली कक्षा बनाने के लिए है। सुनिश्चित करें कि आपका एसआईपी स्टैक एनआईएसटी जेन एसआईपी स्टैक शुरू कर रहा है।

  1. कॉल-आईडी हैडर बनाएं

    CallIdHeader callIdHeader = this.sipProvider.getNewCallId();

  2. CSeq हैडर बनाएं

    CSeqHeader cSeqHeader = this.headerFactory.createCSeqHeader (cseq, " रजिस्टर ");

  3. हैडर

    पता FROMADDRESS = addressFactory से बनाएँ।createAddress ("sip:" + username + '@' + सर्वर); से हैडर से हैडर = this.headerFactory.createFromHeader (एड्रेस, स्ट्रिंग.वल्यूऑफ (this.tag));

  4. शीर्षक के

    ToHeader toHeader = this.headerFactory.createToHeader (FROMADDRESS, नल) बनाएं;

  5. अधिकतम फॉरवर्ड हैडर बनाएं

    MaxForwardsHeader maxForwardsHeader = this.headerFactory.createMaxForwardsHeader (70);

  6. एक के माध्यम से शीर्ष लेख

    ArrayList viaHeaders = नए ArrayList बनाएं(); ViaHeader viaHeader = this.headerFactory.createViaHeader (this.ip, this.port, "tcp", null); viaHeaders.add (throughHeader);

  7. संपर्क हैडर बनाएं

    this.contactAddress = this.addressFactory.createAddress ("घूंट:" + this.username + '@' + this.ip + "परिवहन = टीसीपी");

    // सभी एसआईपी संदेशों के लिए उपयोग किए गए संपर्क हेडर बनाएं। यह.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); 

अब जब कि अनुरोध वस्तु सभी आवश्यक हेडर साथ बनाई गई है यह अनुरोध भेजने के लिए समय है।

inviteTid = sipProvider.getNewClientTransaction(request); // send the request out. 
inviteTid.sendRequest(); 

एक बार अनुरोध सफलतापूर्वक भेज दी गई प्रतिक्रिया SIPListener में processResponse कॉलबैक का उपयोग कर आवेदन को दे दिया जाएगा।

public void processResponse(ResponseEvent responseEvent) { 
    int statusCode = responseEvent.getResponse().getStatusCode(); 
} 

कोड

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"); 
    } 
} 

तुम भी प्रमाणीकरण here पर संदर्भ पोस्ट देख सकते हैं। यहाँ अगर सिर्फ मामले में कड़ी सूख जाता है-अप एक दिन का सार है:

एक सिप अनुरोध के दौरान यदि सर्वर 401 प्रॉक्सी प्रमाणीकरण आवश्यक या 401 अनधिकृत के साथ प्रतिक्रिया तो इसका मतलब है ग्राहक पुनः चलाने के लिए है एमडी 5 चुनौती के साथ फिर से वही अनुरोध।

ग्राहक को प्रतिक्रिया शीर्षलेख WWW-प्रमाणीकरण से गैर मूल्य का उपयोग करना चाहिए।

डब्ल्यूडब्ल्यूडब्ल्यू-प्रमाणीकरण: डाइजेस्ट दायरे = "sip.linphone।ऑर्ग ", अस्थायी रूप से =" JbAO1QAAAAA3aDI0AADMobiT7toAAAAA ", अपारदर्शी =" + GNywA == ", एल्गोरिथ्म = MD5, QOP =" प्रमाणन "

ग्राहक अस्थायी रूप से उपयोग करने के MD5 चुनौती उत्पन्न करने के लिए करना चाहिए और मूल अनुरोध फिर से बनाने के प्राधिकरण हेडर के साथ

कदम MD5 चैलेंज

  1. पहले MD5 हैश उपयोगकर्ता नाम + बनाएं बनाने के लिए। ":" + दायरे + ":" + पासवर्ड

    स्ट्रिंग ए 1 = उपयोगकर्ता नाम + ":" + दायरे + ":" + पासवर्ड; स्ट्रिंग ha1 = toHexString (mdigest.digest (a1.getBytes())); ":"

  2. request_method + का उपयोग कर दूसरी MD5 हैश बनाएं REQUEST_URI

    स्ट्रिंग A2 = request_method.toUpperCase() + ":" + REQUEST_URI; स्ट्रिंग ha2 = toHexString (mdigest.digest (a2.getBytes()));

  3. यदि प्रतिक्रिया शीर्षलेख में qop "auth" है तो अंतिम MD5 हैश की गणना चरण 3 ए का उपयोग करके की जाती है यदि यह अपरिभाषित है या खाली 3b खाली संदर्भ है।

3 ए। ":" + अस्थायी रूप से + अंतिम MD5 स्ट्रिंग HA1 + का उपयोग कर बनाएँ ":" + nonceCount + ":" + cNonce + ":" + QOP + ":" + HA2

String finalStr = ha1 + ":" + nonce + ":" + nonceCount + ":" + cNonce + ":" + qop + ":" + ha2; 
String response = toHexString(mdigest.digest(finalStr.getBytes())); 

3 बी। ":" + अस्थायी रूप से + ":" अंतिम MD5 स्ट्रिंग HA1 + बनाएं + HA2

String finalStr = ha1 + ":" + nonce + ":" + ha2; 
String response = toHexString(mdigest.digest(finalStr.getBytes())); 
+0

मैं प्राप्त कर लेते हैं मैं इस पोस्ट से कोड का उपयोग करने की कोशिश एनपीई लाइन: 'ViaHeader viaHeader = this.headerFactory.createViaHeader (this.ip, this.port," टीसीपी ", नल),' – skywalker

+0

@ johndaw16 आपका हेडर फैक्ट्री नल है? आपको इसे बनाना होगा। उदाहरण के लिए: SipFactory sipFactory = SipFactory.getInstance(); sipFactory.setPathName ("gov.nist"); हेडरफैक्टरी = sipFactory.createHeaderFactory(); – 11101101b

+0

'ViaHeader viaHeader = this.headerFactory.createViaHeader (this.ip, this.port, "tcp", null)' अंतिम पैरामीटर branchID स्ट्रिंग होना चाहिए। इसे इस तरह से आजमाएं। – Bobzone

2

तुम भी ClientAuthenticationHelper वर्ग जो ऊपर के चरणों को समाहित पर एक नज़र लेने के लिए चाहते हो सकता है: पैकेज gov देखें .nist.javax.sip.clientauthutils

मुझे विश्वास है कि कोड बेस में उपयोग का एक उदाहरण है।