Chủ Nhật, 17 tháng 8, 2014

[JAIN SIP] Chương 10 : HelloPhone

Chương 10 : HelloPhone
Từ chương này, chúng ta sẽ kết hợp JAIN SIP, JAIN SDP và JMF để tạo ra 1 phần mềm tên là HelloPhone. HelloPhone có các tính năng sau:
+ Kết nối 2 peer bằng giao thức SIP qua mạng.
+ Thực hiện cuộc gọi (voice chat) giữa 2 peer.
Đối với phần mềm mạng, code  thì hơi phức tạp nên chúng tôi sẽ bắt đầu HelloPhone theo từng bước:
+ Trong chương 10, tạo ra HelloPhone hoàn chỉnh về JAIN SIP.
+ Trong chương 11, bổ sung JAIN SDP vào HelloPhone.
+ Trong chương 12, bổ sung JMF vào HelloPhone, thành một phần mềm hoàn chỉnh.
I. Giao diện phần mềm HelloPhone:
- Sip Port : port thực hiện kết nối dành cho giao thức SIP.
- Voice Port : port thực hiện kết nối để trao đổi Audio.
- Button Connect : khởi động SIP.
- Button Disconnect : ngưng hoạt động SIP.
- Label Initialize : hiển thị thông tin về địa chỉ IP và Port của peer dùng để kết nối giao thức SIP.
- Destination : là địa chỉ của UAS.
- Button Yes :
+ Nếu là UAC,  bấm button này để thực hiện cuộc gọi.
+ Nếu là UAS,  bấm button này để chấp nhận cuộc gọi.
- Button No:
+ Nếu là UAC,  bấm button này để hủy bỏ hoặc kết thúc cuộc gọi.
+ Nếu là UAS, bấm button này để từ chối hoặc kết thúc cuộc gọi.
- Tracer : hiển thị nội dung Request và Response nhận được hoặc gởi đi.
II. Cách hoạt động của HelloPhone :
UAC và UAS bấm vào button Connect để khởi động JAIN SIP. Sau đó, UAC bấm vào button YES để thực hiện voice chat với UAS, thì có 3 trường hợp xảy ra:
- Trường hợp 1: UAS chấp nhận cuộc gọi bằng cách bấm vào button YES. Để kết thúc cuộc gọi UAC hoặc UAS bấm vào button NO.
- Trường hợp 2 : UAC đang chờ UAS chấp nhận cuộc gọi, trong lúc này UAC muốn hủy cuộc gọi này bằng cách bấm vào button NO.
- Trường  hợp 3: UAS không chấp nhận cuộc gọi, bấm vào button NO để kết thúc cuộc gọi.
Để phân biệt được nhiệm vụ của button NO,  khi nào là hủy và  khi nào là kết thúc cuộc gọi. Chúng ta dựa vào "UAC có gởi ACK request hay chưa". Các bạn phải phân biệt được sự khác nhau giữa CANCEL request và BYE request.
+ CANCEL request chỉ được thực hiện ở UAC khi dialog chưa được thiết lập, tức là ACK chưa được gởi. Còn phía UAS muốn hủy cuộc gọi thì gởi "486 BUSY" response.  
+ BYE request được thực hiện ở cả 2 phía UAC và UAS khi dialog đã được thiết lập, tức là ACK đã được gởi.
Hiện tại,chúng ta chỉ quan tâm đến JAIN SIP, nên trong chương này HelloPhone chỉ có 2 class :
+ HelloPhoneGUI class : thành phần giao diện.
+ HelloPhoneListener class : kế thừa SipListener để thực hiện tính năng của SIP.
III. HelloPhoneGUI class :
Chúng ta tạo ra giao diện HelloPhoneGUI như hình trên.
* Phương thức của HelloPhoneGUI:
- setInit(String s) : thiết lập giá trị cho lblInit.
- display(String s) : thêm nội dung vào txtDisplay.
- getSipPort() : trả về giá trị của txtSipPort.
- getVoicePort()  : trả về giá trị  của txtVoicePort.
- getDestination() : trả về giá trị  của txtDestination.
- clean() : thiết lập giá trị rỗng cho lblInit, lblStatus, txtDisplay.
- btnConnectActionPerformed(…) : sự kiện ActionListener khi bấm button Connect.
- btnDisconnectActionPerformed (…) : sự kiện ActionListener khi bấm button Disconnect.
- btnYESActionPerformed (…) : sự kiện ActionListener khi bấm button YES.
- btnNOActionPerformed (…) : sự kiện ActionListener khi bấm button NO.
IV. HelloPhoneListener class:
- Tạo các biến khởi động SIP:
- Tạo các biến thực hiện giao dịch SIP:
Lưu ý : Mỗi cặp đối tượng ClientTransaction và ServerTransaction chỉ chứa 1 loại request nhất định. Trong HelloPhone, đối tượng clientTransaction và serverTransaction được định nghĩa ở hình trên để lưu lại INVITE request, còn các Transaction dành cho các request khác không cần thiết để lưu lại. Do đó, khi sử dụng phương thức getRequest() để trả về 1 Request của clientTransaction và serverTransaction thì chúng ta phải hiểu đó là INVITE request.
- Các biến khác:
- Hàm dựng HelloPhoneLister(HelloPhoneGUI gui) : có tham số đầu vào là đối tượng của class HelloPhoneGUI, hàm dựng này được sử dụng để khởi động giao thức SIP.
- Phương thức disconnect() : ngưng hoạt động SIP
- Phương thức sendRequest() : là hành động khi UAC bấm vào button YES thì phương thức này được gọi. Nhiệm vụ của phương thức này tạo ra INVITE request và gởi đến UAS.
- Hàm terminateRequest() : hành động khi UAC bấm vào button NO thì phương thức này được gọi. Nhiệm vụ của phương thức này là :
+ Tạo CANCEL request để hủy cuộc gọi khi UAC chưa gởi ACK.
+ Hoặc, tạo BYE request để kết thúc cuộc gọi khi UAC đã gởi ACK.
+ Nếu là BYE rerquest, phải thiết lập lại giá trị isACK = false;
- Phương thức sendResponse() : hành động khi UAS bấm vào button YES để chấp nhận cuộc gọi. Nhiệm vụ của phương thức này là tạo ra "200 OK" response.
- Hàm terminateResponse() : hành động khi UAS bấm vào button NO thì phương thức này được gọi. Nhiệm vụ của phương thức này là :
+ Tạo "486 BUSY HERE" response để từ chối cuộc gọi.
+ Hoặc, tạo BYE request để kết thúc cuộc gọi.
+ Nếu là BYE request, thiết lập lại giá trị isACK = false.
+ Thiết lập lại giá trị isUAS = false.
- Hàm processRequest() : đây là phương thức do SipListener định nghĩa, xử lý quá trình UAS nhận request được gởi từ UAC. Trong phương thức này, chúng ta xử lý các tính năng sau:
+ Khi UAS nhận được INVITE request, tự động tạo ra "180 RINGING" request gởi đến UAC. Với ý nghĩa, UAS đã nhận được INVITE và đang chờ xử lý. Biến isUAS được thiết lập là true, để chứng tỏ đây là UAS.
+ Khi UAS nhận được CANCEL request, tự động tạo ra "487 Terminated" để hủy cuộc gọi của INVITE  và "200 OK" response để hoàn thành CANCEL request (vì 1 request phải tồn tại 1 final response để kết thúc 1 transaction dành cho request đó).  Biến isUAS được thiết lập là false, vì peer này không còn là UAS nữa.
Lưu ý : 486, 487 và 200 response đều là final request. Riêng các response có giá trị từ 200 đến 299 được UAC gởi ACK request.
+ Khi UAS nhận được ACK request, biến isACK được thiết lập là true, để chứng tỏ UAS đã nhận được ACK từ UAC.
+ Khi UAS nhận được BYE request, tự động tạo ra "200 OK" response để hoàn thành BYE request và gởi đến UAC để kết thúc cuộc gọi. Biến isUAS được thiết lập là false, vì peer này không còn là UAS nữa và cũng thiết lập isACK là false.
- Hàm processResponse() : đây là phương thức do SipListener định nghĩa, xử lý quá trình UAC nhận response được gởi từ UAS. Trong phương thức này, chúng ta chỉ xử lý tính năng: khi nhận được "200 OK" response dành cho INVITE request thì UAC gởi ACK request.
VI. Chạy chương trình :
Mỗi giao diện tương ứng 1 máy tính, nếu chạy trên cùng 1 máy tính port phải khác nhau.
Giả sử giao diện 1 :
-  Port dành cho sip 6060, bấm vào button “Connect” để khởi động SIP.
-  Port dành cho Voice là 40000.
-  Destination là địa chỉ IP và Port của máy cần gởi đến.
-  Bấm button “YES” để thực hiện voice chat.
 Giao diện 2 :
-  Port dành cho sip 6070, bấm vào button “Connect” để khởi động SIP.
-  Port dành cho Voice là 50000.
-  Destination là địa chỉ IP và Port của máy cần gởi đến.
-  Bấm button “YES” để thực hiện voice chat.
Code đầy đủ :
http://www.mediafire.com/download/cg7yrfh31aoq6yt/HelloPhone_JAINSIP.rar

Không có nhận xét nào:

Đăng nhận xét