เมื่อเราส่ง Register message ไปยัง server เรียบร้อยแล้ว server ก็จะตอบ 100 Trying และ 401 Unauthorized กลับมาให้ ซึ่งเราสามารถ ตรวจสอบได้จาก
public void processResponse(ResponseEvent responseReceivedEvent) { try { } |
ใน method process Response เราสามารถตรวจสอบ Response จาก server โดยการ getStatusCode มา ซึ่ง Response ก็มีได้หลายแบบ แต่เพื่อให้ตัวอย่างนี้สั้น และ เข้าใจง่าย ผมจึงแสดงเพียงแค่ Response.UNAUTHORIZED เท่านั้น หลังจากที่เราได้ UNAUTHORIZED มา เราก็ต้องไปสร้าง SIP Register message ใหม่ โดย method processResponseRegisterAuthorization ข้างล่างนี้
public Request processResponseRegisterAuthorization(Response response, URI uriReq) { try { authHeader = headerFactory authHeader.setUsername(USER_AUTH); DigestClientAuthenticationMethod digest = new DigestClientAuthenticationMethod(); callId = ((CallIdHeader) response requestauth = this.createRegister(callId,3600); digest.initialize(realm, USER_AUTH, uriReq.toString(), ss.getNonce(), requestauth.addHeader(authHeader); } catch (ParseException pa) { catch (Exception ex) { } |
เราก็ 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 ครับ
ไม่มีความเห็น