d Về tính ổn định trong việc truyền dữ liệu cũng như khi sử dụng ứng dụng - Tính ổn định một phần dựa vào phần cứng, bao gồm: o Độ mạnh của tín hiệu wireless, bluetooth o Khả năng xử lý
Trang 1ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ PHẦN MỀM
KHOÁ LUẬN/ĐỒ ÁN TỐT NGHIỆP
ĐỀ TÀI: XÂY DỰNG ỨNG DỤNG GIẢ LẬP
GAMEPAD TRÊN ANDROID
Giảng viên hướng dẫn : Th.S NGUYỄN TRÁC THỨC
Sinh viên thực hiện: NGUYỄN LÊ ANH
Lớp : CNPM02
Khoá : 2
TP Hồ Chí Minh, 28 tháng 06 năm 2012
Trang 2LỜI MỞ ĐẦU
Hiện nay, ngành công nghiệp điện toán và công nghệ thông tin đã có những bước phát triển vượt bậc Việc ứng dụng công nghệ thông tin vào đời sống thường ngày là một việc không thể thiếu trong xã hội hiện đại ngày nay
Cũng vào ngày nay, thị trường đang chứng kiến sự lên ngôi của công nghiệp di động Hàng loạt smartphone mới được ra đời, những hệ điều hành mới liên tục được ra mắt Bối cảnh đó, những phần mềm dựa trên nền tảng di động ngày một nhiều và đáp ứng được với yêu cầu của đa số người dùng
Đề tài khoá luận tốt nghiệp này cũng đề cập tới việc phát triển ứng dụng trên nền tảng di động, quan trọng hơn đó là việc áp dụng công nghệ không dây vào phục vụ cho mục đích giải trí của con người Đó là việc giả lập một chiếc gamepad không dây dựa trên hệ thống điện thoại di động thông minh để chơi những game phổ biến trên máy tính
cá nhân Xa hơn nữa, đề tài khoá luận muốn chỉ ra những công nghệ không dây, và việc
áp dụng những công nghệ không dây đó vào việc tạo ra những ứng dụng tương tự, phục
vụ cho mục đích làm cho cuộc sống con người thoải mái hơn
Trang 3LỜI CẢM ƠN
Nghiên cứu công nghệ mới lúc nào cũng là một sự thử thách đối với bản thân tác giả Nghiên cứu một lĩnh vực hoàn toàn mới đó là truyền dẫn dữ liệu trên nền tảng di động thì thực sự là một khó khăn lớn
Tuy nhiên, trong quá trình thực hiện, tác giả đã nhận được sự giúp đỡ rất lớn đến
từ thầy cô, bạn bè, đồng nghiệp trong công ty và gia đình để hoàn thành đề tài này
Đầu tiên, em xin gửi lời cảm ơn chân thành nhất tới Th.S Nguyễn Trác Thức Thầy là người đã nhận hướng dẫn em từ khi em nêu ra ý tưởng về đề tài khoá luận, cũng
là người đã tận tình hướng dẫn em trong suốt quá trình làm khoá luận
Tiếp theo em xin cảm ơn đến các thầy cô trong trường đại học Công Nghệ Thông Tin – Đại học Quốc Gia thành phố Hồ Chí Minh, trong suốt 4,5 năm học ở trường đã trang bị cho em đầy đủ kiến thức để có thể hoàn thành đề tài khoá luận tốt nghiệp, vốn bao gồm rất nhiều kiến thức được học tại trường
Tác giả cũng xin cảm ơn tới các bạn cùng khoá, những anh chị đồng nghiệp đã giúp đỡ tận tình về kiến thức, công nghệ, là những người bạn luôn đi sát tiến độ thực hiện
đề tài khoá luận này
Con cũng xin gửi lời cảm ơn tới gia đình, đã luôn hỗ trợ động viên con cả về vật chất lẫn tinh thần trong suốt thời gian con làm đề tài khoá luận, cũng như thời gian học ở trường đại học
Cuối cùng, tác giả cảm ơn bản thân, đã thật sự rất cố gắng để vừa hoàn thành tốt được nhiệm vụ học những môn còn lại ở trường, vừa hoàn thành tốt nhiệm vụ ở công ty
và cũng hoàn thành xong bài khoá luận tốt nghiệp Đây cũng là sự cố gắng vượt bậc của tác giả trong suốt quá trình thực hiện đề tài tốt nghiệp
Trang 4NHẬN XÉT (Của giảng viên hướng dẫn)
………
………
………
……….………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
Trang 5NHẬN XÉT (Của giáo viên phản biện)
………
………
………
……….………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
Trang 6MỤC LỤC
Chương 1:Giới thiệu đề tài 1
I/ Mở đầu 1
1.Giới thiệu về tình hình phát triển ứng dụng điện toán hiện nay 1
2.Những tiện ích mà lập trình trên nền tảng di động mang lại 2
3.Giới thiệu về đề tài khoá luận, mục tiêu, phạm vi nghiên cứu và ứng dụng 3
II/ Các phương pháp tiến hành nghiên cứu đề tài 7
1.Lên kế hoạch nghiên cứu 7
2.Đánh giá kết quả nghiên cứu đạt được 11
Chương 2:Cơ sở lý thuyết 12
I/ Mô hình Client – Server giữa PC và điện thoại 12
II/ Lý thuyết về xử lý dữ liệu, truyền dữ liệu qua giao thức Wireless, các kĩ thuật mã hoá tín hiệu trên đường truyền 13
1.Lý thuyết mạng, các vấn đề trong truyền tải package trong mạng Lan 13
2.Xử lý đa luồng, xử lý thời gian thực trong việc gửi / nhận tín hiệu bằng ngôn ngữ Java 20
3.Xử lý đa luồng, xử lý thời gian thực trong việc gửi / nhận tín hiệu bằng ngôn ngữ C# (nền tảng NET framework) 25
4.Giao thức truyền, mã hoá tín hiệu gửi / nhận 27
5.Các vấn đề gặp phải trên phần cứng thiết bị chạy 29
III/Lý thuyết về xử lý dữ liệu, truyền dữ liệu qua giao thức Bluetooth, các kĩ thuật mã hoá tín hiệu trên đường truyền 30
1.Giới thiệu về Bluetooth 30
2.Cách thức xử lý dữ liệu trên hệ thống sử dụng Bluetooth 32
Trang 73.Cách thức truyền dẫn dữ liệu thông qua mạng Bluetooth bằng ngôn ngữ Java trên
nền tảng Android 34
4.Cách thức truyền dẫn dữ liệu thông qua mạng Bluetooth bằng ngôn ngữ C# trên nền tảng Windows 39
5.Một số lưu ý về xử lý thời gian thực đối với tin hiệu gửi / nhận bằng giao thức Bluetooth 41
6.Các vấn đề gặp phải trên phần cứng của thiết bị chạy 42
IV/Các vấn đề cần xử lý khi thực hiện Server giả lập Gamepad 43
1.Giao thức chương trình 43
2.Xử lý nhiều luồng dữ liệu ra vào 45
3.Hạn chế thắt cổ chai trong truyền tải thông tin 47
V/ Một số kĩ thuật lập trình khác được sử dụng trong chương trình 49
1.Tạo Preference để hiển thị các tuỳ chọn 49
2.Tạo một Custom View trên Android 52
Chương 3:Phân tích thiết kế chương trình 55
I/ Phân tích yêu cầu hệ thống 55
1.Các yêu cầu về giao diện của ứng dụng Client - Slide 55
2.Các yêu cầu về giao diện của ứng dụng Server – Slide 55
3.Danh sách các chi tiết các quy định của ứng dụng Client – Slide 55
4.Danh sách các chi tiết các quy định của ứng dụng Server – Slide 56
5.Đặc tả các yêu cầu phần mềm 57
II/ Kiến trúc hệ thống 65
1.Chương trình xây dựng phía Server 65
2.Chương trình xây dựng phía Client 66
3.Giao thức kết nối 66
Trang 84.Giao thức liên lạc Server – Client 66
5.Thông điệp giao tiếp Client – Server 67
III/Thiết kế hệ thống 69
1.Thiết kế Client 69
2.Thiết kế Server 74
3.Sơ đồ tuần tự kết nối 78
Chương 4:Thử nghiệm, đánh giá chương trình 80
I/ Chạy thử nghiệm 80
1.Ảnh chụp màn hình 80
2.Thiết bị chạy thử nghiệm 83
II/ Đánh giá chương trình 85
1.Đánh giá chung 85
2.So sánh giữa kết nối Bluetooth và Wireless trong hệ thống 85
3.Chạy nhiều máy cùng lúc 85
4.Giao diện, tính tiện dụng 85
III/Kết luận 86
1.Những mục tiêu đã đạt được 86
2.Vấn đề còn tồn tại 86
IV/Hướng phát triển 87
Trang 9DANH MỤC CÁC BẢNG, SƠ ĐỒ, HÌNH
Hình: 2.1 Mô hình Client – Server của đề tài 12
Bảng 2.1: Các lớp trong mô hình OSI 14
Hình 2.2: Các tầng của giao thức TCP/IP so với cấc tầng của mô hình OSI 16
Hình 2.3: TCP và UDP trong mô hình OSI 17
Bảng 2.2: Tên dịch vụ phổ biến và các cổng tương ứng 18
Hình 2.4: Các loại Socket 20
Hình 2.5: Minh hoạ vòng đời của một Thread trong Java 22
Hình 2.6: Các bước kết nối giữa client – server 27
Hình 2.7: Logo của giao thức Bluetooth 30
Bảng 2.2: đánh giá về RFCOMM và L2CAP 34
Hình 2.8: Logo của thư viện 32feet.NET 39
Hình 2.9: Các bước kết nối trong giao thức liên lạc Client – Server 43
Hình 2.10: Minh hoạ hiện tượng thắt cổ chai dữ liệu 47
Hình 2.11: Tạo một Preference trong Android 50
Hình 3.1: Mô hình kiến trúc hệ thống Gamepad 65
Hình 3.2: Minh hoạ giao thức liên lạc Client – Server trong hệ thống 67
Hình 3.3: Cấu trúc thông điệp truyền tải 67
Hình 3.4: Liên kết các lớp trong Gamepad Client 69
Hình 3.5: Liên kết các lớp xử lý chính 70
Hình 3.6: Liên kết xử lý chính trong chương trình 71
Hình 3.7: Luồng hoạt động của Client 73
Hình 3.8: Sơ đồ tuần tự minh hoạ hoạt động của Client 74
Hình 3.8: Sơ đồ các lớp liên quan trong Gamepad Server 75
Hình 3.9: Luồng xử lý giao thức của Server trong chương trình 76
Hình 3.10: Sơ đồ tuần tự minh hoạ hoạt động của Server 77
Hình 3.11: Sơ đồ luồng dữ liệu kết nối Gamepad Client – Server 78
Hình 3.12: Sơ đồ luồng dữ liệu chuyển đi khi đã được kết nối Client – Server 79 Hình 4.1: Giao diện gamepad 80
Hình 4.2: Tuỳ chọn kết nối bằng Wireless 81
Hình 4.3: Tuỳ chọn kết nối bằng Bluetooth 82
Hình 4.4: Tuỳ chọn tinh chỉnh bàn phím 82
Hình 4.5: Danh sách các phím được hỗ trợ 83
Trang 10Phụ lục
Sơ đồ Gantt quá trình thực hiện đề tài khoá luận
Trang 11Chương 1: Giới thiệu đề tài
I/ Mở đầu
1 Giới thiệu về tình hình phát triển ứng dụng điện toán hiện nay
Xu hướng sử dụng các loại ngôn ngữ kịch bản, lưu trữ đám mây và nguồn
mở đang là mảnh đất màu mỡ dành cho các nhà phát triển phần mềm để tạo ra nhiều ứng dụng trên điện thoại thông minh (smartphone)
1.1 Điện thoại thông minh
Sau một thời gian dài máy tính để bàn (desktop) chiếm ưu thế, thì giờ đây
nó đã nhường lại ngôi vị quán quân cho các thiết bị di động Nguyên nhân của sự chuyển dịch có thể do các thiết bị di động như smartphone, máy tính xách tay (laptop), netbook (máy tính sổ tay), smartbook (máy sổ tay thông minh) có tính di động, nhỏ gọn hơn và giá thành xấp xỉ với desktop Một điều quan trọng nữa, các ứng dụng thuờng thấy trên desktop cũng dần xuất hiện trên smartphone, mặc dù cấu hình của smartphone có thể chưa sánh bằng desktop Thậm chí ngay cả dân viết blog quen sử dụng các ngón tay cái gõ “lọc cọc” ở các trang Twitter, Facebook… nay cũng chuyển sang dùng trên smartphone hay smartbook Song song đó, các nhà phát triển đã chuyển hướng phát triển sang các máy tính bỏ túi với kích thước nhỏ, chạy trên HĐH Android của Google, WebOS của Palm, Symbian của Nokia
Đặc biệt, sự nổi lên nhanh chóng của smartphone với các tính năng, các ứng dụng tiếp tục là lực hấp dẫn đối với đa số người tiêu dùng Đơn cử là sự ra mắt của smartphone iPhone Đây có thể được coi là cuộc trình làng thành công nhất của họ tính đến thời điểm này
Trên thực tế, HĐH Android được viết bằng Java và OS X (HĐH của iPhone) dựa trên Objective-C Một ứng dụng thường được các nhà phát triển ưa thích, đó là thư viện mã nguồn mở WebKit (http://webkit.org) Trong đó, HĐH
OS X và Android đều sử dụng trực tiếp thư viện này Mới đây Google quyết định tập trung thời gian phát triển các ứng dụng dành cho smartphone chạy Android dùng HĐH Google Chrome
1.2 Ứng dụng web trên smartphone
Chẳng có gì đáng ngạc nhiên khi bạn cài một ứng dụng nào đó vào máy tính, nhưng trong những năm gần đây và sắp tới, mọi người có thể truy cập các ứng dụng web ngay trên smartphone - hiện được xem là phương tiện có nhiều ưu thế hơn bao giờ hết
Trang 12Ứng dụng web cho phép các chương trình liên kết mọi người đến một cơ
sở dữ liệu tập trung được lưu trên Internet Nghĩa là cho phép bạn xử lý văn bản ngay trên web mà không cần phải lưu dữ liệu trên đĩa cứng nữa
Dù khuynh hướng này vẫn chưa phổ biến so với việc lưu trữ trên máy tính, nhưng Google đã rất tự tin khi giới thiệu HĐH Chrome (xây dựng trên Linux) thông qua trình duyệt Chrome Sản phẩm này sẽ chính thức có mặt vào giữa năm
2010 Tuy nhiên, bạn phải là một người trung thành với trình duyệt Chrome, vì để
sử dụng được HĐH này chỉ có cách duy nhất là vào trình duyệt Chrome
Khi một ứng dụng nào đó ra đời, các nhà phát triển cũng cần sự trợ giúp
từ các công cụ phát triển phần mềm dù đó có thể là nguồn đóng hay mở Dưới đây
là một vài dự báo về khả năng “tiến xa” của các công cụ, có thể hỗ trợ tốt cho smartphone
2 Những tiện ích mà lập trình trên nền tảng di động mang lại
Tháng 7/2008, Apple ra mắt kho ứng dụng di động trực tuyến đầu tiên với
500 ứng dụng cho các sản phẩm iPhone, iPod Khi đó, thị trường ứng dụng mobile hầu như chưa hề tồn tại Đến nay, App Store đã có hơn 400,000 ứng dụng với 10
tỷ lượt tải về, dẫn đầu ngành về dịch vụ ứng dụng cho di động Sau thành công của Apple, các hãng di động nhận thấy tiềm năng của thị trường Mobile Apps đã liên tiếp cho ra mắt kho ứng dụng của mình Tiêu biểu là Ovi Store của Nokia (55,000 ứng dụng, 760 triệu download), Android Market của Google (200,000 ứng dụng, 4,5 tỉ download), App World của Blackberry (30,000 ứng dụng, 3 triệu download/ngày), và mới đây là Huawei Technology - dành cho các nhà mạng di động trên toàn cầu với hơn 80.000 ứng dụng di động/nhạc, phim, e-book cho HĐH Android, Symbian và Windows Mobile Góp vào tổng doanh thu hàng năm ngành lên tới 7 tỷ USD, dự báo sẽ đạt 30 tỷ USD trong 3 năm tới
Tại Việt Nam, một số doanh nghiệp đã xây dựng kho ứng dụng di động riêng như F-Store của FPT, mStore của Tổng công ty Viễn thông Quân đội Viette,
LG Application Mobile của LG hay Nokia Ovi với phiên bản dành cho thị trường Việt Nam VTC Mobile, một trong các đơn vị dẫn đầu thị phần dịch vụ giá trị gia tăng trên di động giai đoạn 2006-2010 tại Việt nam cũng đã hợp tác với Q-mobile
để xây dựng Q-Store, cung cấp các ứng dụng do Việt Nam xây dựng tới hàng triệu người sử dụng Q Mobile
Việt Nam hiện có tới 50 triệu thuê bao di động hoạt động thường xuyên
và nền tảng 3G đã được các nhà mạng triển khai rộng khắp với 69% người sử dụng ở độ tuổi trung bình 15 – 24 tạo nên một thị trường có tốc độ phát triển nhanh chóng và mạnh mẽ
Trang 13Theo dự đoán, ngành công nghiệp ứng dụng mobile toàn cầu sẽ đạt 17.5
tỷ USD và năm 2012 với tốc độ phát triển lượng download hàng năm là 92% Mức lợi nhuận khổng lồ từ ngành phát triển ứng dụng di động đến từ việc bán các ứng dụng cho người dùng (trung bình 1-5 USD) và sử dụng các ứng dụng làm công cụ quảng cáo Theo thông lệ, lợi nhuận từ ứng dụng di động được phân phối theo tỉ lệ bình quân 70% cho người phát triển và 30% còn lại cho chủ sở hữu kho ứng dụng
3 Giới thiệu về đề tài khoá luận, mục tiêu, phạm vi nghiên cứu và ứng dụng
3.1 Giới thiệu đề tài
Ngày nay lập trình trên ứng dụng di động đã trở thành một hướng đi tốt cho những lập trình viên, sinh viên mới ra trường Ứng dụng trên di động ngày một phong phú, lập trình viên khi tham gia viết ứng dụng, ngoài việc có thể làm cho các công ty, ngoài ra có thể phát triển ứng dụng cá nhân để thêm thu nhập
Trên thị trường ứng dụng, các công ty phần mềm cũng đang chuyển hướng từ viết phần mềm trên PC sang viết phần mềm cho điện thoại di động Ứng dụng trên điện thoại di động đã và đang chứng minh lợi thế vượt trội của mình trên lĩnh vựt phần mềm, cả về số lượng người dùng và doanh thu mà phần mềm mang về
Xu hướng hỗ trợ hệ điều hành trên thế giới đã và đang thay đổi Từ khi Apple ra hệ điều hành iOS và Google ra nền tảng Android, người sử dụng đã quan tâm hơn đến phần mềm dành cho di động Trải qua nhiều năm phát triển, ứng dụng trên điện thoại di động dần dần khẳng định được vị trí của mình, và chiếm thị phần ngày càng cao trên thị trường phần mềm thế giới Năm nay, Microsoft cũng đã có bước chuyển mình quan trọng khi để Windows 8 gần như đặt dấu chấm hết cho hệ điều hành dành cho PC Hàng loại các biện pháp kĩ thuật cũng như thương mại nhằm đẩy người dùng đến xu thế sử dụng phần mềm di động một lần nữa chứng tỏ lập trình cho nền tảng di động đã đang và sẽ là hướng
đi cho tương lai
Là một sinh viên sắp ra trường, ai cũng có một hướng đi riêng cho mình, riêng tôi ngày từ năm trước đã hướng cho mình đào sâu vào lĩnh vực lập trình cho thiết bị di động nói chung và lập trình cho nền tảng smart phone và tablet sử dụng
hệ điều hành Android nói riêng Trải qua việc tìm hiểu gần một năm về hệ điều hành mới mẻ này, làm một vài project nho nhỏ, tôi đã quyết định để tài khoá luận của mình khi ra trường sẽ là một ứng dụng chạy trên nền tảng Android Đây vừa
là một thử thách, vừa là một cơ hội để tôi khẳng định lại những kiến thức đã học ở nhà trường, cũng như những kiến thức mà tôi tự nghiên cứu được
Trang 14Qua nhiều project nho nhỏ khi tôi tập làm quen với việc viết ứng dụng trên nền tảng Android, tôi thấy nổi bật lên là khả năng xử lý của những thiết bị di động Ngày nay cấu hình cho điện thoại di động ngày một được nâng cao, nhưng vẫn chưa đạt được sức mạnh của máy tính Vì vậy lập trình trên thiết bị di động đòi hỏi người lập trình viên có kiến thức xử lý CPU và bộ nhớ trong cao hơn hẳn việc lập trình trên desktop Vì vậy trong ý tưởng ban đầu hình thành nên đề tài, tôi
đã hướng đến một ứng dụng đòi hỏi xử lý tốt việc chạy trên smart phone cấu hình yếu
Ý tưởng về đề tài khoá luận đến với tôi khi tôi đang chơi game và thiếu đi một thiết bị hỗ trợ tốt cho việc chơi game, đó là Gamepad Gamepad là gì? Đó là thiết bị phần cứng gắn ngoài giao tiếp qua PC thông qua cổng USB hoặc cổng COM cũ, đóng vai trò như một cần điều khiển với các phím bấm chuyên nghiệp
và hỗ trợ tốt cho việc chơi game Tôi đã nghĩ đến việc tìm một ứng dụng trên Android Market để phục vụ cho việc giả lập một Gamepad trên chiếc smart phone của mình Nhưng khi tìm xuyên suốt Android Market, tôi đã không tìm thấy một phần mềm nào (vào thời điểm đó) phù hợp với nhu cầu của tôi Từ đó ý tưởng về việc làm khoá luận về việc giả lập game pad trên nền tảng Android và giao tiếp không dây với PC đã được hình thành
Trên hết, việc thực hiện đề tài cũng thoả mãn một niềm đam mê rất lớn của tôi, đó là đam mê về game Trong thời gian đi học, tôi đã tìm hiểu rất nhiều về lĩnh vực lập trình game, từ lập trình game trên PC với môn học Lập trình Game, đến lập trình game trên điện thoại Android với môn học Đồ án môn học Vì vậy không có gì tốt hơn việc kết thúc tổng kết những gì mình học ở trường bằng một
đề tài liên quan tới game, không phải là một sản phẩm game mà là một sản phẩm
hỗ trợ chơi game, hỗ trợ trải nghiệm game một cách tốt hơn
Ý tưởng được cụ thể hoá và đánh giá khả năng thành công bằng những nghiên cứu của tôi về công nghệ giả lập game pad, những tài liệu về xử lý thời gian thực từ server sang client Sau khi đã đánh đánh giá toàn diện về tính khả thi của đồ án, cũng như những rủi ro có thể gặp phải, tôi đã trình bày ý tưởng mình cho Thạc sĩ Nguyễn Trác Thức và đã được thầy đồng ý hướng dẫn tôi thực hiện
Trang 15a) Những thiết bị khác đã có những chương trình tương tự khác thay thế
Ví dụ: để giả lập bàn phím và touchpad, ta có chương trình RemoteDroid,
để làm remote điều khiển trình chiếu slide PowerPoint, ta có ShowDirector, trong khi để giả lập 1 chiếc gamepad chơi game trên PC, hầu như ta chưa có chương trình nào
b) Những thách thức đặt ra khi làm chương trình giả lập gamepad
Xử lý thời gian thực
Nếu như giả lập touchpad và làm 1 cái remote điều khiển slide PowerPoint không cần xử lý thời gian thực thì việc giả lập gamepad phụ thuộc rất nhiều và điều này Chơi game và điều khiển nhân vật của mình trong game đòi hỏi phụ thuộc rất nhiều và khả năng xử lý và ra lệnh chính xác của người chơi Vì vậy chương trình đòi hỏi phải xử lý những tín hiệu theo thời gian thực, đáp ứng đủ độ nhạy cần thiết để người chơi sử dụng chương trình và làm giả lập 1 chiếc gamepad chơi game 1 cách thoải mái nhất
Khả năng hiển thị trên màn hình điện thoại thông minh
Khác với gamepad, điện thoại Android còn có khả năng hiển thị trên màn hình cảm ứng Điều này mang đến một lợi thế rất to lớn khi dùng điện thoại để giả lập gamepad Đó là khả năng hiển thị linh hoạt thông tin trong game trên chính màn hình điện thoại Vì vậy, chương trình cần phải có khả năng xử lý gởi nhận dữ liệu đa chiều, cùng 1 lúc có thể gởi nhận thông tin và xử lý hiển thị trên màn hình điện thoại Ngoài ra còn phải xây dựng 1 số hàm API trên máy tính để có thể áp dụng vào game hỗ trợ hiển thị thông tin trên màn hình điện thoại di động
Khả năng xử lý đa luồng hỗ trợ nhiều máy (2 máy trở lên) cùng giả lập gamepad và chơi 1 game
Khác với các thiết bị khác, gamepad có thể cho phép người dùng gắn vào cùng một máy tính 2 hay nhiều gamepad để chơi cùng 1 lúc 2 người chơi có thể cùng chơi Fifa trên cùng 1 máy PC Điều này đặt ra cho ứng dụng 1 khó khăn trong việc xử lý đa luồng dữ liệu từ nhiều máy điện thoại gởi đến cho PC cùng 1 lúc
3.3 Yêu cầu đề tài
- Hỗ trợ nhiều chip điện thoại (ARM, Terga,…), chương trình có thể chạy được trên nhiều loại điện thoại Android khác nhau, nhiều version Android khác nhau
- Giả lập được gamepad trên PC, giả lập phím nhấn trên bàn phím PC
Trang 16- Giao tiếp qua mạng Lan hoặc Bluetooth (ưu tiên qua mạng Lan vì Bluetooth ít máy hỗ trợ)
- Tín hiệu từ chương trình chạy trên Android đáp ứng kịp thời trong game, giảm thiểu độ trễ hoặc tiến tới xử lý thời gian thực
- Hỗ trợ nhiều máy android giả lập cùng một lúc để chơi 1 game
3.4 Phạm vi nghiên cứu
Phạm vi của đề tài khá rộng, trải dài từ việc tổng hợp kiến thức lập trình C# trên Windows đến lập trình Java trên Android Kĩ thuật áp dụng trong đề tài trải dài từ xử lý thời gian thực đến việc truyền dẫn dữ liệu qua mạng Việc giới hạn lại phạm vi nghiên cứu là việc làm cần thiết để tránh đẩy đề tài đến việc phạm
vi quá rộng, nghiên cứu không chuyên sâu và không rút ra được nhiều kiến thức kinh nghiệm thực tiễn xứng đáng với một đề tài khoá luận Vì vậy, ngay khi giai đoạn khởi động dự án, tôi đã giới hạn lại phạm vi của đề tài như sau:
a) Về server slide
- Sử dụng ngôn ngữ C# để thực hiện server –slide Ngôn ngữ C# là ngôn ngữ chính được đào tạo ở trường, và một phần đồ án sử dụng ngôn ngữ C# là để tổng kết lại những gì mình đã được học qua 4 năm
- Hướng đến xử lý chuyên sâu và giao diện đơn giản Vì là server-slide nên tính cụ thể trong giao diện đồ hoạ được yêu cầu không cao Ngược lại, xử lý trên server rất phức tạp, nên việc xử lý bên dưới không thể xem nhẹ
b) Về client-slide
- Sử dụng ngôn ngữ Java để thực hiện client-slide Ngôn ngữ Java cũng
là một ngôn ngữ được đào tạo chính ở trường bên cạnh C# Vì vậy áp dụng Java vào đồ án cũng là để tổng kết lại những kiến thức của ngôn ngữ Java
- Hướng đến xử lý chuyên sâu, tiết kiếm bộ nhớ và vi xử lý
- Giao diện được thiết kế tốt, đảm bảo trực quan và dễ dùng
c) Về giao tiếp giữa server và client
- Sử dụng 2 loại giao tiếp phổ biến là Bluetooth và Wireless Hầu hết những laptop có trang bị kết nối bluetooth Bên cạnh đó kết nối bluetooth cũng rất phổ biến trên điện thoại di động dẫn tới kết nối bằng bluetooth là ưu tiên hàng đầu về giao tiếp giữa server và client
- Wireless là giải pháp đề phòng trong trường hợp bluetooth ở một trong 2 thiết bị không có hoặc không sẵn sàng để kết nối Wireless có lợi hơn bluetooth ở khoảng cách kết nối cao hơn hẳn (nhưng không có nhiều lợi ích trong việc sử dụng gamepad) Nhưng wireless có điểm
Trang 17bất lợi ở khả năng bảo mật không cao, vì vậy phải trang bị thuật toán
mã hoá cho kết nối wireless để tăng cường bảo mật
- Có một bộ giao thức để quy định cách thức giao tiếp giữa server và các máy client Bộ giao thức này phải đủ để thực hiện những thao tác cần có của đồ án, nhưng không quá phức tạp cồng kềnh để thực hiện việc nâng cấp sửa chữa được dễ dàng
d) Về tính ổn định trong việc truyền dữ liệu cũng như khi sử dụng ứng dụng
- Tính ổn định một phần dựa vào phần cứng, bao gồm:
o Độ mạnh của tín hiệu wireless, bluetooth
o Khả năng xử lý phần cứng của client-slide và server-slide
o Một số lý do khác
- Để hạn chế những hạn chế về phần cứng ảnh hưởng đến ứng dụng, phải xử lý những lỗi liên quan tới việc truyền nhận tín hiệu tốt
e) Xử lý đa luồng, hỗ trợ nhiều client-slide
- Hỗ trợ nhiều client cùng kết nối vào server một lúc, tối đa là 4 máy client Hỗ trợ dựa trên nền tảng kĩ thuật multi – threading
- Đảm bảo ổn định và sức mạnh xử lý dựa trên nền tảng Windows khi
xử lý đa luồng
II/ Các phương pháp tiến hành nghiên cứu đề tài
1 Lên kế hoạch nghiên cứu
1.1 Danh sách các nội dung cần nghiên cứu
- Hệ thống lại kiến thức nền tảng về Java
- Hệ thống lại kiến thức nền tảng về C#
- Tìm hiểu về lập trình trên Android
- Tìm hiểu về kĩ thuật multi – threading trên Java
- Tìm hiểu về kĩ thuật multi – threading trên C#
- Tìm hiểu về truyền socket qua mạng Lan bằng Java
- Tìm hiểu về truyền socket qua mạng Lan bằng C#
- Xây dựng demo về gửi tín hiệu giữa Java và C#, về nhận dữ liệu socket bằng Java và C# sử dụng Thread
- Tìm hiểu về việc truyền dữ liệu bằng giao thức Bluetooth
- Tìm hiểu về truyền socket qua Bluetooth bằng Java
- Tìm hiểu về truyền socket qua Bluetooth bằng C#
- Xây dựng demo về gửi tín hiệu giữa Java và C#, về nhận dữ liệu socket Bluetooth bằng Java và C# sử dụng Thread
- Xử lý việc nhận đa luồng bằng nhiều Socket trên C#
Trang 18- Thử nghiệm xây dựng giao diện người dùng trên client Android, thực hiện xử lý ban đầu liên quan tới hiển thị, cảm ứng, cảm ứng đa điểm
- Xây dựng các phương thức, các hàm cơ bản bên phía client Android
- Xây dựng các phương thức, các hàm cơ bản bên phía Server C#
- Tìm hiểu về ứng dụng vJoy, một SDK mã nguồn đóng vào việc ứng dụng giả lập gamepad bằng C# hoặc C++
1.2 Kế hoạch cho việc nghiên cứu kĩ thuật và tiến hành đề tài
Do quy mô đề tài tương đối lớn, lại có một người để làm nên việc sắp xếp thời gian hợp lý để làm đề tài là một việc rất cần thiết Cần thiết hơn là trong tác giả đang đi làm nên chỉ có thể sắp xếp thời gian buổi tối để thực hiện đề tài Vì vậy quy mô mỗi ngày tác giả bỏ ra cho đề tài là từ 1 đến 2h
Sau đây là bản kê chi tiết việc sắp xếp thời gian của tác giả vào việc nghiên cứu và thực hiện đề tài
a) Hệ thống lại kiến thức nền tảng về Java
Thời gian dự kiến: 1 tuần
Kiến thức cần chuẩn bị: OOP, các kiến thức về các hàm xử lý, cách viết các method,…
b) Hệ thống lại kiến thức nền tảng về C#
Thời gian dự kiến: 1 tuần
Kiến thức cần chuẩn bị: OOP, các kiến thức về các hàm xử lý, cách viết các method,…
c) Tìm hiểu về lập trình trên Android
Thời gian dự kiến: 2 tuần
Kiến thức cần chuẩn bị: các kiến thức về lập trình trên nền tảng Android, các phương thức xử lý đặc thù trên lĩnh vực lập trình ứng dụng di động
d) Tìm hiểu về kĩ thuật multi – threading trên Java
Thời gian dự kiến: 1 tuần
Kiến thức cần chuẩn bị: các kĩ thuật về multi-threading, các kĩ thuật liên quan tới đồng bộ hệ thống, tránh xung đột dữ liệu
e) Tìm hiểu về kĩ thuật multi – threading trên C#
Thời gian dự kiến: 1 tuần
Trang 19Kiến thức cần chuẩn bị: các kĩ thuật về multi-threading, các kĩ thuật liên quan tới đồng bộ hệ thống, tránh xung đột dữ liệu
f) Tìm hiểu về truyền socket qua mạng Lan bằng Java
Thời gian dự kiến: 1 tuần
Kiến thức cần chuẩn bị: truyền dẫn dữ liệu bằng socket trên mạng Lan bằng Java ở cả 2 phương thức TCP và UDP, nghiên cứu tính khả thi khi tiến hành chọn 1 trong 2 phương thức đó
g) Tìm hiểu về truyền socket qua mạng Lan bằng C#
Thời gian dự kiến: 1 tuần
Kiến thức cần chuẩn bị: truyền dẫn dữ liệu bằng socket trên mạng Lan bằng C# ở cả 2 phương thức TCP và UDP, nghiên cứu tính khả thi khi tiến hành chọn 1 trong 2 phương thức đó
h) Xây dựng demo về gửi tín hiệu giữa Java và C#, về nhận dữ liệu socket bằng Java và C# sử dụng Thread
Thời gian dự kiến: 2 tuần
Kiến thức cần chuẩn bị: truyền dẫn dữ liệu bằng socket trên mạng Lan bằng Java và C# ở cả 2 phương thức TCP và UDP, nghiên cứu tính khả thi khi tiến hành chọn 1 trong 2 phương thức đó
i) Tìm hiểu về việc truyền dữ liệu bằng giao thức Bluetooth
Thời gian dự kiến: 1 tuần
Kiến thức cần chuẩn bị: các giao thức khi truyền dẫn dữ liệu bằng Bluetooth, quyết định giao thức sẽ được ứng dụng trong khoá luận
j) Tìm hiểu về truyền socket qua Bluetooth bằng Java
Thời gian dự kiến: 1 tuần
Kiến thức cần chuẩn bị: tìm hiểu việc truyền dẫn dữ liệu sử dụng Bluetooth trên nền tảng Android sử dụng ngôn ngữ Java
k) Tìm hiểu về truyền socket qua Bluetooth bằng C#
Thời gian dự kiến: 1 tuần
Kiến thức cần chuẩn bị: tìm hiểu việc truyền dẫn dữ liệu sử dụng Bluetooth trên nền tảng Windows sử dụng ngôn ngữ C#
Trang 20l) Xây dựng demo về gửi tín hiệu giữa Java và C#, về nhận dữ liệu socket Bluetooth bằng Java và C# sử dụng Thread
Thời gian dự kiến: 0.5 tuần
Kiến thức cần chuẩn bị: tìm hiểu việc truyền dẫn dữ liệu sử dụng Bluetooth trên nền tảng Windows sử dụng ngôn ngữ C#
m) Xử lý việc nhận đa luồng bằng nhiều Socket trên C#
Thời gian dự kiến: 1 tuần
Kiến thức cần chuẩn bị: tìm hiểu việc truyền dẫn dữ liệu sử dụng đa luồng trên nền tảng Windows sử dụng ngôn ngữ C#
n) Thử nghiệm xây dựng giao diện người dùng trên client Android, thực hiện xử lý ban đầu liên quan tới hiển thị, cảm ứng, cảm ứng đa điểm
Thời gian dự kiến: 2 tuần
Yêu cầu: xây dựng giao diện ứng dụng Gamepad client trên nền tảng Android, ứng với yêu cầu đề ra
o) Xây dựng các phương thức, các hàm cơ bản bên phía client Android
Thời gian dự kiến: 3 tuần
Yêu cầu: xây dựng các hàm xử lý bên trong chương trình Gamepad client trên nền tảng Android, ứng với yêu cầu đề ra
p) Xây dựng các phương thức, các hàm cơ bản bên phía Server C#
Thời gian dự kiến: 3 tuần
Yêu cầu: xây dựng giao diện, các hàm xử lý bên trong chương trình Gamepad server trên nền tảng Windows, ứng với yêu cầu đề ra
q) Tìm hiểu về ứng dụng vJoy, một SDK mã nguồn đóng vào việc ứng dụng giả lập gamepad bằng C# hoặc C++
Thời gian dự kiến: 3 tuần
Yêu cầu: đặt ra mục tiêu nâng cao xây dựng ứng dụng có thể giả lập hoàn toàn gamepad, từ việc sử dụng mã nguồn đóng vJoy của hãng Headsoft
Trang 212 Đánh giá kết quả nghiên cứu đạt được
Do bố trí thời gian nghiên cứu tương đối hợp lý nên mặc dù lượng lý thuyết nghiên cứu khá nhiều nhưng tác giả đã hoàn thành hầu hết các mục tiêu yêu cầu đề ra
Về lý thuyết các vấn đề mà tác giả đã nghiên cứu và áp dụng được trong khoá luận, sẽ được trình bày chi tiếc ở các chương tiếp theo
Trang 22Chương 2: Cơ sở lý thuyết
I/ Mô hình Client – Server giữa PC và điện thoại
Hình: 2.1 Mô hình Client – Server của đề tài
Đề tài khoá luận yêu cầu về tính kết nối không dây Do vậy mô hình đề tài được vẽ dựa trên 2 kết nối không dây phổ biến hiện nay đó là Bluetooth và Wireless
Hiện tại, 2 kết nối này đều được hỗ trợ bởi hầu hết các smartphone và laptop nên phạm vi có thể áp dụng của đề tài tương đối rộng lớn Các giải pháp cần phải đạt được khi tìm hiểu thực hiện đề tài đó là:
- Thực hiện giao tiếp không dây giữa các thiết bị trên nhiều hệ điều hành khác nhau, tìm hiểu để đưa ra các phương thức chung khi giao tiếp giữa các thiết bị đó
- Tối ưu hoá việc giao tiếp giữa các thiết bị
Trang 23- Hỗ trợ giao tiếp nhiều thiết bị trên nhiều kênh giao tiếp khác nhau (bluetooth và wireless)
Giao tiếp giữa smartphone và PC hiện nay hầu hết đều qua cáp Việc này
sẽ làm tăng độ tin cậy của các gói truyền đi truyền về giữa 2 thiết bị Một phần nữa đó là do con người chưa có nhu cầu lớn trong việc giao tiếp không dây giữa
PC và smart phone Nhưng nếu tận dụng được sức mạnh xử lý của PC và tính cơ động của smartphone thì giao tiếp giữa PC và smartphone sẽ là một điều rất cần thiết Quy mô của đề tài khoá luận sẽ đề cập tới sự kết nối thông qua bluetooth và wireless giữa smartphone và PC Do vậy những công nghệ dùng để kết nối giữa 2 giao thức đó sẽ được đề cập ở các phần tiếp theo của chương này
II/ Lý thuyết về xử lý dữ liệu, truyền dữ liệu qua giao thức Wireless, các kĩ thuật mã hoá tín hiệu trên đường truyền
1 Lý thuyết mạng, các vấn đề trong truyền tải package trong mạng Lan
Ngày nay, hầu như việc viết một ứng dụng để chạy trên máy đơn cục bộ không còn được ưa chuộng và thích hợp nữa Các chương trình và ứng dụng hiện đại phải tích hợp và triệu gọi lẫn nhau trên mạng Intranet (mạng cục bộ), mạng Internet (mạng toàn cầu) và ngôn ngữ lập trình Java là một trong những lựa chọn tốt nhất để làm việc này Java là một ngôn ngữ lập trình không đơn giản, ngoài
sự nổi tiếng về bản thân ngôn ngữ, nền tảng Java còn hướng đến các ứng dụng mạng như: giao tiếp trên mạng theo mô hình khách/chủ (client/server) … So với lập trình thông thường, lập trình mạng đòi hỏi người lập trình những hiểu biết và
kỹ năng chuyên sâu hơn để tạo giao tiếp và trao đổi dữ liệu giữa các máy tính với nhau
a) Chức năng của mô hình OSI
- Cung cấp kiến thức về hoạt động của kết nối liên mạng
- Đưa ra trình tự công việc để thiết lập và thực hiện một giao thức cho kết nối các thiết bị trên mạng
Mô hình OSI còn có một số thuận lợi sau :
Trang 24- Chia nhỏ các hoạt động phức tạp của mạng thành các phần công việc đơn giản
- Cho phép các nhà thiết kế có khả năng phát triển trên từng modun chức năng
- Cung cấp các khả năng định nghĩa các chuẩn giao tiếp có tính tương thích cao “plug and play” và tích hợp nhiều nhà cung cấp sản phẩm
b) Cấu trúc mô hình OSI
Mô hình OSI gồm 7 lớp (level), mỗi lớp thực hiện các chức năng riêng cho hoạt động kết nối mạng
Application
(Upper Layer)
Aplication Presentation Session Transport Layer
Data Lower Layer Network Layer
Data Link Physical
Bảng 2.1: Các lớp trong mô hình OSI
3 lớp trên cùng của mô hình OSI thường được gọi là các lớp ứng dụng (Application layers) hay còn gọi là các lớp cao Các lớp này thường liên quan tới giao tiếp với người dùng, định dạng của dữ liệu và phương thức truy nhập các ứng dụng đó
- Application layer : đây là lớp cao nhất trong mô hình Nó là nơi mà người sử dụng hoặc kết nối các chương trình ứng dụng với các thủ tục cho phép truy nhập vào mạng
- Presentation layer : Lớp presentation cung cấp các mã và chức năng
để chuyển đổi mà được cung cấp bởi lớp ứng dụng Các chức năng
đó đảm bảo rằng dữ liệu từ lớp ứng dụng trong một hệ thống có thể được đọc bởi lớp ứng dụng của một hệ thống khác VD : dùng để mã hoá dữ liệu từ lớp ứng dụng : như mã hoá ảnh jpeg , gif Mã đó cho phép ta có thể hiện lên trang web
- Session layer : được sử dụng để thiết lập, duy trì và kết thúc phiên làm việc giữa các lớp presentation Việc trao đổi thông tin ở lớp này
Trang 25bao gồm yêu cầu dịch vụ và đáp ứng yêu cầu của các ứng dụng trên thiết bị khác
4 lớp dưới của mô hình OSI sử dụng để định nghĩa làm thế nào để dữ liệu được truyền đi trong các dây nối vật lý, các thiết bị mạng và đi đến trạm đầu cuối cuối cùng là đến các lớp ứng dụng Quấn sách này ta chỉ quan tâm đến 4 lớp cuối
Và sẽ xem xét từng lớp một cách chi tiết giao thiếp giữa các lớp trong mô hình OSI
Sử dụng phương pháp protocal stack để kết nối giữa hai thiết bị trong mạng Protocal stack là một tập hợp các quy định dùng để định nghĩa làm thế nào
để dữ liệu truyền qua mạng
1.2 Tổng quan về lập trình mạng
a) Các giao thức mạng
Ngày nay, hầu như việc viết một ứng dụng để chạy trên máy đơn cục bộ không còn được ưa chuộng và thích hợp nữa Các chương trình và ứng dụng hiện đại phải tích hợp và triệu gọi lẫn nhau trên mạng Intranet (mạng cục bộ), mạng Internet (mạng toàn cầu) và ngôn ngữ lập trình Java là một trong những lựa chọn tốt nhất để làm việc này Java là một ngôn ngữ lập trình không đơn giản, ngoài
sự nổi tiếng về bản thân ngôn ngữ, nền tảng Java còn hướng đến các ứng dụng mạng như: giao tiếp trên mạng theo mô hình khách/chủ (client/server) … So với lập trình thông thường, lập trình mạng đòi hỏi người lập trình những hiểu biết và
kỹ năng chuyên sâu hơn để tạo giao tiếp và trao đổi dữ liệu giữa các máy tính với nhau
Giao thức UDP ngược lại không đáng tin cậy lắm, không có sự kết nối trước nào giữa nơi gửi và nơi nhận, dữ liệu gửi đi mặc định rằng máy tính ở đầu nhận luôn ở trạng thái sẵn sàng để tiếp đón dữ liệu gửi đến Nếu dữ liệu gửi đến bị lỗi trong quá trình truyền hay không nhận được đầy đủ giao thức UDP cũng không có thông tin phản hồi gì lại cho nơi gửi Tuy nhiên UDP không đòi hỏi sự chính xác cao như dịch vụ thông báo giờ, tỉ giá hay các dịch vụ gửi nhắn tin …
Họ giao thức TCP
Trang 26Hình 2.2: Các tầng của giao thức TCP/IP so với cấc tầng của mô hình OSI
- Application: Xác nhận quyền, nén dữ liệu và các dịch vụ cho người dùng
- Transport: Xử lý dữ liệu giữa các hệ thống va cung cấp việc truy cập mạng cho các ứng dụng
- Network: Tìm đường cho các packet
TCP (Transmission Control Protocol - "Giao thức điều khiển truyền vận")
là một trong các giao thức cốt lõi của bộ giao thức TCP/IP Sử dụng TCP, các ứng dụng trên các máy chủ được nối mạng có thể tạo các "kết nối" với nhau, mà qua
đó chúng có thể trao đổi dữ liệu hoặc các gói tin Giao thức này đảm bảo chuyển giao dữ liệu tới nơi nhận một cách đáng tin cậy và đúng thứ tự TCP còn phân biệt giữa dữ liệu của nhiều ứng dụng (chẳng hạn, dịch vụ Web và dịch vụ thư điện tử) đồng thời chạy trên cùng một máy chủ
Họ giao thức UDP
UDP (User Datagram Protocol) là một trong những giao thức cốt lõi của giao thức TCP/IP Dùng UDP, chương trình trên mạng máy tính có thể gởi những
dữ liệu ngắn được gọi là datagram tới máy khác UDP không cung cấp sự tin cậy
và thứ tự truyền nhận mà TCP làm; các gói dữ liệu có thể đến không đúng thứ tự hoặc bị mất mà không có thông báo Tuy nhiên UDP nhanh và hiệu quả hơn đối với các mục tiêu như kích thước nhỏ và yêu cầu khắt khe về thời gian Do bản chất không trạng thái của nó nên nó hữu dụng đối với việc trả lời các truy vấn nhỏ với số lượng lớn người yêu cầu
Các lợi ích của UDP:
Trang 27- Không cần thiết lập kết nối: dành cho ứng dụng chỉ chạy từ một phía
- Không duy trì trạng thái kết nối: Ứng dụng phục vụ nhiều người hơn
- Tiêu đề gói nhỏ: 8byte
- Không kiểm xoát tốc độ gửi: Gửi trước sau hy nhanh chậm thì tùy ý
- Không cần độ chính xác cao: Dữ liệu bị lỗi vẫn chấp nhận được
TCP :
- Dùng cho mạng WAN
- Không cho phép mất gói tin
- Đảm bảo việc truyền dữ liệu
- Tốc độ truyền thấp hơn UDP
Trang 28UDP:
- Dùng cho mạng LAN
- Cho phép mất dữ liệu
- Không đảm bảo
- Tốc độ truyền cao, VolP truyền tốt qua UDP
b) Dịch vụ máy chủ và khái niệm cổng (port)
Khi kết nối vào máy chủ ta có thể yêu cầu máy chủ nhiều dịch vụ khác nhau, như dịch vụ truy tìm và đọc các trang Web trên Internet, dịch vụ gửi nhận e-mail, dịch vụ dò tìm hệ thống tên vùng DNS Mỗi dịch vụ đều có cách gửi nhận
dữ liệu theo quy ước riêng TCP và UDP chỉ chịu trách nhiệm đưa dữ liệu từ một máy tính này đến một máy tính khác, còn dữ liệu đó được gửi cho dịch vụ nào thì phải thông qua một dịch vụ nữa gọi là cổng (hay port) Mỗi chương trình dịch vụ
sẽ sử dụng một cổng khác để truy xuất thông tin Cổng là một số nguyên dương có giá trị từ 1 đến 16383 Máy chủ (server) sẽ quy định cổng được sử dụng cho mỗi loại dịch vụ Thông tin giữa máy khách (client) và máy chủ (server) phải sử dụng cổng tương ứng nhau thì mới trao đổi được với nhau Tuy nhiên, hầu hết các chương trình dịch vụ nổi tiếng hiện nay đều có quy định chuẩn cổng dành riêng cho mình như:
Bảng 2.2: Tên dịch vụ phổ biến và các cổng tương ứng
Nếu tự xây dựng một ứng dụng làm dịch vụ trên máy chủ ta phải chọn cho mình một số cổng có các giá trị khác với những giá trị cổng mà những dịch vụ nổi tiếng khác đã sử dụng
1.3 Giao tiếp trên mạng theo mô hình khách/chủ (Client/Server)
và khái niệm socket
a) Giao tiếp theo mô hình khách/chủ (Client/Server)
Có rất nhiều dịch vụ hỗ trợ trên Internet như e-mail, nhóm tin (newsgroup), chuyển tập tin (file transfer), đăng nhập từ xa (remote login), truy tìm các trang Web Những dịch vụ này được tổ chức và kiến trúc theo mô hình khách/chủ (mô hình Client/Server) Các chương trình ở máy khách (client) như trình duyệt (Web Browser) hay chương trình gửi nhận e-mail sẽ tạo ra kết nối (connection) với một máy chủ ở xa (server) sau đó gửi các yêu cầu đến máy chủ,
Trang 29các chương trình dich vụ trên máy chủ như Web server hay Mail server sẽ xử lý những yêu cầu này và gửi kết quả ngược về cho máy khách (chẳng hạn Web theo địa chỉ mà máy khách đưa đến còn Mail server thì lưu giữ và gửi về cho máy khách những bức e-mail mới) Thông thường một dịch vụ trên máy chủ phục vụ cho rất nhiều khách
b) Lập trình mạng thông qua Socket
Như vậy trước khi yêu cầu một dịch vụ trên máy chủ thực hiện điều gì đó, máy khách (client) phải có khả năng kết nối được với máy chủ Quá trình kết nối này được Java thực hiện thông qua một cơ chế trừu tượng hóa gọi là Socket (tạm gọi là “cơ chế ổ cắm”) Kết nối giữa máy khách và máy chủ tương tự như việc cắm phích điện vào ổ cắm điện Máy khách thường được coi như phích cắm điện còn máy chủ được coi như ổ cắm điện, một ổ cắm có thể cắm vào đó nhiều phích điện khác nhau cũng như một máy chủ có thể kết nối và phục vụ cho rất nhiều máy khách
Nếu kết nối socket thành công thì máy khách và máy chủ có thể trao đổi
dữ liệu với nhau thực hiện các yêu cầu về dịch vụ trên máy chủ Việc kết nối theo
cơ chế socket cần biết hai thông tin chủ yếu đó là địa chỉ của máy cần kết nối và
số hiệu cổng của chương trình dịch vụ Java cung cấp lớp Socket (thường được dùng như “phich cắm điện” cho máy khách) và lớp ServerSocket (thường được dùng như “ổ cắm điện” đặt trên máy chủ) Hai lớp này được đặt trong gói thư viện Java.net
Socket là một giao diện lập trình ứng dụng (API) mạng Thông qua giao diện này chúng ta có thể lập trình điều khiển việc truyền thông giữa hai máy sử dụng các giao thức mức thấp là TCP, UDP… Socket là sự trừu tượng hoá ở mức cao, có thể tưởng tượng nó như là thiết bị truyền thông hai chiều gửi – nhận dữ liệu giữa hai máy tính với nhau
Các loại Socket
- Socket hướng kết nối (TCP Socket)
- Socket không hướng kết nối (UDP Socket)
- Raw socket
Trang 30Hình 2.4: Các loại Socket
Đặc điểm của Socket hướng kết nối
- Có 1 đường kết nối ảo giữa 2 tiến trình
- Một trong 2 tiến trình phải đợi tiến trình kia yêu cầu kết nối
- Có thể sử dụng để liên lạc theo mô hình Client/Server
- Trong mô hình Client/Server thì Server lắng nghe và chấp nhận một yêu cầu kết nối
- Mỗi thông điệp gửi đều có xác nhận trở về
- Các gói tin chuyển đi tuần tự
Đặc điểm của Socket không hướng kết nối
- Hai tiến trình liên lạc với nhau không kết nối trực tiếp
- Thông điệp gửi đi phải kèm theo địa chỉ của người nhận
- Thông điệp có thể gửi nhiều lần
- Người gửi không chắc chắn thông điệp tới tay người nhận
- Thông điệp gửi sau có thể đến đích trước thông điệp gửi trước đó
2 Xử lý đa luồng, xử lý thời gian thực trong việc gửi / nhận tín hiệu bằng ngôn ngữ Java
2.1 Giới thiệu
Luồng là một thuộc tính duy nhất của Java Nó là đơn vị nhỏ nhất của đoạn mã có thể thi hành được để thực hiện một công việc nhất định Ngôn ngữ Java, máy ảo Java cả hai đều là các hệ thống phân luồng
Trang 312.2 Đa luồng
Java hổ trợ đa luồng, nó có khả năng làm việc với nhiều luồng Một ứng dụng có thể bao hàm nhiều luồng Mỗi luồng được gán một công việc cụ thể, chúng được thực thi đồng thời với các luồng khác
Đa luồng làm giảm tối đa thời gian nhàn rỗi của hệ thống Điều này cho phép bạn viết các chương trình có hiệu quả cao với sự tận dụng tối đa CPU Mỗi phần của chương trình được gọi một luồng, mỗi luồng định nghĩa một cấch thực hiện Đây là một trường hợp đặc biệt của đa nhiệm
Trong đa nhiệm, nhiều chương chương trình chạy đồng thời, mỗi chương trình có ít nhất một luồng trong nó Một bộ vi xử lý thực thi tất cả các chương trình này Qua đó chương trình được thực thi như là đồng thời, trên thực tế bộ vi
xử lý chuyển qua chuyển lại giữa các chương trình
2.3 Tạo và quản lý luồng
Khi các chương trình Java được thực thi, luồng chính đã đang được thực hiện Hai yếu tố quan trong luồng chính (main) là:
- Các luồng con sẽ được tạo ra từ nó
- Nó là luồng cuối cùng kết thúc việc thực hiện Ngay khi luồng chính ngừng thực thi, chương trình bị chấm dứt
Cho dù luồng chính được tạo ra một cách tự động với chương trình thực thi, nó có thể được điều khiển thông qua một đối tượng luồng
Các luồng có thể được tạo ra từ hai cách:
- Khai báo lớp là lớp con của lớp Thread, và phương thức run() của lớp Thread cần được định nghĩa đè
- Khai báo lớp cài đặt giao diện Runnable Rồi thì định nghĩa phương thức run()
Mỗi luồng trong chương trình Java được cấp một quyền ưu tiên Máy ảo Java không bao giờ thay đổi quyền ưu tiên của luồng Quyền ưu tiên vẫn còn là hằng số cho đến khi luồng bị ngắt
Mỗi luồng có một giá trị ưu tiên nằm trong khoảng của một Thread.MIN_PRIORITY (=1), và đến Thread.MAX_PRIORITY (=10) Mỗi luồng thuộc vào một nhóm luồng, và mỗi nhóm luồng có quyền ưu tiên của chính
nó Mỗi luồng có một giá trị ưu tiên mặc định Thread.NORM_PRIORITY là 5 Luồng mới thừa kế quyền ưu tiên của luồng mà tạo ra nó
Trang 32Chương trình bắt đầu thực thi luồng với việc gọi phương thức start() của lớp Thread Phương thức này sẽ gọi phương thức run(), nơi định nghĩa công việc được thực thi Phương thức này có thể được định nghĩa đè trong lớp con của lớp Thread, hoặc trong đối tượng cài đặt giao diện Runnable
2.4 Vòng đời của luồng
Hình 2.5: Minh hoạ vòng đời của một Thread trong Java
Một Thread bao gồm 4 trạng thái sau:
Trang 33c) Trạng thái Blocked
Thread rơi vào trạng thái Blocked nếu một trong các action sau đây xảy ra:
- Gọi phương thức sleep()
- Thread gọi một operation mà nó đang bị blocking trên Input/Output
- Thread cố gắng giành lấy khóa(lock) trong khi khóa này đang được nắm giữ bởi một Thread khác
- Thread đang đợi một điều kiện nào đó để thực thi
Một ai đó gọi phương thức suppend() của Thread Tuy nhiên, phương thức này đã bị phản đối và không nên gọi nó trong code Tóm lại, khi một Thread
ở trong trạng thái blocked, scheduler sẽ bỏ qua nó và không cho nó thời gian CPU
để xử lý, và nó không thể thực thi bất kỳ hoạt động nào
d) Trạng thái Dead
Một Thread rơi vào trạng thái Dead với một trong 2 lý do sau:
- Thực thi xong phương thức run()
- Một ngoại lệ chưa được bắt(uncaught) được phát sinh và kết thúc phương thức run()
Ngoài ra, có một cách khác có thể kill một Thread bằng cách gọi phương thức stop() Tuy nhiên, phương thức này đã bị ngăn cấm và không nên sử dụng phương thức này trong code
e) Vòng đời của luồng:
Một luồng vừa được tạo ra có trạng thái 'born' Luồng không bắt đầu chạy ngay lập tức sau khi nó được tạo ra Nó đợi phương thức start() của chính nó được gọi từ đó nó ở trạng thái "sẵn sàng để chạy" Luồng đi vào trạng thái "đang chay" khi hệ thống cấp quyền sử dụng bộ vi xử lý cho nó
Bạn có thể sử dụng phương thức sleep() để tạm thời dừng sự thực thi của luồng Luồng trở thành sẵn sàng sau khi phương thức sleep() kết thúc Luồng khi roi vào trạng thái 'ngủ' (sleeping) không sử dụng bộ vi xử lý Luồng đi vào trạng thái "đợi" (waiting) khi một luồng gọi phương thức wait()
Khi các luồng khác sử dụng xong đối tượng, gọi phương thức notify(), luồng trở lại trạng thái "sẵn sàng" (ready) Luồng đi vào trạng thái "blocked" khi
nó đang thực thi các phép toán vào/ra (Input/output) Nó đi vào trạng thái "sẵn sàng" khi các phương thức vào/ra nó đang đợi được hoàn thành Luồng đi vào trạng thái "chết" (dead) sau khi phương thức run() đã được thực thi xong, hoặc khi phương thức stop() của nó được gọi
Trang 342.5 Đa luồng
Các ngôn ngữ lập trình thông thường không cho phép người lập trình thực hiện nhiều công việc cùng một lúc Thay vào đó, cung cấp các điều khiển mà chỉ cho phép người lập trình thực hiện một công việc tại một thời điểm, đó là chỉ cho phép thực hiện công việc tiếp theo sau khi đã hoàn tất công việc trước đó Java cho phép người lập trình thưc hiện nhiều công việc thông qua API của nó Người lập trình có thể tạo Thread thực thi, trong đó mỗi thread được phân chia như là một phần của chương trình và có thể thực thi đồng thời với các Thread khác, điều này được gọi là Multiple Thread
Hầu hết các hệ điều hành ngày nay đều có nhiều hơn một thread chạy đồng thời tại cùng một thời điểm bên trong một tiến trình Khi máy ảo Java (JavaVM) chạy trên các hệ điều hành đó, một tiến trình mới cũng được tạo ra Bên trong tiến trình đó, có nhiều thread có thể được tạo ra
Thông thường, bạn nghĩ các đoạn mã Java bắt đầu thực thi trong phương thức main() và tiến hành tại một đường dẫn thông qua chương trình Đây chỉ là một ví dụ về thread đơn Thread chính được sinh ra bởi JavaVM, mà bắt đầu thực thi với phương thức main, nó thực thi tất cả statement trong phương thức main(),
và nó chết khi phương thức main() được hoàn tất
Một thread thứ hai luôn luôn chạy trong JavaVM, đó là bộ dọn rác (garbage collection), nó dọn dẹp các đối tượng và khôi phục lại bộ nhớ Vì vậy, khi bạn viết một đoạn mã java đơn giãn là System.out.println(“Xin chào”) thì nó cũng được chạy trên môi trường multithread, đó là main thread và garbage collention thread
Khi một chương trình Java bào gồm một giao diện người dùng đồ họa(GUI), thì JavaVM tạo ra nhiều thread Một trong các thread này phụ trách cung cấp các sự kiện GUI cho các phương thức trong chương trình, còn thread khác chịu trách nhiệm về vẽ cửa sổ GUI
Ví dụ: ta có một chương trình dựa trên GUI, với một thread tính toán đang thực thi các công việc tính toán phức tạp và dài hạn, và trong khi điều này đang diễn ra, người dùng nhấn nút Stop GUI event thread ngay sau đó sẽ gọi các
sự kiện xử lý code tương ứng cho nút nhấn Stop, cho phép thread tính toán kết thúc Nếu chương trình này chỉ có một thread, thì cả hai không thể thực thi cùng lúc, và sẽ gây ra tình trạng gián đoạn
Thực thi multithread cũng là một đặc điểm thiết yếu của Java platform Một ứng dụng đều có tối thiểu một thread-hay nhiều nếu bạn đếm các thread hệ thống làm những việc như quản lý bộ nhớ và xử lý tín hiệu Tuy nhiên, nếu đứng
Trang 35trên quan điểm của người phát triển ứng dụng, bạn chỉ bắt đầu với một thread, và được gọi là main thread Và thread này có khả năng tạo ra các thread bổ xung
2.6 Thời gian biểu của luồng
Hầu hết các chương trình Java là đa luồng Nhưng CPU chỉ có khả năng thực thi một luồng tại một thời điểm Khi có nhiều hơn một luồng có cùng mức ưu tiên thực thi trong cùng một thời điểm thì người lập trình, hoặc máy ảo Java, hoặc
hệ điều hành đảm bảo rằng CPU được chia sẻ giữa chúng Điều này được gọi là điều khiển luồng (thời gian biểu luồng)
Không có máy ảo Java nào có cơ chế cụ thể cho việc điều khiển luồng Một số môi trường Java hổ trợ việc chia nhỏ thời gian Ở đây, mỗi luồng nhận một phần nhỏ của thời gian bộ vi xử lý, được gọi là định lượng (quantum) Luồng
có thể thực thi tác vụ của chính nó trong suốt khoảng thời gian được cấp đấy Sau khoảng thời gian này, luồng phải tạm dừng thực hiện, ngay cả khi nó chưa hoàn thành Luồng kế tiếp có cùng quyền ưu tiên sẽ sử dụng bộ vi xử lý trong khoảng thời tiép theo Java điều khiển việc chia nhỏ thời gian giữa tất cả các luồng có cùng mức ưu tiên
Phương thức setPriority() có một tham số kiểu số nguyên dùng để đặt mức ưu tiên của luồng Đây là giá trị nằm trong khoảng 1 đến 10, mặc khác, phương thức có thể gây ra ngoại lệ IllegalArgumentException
Phương thức yield() tam dừng luồng và tạo khả năng cho các luồng khác một một cơ hội được thực thi Phương thức này thích hợp cho các hệ thống không chia sẻ thời gian (non-time-sliced), nơi mà các luồng hiện thời hoàn thành việc thực hiện trước khi các luồng có quyền ưu tiên ngang nhau kế tiếp tiếp được thực thi Ở đây, bạn sẽ gọi phương thức yield() tại những khoảng thời gian riêng biệt
để có thể tất cả các luồng có quyền ưu tiên ngang nhau chia sẻ thời gian thực thi CPU
3 Xử lý đa luồng, xử lý thời gian thực trong việc gửi / nhận tín hiệu bằng ngôn ngữ C# (nền tảng NET framework)
Kiến thức về đa luồng đã được trình bày ở phần trước Về cơ bản kiến thức đa luồng của C# và Java tương tự nhau nên phần này sẽ không trình bày lặp lại những kiến thức đó Nội dung chủ yếu của phần này liên quan tới việc xử lý đa luồng trên nền tảng C#
3.1 Tạo và thực thi thread
.Net cung cấp lớp Thread trong namespace System.Threading cùng với những phương thức cần thiết để giúp lập trình viên sử dụng một cách đơn giản và hiệu quả Để tạo một thread mới làm theo các bước sau:
Trang 36- Tạo phương thức (gọi là phương thức callback) sẽ thực thi ghi thread được gọi: Phương thức này phải không có tham số hoặc chỉ có một tham số là kiểu object và kiểu trả về là void Bước này có thể bỏ qua
vì ta có thể sử dụng sử dụng anonymous method hoặc lambda expression để tạo đoạn mã lệnh thực thi in-line cùng với lệnh khởi tạo thread
- Tạo đối tượng Thread và truyền một delegate ThreadStart chứa phương thức sẽ thực thi vào constructor của Thread
- Chạy thread: Gọi phương thức Start() của đối tượng thread vừa tạo Nếu không dùng thread chạy lần lượt 2 phương thức MethodA() và MethodB() thì kết quả in ra sẽ là 100 kí tự „1‟ và sau đó là 100 kí tự „0‟ Tuy nhiên như khi dùng thread như ví dụ trên, kết quả in ra sẽ là một chuỗi lẫn lộn „1‟
và „0‟, tức là hai phương thức này chạy đồng thời với nhau
3.2 Foreground và Background Thread
Ứng dụng phân biệt Thread theo hai loại: Foreground thread và Background thread Các thread ban đầu được tạo ra đều là foreground Ứng dụng
sẽ vẫn tiếp tục chạy nếu như tất cả các foreground thread chưa chạy xong mặc dù bạn đã thực hiện lệnh tắt ứng dụng Và nếu tất cả các foreground thread hoàn thành, ứng dụng sẽ tắt, đồng thời tất cả background thread cũng bị “khai tử” theo
Xét về độ ưu tiên, foreground và background không có sự khác biệt nào trừ phi bạn đặt lại giá trị này cho chúng Để xác định một Thread là foreground hay background, bạn sử dụng thuộc tính IsBackground
Background thread ứng dụng rất nhiều để thực hiện các tác vụ nền trong ứng dụng Ngoài ra, Net cung cấp lớp BackgroundWorker sử dụng background thread giúp lập trình thread trở nên dễ dàng và được ứng dụng khá phổ biến trong Windows Form
3.3 Thread Pooling
Thread Pooling là một kĩ thuật cho phép bạn sử dụng các thread hiệu quả hơn bằng cách quản lý và phân phối chúng hợp lý, tận dụng tối đa thời gian nhàn rỗi và tăng hiệu suất của chương trình Thread pooling là một kĩ thuật được áp dụng phổ biến trong các ứng dụng về I/O bất đồng bộ tập tin và truyền tải dữ liệu trên mạng
Mỗi chương trình được cung cấp một Thread pool khi khởi tạo, vì thế bạn không cần tạo một thể hiện của thread pool để sử dụng Một đặc điểm của Thread pool là các thread sẽ được đặt ở chế độ background (Background Thread) Các tác
vụ khi được thêm vào Thread pool sẽ được thực thi khi có một thread đang ở
Trang 37trạng thái sẵn sàng Sau khi kết thúc một tác vụ, thread sẽ chuyển về trạng thái sẵn sàng để chờ một công việc khác
Bạn có thể tưởng tượng thread pool giống như một hàng đợi hay phòng bán vé với mặc định là 25 người làm việc, khi một người hoàn tất công việc bán
vé cho khách thì khách hàng tiếp theo sẽ đến bắt đầu một giao dịch mới
Để sử dụng thread pool, bạn chỉ sử dụng phương thức tĩnh QueueUserWorkItem() của lớp ThreadPool Phương thức này nhận tham số là một phương thức callback hoặc delegate, có thể dùng overload thứ hai để truyền thêm tham số cho phương thức cần thực thi Sau khi được truyền vào thread pool, tác vụ đó được đặt vào hàng đợi và sẵn sàng thực thi bất cứ lúc nào có thread ở trạng thái sẵn sàng
4 Giao thức truyền, mã hoá tín hiệu gửi / nhận
4.1 Giao thức truyền tải
Ngoài giao thức để thực hiện kết nối vật lý giữa 2 thiết bị phần cứng với nhau, phần mềm còn phải tự định nghĩa ra giao thức của riêng mình để client và server có thể hiểu được nhau Việc quy định ra một bộ giao thức ứng xử giữa client và server rất quan trọng và ảnh hưởng lớn đến khả năng xử lý cũng như hiệu suất của chương trình
4.2 Các bước để thực hiện kết nối giữa Client và Server
Hình 2.6: Các bước kết nối giữa client – server
Để thực hiện kết nối giữa client và server, cần phải tiến hành qua những bước sau đây:
Kết nối
Giao thức quy định việc kết nối giữa Client và Server Thông thường Server luôn mở, do vậy để kết nối, thông số sẽ được thiết lập tại Client Sau khi
Trang 38thiết lập, Client sẽ thực hiện việc kết nối và liên lạc với Server bằng giao thức kết nối
Bắt tay
Sau khi kết nối là giao thức Bắt tay Bắt tay có nghĩa là xác nhận kết nối
có phù hợp không, có đúng định dạng mà 2 bên quy định không và thực hiện việc bảo mật nếu có
4.3 Tối ưu truyền dẫn trên ngôn ngữ lập trình
Ngoài việc thiết lập giao thức truyền dẫn, chúng ta cần phải thiết lập môi trường truyền dẫn bên trong chương trình để xử lý thông điệp đi và đến Việc tối
ưu hoá gồm những bước sau đây:
a) Quyết định thời điểm truyền dữ liệu
Thời điểm truyền dữ liệu là số lần và thời gian truyền đạt dữ liệu giữa 2 phía Quyết định được thời điểm sẽ giúp chúng ta định hình được khi nào nên truyền dữ liệu gì và truyền hợp lý hay không
b) Dùng các kiểu dữ liệu đơn giản
Các kiểu dữ liệu quy định sẵn trong các ngôn ngữ lập trình, vừa là những kiểu dữ liệu đơn giản, tốn ít bộ nhớ Mặc khác, các ngôn ngữ lập trình hiện tại hầu hết đều có hỗ trợ việc chuyển đổi kiểu dữ liệu Việc này sẽ giúp chúng ta dễ dàng đọc và ghi dữ liệu truyền tải hơn các kiểu dữ liệu chúng ta tự định nghĩa
c) Tối ưu hoá bộ nhớ trong
Bộ nhớ trong không chỉ để sử dụng cho việc xử lý chương trình mà nó còn là tài nguyên dùng cho của các chương trình khác Việc chương trình của chúng ta chiếm dụng quá nhiều bộ nhớ trong sẽ làm giảm hiệu năng chung của cả
hệ thống, dẫn tới việc truyền dữ liệu chậm Do vậy khi thiết kế chương trình mạng nói riêng và các ứng dụng khác nói chung thì việc tiếc kiệm bộ nhớ được đặt lên hàng đầu
d) Sử dụng thuật toán mã hoá phù hợp
Mã hoá và tốc độ là 2 mặt của một vấn đề Nếu thuật toán mã hoá nặng, chúng ta sẽ có được dữ liệu bảo mật tốt trên đường truyền, bù lại tốc độ truyền bị kéo xuống do thời gian mã hoá / giải mã lâu Vì vậy, nếu tính toán tới việc sử dụng mã hoá trên đường truyền, ta phải tính toán tới việc sử dụng thuật toán phù
Trang 39hợp với yêu cầu của chương trình, trên cơ sở cân bằng giữa tính bảo mật thông tin
và tốc độ truyền tải dữ liệu
5 Các vấn đề gặp phải trên phần cứng thiết bị chạy
5.1 Thiết bị ngắt kết nối giữa chừng
Do bản chất là kết nối không dây nên tín ổn định của đường truyền không cao Do vậy khi tạo ứng dụng kết nối mạng, ta phải tính đến tính ổn định của đường truyền
a) Đối với giao thức TCP
Do bản chất giao thức TCP là truyền tín hiệu đảm bảo có duy trì trạng thái kết nối nên khi bị ngắt mạng, giao thức tự thông báo cho ngôn ngữ phát hiện ra lỗi
và bung ra Exception
Trong Java có phương thức isReachable() thuộc lớp java.net.InetAddress cho phép chúng ta kiểm tra thử đường truyền trước khi ra lệnh gửi đi một gói tin nào sử dụng giao thức TCP
Tương tự như vậy, ngôn ngữ C# có cơ chế bung lỗi như ở Java khi kết nối
bị đóng Để có thể phát hiện kết nối bị đóng lại trên C#, ta có thể tiến hành bắt lỗi
sự kiện nhận và gửi, hoặc có thể thực hiện việc nhận và đo đạc một gói tín bắt được xem nó là rỗng hay không Nếu gói tin rỗng, kết nối đã bị đóng
b) Đối với giao thức UDP
Do bản chất của giao thức UDP có độ tin cậy không cao, vì vậy việc kiểm tra kết nối có bị ngắt hay không hoàn toàn không có ngôn ngữ nào hỗ trợ Việc chính chúng ta cần làm là quy định một giao thức để kiểm tra gói tin có đến đúng địa chỉ hay không Có thể quy định giao thức tương tự như trên TCP, bao gồm gửi gói yêu cầu tín hiệu, yêu cầu server trả lời lại Nếu sau một khoảng thời gian Timeout quy định trước, server không trả lời thì xác nhận kết nối bị ngắt Do không có phương thức hỗ trợ phát hiện kết nối bị ngắt trên UDP nên việc kiểm tra hoàn toàn dựa vào chương trình
Một cách nữa để có thể kiểm tra kết nối tới thiết bị khác bị ngắt hay không, đó là gửi những gói tin ICMP để địa chỉ cần gửi và đợi phản hồi về Gói tin ICMP hoạt động như giao thức TCP dùng để ping và kiểm tra kết nối tới một máy trên cũng mạng Lan
5.2 Tín hiệu không ổn định trong quá trình kết nối
Một lỗi thường gặp nữa trong quá trình tạo ứng dụng giao tiếp qua mạng
đó là tín hiệu không ổn định Do bản chất mạng Wifi nên sóng có thể bị nhiễu bởi
Trang 40nhiều thiết bị phát sóng vô tuyến khác Vì vậy trong chương trình, chúng ta cũng cần phải xử lý chuyện nhiễu, mất gói tin khi gửi tín hiệu đi trong mạng Lan
Đối với giao thức TCP, do có đường truyền đảm bảo nên việc gửi nhận tín hiệu được kiểm tra một cách thường xuyên, tín hiệu nào bị mất trong quá trình truyền dẫn được thông báo về và gửi lại một cách kịp thời
Trái lại đối với giao thức UDP, tín hiệu do không được đảm bảo nên sẽ có
tỉ lệ bị mất tín hiệu Khi đã quyết định chọn giao thức UDP để truyền dẫn tín hiệu, người thiết kế chương trình đã quyết định luôn việc chọn hiệu năng truyền dẫn thay cho tính an toàn Vì vậy đơn giản, nếu gói tin nào không được nhận, server sẽ không xử lý gói tin đó Nếu như bạn thiết kế giao thức để đảm bảo gói tin truyền nhận có đảm bảo, thì thay vì bạn chọn UDP, TCP sẽ là giải pháp tốt và hoàn hảo hơn
III/ Lý thuyết về xử lý dữ liệu, truyền dữ liệu qua giao thức Bluetooth, các kĩ thuật mã hoá tín hiệu trên đường truyền
1 Giới thiệu về Bluetooth
1.1 Giới thiệu
Hình 2.7: Logo của giao thức Bluetooth
Bluetooth là một đặc tả công nghiệp cho truyền thông không dây tầm gần giữa các thiết bị điện tử Công nghệ này hỗ trợ việc truyền dữ liệu qua các khoảng cách ngắn giữa các thiết bị di động và cố định, tạo nên các mạng cá nhân không dây (Wireless Personal Area Network-PANs)
Bluetooth có thể đạt được tốc độ truyền dữ liệu 1Mb/s Bluetooth hỗ trợ tốc độ truyền tải dữ liệu lên tới 720 Kbps trong phạm vi 10 m–100 m Khác với