Luận văn Lập trình SIP cho thiết bị di động bằng Java
MỤC LỤC
Trang Trang 1
Lời cam đoan 1
Mục lục 2
Danh mục các chữviết tắt 6
Danh mục các hình vẽ8
MỞ ĐẦU 10
Chương 1 – GIAO THỨC ĐIỀU KHIỂN PHIÊN (SIP) 11
1.1. Khái niệm 11
1.2. Các đặc điểm của SIP 11
1.3. Các phần tửmạng SIP 12
1.3.1. User agent (UA) 12
1.3.2. Proxy Server 12
1.3.2.1. Proxy server không trạng thái 12
1.3.2.2. Proxy server trạng thái 13
1.3.3. Registrar server 13
1.3.4. Redirect server 13
1.4. Các bản tin SIP 14
1.4.1. Các bản tin yêu cầu 14
1.4.2. Các bản tin phúc đáp 17
1.5. Các giao dịch SIP 19
1.6. Các hội thoại SIP 20
1.6.1. Các hội thoại làm cho định tuyến thuận tiện 21
1.6.2. Nhận dạng hội thoại 22
1.7. Những kịch bản SIP điển hình. 23
1.7.1. Đăng ký 23
3
1.7.2. Khởi tạo phiên 23
1.7.3. Kết thúc phiên 24
1.7.4. Định tuyến bản ghi 25
1.8. So sánh SIP và H.323 26
Chương 2 - CƠBẢN VỀLẬP TRÌNH CHO THIẾT BỊDI
ĐỘNG BẰNG JAVA
29
2.1. Giới thiệu 29
2.2. Máy ảo Java (JVM – Java Virtual Machine) 29
2.3. Cấu hình thiết bị29
2.3.1. Cấu hình thiết bịkết nối 29
2.3.2. Cấu hình thiết bịhạn chếkết nối 30
2.3.2.1. Những khác biệt của CLDC so với Java chuẩn 30
2.3.2.2. Các lớp CLDC kếthừa từJ2SE 30
2.3.2.3. Khung kết nối chung (GCF – Generic Connection
Framework)
32
2.4. Profile 33
2.5. Máy ảo Java cho CLDC 33
2.6. Xác minh file lớp (.class) 34
2.6.1. Tiền xác minh 34
2.6.2. Xác minh bởi thiết bị34
2.7. MIDLET 34
2.7.1. Cơbản vềMIDlet 34
2.7.1.1. Quản lý ứng dụng và môi trường thực thi Runtime 35
2.7.1.2. File lưu trữJava (JAR) 35
2.7.1.3. Bộmô tả ứng dụng Java (file JAD) 36
2.7.2. Vòng đời của MIDlet 37
2.7.3. Tạo ra một MIDlet 38
4
2.7.4. MIDlet API 39
2.7.5. Giao tiếp từbộquản lý ứng dụng 39
2.7.6. Giao tiếp tới bộquản lý ứng dụng 40
2.7.7. Truy vấn thuộc tính MIDlet 40
Chương 3 - BỘCÔNG CỤKHÔNG DÂY J2ME 41
3.1. Giới thiệu 41
3.1.1. Các công cụtrong bộcông cụ41
3.1.2. Đặc điểm bộcông cụ41
3.1.3. Các công nghệhỗtrợ42
3.2. Phát triển các bộMIDlet 42
3.2.1. Dựán (Project) 42
3.2.2. Quy trình phát triển đơn giản 44
3.2.3. Quy trình phát triển đầy đủ44
3.3. Làm việc với các project 45
3.3.1. Lựa chọn các API 45
3.3.2. Thay đổi các thuộc tínhcủa bộMIDlet 45
3.3.3. Thao tác MIDlet 46
3.3.4. Cấu trúc thưmục dựán 46
3.3.5. Sửdụng các thưviện của bên thứba 46
3.3.5.1. Các thưviện của bên thứba cho một project 47
3.3.5.2. Các thưviện của bên thứba cho tất cảproject 47
3.4. An toàn và đánh dấu MIDlet 47
3.4.1. Sựcho phép (permission) 47
3.4.2. Các vùng bảo vệ(protect domain) 48
3.4.3. Đánh dấu một bộMIDlet 49
3.4.4. Quản lý khóa 49
3.4.4.1. Tạo một cặp khóa mới 49
5
3.4.4.2. Nhận các khóa thực 51
Chương 4 - GIAO TIẾP LẬP TRÌNH ỨNG DỤNG CHO J2ME
52
4.1. SipConnection 53
4.2. Tích hợp vào khung kết nối chung 53
4.3. Định tuyến yêu cầu gửi đến 54
4.4. SipClientConnection 55
4.5. SipServerConnection 56
4.6. SipConnectionNotifier 57
4.7. SipClientConnectionListener 58
4.8. SipServerConnectionListener 58
4.9. SipDialog 58
4.10. SipHeader 60
4.11. SipAddress 60
4.12. SipRefreshHelper 61
4.13. SipRefreshListener 62
4.14. SipException 62
Chương 5 - LẬP CHƯƠNG TRÌNH 63
5.1. Điều kiện thực hiện chương trình 63
5.2. Lưu đồthuật toán 63
5.3. Đăng nhập SIP 65
5.4. Gọi đi 69
5.5. Chờgọi đến và trảlời 71
5.6. Tạo project đóng gói chương trình 73
5.7. Mô phỏng 73
KẾT LUẬN 74
TÀI LIỆU THAM KHẢO 75
p này có thể được sử dụng để phân tích các giá trị đầu đề ký tự tối thiểu mà đọc từ bản tin SIP sử dụng phương thức SipConnection.getHeader().SipHeader là một lớp trợ giúp riêng rẽ và không bắt buộc sử dụng cho tạo một kết nối SIP. Do đó SIP headers có thể được xây dựng với lớp này. SipHeader sử dụng khuôn dạng chung để phân tích các giá trị header và các tham số. 4.11. SipAddress Khai báo: public class SipAddress java.lang.Object | +--javax.microedition.sip.SipAddress SipAddress cung cấp một bộ phân tích địa chỉ SIP chung. Các địa chỉ hợp lệ có thể được xây dựng với lớp này. SipAddress có các yêu cầu chức năng sau: • SipAddress không tránh được các chuỗi ký tự địa chỉ. • SipAddress bỏ qua phần đầu đề của SIP URI. • Khuôn dạng hợp lệ SipAddress là giống như được định nghĩa trong SIP BNF cho URI tuyệt đối. • Địa chỉ Contact hợp lệ “*” được chấp nhận trong SipAddress. Trong trường hợp này các thuộc tính sẽ là null và số cổng sẽ là 0. 61 4.12. SipRefreshHelper Khai báo: public class SipRefreshHelper java.lang.Object | +--javax.microedition.sip.SipRefreshHelper Lớp này thực hiện chức năng làm cho thuận tiện việc làm tươi các yêu cầu của ứng dụng. một số yêu cầu SIP (REGISTER, SUBSCRIBE, ...) cần phải được làm tươi đúng lúc. Ví dụ yêu cầu REGISTER cần phải được gửi lại để đảm bảo điểm khởi tạo vẫn hoạt động. Tính hợp lệ của yêu cầu được đề ra bởi điểm cuối trong yêu cầu và được xác nhận trong phúc đáp bởi registrar/notifier ví dụ trong expires header. Việc xử lý này sẽ làm tăng đáng kể độ phức tạp và kích thước chương trình. SipRefreshHelper có thể đwocj sử dụng để làm cho dễ dàng các công việc này. Khi ứng dụng muốn gửi một yêu cầu có thể làm tươi nó sẽ: • Thực hiện SipRefreshListener gọi lại giao diện. • Tạo một SipClientConnection mới và thiết lập nó. • Gọi phương thức enableRefresh(SipRefreshListener). • Nếu công việc làm tươi bị lỗi thì một sự kiện lỗi sẽ được gửi đến SipRefreshListener Một tham chiếu tới đối tượng SipRefreshHelper thu được bằng cách gọi phương thức tĩnh SipRefreshHelper.getInstance(). Cuối cùng sử dụng mã làm tươi từ enableRefresh(SipRefreshListener) ứng dụng có thể: • Dừng làm tươi: sự liên kết giữa điểm cuối và server bị hủy bỏ. • Cập nhật làm tươi với các tham số mới 62 4.13. SipRefreshListener Khai báo: public interface SipRefreshListener SipRefreshListener là giao diện nghe các sự kiện RefreshHelpe. Giao diện này định nghĩa một sự kiện mà chứa một refreshID để nhận dạng một công việc làm tươi tương ứng, statusCode diễn tả kết quả của quá trình làm tươi này (0 = bị hủy, 200 = thành công, còn lại = không thành công). statusCode tương ứng với phúc đáp nhận được cho yêu cầu nguyên thủy được gửi bởi SipRefreshHelper. reasonPhrase cho một bản tin nguyên bản về thành công hay không của công việc làm tươi này. 4.14. SipException Khai báo: public class SipException extends java.io.IOException java.lang.Object | +--java.lang.Throwable | +--java.lang.Exception | +--java.io.IOException | +--javax.microedition.sip.SipException Đây là một lớp ngoại lệ cho các lỗi cụ thể SIP. Ngoại lệ bao gồm bản tin lỗi nguyên bản khuôn dạng tự do và mã lỗi để phân loại lỗi. 63 CHƯƠNG 5 : LẬP CHƯƠNG TRÌNH 5.1. Điều kiện thực hiện chương trình Để thực hiện được chương trình cần phải có những điều kiện sau: • Thiết bị di động phải có cài đặt CLDC và MIDP. Hiện nay các loại điện thoại di động phổ biến cài đặt CLDC 1.1 và MIDP 2.0. Ngoài ra thiết bị phải có kkhả năng kết nối mạng, có đủ bộ nhớ để cài đặt và thực hiện chương trình. • Đã có các SIP server (proxy server, registrar server, redirect server). • Có tài khoản của SIP server trên. 5.2. Thuật toán chương trình Các bước của thuật toán: • Khi bắt đầu chạy chương trình, thiết bị đăng nhập vào SIP server. • Sau đó thiết bị vào trạng thái chờ gọi đến. • Nếu có cuộc gọi đến thì trả lời hoặc không trả lời. • Nếu muốn gọi đi thì chuyển sang chế độ gọi đi. • Nếu đến thời gian phải làm tươi thì thực hiện lại đăng nhập tới server. • Nếu muốn kết thúc chương trình thì đóng chương trình và giải phóng bộ nhớ. 64 Bắt đầu Chờ Gọi đi? Đăng nhập Gọi Y N Y Có cuộc gọi đến? Kết thúc? Y N Kết thúc N Làm tươi? Trả lời N Hình 5.1. Lưu đồ thuật toán 65 5.3. Đăng nhập SIP Khi bắt đầu chạy, chương trình phải thực hiện đăng nhập vào mạng SIP bằng cách gửi bản tin REGISTER. Trước tiên phải nhập tên và mật khẩu. Các bước thực hiện như sau: + Ứng dụng khởi tạo yêu cầu REGISTER gốc. + Ứng dụng gọi send() + SIP API thực hiện gửi yêu cầu REGISTER đến server. + Ứng dụng gọi receive( ) để đợi phúc đáp. + Nếu tên và mật khẩu không hợp lệ thì SIP server gửi phúc đáp “401 Unauthorized”. Nếu hợp lệ thì SIP server gửi phúc đáp “200 OK”. + Ứng dụng gọi getStatusCode(). + Ứng dụng kết thúc kết nối bằng phương thức close( ). Hình 5.2. Thuật toán đăng nhập SIP Bắt đầu Khởi tạo REGISTER Gửi yêu cầu Nhận phúc đáp Hợp lệ? Kết thúc Y N 66 Hình 5.3. Quá trình thực hiện đăng nhập Mã chương trình: public void doRegister(String username, String password, String realm) { SipClientConnection scc = null; SipConnectionNotifier scn = String contact = try { // open listener in application specific port 5080 scn = (SipConnectionNotifier) Connector.open(“sip:5080”); 67 // build the contact URI contact = new String(“sip:user@”+scn.getLocalAddress()+“:”+scn.getLocalPort( )); open client connection to the SIP registrar in this case “host.com” scc =SipClientConnection)open(“sip:host.com”); initialize REGISTER with appropriate headers scc.initRequest(“REGISTER”, scn); scc.setHeader(“From”, “sip:user@host.com”); setHeader(“To”,sip:user@host.com”); setHeader(“Contact”, contact); scc.send(); boolean handled = false; int scode = 0; while(!handled) { SipHeader sh; // wait max 30 secs for response scc.receive(30000); scode = scc.getStatusCode(); switch(scode) { case 401: sh = new SipHeader(“WWW-Authenticate”, scc.getHeader(“WWW-Authenticate”)); realm = sh.getParameter(“realm”); // here for example, prompt user for password for this realm // set credentials to initiate re-REGISTER 68 scc.setCredentials(username, password, realm); break; case 407: sh = new SipHeader(“Proxy-Authenticate”, scc.getHeader(“Proxy-Authenticate”)); realm = sh.getParameter(“realm”); // here for example, prompt user for password for this realm // set credentials to initiate re-REGISTER scc.setCredentials(username, password, realm); break; case 200: // handle OK response handled = true; default: handle other responses handled = } } scc.close(); } catch(Exception ex) { // handle Exceptions } } 69 5.4. Gọi đi Quy trình gọi đi như sau: • Khởi tạo và gửi bản tin INVITE • Nhận bản tin phúc đáp tạm thời 100, 180 cho đến khi nhận bản tin cuối cùng 200 OK. • Khởi tạo và gửi bản tin ACK để thiết lập phiên. • Trao đổi dữ liệu • Khởi tạo và gửi bản tin BYE. • Nhận bản tin 200 OK cho BYE, kết thúc phiên. Client Server INVITE 100 Trying 180 Ringing 200 OK ACK Media BYE 200 OK Hình 5.4. Quá trình thực hiện gọi đi 70 Bắt đầu Khởi tạo và gửi INVITE Khởi tạo và gửi BYE Nhận phúc đáp 200 OK? Kết thúc Y N Khởi tạo và gửi ACK Trao đổi dữ liệu Hình 5.5 Thuật toán gọi đi Kết thúc? Nhận 200 OK N Y 71 5.5. Chờ gọi đến và trả lời Quy trình chờ gọi đến và trả lời như sau: • Mở kết nối để chờ yêu cầu gửi đến. • Nhận yêu cầu INVITE. • Khởi tạo và gửi phúc đáp 180 và 200 OK. • Chờ nhận yêu cầu ACK :phiên được khởi tạo. • Trao đổi dữ liệu. • Chờ nhận yêu cầu BYE: phiên kết thúc. • Gửi phúc đáp 200 OK Client Server INVITE Open connection 180 Ringing 200 OK ACK Media BYE 200 OK Hình 5.6. Quá trình thực hiện trả lời cuộc gọi đến 72 Bắt đầu Nhận bản tin Gửi 200 OK Gửi 180 Ringing Kết thúc Nhận bản tin Trao đổi dữ liệu Hình 5.7 Thuật toán trả lời cuộc gọi đến BYE? Mở kết nối Gửi 200 OK INVITE? ACK? Y N Y N Nhận bản tin Y N 73 5.6. Tạo project đóng gói chương trình Sau khi viết xong mã nguồn, sử dụng J2ME Wireless Toolkit để lập dự án đóng gói chương trình. Trước hết ta khởi động chương trình KToolbar. Đặt tên dự án là “SIP”. Sau đó copy các file nguồn vào thư mục \SIP\src\. Tiến hành biên dịch và tiền xác minh các file nguồn này bằng cách chọn Project → Package → Create Package. Trong quá trình dịch nếu có lỗi thì phải sửa lỗi ở các file nguồn. Sau khi dịch và tiền xác minh xong bộ công cụ sẽ tạo ra các file JAD, JAR và lưu trữ vào thư mục \SIP\bin\. 5.7. Mô phỏng Sau khi đóng gói chương trình thì chạy trương trình mô phỏng trên máy tính. Hình mô phỏng như ở hình 5.8: Hình 5.8. Mô phỏng điện thoại di động 74 KẾT LUẬN Luận văn đã thực hiện được những vấn đề sau: 1. Tìm hiểu về J2ME, SIP, tìm được các điểm mạnh, điểm yếu, so sánh với các công nghệ tương tự. 2. Ứng dụng xây dựng một chương trình có tính năng: a. Đăng nhập vào mạng SIP. b. Thực hiện khởi tạo một phiên để gọi đến một thiết bị SIP khác. c. Trả lời khi có một cuộc gọi từ thiết bị SIP khác đến. 3. Phân tích, đánh giá, tổng hợp tạo ra một qui trình xây dựng các ứng dụng dựa trên J2ME và các giao thức truyền thông. Hướng nghiên cứu tiếp theo là mở rộng framework về giao thức truyền tải thời gian thực (RTP- Real-time Transport Protocol) và thực hiện RTP bằng J2ME. Một lần nữa em xin chân thành cảm ơn thầy giáo TS Hà Quốc Trung tận tình hướng dẫn em trong quá trình thực hiện luận văn. Đồng thời em cũng xin cảm ơn bạn bè, đồng nghiệp đã hỗ trợ em trong quá trình thực hiện luận văn này. Nếu có gì thiếu sót em rất mong được các thầy cô giáo và các bạn đồng nghiệp chỉ bảo.
File đính kèm:
- Luận văn Lập trình SIP cho thiết bị di động bằng Java.pdf