SIP Servlet by Netbeans 6.5

SIP Servlet by Netbeans 6.5

วันนี้ผมมีตัวอย่างวิธีการสร้าง SIP Servlet Server อย่างง่าย ๆ โดยใช้ Netbeans มาให้ดูครับ ก่อนจะก่อนถึงวิธีการผมขออธิบายคำว่า "SIP Servlet" ก่อนว่ามันต่างกับกับ SIP Server ทั่ว ๆ ไปอย่างไร เอาแบบสั้น ๆ เข้าใจง่าย ๆ นะครับ ถ้าพูดถึง Servlet เราก็จะนึกถึง Servlet Container ที่สามารถประมวลผล user request ที่ถูกส่งมาให้ web server แล้ว SIP Servlet ละ?  ก็คล้าย ๆ กันครับ เพียงแต่ว่า SIP Servlet ก็คือ Servlet container ที่สามารถ ประมวลผล SIP Messages ได้ไงละ  หรือสรุปสั้น ๆ ง่าย ๆ ว่า SIP Servlet ก็คือ Web Server (ในที่นี้คือ Sailfin) ที่มีความสามารถในการรับ SIP Request ได้ครับ

มาเริ่มเลยดีกว่า ผมใช้ Netbeans v 6.5 ครับ ก่อนที่จะสร้าง SIP Servlet ได้ เราจะต้องติดตั้ง Glass fish/Sailfin และ update netbeans ให้รู้จัก Java EE SIP Project กับ SIP Agents ก่อนนะครับ วิธีการคือ ไปที่ Menu Tools -> Plugin -> Available Plugins แล้ว Search คำว่า SIP จากนั้นก็ติดตั้งให้เรียบร้อยครับ

เมื่อติดตั้งเรียบร้อยแล้วเราก็สร้าง Project SIP Servlet ได้เลย ดังนี้ครับ เลือกที่ SIP -> Converged Servlet Application จากนั้นกด Next ครับ

จากนั้นตั้งชื่อ Project ซึ่งผมตั้งชื่อว่า ConvergedServletApplication ตามที่ Netbeans กำหนดมาเลยครับ

เมื่อสร้าง Project เสร็จเรียบร้อยแล้ว เราก็จะ SIP Servlet แล้ว ง่ายดีครับ ไฟล์ที่น่าสนใจคือ  NewSipServlet.java ดังตัวอย่างข้างล่าง

  /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package test.first;

import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.ServletException;
import javax.servlet.sip.*;
/**
 *
 * @author binod
 */
@javax.servlet.sip.annotation.SipServlet
public class NewSipServlet extends javax.servlet.sip.SipServlet {
   
    private static ConcurrentHashMap<String, SipURI> contacts = new ConcurrentHashMap();

    @Override
    protected void doRegister(SipServletRequest req) throws IOException, ServletParseException {
        saveContact(req); // Save the contact information (i.e address/port etc).
        req.createResponse(SipServletResponse.SC_ACCEPTED).send();
    }

    @Override
    protected void doRequest(SipServletRequest req) throws IOException, ServletException {
        String to = ((SipURI) req.getTo().getURI()).getUser();
        SipURI u = getContact(to);
        if (u != null) {
            req.setRequestURI(u);
        }
        super.doRequest(req);
    }

    @Override
    protected void doInvite(SipServletRequest req) throws TooManyHopsException {
        Proxy p = req.getProxy();
        p.setRecordRoute(true);
        p.setSupervised(true);
        p.proxyTo(req.getRequestURI());
    }
   
    private void saveContact(SipServletRequest req) throws ServletParseException {
        String user = ((SipURI) req.getFrom().getURI()).getUser();    
        contacts.put(user, (SipURI) req.getAddressHeader("Contact").getURI());
    }

    private SipURI getContact(String user) {
        return contacts.get(user);
    }
}

มี method ที่ใช้ในการจัดการ Register, Invite รายละเอียดติดไว้ก่อนแล้วกัน มาดูของเล่นและวิธี Setup กันก่อน

เมื่อได้ Project เรียบร้อยแล้วเราก็กดปุ่ม Run (F6) ได้เลย ตัว Sailfin ก็จะสร้าง SIP Servlet Container รอไว้ ถ้า Run แล้ว ไม่มีอะไรผิดพลาด ท่านจะต้องได้หน้าจอดังนี้

ผมทดสอบ Project นี้ โดยการใช้ SIP Client 2 ตัว (โดย run ทั้ง 2 ตัวในเครื่องเดียวกันเลย ฮิ ๆ ๆ)

1. X-Lite (www.counterpath.com/)
2. Express Talk (http://www.nch.com.au/talk)

 จากนั้นลองทดสอบดูอีกที ผมใช้ X-Lite เป็น Sip Client เวลา Register user  สำหรับ X-Lite ผมใช้ข้อมูลดังนี้

Display name: pleX
user name: pleX
Password: pleX
Authorization user name: pleX
Domain: localhost

ส่วน Express Talk ผมใช้ user: [email protected]

จริง ๆ กรอก user/password อะไรไปก็ได้ครับ เพราะ SIP Servlet ตัวนี้ ไม่ได้ไป verified user password หลังจาก Register user กับ SIP Servlet เรียบร้อยแล้ว เราก็ทดลองโทรหากันได้เลย ผมให้ victor (Express Talk) เป็นคนโทรหา pleX (X-Lite)  ผมก็พิมพ์ [email protected] ใน Express Talk

แล้วก็กด Call เลย ก็ได้ผลลัพธ์ดังรูป จะเห็นได้ว่า X-Lite รอรับ Call จาก Express Talk

ทีนี้ผมก็กดรับสาย

จะสังเกตได้ว่า call established แล้ว คราวนี้เสียงลำโพงก็จะเริ่มดังขึ้นเรื่อย ๆ เนื่องจากมันเป็น Loop back เพราะคุยกับเครื่องเดียวกัน ผมก็เลยจัดการ Disconnect ครับ

ถ้าต้องการให้ X-Lite (pleX) โทรไปหา Express Talk (victor) ก็ได้เหมือนกัน เราก็พิมพ์ [email protected] ที่ X-Lite แล้วก็กด Call Express Talk ก็จะมีสัญญาณให้รอรับสายโทรศัพท์ครับ

จะเห็นว่าเพียงเท่านี้เราก็ได้ SIP Servlet มาใช้งานแล้ว ใช้เวลาไม่ถึง 5 นาทีเท่านั้นครับ แถมท้ายอีกนิดครับ ใน Project นี้ เค้ายังแถม SIP Test Agent มาให้เราด้วย เราสามารถสร้าง SIP Request/Response ขึ้นเอง แล้วลองส่งไปทดสอบกับ SIP Servlet ตัวนี้ได้อีกด้วยครับ  :-)