JAIN SIP #2
ก่อนอื่นผมขอเกรินนำถึงเป้าหมายของผมก่อน
ผมสนใจเกี่ยวกับ เทคโนโลยี IMS ซึ่งตอนนี้ผมได้ทดลองติดตั้ง OpenIMS และ ใช้งานได้แล้ว คราวนี้ ผมต้องการที่จะสร้าง Services สักตัว ในระบบ IMS ผมต้องทำไงดีเนี่ย? ก็หาข้อมูลใน Internet ก็ได้ความว่าจะต้องสร้าง Services ใน Application Server เอ... แล้วจะทำไงละ Keyword แรก ที่หาเจอก็คือ JAIN SIP นั่นเอง
หลังจากที่ผมได้พยายามศึกษากับ JAIN SIP API จนเข้าใจ Concept การทำงานว่า JAIN SIP ประกอบไป ด้วย ส่วนประกอบที่สำคัญดังนี้
| SIP Factory -> SIP Stack -> Listening Point -> SIP Provider |
SIP Factory เป็น Singleton class ที่ทำหน้าที่ผลิต SIP Stack instance ออกมา เมื่อเราได้ SIP Stack แล้วเราก็เอาเจ้านี่แหละ ไปสร้าง SIP Stack จากนั้นก็เอา SIP Stack ไป สร้าง Listening Point และ SIP Provider
Method หลัก ๆ ที่จำเป็นต้องสนใจก็คือการ กำหนดค่าเริ่มต้นให้กับตัวแปร รวมถึง object ต่าง ๆ ตามที่ผมได้กล่าวไปข้างต้น ซึ่งเราต้องทำตาม step อยู่แล้ว แต่ ส่วนที่เราสามารถเขียนโปรแกรมเพิ่มเติมก็คือใน method ที่ไปสืบทอดจาก interface นั่นก็คือ
|
public void processRequest(RequestEvent requestEvent) { } |
เมื่อ server หรือ client ได้รับ SIP message มันก็จะเข้ามาทำใน method นี้เองครับ
ใครสนใจทดลองก็ ลองไปเปิด code ใน ตัวอย่าง ซึ่งจะอยู่ใน
folder jain-sip\src\examples\simplecallsetup ดูได้นะครับ
ผมใช้เวลาศึกษาเจ้า JAIN-SIP อยู่ประมาณ 1 สัปดา์ห์เต็ม ๆ จนพอจะเข้าใจการทำงานของมันบ้าง แต่ในตัวอย่างที่ให้มานั้น (SimpleCallSetup) มีเฉพาะการ Invite-Ack-Bye ไม่มีการ Register ก่อน ผมก็เลยไม่สามารถทดสอบโปรแกรมพวกนี้ กับ SipPhone ที่ใ้ช้อยู่ในปัจจุบัน เช่น X-Lite , Softphone, Ekiga ฯลฯ
ก็เลยพยายามลองเขียน Register Message เอง แต่ก็ยังไม่ work (นี่ขนาดยังไม่ได้ไปแตะกับ IMS เลยน่ะเนี่ย) แล้วตัวอย่าง การใช้ JAIN-SIP กับ IMS ก็ค่อนข้าง Abstract มาก ๆ ก็เลยทำให้วนไปหาของเจ้าอื่นดูบ้าง
ก็ไปเจอกับเจ้า SipServlet (มีตัวอย่างชื่อว่า CallSetup) ที่พัฒนามาจาก Sailfin (เป็นลูก ของ Glass Fish J2EE) ที่สามารถเรียกใช้งานได้จาก Netbean อ่านดูรายละเอียดก็น่าสนใจดี เพราะ เราสามารถ deploy เป็น Application Server โดยใช้ แนวความคิดของ B2BUA เลย แต่พอเอามาทดลองใช้ ปรากฎ ว่า SipServlet ไม่สามารถ แสดง Session ที่ Sip Client ส่งมาให้ได้ (คือ Sip Client Register ไม่ได้ว่างั้นเหอะ)
โ้อ้... ทำไงดีละเนี่ย ผมก็หาข้อมูลไปเรื่อย ๆ และ แล้ว ผมก็มาพบรัก เอ้ย!! ไม่ใช่ มาเจอกับสิ่งที่ผมต้องการจนได้ นั่นก็คือ SDS 4.1 จาก Ericsson !! มันคืออะไรหว่า?? คอยติดตามตอนต่อไป ตอนนี้ผมกำลังสนุกกับมันอยู่ครับ :-)
ไงต่อหละครับ... กำลังรออยู่
สวัสดีคับ คือตอนนี้ผมกะลังศึกษา Jain-Sip หนะคับ เพื่อจะมาเขียนโปรแกรมให้มันสื่อสารกะ X-Lite ได้รู้เรื่องหนะคับ พอดีตอนนี้ผมติดปัญหาเรื่องเกี่ยวกับ SDP อะคับ ผมไม่เข้าใจในส่วน sdpData อะคับ ณ ตอนนี้ผมเอาตัวอย่าง ShootistAuth.java ซึ่งอยุ่ใน examples/authorization หนะครับ ผมเลยอยากจะรบกวนอยากจะให้อธิบายฟังก์ชั่น createInvite ให้ฟังหน่อยคับ ว่าต้องเซ็ตพาราีมีเตอร์อะไรยังไงบ้าง คือ ผมลองๆ เซ็ตแล้วมันไม่ได้อะคับ..รบกวนด้วยนะคับ
ถ้าจะ Implement SIP Server ง่าย ๆ ใช้ Netbean สร้าง SIP Servlet แป๊บเดียวเสร็จเลยครับ เอา X-Lite คุยได้เลย
ฟังก์ชัน createInvite ก็ทำหน้าที่ create SIP INVITE message
ซึ่งเมื่อสร้างเสร็จแล้ว เราก็จะได้หน้าตา INVITE message เป็นแบบนี้ครับ
INVITE sip:[email protected]:5070 SIP/2.0
Call-ID: [email protected]
CSeq: 1 INVITE
From: "The Master Blaster" <sip:[email protected]>;tag=12345
To: "The Little Blister" <sip:[email protected]>
Via: SIP/2.0/UDP 127.0.0.1:5060;branch=z9hG4bK31492ae83a367c4caa0c0e8e1be098b5
Max-Forwards: 70
Contact: "BigGuy" <sip:[email protected]:5060>
Content-Type: application/sdp
Call-Info: <http://www.antd.nist.gov>
Content-Length: 247
รายละเอียดเกี่ยวกับ SIP Invite มีเยอะแยะใน internet ลองหาอ่านดู ไม่ยากครับ แล้วก็ต่อด้วย SDP protocol ที่ SIP เป็นคนเรียกใช้อีกที เพื่อบอกให้ผู้รับทราบเกี่ยวกับรายละเอียดของ session ที่ใช้ในการติดต่อ ดังนี้ครับ
v=0
o=4855 13760799956958020 13760799956958020 IN IP4 129.6.55.78
s=mysession session
p=+46 8 52018010
c=IN IP4 129.6.55.78
t=0 0
m=audio 6022 RTP/AVP 0 4 18
a=rtpmap:0 PCMU/8000
a=rtpmap:4 G723/8000
a=rtpmap:18 G729A/8000
a=ptime:20
ส่วน SDP data ใน ShootistAuth.java
ผมเขียนอธิบายไว้ในหัวข้อ SDP ใน JAIN-SIP Tutorial นะ ครับ ลองเข้าไปอ่านดู