SIP Servlet (ClickToDial) #2


SIP Servlet (ClickToDial)

ทำความเข้าใจ code SIP Servlet ของ กันต่อ หลังจากได้ทดลองใช้โปรแกรมกันแล้ว จากความเดิม

Click-To-Dial จะแบ่งการทำงาน คือ

Login (Web) -> Register (SIP) -> Place Call (Web -> SIP)

ในตอนนี้ผมจะอธิบายภาพรวมการทำงานของ SIP Servlet ที่ทำงานบน SailFin (GlassFish) โดยจะเน้นในส่วนของ และ เป็นพิเศษ

- เมื่อสั่งให้ Run project นี้ ก็เรียก index.jsp ตามที่กำหนดไว้ใน welcome-file จาก web.xml โดย index.jsp จะสร้าง form สำหรับ login (ไม่มี password)  เมื่อผู้ใช้ทำการ login โดยการกดปุ่ม login แล้ว มันก็จะ Post ต่อไปยัง LoginServlet.java

- LoginServlet.java จะอ่าน username ที่ผู้ใช้ส่งมา จาก request ของ servlet จากนั้นก็ทำการเขียนชื่อ username ลงในฐานข้อมูล  ซึ่งจะมี file ที่เกี่ยวข้องดังนี้  ModelFacade.java,  Person.java, persistence.xml

- persistence.xml เป็น configuration file ที่ใช้กำหนดรายละเอียดการเชื่อมฐานข้อมูล ซึ่งในตัวอย่างนี้ คือ

  persistence-unit name="ClickToDialPU" เป็นชื่อไว้อ้างอิงถึง persistence-unit ตัวนี้

   <jta-data-source>jdbc/__default</jta-data-source> เป็นรายละเอียดการเชื่อมต่อฐานข้อมูล ที่กำหนดไว้แล้วใน SailFin (GlassFish) ตัวฐานข้อมูลจริง ๆ นั้นชื่อ  sun-appserv-samples , User= APP,  Password = APP, port = 1527 ครับ เราสามารถดูข้อมูลพวกนี้ได้จาก GlassFish Admin Console ที่ http://localhost:4848/   แ้ล้วไปที่ เมนู Resources => JDBC => JDBC Resources => jdbc/__default ครับ

รูปที่แสดงอยู่นี้ผมใช้ Netbeans เป็นตัวแสดงฐานข้อมูลโดยใช้ jdbc:derby driver ที่ติดมากับ GlassFish อยู่แล้ว  หรือ ใครอยากจะใช้ "li" ที่เป็น database console ก็ได้ครับ

 

- Person.java เป็น class ที่สร้างมาไว้ map กับ table คือ ตัวแปรของ class นั้นก็คือ field ของ table นั่นเอง ในไฟล์นี้มีสิ่งที่ผมสนใจคือ

@Entity
public class Person implements Serializable {
..

@Entity เป็นการบอกว่า class นี้ เป็น class ที่ map กับ table

@Id
public String getUsername() {
        return username;
    }

@Id เป็นการบอกว่า username เป็น primary key


- ModelFacade.java เป็นตัวจัดการฐานข้อมูล หรือว่าเป็นตัวที่ใช้กำหนด method ในการ Create/Read/Update/Delete (CRUD) ให้กับฐานข้อมูลผ่าน Object  โดย มี LoginServlet มาเรียกใช้ method ของ ModelFacade เพื่อไปจัดการ Object Person (Person.java) แล้วก็เขียนลงในฐานข้อมูลอีกทีหนึ่ง

สิ่งที่ผมสนใจคือ

   @PersistenceUnit(unitName="ClickToDialPU")
    private EntityManagerFactory emf

เป็นการกำหนด PersistenceUnit จะกำหนดโดยใช้ชื่อ ซึ่งมันจะนำชื่อนี้ไปเปรียบเทียบกับชื่อใน persistence.xml ที่เราได้กำหนดชื่อไว้ ถ้าตรงกัน ก็จะใช้รายละเอียดการเชื่อมต่อฐานข้อมูลในไฟล์นั้น ให้กับ EntityManagerFactory หรือเรียกอีกอย่างว่า ใช้ annotate EntityManagerFactory

@Resource
private UserTransaction utx

ก็คล้ายกัน คือ ใช้ annotate (หรือ inject) ให้กับ UserTransaction

    @SuppressWarnings("unchecked")
    public Person getPerson(String userName) {
        EntityManager em = emf.createEntityManager();
        Person person = em.find(Person.class, userName);
        em.close();
        return person;
   

อันนี้ เป็นการบอก compile ว่าถ้าเจอ warning "unchecked" ก็ไม่ให้มันแสดงออก

กลับมาต่อที่ LoginServlet ครับ เมื่อ ทำการเขียน username ของผู้ที่ Login ลงไปแล้วในฐานข้อมูลแล้ว จากนั้นก็ Redirect ไปยังหน้า main.jsp เพื่อแสดงสถานะการลงทะเบียนของ SIP Client ใน main.jsp นั้น เรียก javascript dojo.js เป็น Ajax แล้วก็มีการใช้  json ด้วย ค่อนข้างมั่ว ถ้าศึกษาแล้วเดี๋ยวค่อยเอามาเล่าทีหลังแล้วกันนะครับ แฮะ ๆ ๆ

- เมื่อ SIP Client ทำการลงทะเบียนกับ SIP Server แล้ว ก็จะไปเรียก RegistrarServlet.java แล้วดิ่งตรงไปใน method doRegister()

@Resource(mappedName="sip/ClickToDial")
    private SipFactory sf;

ก็คล้าย ๆ เดิม คือ เพิ่มเติมความสามารถให้กับ SipFactory ให้รู้จักพวก SIP API ที่ใช้ในการสร้าง SIP header ต่าง ๆ

จากนั้นทำการตรวจสอบ username ว่ามีใน ฐานข้อมูลหรือไม่ ดังนี้

// get the Person object from the database
        Person p = mf.getPerson(username);
        if (p != null)
             ...

ถ้าหาไม่เจอก็จะบอกว่า NotFound (SipServletResponse.SC_NOT_FOUND)

จากนั้น ทำการ ตรวจสอบ expire ถ้า expire == 0 ก็สั่ง handleUnregister()  แต่ถ้า expire != 0 ก็สั่ง handleRegister() และส่ง 200 OK กลับไปให้ Registered Client  ดังนี้ 

SipServletResponse resp = req.createResponse(response);

เมื่อมีการกด Link "Call" ในหน้า web ก็จะไปเรียกใช้ PlaceCallServlet ซึ่งจะทำการส่ง INVITE ไปหา Client ที่ได้ลงทะเบียนไว้ เมื่อ Client ตอบกลับมา ก็จะมีการจัดการ SIP message ด้วย CallSipServlet.java  ตรงนี้ เอาสั้น ๆ ไว้เท่าก่อน ไว้รอตอนต่อไปนะครับ

แถม Link อธิบาย CallSetup น่าสนใจ (ก่อนจะเปลี่ยนมาเป็น Click-To-Dial)
=>

คำสำคัญ (Tags): #click to dial#sip servlet#glassfish#sailfin
หมายเลขบันทึก: 308084เขียนเมื่อ 23 ตุลาคม 2009 22:57 น. ()แก้ไขเมื่อ 6 กันยายน 2013 21:46 น. ()สัญญาอนุญาต: ครีเอทีฟคอมมอนส์แบบ แสดงที่มา-ไม่ใช้เพื่อการค้า-อนุญาตแบบเดียวกันจำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (2)

Nice information you have been provided. Thanks for sharing.GCP Training in Hyderabad

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