Ngày nay công nghệ thông tin di động đang phát triển. Các máy điện thoại di động ngoài việc thực hiện chức năng thoại bình thường còn được tích hợp thêm nhiều tính năng khác như cho phép người sử dụng có thể cài đặt thêm chương trình. Hãng Sun MicroSystem đã phát triển phần mềm Java cho lập trình di động (J2ME) mà hiện nay nhiều nhà sản xuất thiết bị đã tích hợp vào. Song song với thông tin di động thì mạng IP cũng đang phát triển nhanh chóng. Đã có nhiều nhà cung cấp dịch vụ thoại qua mạng IP nhưng thoại qua mạng IP sử dụng thiết bị đầu cuối di động còn ít. Giao thức điều khiển báo hiệu phiên (SIP) là một giao thức báo hiệu đơn giản nhưng có khả năng cao để điều khiển báo hiệu trong mạng IP.
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI LUẬN VĂN THẠC SỸ KHOA HỌC LẬP TRÌNH SIP CHO THIẾT BỊ DI ĐỘNG BẰNG JAVA NGÀNH : XỬ LÝ THÔNG TIN VÀ TRUYỀN THÔNG MÃ SỐ: TRẦN XUÂN THẢO Người hướng dẫn khoa học: TS HÀ QUỐC TRUNG HÀ NỘI 2006 MỤC LỤC Trang Trang Lời cam đoan Mục lục Danh mục chữ viết tắt Danh mục hình vẽ MỞ ĐẦU 10 Chương – 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 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 tin SIP 14 1.4.1 Các tin yêu cầu 14 1.4.2 Các 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 SIP điển hình 1.7.1 Đăng ký 23 23 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 ghi 25 1.8 So sánh SIP H.323 26 Chương - CƠ BẢN VỀ LẬP TRÌNH CHO THIẾT BỊ DI 29 ĐỘNG BẰNG JAVA 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 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 32 Framework) 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 thiết bị 34 2.7 MIDLET 34 2.7.1 Cơ MIDlet 34 2.7.1.1 Quản lý ứng dụng 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 MIDlet 37 2.7.3 Tạo MIDlet 38 2.7.4 MIDlet API 39 2.7.5 Giao tiếp từ quản lý ứng dụng 39 2.7.6 Giao tiếp tới quản lý ứng dụng 40 2.7.7 Truy vấn thuộc tính MIDlet 40 Chương - 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ụ công cụ 41 3.1.2 Đặc điểm công cụ 41 3.1.3 Các công nghệ hỗ trợ 42 3.2 Phát triển 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 project 45 3.3.1 Lựa chọn API 45 3.3.2 Thay đổi thuộc tínhcủa 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 thư viện bên thứ ba 46 3.3.5.1 Các thư viện bên thứ ba cho project 47 3.3.5.2 Các thư viện bên thứ ba cho tất project 47 3.4 An toàn đá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 MIDlet 49 3.4.4 Quản lý khóa 49 3.4.4.1 Tạo cặp khóa 49 3.4.4.2 Nhận khóa thực 51 Chương - 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 - LẬP CHƯƠNG TRÌNH 63 5.1 Điều kiện thực 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 69 5.5 Chờ gọi đến trả lời 71 5.6 Tạo project đóng gói chương trình 73 5.7 Mơ 73 KẾT LUẬN 74 TÀI LIỆU THAM KHẢO 75 10 MỞ ĐẦU Ngày công nghệ thông tin di động phát triển Các máy điện thoại di động việc thực chức thoại bình thường cịn tích hợp thêm nhiều tính khác cho phép người sử dụng cài đặt thêm chương trình Hãng Sun MicroSystem phát triển phần mềm Java cho lập trình di động (J2ME) mà nhiều nhà sản xuất thiết bị tích hợp vào Song song với thơng tin di động mạng IP phát triển nhanh chóng Đã có nhiều nhà cung cấp dịch vụ thoại qua mạng IP thoại qua mạng IP sử dụng thiết bị đầu cuối di động Giao thức điều khiển báo hiệu phiên (SIP) giao thức báo hiệu đơn giản có khả cao để điều khiển báo hiệu mạng IP Trong q trình học cao học ngành xử lý thơng tin truyền thông, em tâm đắc với môn học lập trình hệ phân tán thầy giáo, TS Hà Quốc Trung Do em định chọn đề tài “Lập trình SIP cho thiết bị di động Java” 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 trình thực luận văn Em xin cảm ơn bạn bè, đồng nghiệp hỗ trợ em trình thực luận văn Luận văn gồm chương: Chương nghiên cứu giao thức điều khiển báo hiệu phiên (SIP) Chương nghiên cứu lập trình cho thiết bị di động Chương nghiên cứu sử dụng công cụ để phát triển MIDlet Chương nghiên cứu giao diện ứng dụng chương trình SIP Chương lập chương trình SIP có chức đăng nhập, gọi đến thiết bị SIP khác, chờ trả lời gọi từ thiết bị SIP khác đến 11 CHƯƠNG 1: GIAO THỨC ĐIỀU KHIỂN PHIÊN (SIP) 1.1 Khái niệm SIP giao thức lớp ứng dụng thiết kế phát triển IETF Đặc tả SIP có vài RFC, quan trọng RFC 3261 SIP giao thức báo hiệu cho điều khiển phiên đa phương tiện Nói cách khác, SIP cung cấp cách thiết lập truyền thông thoại, video tin nhắn thiết bị SIP dựa HTTP (Hyper Text Transfer Protocol – giao thức truyền siêu văn bản) SIP giao thức Client/Server, yêu cầu bên gọi (client) đưa bên bị gọi (server) trả lời 1.2 Các đặc điểm SIP • Tính di động: SIP cho phép client vị trí cố định bất kỳ, gọi định tuyến tới sử dụng địa biết địa email • Cấu trúc tin mềm dẻo: tin SIP có dạng văn (text) làm cho dễ dàng mở rộng thêm ứng dụng • Phân tán chức thiết bị: SIP cho phép yêu cầu định tuyến động qua thiết bị khác nhau, cho phép chức phân tán yêu cầu định tuyến qua thiết bị liên quan • Sự thỏa thuận tính hỗ trợ: điều làm cho SIP thích nghi mở rộng phương tiện giao thức sử dụng cho gọi riêng biệt thỏa thuận client gọi Kết SIP thiết lập kiểu hội thoại bao gồm thoại, video, tin nhắn • Tách riêng báo hiệu thông tin: SIP đường báo hiệu thơng tin hồn tồn độc lập 12 • Sự chia nhánh: điều cho phép thiết bị liên kết với địa đơn, tất lựa chọn thiết bị liên lạc đồng thời tùy thuộc sách địa phương 1.3 Các phần tử mạng SIP 1.3.1 User agent (UA) UA thiết bị đầu cuối mạng SIP UA máy tính cài phần mềm SIP, điện thoại SIP, điện thoại di động, PDA … UA thường đề cập tới UA server (UAS) UA client (UAC) UAS UAC thực thể logic, UA chứa UAS UAC UAC phần UA mà gửi yêu cầu nhận trả lời UAS phần UA mà nhận yêu cầu gửi trả lời 1.3.2 Proxy Server Proxy server thiết bị trung gian UA Proxy server chuyển yêu cầu trả lời UA Có loại proxy server proxy server trạng thái (stateful) proxy server không trạng thái (stateless) 1.3.2.1 Proxy server không trạng thái Proxy server không trạng thái đơn giản chuyển tiếp tin Nó chuyển tiếp tin độc lập với Mặc dù tin xếp vào giao dịch khơng quan tâm đến giao dịch Proxy server không trạng thái đơn giản nhanh proxy server trạng thái Một hạn chế proxy server không trạng thái khơng có khả truyền lại tin thực định tuyến phức tạp ví dụ chia nhánh 13 1.3.2.2 Proxy server trạng thái Proxy server trạng thái phức tạp Khi nhận yêu cầu, proxy server tạo trạng thái, trạng thái trì kết thúc phiên giao dịch Một số giao dịch, đặc biệt giao dịch tạo “INVITE” kéo dài lâu (đến bị gọi nhấc máy từ chối gọi) Bởi máy chủ phải quản lý trạng thái suốt thời gian giao dịch nên thực thi bị giới hạn Khả liên kết tin SIP vào giao dịch làm cho proxy server có số tính thú vị Proxy server thực việc chia nhánh, tức nhận tin hai hay nhiều tin khác gửi Proxy server thực việc truyền lại tin từ trạng thái giao dịch biết nhận tin chưa Proxy server thực phương pháp phức tạp để tìm kiếm người sử dụng, ví dụ máy người sử dụng quan khơng trả lời chuyển gọi đến máy di động người Hầu hết SIP proxy trạng thái cấu hình chúng thường phức tạp 1.3.3 Registrar server Registrar server thiết bị nhận yêu cầu đăng ký lưu trữ thông tin người sử dụng 1.3.4 Redirect server Redirect server thiết bị nhận tin yêu cầu gửi trả lại tin trả lời chứa danh sách vị trí người sử dụng 14 1.4 Các tin SIP Truyền thông sử dụng SIP (thường gọi báo hiệu) bao gồm dãy tin Các tin truyền độc lập mạng Thông thường tin truyền gam liệu UDP Mỗi tin bao gồm phần dòng đầu tiên, phần đầu đề phần thân tin Phần dòng loại tin Có hai loại tin SIP Bản tin yêu cầu sử dụng để khởi tạo số hành động báo cho người nhận yêu cầu Bản tin trả lời để xác nhận yêu cầu nhận xử lý chứa trạng thái việc xử lý 1.4.1 Các tin yêu cầu • INVITE : tin sử dụng để thiết lập phiên Ví dụ tin INVITE sau: INVITE sip:7170@iptel.org SIP/2.0 Via: SIP/2.0/UDP 195.37.77.100:5040;rport Max-Forwards: 10 From: "jiri" ;tag=76ff7a07-c091-4192-84a0d56e91fe104f To: Call-ID: d10815e0-bf17-4afa-8412-d9130a793d96@213.20.128.35 CSeq: INVITE Contact: User-Agent: Windows RTC/1.0 Proxy-Authorization: Digest username="jiri", realm="iptel.org", algorithm="MD5", uri="sip:jiri@bat.iptel.org", nonce="3cef753900000001771328f5ae1b8b7f0d742da1feb5753c", response="53fe98db10e1074 b03b3e06438bda70f" 60 4.10 SipHeader Khai báo: public class SipHeader java.lang.Object | + javax.microedition.sip.SipHeader SipHeader cung cấp trợ giúp phân tích đầu đề SIP chung Lớp sử dụng để phân tích giá trị đầu đề ký tự tối thiểu mà đọc từ tin SIP sử dụng phương thức SipConnection.getHeader().SipHeader lớp trợ giúp riêng rẽ không bắt buộc sử dụng cho tạo kết nối SIP Do SIP headers xây dựng với lớp SipHeader sử dụng khn dạng chung để phân tích giá trị header tham số 4.11 SipAddress Khai báo: public class SipAddress java.lang.Object | + javax.microedition.sip.SipAddress SipAddress cung cấp phân tích địa SIP chung Các địa hợp lệ xây dựng với lớp SipAddress có u cầu chức sau: • SipAddress không tránh chuỗi ký tự địa • SipAddress bỏ qua phần đầu đề SIP URI • Khuôn dạng hợp lệ SipAddress giống định nghĩa SIP BNF cho URI tuyệt đối • Địa Contact hợp lệ “*” chấp nhận SipAddress Trong trường hợp thuộc tính null số cổng 61 4.12 SipRefreshHelper Khai báo: public class SipRefreshHelper java.lang.Object | + javax.microedition.sip.SipRefreshHelper Lớp thực chức làm cho thuận tiện việc làm tươi yêu cầu ứng dụng số yêu cầu SIP (REGISTER, SUBSCRIBE, ) cần phải làm tươi lúc Ví dụ yêu cầu REGISTER cần phải gửi lại để đảm bảo điểm khởi tạo hoạt động Tính hợp lệ yêu cầu đề điểm cuối yêu cầu xác nhận phúc đáp registrar/notifier ví dụ expires header Việc xử lý làm tăng đáng kể độ phức tạp kích thước chương trình SipRefreshHelper đwocj sử dụng để làm cho dễ dàng công việc Khi ứng dụng muốn gửi u cầu làm tươi sẽ: • Thực SipRefreshListener gọi lại giao diện • Tạo SipClientConnection thiết lập • Gọi phương thức enableRefresh(SipRefreshListener) • Nếu cơng việc làm tươi bị lỗi kiện lỗi gửi đến SipRefreshListener Một tham chiếu tới đối tượng SipRefreshHelper thu cách gọi phương thức tĩnh SipRefreshHelper.getInstance() Cuối sử dụng mã làm tươi từ enableRefresh(SipRefreshListener) ứng dụng có thể: • Dừng làm tươi: liên kết điểm cuối server bị hủy bỏ • Cập nhật làm tươi với tham số 62 4.13 SipRefreshListener Khai báo: public interface SipRefreshListener SipRefreshListener giao diện nghe kiện RefreshHelpe Giao diện định nghĩa kiện mà chứa refreshID để nhận dạng công việc làm tươi tương ứng, statusCode diễn tả kết trình làm tươi (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 cho yêu cầu nguyên thủy gửi SipRefreshHelper reasonPhrase cho tin nguyên thành công hay không công việc làm tươi 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ớp ngoại lệ cho lỗi cụ thể SIP Ngoại lệ bao gồm tin lỗi nguyên khuôn dạng tự mã lỗi để phân loại lỗi 63 CHƯƠNG : LẬP CHƯƠNG TRÌNH 5.1 Điều kiện thực chương trình Để thực chương trình cần phải có điều kiện sau: • Thiết bị di động phải có cài đặt CLDC MIDP Hiện loại điện thoại di động phổ biến cài đặt CLDC 1.1 MIDP 2.0 Ngồi thiết bị phải có kkhả kết nối mạng, có đủ nhớ để cài đặt thực chương trình • Đã có SIP server (proxy server, registrar server, redirect server) • Có tài khoản SIP server 5.2 Thuật tốn chương trình Các bước thuật tố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ó gọi đến trả lời khơng trả lời • Nếu muốn gọi chuyển sang chế độ gọi • Nếu đến thời gian phải làm tươi thực lại đăng nhập tới server • Nếu muốn kết thúc chương trình đóng chương trình giải phóng nhớ 64 Bắt đầu Đăng nhập Chờ Y Gọi Gọi đi? N Có gọi đến? Trả lời N Làm tươi? N N Kết thúc? Y Kết thúc Hình 5.1 Lưu đồ thuật toán Y 65 5.3 Đăng nhập SIP Khi bắt đầu chạy, chương trình phải thực đăng nhập vào mạng SIP cách gửi tin REGISTER Trước tiên phải nhập tên mật Các bước thực 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 gửi yêu cầu REGISTER đến server + Ứng dụng gọi receive( ) để đợi phúc đáp + Nếu tên mật khơng hợp lệ SIP server gửi phúc đáp “401 Unauthorized” Nếu hợp lệ 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 phương thức close( ) Bắt đầu Khởi tạo REGISTER Gửi yêu cầu Nhận phúc đáp Hợp lệ? N Y Kết thúc Hình 5.2 Thuật tốn đăng nhập SIP 66 Hình 5.3 Q trình thực đă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 Quy trình gọi sau: • Khởi tạo gửi tin INVITE • Nhận tin phúc đáp tạm thời 100, 180 nhận tin cuối 200 OK • Khởi tạo gửi tin ACK để thiết lập phiên • Trao đổi liệu • Khởi tạo gửi tin BYE • Nhậ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 gọi 70 Bắt đầu Khởi tạo gửi INVITE Nhận phúc đáp 200 OK? N Y Khởi tạo gửi ACK Trao đổi liệu Kết thúc? N Y Khởi tạo gửi BYE Nhận 200 OK Kết thúc Hình 5.5 Thuật tốn gọi 71 5.5 Chờ gọi đến trả lời Quy trình chờ gọi đến trả lời 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 gửi phúc đáp 180 200 OK • Chờ nhận yêu cầu ACK :phiên khởi tạo • Trao đổi 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 Open connection INVITE 180 Ringing 200 OK ACK Media BYE 200 OK Hình 5.6 Quá trình thực trả lời gọi đến 72 Bắt đầu Mở kết nối Nhận tin N INVITE? Y Gửi 180 Ringing Gửi 200 OK Nhận tin N ACK? Y Trao đổi liệu Nhận tin N BYE? Y Gửi 200 OK Kết thúc Hình 5.7 Thuật tốn trả lời gọi đến 73 5.6 Tạo project đóng gói chương trình Sau 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 “SIP” Sau copy file nguồn vào thư mục \SIP\src\ Tiến hành biên dịch tiền xác minh file nguồn cách chọn Project → Package → Create Package Trong q trình dịch có lỗi phải sửa lỗi file nguồn Sau dịch tiền xác minh xong công cụ tạo file JAD, JAR lưu trữ vào thư mục \SIP\bin\ 5.7 Mơ Sau đóng gói chương trình chạy trương trình mơ máy tính Hình mơ hình 5.8: Hình 5.8 Mơ điện thoại di động 74 KẾT LUẬN Luận văn thực vấn đề sau: Tìm hiểu J2ME, SIP, tìm điểm mạnh, điểm yếu, so sánh với công nghệ tương tự Ứng dụng xây dựng chương trình có tính năng: a Đăng nhập vào mạng SIP b Thực khởi tạo phiên để gọi đến thiết bị SIP khác c Trả lời có gọi từ thiết bị SIP khác đến Phân tích, đánh giá, tổng hợp tạo qui trình xây dựng ứng dụng dựa J2ME giao thức truyền thông Hướng nghiên cứu mở rộng framework giao thức truyền tải thời gian thực (RTP- Real-time Transport Protocol) thực RTP J2ME Một lần 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 trình thực luận văn Đồng thời em xin cảm ơn bạn bè, đồng nghiệp hỗ trợ em q trình thực luận văn Nếu có thiếu sót em mong thầy giáo bạn đồng nghiệp bảo ... server SipDialog SipDialog mô tả SIP Dialog SipRefreshListener Giao di? ??n nghe kiện RefreshHelpe SipServerConnection SipServerConnection mô tả giao dịch SIP server SipServerConnectionListener Giao di? ??n... thực luận văn Em xin cảm ơn bạn bè, đồng nghiệp hỗ trợ em trình thực luận văn Luận văn gồm chương: Chương nghiên cứu giao thức điều khiển báo hiệu phiên (SIP) Chương nghiên cứu lập trình cho thiết. .. thiết bị di động Chương nghiên cứu sử dụng công cụ để phát triển MIDlet Chương nghiên cứu giao di? ??n ứng dụng chương trình SIP Chương lập chương trình SIP có chức đăng nhập, gọi đến thiết bị SIP