JAIN SIP #5 (SIP Register ตอนที่ 2 )


SIP Register ตอนที่ 2

เมื่อเราส่ง Register message ไปยัง server เรียบร้อยแล้ว server ก็จะตอบ 100 Trying และ 401 Unauthorized กลับมาให้ ซึ่งเราสามารถ ตรวจสอบได้จาก
 

  public void processResponse(ResponseEvent responseReceivedEvent) {
     System.out.println("Got a response");
     Response response = (Response) responseReceivedEvent.getResponse();
     ClientTransaction tid = responseReceivedEvent.getClientTransaction();
     CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME);
     System.out.println("Response received : Status Code = "
    + response.getStatusCode() + " [" +response.getReasonPhrase() + "] "+ cseq);
     if (tid == null) {
       System.out.println("Stray response -- dropping ");
       return;
     }

  try {
   if (response.getStatusCode() == Response.UNAUTHORIZED) {
         System.out.println(" ENTER UNAUTHORIZATION  ");
         URI uriReq = tid.getRequest().getRequestURI();
         Request authRegRequest = this.processResponseRegisterAuthorization(response, uriReq);
         System.out.println("Auth Register Request  = " +  authRegRequest );
         inviteTid = sipProvider.getNewClientTransaction(authRegRequest);
        inviteTid.sendRequest();
        System.out.println("REGISTER AUTHORIZATION sent:\n");    
        System.out.println("Test inviteTid state = " +  inviteTid.getState() );
  }
 
            System.out.println("Finish response process");
   } catch (Exception ex) {
   ex.printStackTrace();
            System.out.println("From process Response");
   System.exit(0);
  }

 }

ใน method process Response เราสามารถตรวจสอบ Response จาก server โดยการ getStatusCode มา ซึ่ง Response ก็มีได้หลายแบบ แต่เพื่อให้ตัวอย่างนี้สั้น และ เข้าใจง่าย ผมจึงแสดงเพียงแค่ Response.UNAUTHORIZED เท่านั้น หลังจากที่เราได้ UNAUTHORIZED มา เราก็ต้องไปสร้าง SIP Register message ใหม่ โดย  method processResponseRegisterAuthorization ข้างล่างนี้

 public Request processResponseRegisterAuthorization(Response response, URI uriReq) {
  
       Request requestauth = null;     

  try {         
            WWWAuthenticateHeader ss = (WWWAuthenticateHeader)response
                                    .getHeader(SIPHeaderNames.WWW_AUTHENTICATE );

            authHeader = headerFactory
                                .createAuthorizationHeader(ss.getScheme());

            authHeader.setUsername(USER_AUTH);
            authHeader.setRealm(realm);
            authHeader.setNonce(ss.getNonce());
            authHeader.setURI(uriReq);

   DigestClientAuthenticationMethod digest = new DigestClientAuthenticationMethod();

   callId = ((CallIdHeader) response
     .getHeader(CallIdHeader.NAME)).getCallId();

   requestauth = this.createRegister(callId,3600);

   digest.initialize(realm, USER_AUTH, uriReq.toString(), ss.getNonce(),
     PASS_AUTH, ((CSeqHeader) response
       .getHeader(CSeqHeader.NAME)).getMethod(), null,
     "MD5");
   System.out.println("Proxy Response antes de modificarlo : "
     + authHeader.getResponse());
   String respuestaM = digest.generateResponse();
   authHeader.setResponse(respuestaM);
            authHeader.setAlgorithm("MD5");

   requestauth.addHeader(authHeader);

  }

 catch (ParseException pa) {
    System.out.println(pa.getMessage());
    pa.printStackTrace();
  }

 catch (Exception ex) {
    System.out.println(ex.getMessage());
    ex.printStackTrace();
  }

    return requestauth;

 }

เราก็ get ค่า SIP header ต่าง ๆ จาก response object และก็สร้าง SIP Register message ใหม่โดยการเรียกใช้  this.createRegister(callId,3600);  คราวนี้จะเห็นได้กว่า เราส่ง callId ไปด้วย (ที่ติดค้างจากตอนที่ 1)  callId นี้เป็น callId ที่เราสร้างไว้ใน SIP Register message ครั้งแรก พอส่งไปสร้าง SIP Register message ใหม่ เราก็ไม่จำเป็นต้องสร้าง callId ใหม่แล้ว ใช้ callId ตัวเดิมได้เลย

เมื่อได้ SIP header ต่าง ๆ เกือบครบแล้ว จากนั้นก็นำไปคำนวน message digest ซึ่งมีตัวอย่างวิธีการคำนวนอยู่ใน class DigestClientAuthenticationMethod และ DigestServerAuthenticationMethod ซึ่งผมจะไม่ขอกล่าวถึง

จากนั้นเมื่อเราสร้าง SIP Register header ที่มี authentication header ใหม่เสร็จเรียบร้อยแล้ว เราก็ส่ง request ไปเหมือนเดิม โดย

         inviteTid = sipProvider.getNewClientTransaction(authRegRequest);
        inviteTid.sendRequest();

 เราสามารถตรวจสอบจาก Asterisk server ได้ด้วยนะครับ ว่า ผลการ register เป็นอย่างไรบ้าง โดยใช้คำสั่ง

 *CLI> sip show peers

ถ้าไม่มีอะไรผิดพลาด ตรง status มันจะต้องแสดง OK  เท่านี้ก็เป็นการเสร็จสิ้นขั้นตอนการ Register กับ Asterisk SIP Server ครับ 

คำสำคัญ (Tags): #jain-sip#sip register
หมายเลขบันทึก: 288842เขียนเมื่อ 18 สิงหาคม 2009 19:06 น. ()แก้ไขเมื่อ 12 กุมภาพันธ์ 2012 08:50 น. ()สัญญาอนุญาต: ครีเอทีฟคอมมอนส์แบบ แสดงที่มา-ไม่ใช้เพื่อการค้า-อนุญาตแบบเดียวกันจำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (0)

ไม่มีความเห็น

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท