Đề tài nghiên cứu khoa học Nghiên cứu mô hình giám sát thảm họa và môi trường bờ biển Việt Nam

pdf 43 trang thiennha21 12/04/2022 3190
Bạn đang xem 20 trang mẫu của tài liệu "Đề tài nghiên cứu khoa học Nghiên cứu mô hình giám sát thảm họa và môi trường bờ biển Việt Nam", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfde_tai_nghien_cuu_khoa_hoc_nghien_cuu_mo_hinh_giam_sat_tham.pdf

Nội dung text: Đề tài nghiên cứu khoa học Nghiên cứu mô hình giám sát thảm họa và môi trường bờ biển Việt Nam

  1. TRƯỜNG ĐẠI HỌC HÀNG HẢI VIỆT NAM KHOA CÔNG NGHỆ THÔNG TIN THUYẾT MINH ĐỀ TÀI NCKH CẤP TRƯỜNG ĐỀ TÀI Nghiên cứu mô hình giám sát thảm họa và môi trường bờ biển Việt Nam Chủ nhiệm đề tài: TS. Trần Đăng Hoan Hải Phòng, tháng 15 /05/2015
  2. Mục lục Mở đầu i 1 Mô hình tích hợp giám sát môi trường bờ biển 1 1.1 Hệ thống giám sát tích hợp . . . . . . . . . . . . . . . . . . . . . .1 1.1.1 Các chi tiết về hạ tầng . . . . . . . . . . . . . . . . . . . . .1 1.1.2 Quản trị dữ liệu . . . . . . . . . . . . . . . . . . . . . . . . .3 1.1.3 Phân tích dữ liệu . . . . . . . . . . . . . . . . . . . . . . . .3 1.1.4 Báo cáo và truyền tin . . . . . . . . . . . . . . . . . . . . . .3 1.2 Thách thức của việc thu thập dữ liệu từ xa . . . . . . . . . . . . . .4 1.3 Các kiểu giám sát . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 1.3.1 Các báo cáo . . . . . . . . . . . . . . . . . . . . . . . . . . .5 1.4 Một số ứng dụng điển hình . . . . . . . . . . . . . . . . . . . . . . .6 1.4.1 Nghiên cứu Acid hóa đại dương . . . . . . . . . . . . . . . .6 1.4.2 Mạng cảm biến nhằm ứng phó với tẩy trắng san hô ở đảo Racha Yai, Thái Lan . . . . . . . . . . . . . . . . . . . . . .6 1.5 Quản trị dữ liệu hàng hải và những thách thức . . . . . . . . . . . .7 1.6 Kiến trúc hệ thống . . . . . . . . . . . . . . . . . . . . . . . . . . .8 1.6.1 Kien truc de xuat . . . . . . . . . . . . . . . . . . . . . . . .8 1.6.2 Phần cứng . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 2 Giới thiệu về DataTurbine 10 2.1 DataTurbine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.1.1 Kiến trúc của DataTurbine . . . . . . . . . . . . . . . . . . . 11 2.1.2 Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.1.3 Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.1.4 Sink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.2 Những điểm mạnh và hạn chế của DataTurbine . . . . . . . . . . . 14 1
  3. MỤC LỤC 2 3 Lập trình với DataTurbine 16 3.1 Tổng quan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.2 Lập trình sử dụng SAPI . . . . . . . . . . . . . . . . . . . . . . . . 17 3.2.1 Các kiểu đối tượng trong SAPI . . . . . . . . . . . . . . . . 17 3.2.2 ChannelMap . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Kiểu dữ liệu của kênh . . . . . . . . . . . . . . . . . . . . . 19 Các phương thức của ChannelMap . . . . . . . . . . . . . . 19 3.2.3 Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.2.4 Source Client . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.2.5 Sink Client . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.3 Một số kết quả thử nghiệm . . . . . . . . . . . . . . . . . . . . . . . 30 3.3.1 Thử nghiệm trên dữ liệu sensor Intel . . . . . . . . . . . . . 30 3.3.2 Thử nghiệm trên dữ liệu video qua chương trình video chat . 32 4 Kết luận 35
  4. Danh sách hình vẽ 1.1 Các bước có liên quan đến khai phá dữ liệu, lưu trữ và truy nhập, bắt đầu từ tiếp nhận dữ liệu thô và kết thúc bằng việc công bố dữ liệu và các sản phẩm, trong vòng đời của dữ liệu được tiếp nhận từ một chương trình giám sát . . . . . . . . . . . . . . . . . . . . . . .2 1.2 Một kiến trúc hệ thống cho các hệ thống giám sát môi trường . . .8 2.1 Kiến trúc của DataTurbine . . . . . . . . . . . . . . . . . . . . . . 11 3.1 Tải dữ liệu vào RBNB server . . . . . . . . . . . . . . . . . . . . . 25 3.2 Tải dữ liệu ảnh vào RBNB server . . . . . . . . . . . . . . . . . . . 26 3.3 Một cách khác để tải dữ liệu ảnh vào RBNB server . . . . . . . . . 26 3.4 Sink lấy dữ liệu đã đưa vào RBNB server . . . . . . . . . . . . . . 28 3.5 Sink lấy dữ liệu ảnh đã đưa vào RBNB server . . . . . . . . . . . . 29 3.6 Kênh nhiệt độ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.7 Kênh ánh sáng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.8 Kênh độ ẩm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.9 Kênh điện thế . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3
  5. Danh sách bảng 3.1 Các kiểu dữ liệu của SAPI . . . . . . . . . . . . . . . . . . . . . . . 19 3.2 Các kiểu MIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 4
  6. Mở đầu Việt Nam là quốc gia nằm dọc bờ biển với chiều dài 11.409,1km, trong đó chiều dài bờ biển tiếp giáp biển Đông là 3.444km. Với mục tiêu đưa Việt Nam trở thành một Quốc gia mạnh về biển theo Nghị quyết về Chiến lược biển Việt Nam đến năm 2020 được thông qua tại Hội nghị lần thứ tư Ban Chấp hành Trung ương Đảng khóa X, việc bảo vệ và giám sát môi trường biển và bờ biển Việt Nam đóng một vai trò quan trọng trong Chiến lược biển Việt Nam. Trên thế giới việc nghiên cứu và phát triển mô hình và hệ thống giám sát thảm họa và môi trường Biển thu hút sự quan tâm không chỉ của cộng đồng các nhà nghiên cứu về biển và hàng hải mà còn dành được sự quan tâm của các nhà nghiên cứu thuộc các lĩnh vực khác, trong đó có các nhà khoa học máy tính, các chuyên gia công nghệ thông tin. Là một đơn vị nghiên cứu và đào tạo hàng đầu trong lĩnh vực biển và hàng hải Việt Nam, Đại học Hàng Hải Việt Nam cũng đã và đang tập trung vào việc nghiên cứu và phát triển các mô hình và hệ thống giám sát thảm họa và môi trường biển. Là những nhà khoa học hoạt động trong lĩnh vực Công nghệ Thông tin, chúng tôi muốn đề xuất một mô hình hạ tầng về công nghệ thông tin như là một phần của mô hình của hệ thống giám sát bờ biển Việt Nam. Chúng tôi đề xuất ra một mô hình giám sát thảm họa và môi trường dọc bờ biển Việt Nam, trong đó mục tiêu đưa ra giải pháp về hạ tầng công nghệ thông tin như là một phần của hệ thống giám sát thảm họa và môi trường bờ biển. Trong đề tài này, chúng tôi sẽ giới thiệu một ứng dụng mã nguồn mở có tên là DataTurbine. Báo cáo kỹ thuật bao gồm ba chương: • Chương 1 - Giới thiệu tóm lược mô hình giám sát tích hợp và kiến trúc giám sát thời gian thực. Giới thiệu thách thức của việc giám sát dữ liệu từ xa. • Chương 2 - Cài đặt và cấu hình DataTurbine: Chương này sẽ trình bày về các yêu cầu để cài đặt DataTurbine lên hệ thống, quá trình cài đặt và triển khai các thành phần của DataTurbine lên hệ thống. • Chương 3 - Lập trình cho DataTurbine: Chương này tập trung trình bày về việc i
  7. MỞ ĐẦU ii lập trình cho DataTurbine sử dụng SAPI (Simple Application Programming Interface). Trong chương sẽ có các ví dụ đơn giản để minh họa về các bước đưa dữ liệu vào server và lấy dữ liệu từ server. Chương này cũng giới thiệu một số kết quả thử nghiệm với lập trình cho DataTurbine. Mặc dù chúng tôi đã rất nỗ lực để hoàn thành đề tài với chất lượng tốt nhất có thể nhưng trong quá trình thực hiện đề tài vẫn khó tránh khỏi những sai sót. Vì vậy, chúng tôi rất mong nhận được những ý kiến đóng góp của các đồng nghiệp để đề tài hoàn thiện hơn.
  8. Chương 1 Mô hình tích hợp giám sát môi trường bờ biển 1.1 Hệ thống giám sát tích hợp Giám sát tích hợp như là đo lường một cách có hệ thống, nhất quán, và đồng bộ các biến vật lý, hóa học, sinh học, và kinh tế xã hội của các bộ phận khác nhau của hệ thống sinh thái theo thời gian và tại các vị trí xác định. Giám sát tích hợp khi được lập kế hoạch và thực thi một cách hiệu quả, sẽ mang lại hai lợi ích chính. Lợi ích đầu tiên là có được sự hiểu biết tốt hơn về các quan hệ nhân quả bên trong các hệ thống sinh thái và phản ứng của các hệ thống này đối với các hành động quản lý. Lợi ích chính thứ hai là sử dụng hiệu quả các tài nguyên hiện có để giám sát tình trạng của MNES. Hình 1.1chỉ ra các bước của một mô hình giám sát tích hợp. 1.1.1 Các chi tiết về hạ tầng Mục tiêu bao gồm: 1. Cung cấp một dịch vụ có giá trị cho vùng bằng cách cung cấp cho ngư nhân và địa phương dịch vụ để đánh giá chất lượng nước trong vùng vịnh 2. Hiểu mô hình môi trường gây lên lụt lội và các sự kiện khác 3. Cung cấp một hệ thống cảnh báo sớm cho ngư dân và địa phương 1
  9. CHƯƠNG 1. MÔ HÌNH TÍCH HỢP GIÁM SÁT MÔI TRƯỜNG BỜ BIỂN 2 Hình 1.1: Các bước có liên quan đến khai phá dữ liệu, lưu trữ và truy nhập, bắt đầu từ tiếp nhận dữ liệu thô và kết thúc bằng việc công bố dữ liệu và các sản phẩm, trong vòng đời của dữ liệu được tiếp nhận từ một chương trình giám sát
  10. CHƯƠNG 1. MÔ HÌNH TÍCH HỢP GIÁM SÁT MÔI TRƯỜNG BỜ BIỂN 3 1.1.2 Quản trị dữ liệu Quản trị dữ liệu là một chức năng căn bản của hệ thống giám sát dữ liệu bởi vì nó cung cấp hạ tầng, các tiến trình, và các chuẩn cần thiết cho phép lưu trữ, khai phá, và truy nhập dữ liệu được tạo ra từ các chương trình giám sát đã được lựa chọn và các chương trình có liên quan khác. Quản trị dữ liệu có tính chất căn bản đối với luồng dữ liệu phù hợp với mục đích sử dụng đúng lúc và tin cậy từ các thiết bị thu thập dữ liệu cho các phân tích viên dữ liệu, những báo cáo viên và những người truyền tin. Một hệ thống quản trị dữ liệu được thiết kế đúng đắn phải là một đặc trưng trung tâm của một chương trình giám sát tích hợp, vì vòng đời của dữ liệu sẽ kéo dài trong suốt sự nghiệp của các nhà khoa học. Quản trị dữ liệu cho các chương trình giám sát thường không nhận được đủ sự quan tâm 1.1.3 Phân tích dữ liệu Phân tích dữ liệu cho hệ thống tích hợp có vai trò quan trọng trong đối chiếu các tập dữ liệu từ các chương trình giám sát và hoàn thành việc phân tích ở quy mô vùng và địa phương để thấy được hiệu quả của quản trị dữ liệu trong việc tăng cường và duy trì các giá trị MNES. Phân tích dữ liệu về cơ bản sẽ chuyển đổi dữ liệu giám sát kinh tế, xã hội, sinh thái thành tri thức và hiểu về các xu thế trong các giá trị MNES và các áp lực ở quy mô vùng và địa phương. 1.1.4 Báo cáo và truyền tin Báo cáo và truyền tin là chức năng cơ bản của giám sát tích hợp vì nó tập trung vào đưa ra các thông điệp chủ đạo và mức độ thích hợp của việc cung cấp thông tin về các kết quả giám sát cho đúng người đúng lúc. Báo cáo và truyền thông tin phức tap cho những người quản lý theo một khuôn dạng rõ ràng dễ hiểu có tính chất căn bản nếu giám sát nhằm mục đích kích hoạt một phản ứng quản lý Các chức năng căn bản của một hệ thống giám sát tích hợp 1. Xác định rõ ràng mục đích của chương trình giám sát và các mục tiêu giám sát 2. Biên dịch và phân tích thông tin có liên quan đến các chương trình giám sát hiện có 3. Phát triển các mô hình khái niệm 4. Phát triển thiết kế lấy mẫu chung cho hệ thống giám sát tích hợp
  11. CHƯƠNG 1. MÔ HÌNH TÍCH HỢP GIÁM SÁT MÔI TRƯỜNG BỜ BIỂN 4 5. Phát triển các giao thức giám sát 6. Quản trị dữ liệu 7. Phân tích dữ liệu 8. Báo cáo và truyền tin 9. Tổng quát và kiểm tra 1.2 Thách thức của việc thu thập dữ liệu từ xa Để thu thập dữ liệu trong một khoảng thời gian dài, tại những địa điểm cách xa hàng trăm dặm (miles) từ trung tâm điều hành. Chúng ta cần thiết lập một loạt các sensor trên thực địa để liên tục đo nhiệt độ, độ ẩm, và thu thập hình ảnh. Tất cả các dữ liệu cần được lưu trữ an toàn để sau đó được trích ra và phân tích. Nhưng việc tiếp nhận và lưu trữ dữ liệu một cách đáng tin cậy khó hơn ta tưởng. Đôi khi các sensors bị hỏng trên khi thu thập dữ liệu cho một thử nghiệm dài hạn, và nếu chúng không được truyền qua một mạng LAN, thì các nhà khoa học có thể không biết được chúng bị hỏng cho tới khi họ tìm kiếm dữ liệu và phát hiện ra rằng thử nghiệm bị thất bại. Có được dữ liệu đúng lúc và đáng tin cậy từ một vị trí khác cũng là một thách thức. Một số các nhà nghiên cứu muốn thiết lập thử nghiệm ở một vị trí ở xa chỉ để đưa ra một cảnh báo khi các điều kiện nào đó là đúng, chẳng hạn sự hình thành của một cơn bão-vì thế các nhà khoa học chỉ cần đi tới thực địa khi cần. Dữ liệu không đáng tin cậy có thể phá hỏng toàn bộ các kế hoạch này. Ngoài ra, nhiều chương trình nghiên cứu cài đặt các sensor từ một số nhà sản xuất, và thường khó mà tích hợp các phần mềm và phần cứng không đồng nhất vào cùng một hệ thống. Nếu không có một định dạng thống nhất, có thể cần mất nhiều thời gian để tổ chức dữ liệu với các chỉ dẫn thích hợp. Để đảm bảo có được dữ liệu tốt, những câu hỏi mà chúng ta cần trả lời là: • Làm thế nào để truyền dữ liệu giữa các nguồn, các kho dữ liệu, và các ứng dụng mà sử dụng nó? • Làm thế nào để truyền dữ liệu gần với thời gian thực một cách tin cậy trên các mạng truyền dữ liệu có hiệu năng khác nhau
  12. CHƯƠNG 1. MÔ HÌNH TÍCH HỢP GIÁM SÁT MÔI TRƯỜNG BỜ BIỂN 5 1.3 Các kiểu giám sát Giám sát có thể cung cấp thông tin về các yếu tố vật lý hóa học (ví dụ, độ mặt của nước biển, nhiệt độ, mức độ ô nhiễm), các loài (ví dụ, thảm thực vật dưới biển, sự thay đổi về độ bao phủ của các rặng san hô), và các độ đo về tình trạng chung của hệ thống sinh thái. Người ta chia giám sát môi trường bờ biển và các vùng biển thành các tầng giám sát • Giám sát quy mô tầng 1 nhằm mục đích cung cấp thông tin có liên quan đến tình trạng chung và các xu thế cho những khu vực trải dài trên quy mô toàn quốc đến khu vực. • Giám sát và đánh giá ở quy mô tầng 2: Giám sát quy mô địa phương. Giám sát tầng 2 nhằm mục đích cung cấp thông tin có liên quan đến tình trạng và xu thế cho các khu vực mà tương đối nhỏ so với tầng 1. Giám sát ở quy mô này sẽ cung cấp thông tin về tình trạng và các xu thế • Giám sát tầng 3: Giám sát cụ thể với từng điểm Giám sát tầng 3 nhằm mục đích giải quyết các vấn đề liên quan đến từng điểm 1.3.1 Các báo cáo Các thẻ báo cáo sẽ đưa ra thông tin được thông dịch một cách dễ dàng về tình trạng và các xu thế của khu vực báo cáo. Các thành phần của mot bản báo cáo hàng năm về tình trạng và xu thế hàng năm của tài nguyên biển và tài nguyên vùng bờ biển bao gồm: • Báo cáo khung cảnh- một đặc trưng hóa về tài nguyên/atlas, bao gồm nhưng không chỉ hạn chế ở thông tin cập nhật nhất về các mặt độ quần thể dọc theo các vùng bờ biển. • Sử dụng đất • Phân loại các vùng nước trên bản đồ •
  13. CHƯƠNG 1. MÔ HÌNH TÍCH HỢP GIÁM SÁT MÔI TRƯỜNG BỜ BIỂN 6 1.4 Một số ứng dụng điển hình 1.4.1 Nghiên cứu Acid hóa đại dương Acid hóa đại dương là kết quả của việc tích tụ các khí gas do hiệu ứng nhà kính-chủ yếu là do CO2 trong khí quyển. Khi các khí gas tích lũy trong khí quyển, chúng cũng hòa tan trong nước biển và tăng độ axit của nước biển ?. Hiện nay cộng đồng khoa học vẫn không biết nhiều về axit hóa đại dương ở các khu vực bờ biển, phần lớn việc thu thập dữ liệu được tiến hành ở các vùng nước mở. Vì thế Smith Lat tại viện Scripps Institue of Oceangraphy đã sử dụng SensorPod để thiết lập một chương trình triển khai tại Scripps Pier để thiết lập một chương trình giám sát Axit hóa đại dương lâu dài. Axit hóa đại dương có thể đóng vai trò như tác nhân gây vôi hóa các sinh vật biển mà có vỏ hoặc các khung xương ngoài như con trai, con hàu, san hô. Triển khai Scripp Pier tại UC San Diego tiếp tục vận hành tốt với số lần gặp sự cố là tối thiểu kể từ tháng 3 năm 2013. Triển khai Scripps Pier có tiềm năng trở thành chuẩn công nghiệp để giám sát độ pH tại khu vực bờ biển. 1.4.2 Mạng cảm biến nhằm ứng phó với tẩy trắng san hô ở đảo Racha Yai, Thái Lan Biến đổi khí hậu và sự gia tăng nhiệt độ bề mặt nước biển, kết hợp với hiệu ứng axit hóa đại dương đã gây tác động xấu tới các hệ sinh thái biển. Hệ sinh thái rạn san hô rất nhạy cảm với những thay đổi khí hậu trong môi trường vật lý. Tẩy trắng san hô do nhiệt độ nước biển cao bất thường đã có những tác động tàn phá và lan rộng trên toàn thế giới. Nhiều yếu tố vật lý làm giảm tỷ lệ tẩy trắng san hô như ánh sáng thấp, dòng chảy cao, nhiệt độ thấp và các chất dinh dưỡng cao hơn. Mối liên hệ giữa các điều kiện vật lý và các phản ứng sinh học dẫn tới tẩy trắng san hô cho phép dự đoán hiện tượng này dựa trên số đo các thông số vật lý. Do đó, việc giám sát các thông số này trở thành một phần quan trọng của việc phát hiện và ứng phó với tẩy trắng san hô. Trên yêu cầu đó, một mạng cảm biến đã được lắp đặt ở đảo Racha Yai, Thái Lan vào đầu năm 2011 nhằm cung cấp thông tin thời gian thực về các sự kiện ?. Hệ thống được lắp đặt bao gồm một camera dưới nước, hai camera trên bờ, một CTD, nhiều cảm biến nhiệt độ / ánh sáng HOBO, cảm biến G và hai trạm thời tiết Davis. Việc thu nhận và truyền dữ liệu trong hệ thống này được thực hiện nhờ sử dụng DataTurbine. Dữ liệu được truyền qua nhiều server DataTurbine và đưa vào các server dữ liệu nội bộ trong một vài định dạng sau khi làm sạch với các bài kiểm tra chất lượng dữ liệu kèm theo các thống
  14. CHƯƠNG 1. MÔ HÌNH TÍCH HỢP GIÁM SÁT MÔI TRƯỜNG BỜ BIỂN 7 kê. Kể từ khi bắt đầu triển khai vào đầu năm 2011, hệ thống này đã hoạt động rất ổn định. Các gián đoạn nếu có chỉ là do việc bảo trì và mất điện. Đảo Racha Yai có tẩy trắng san hô rộng lớn trong năm 2010 nhưng trong năm 2011 đã không còn quan sát được hiện tượng này. 1.5 Quản trị dữ liệu hàng hải và những thách thức Trước tiên, chúng ta cần phân biệt dữ liệu với thông tin Dữ liệu là các giá trị thô có thể quan sát được có được từ các hoạt động nghiên cứu và giám sát; các giá trị này có thể là số (các độ đo nhiệt độ hoặc độ mặn). Thông tin được sử dụng để đề cập tới dữ liệu mà đã được xử lý hoặc kết quả. Quản trị dữ liệu hàng hải hoặc đại dương là quá trình nhập, kiểm soát chất lượng, lưu trữ và công bố dữ liệu nghiên cứu và giám sát được thu thập trong các vùng biển và đại dương. Dữ liệu thường được phân thành dữ liệu vận hành thời gian thực (dữ liệu được thu thập bởi các mạng sensor và các nền tảng đó, được truyền bởi vệ tinh và sóng radio) và dữ liệu lưu trữ/dịch vụ (dữ liệu được thu thập bởi các nhóm nghiên cứu và các dự án nghiên cứu, bao gồm dữ liệu mô hình hóa, dữ liệu lĩnh vực, dữ liệu thử nghiệm). Dữ liệu được thu thập tự động trên các tầu nghiên cứu được gọi là dữ liệu bán vận hành Quản trị dữ liệu hàng hải gặp phải những thách thức sau: • Thứ nhất, sự tăng lên đáng ngạc nhiên về dung lượng dữ liệu, đặc biệt trong lĩnh vực cảm nhận từ xa. • Thứ hai, là sự da dạng về các kiểu dữ liệu cần phải quản lý: dữ liệu sinh học, địa chất, địa lý, hóa lý, tất cả đều phải được tích hợp, và các phân tích và các sang phẩm thông tin phải rút ra từ các dữ liệu này. • Thứ ba, sự khác biệt chính giữa quy mô mà dữ liệu được thu thập và thông tin cần đến. Rất hiếm các dự án thu thập dữ liệu và thông tin trên quy mô cục bộ, và trên khoảng thời gian ngắn. Bản thân con người gây lên các vấn đề như sự nóng lên toàn cầu và sự tăng lên của mực nước biển, sự cạn kiệt của các loài cá, ô nhiễm, đã đặt ra sự cần thiết phải quản lý dữ liệu ở quy mô toàn cầu, tích hợp các tập dữ liệu cục bộ là cách duy nhất để tạo ra cơ sở thông tin dữ liệu toàn cầu để đưa ra các quyết định. Quản trị dữ liệu hiện đại không thể tách rời khỏi công nghệ thông tin. Những tiến bộ gần đây trong công nghệ trợ giúp cho việc làm việc với sự đa dạng và dung
  15. CHƯƠNG 1. MÔ HÌNH TÍCH HỢP GIÁM SÁT MÔI TRƯỜNG BỜ BIỂN 8 Hình 1.2: Một kiến trúc hệ thống cho các hệ thống giám sát môi trường lượng của các luồng dữ liệu. Internet đưa ra cách thức để trao đổi dữ liệu với chi phí thấp. Ấn bản điện tử ngày càng trở nên là phương pháp được lựa chọn cho truyền tin các kết quả nghiên cứu và thông báo các thông tin khác 1.6 Kiến trúc hệ thống 1.6.1 Kien truc de xuat Hình ?? chỉ ra kiến trúc cho các hệ thống giám sát môi trường trong đó DataTurbine được sử dụng như là một thành phần kiến trúc. 1.6.2 Phần cứng Chúng tôi lựa chọn một thiết bị di động Android để thu thập dữ liệu, vì nó có mức tiêu thụ năng lượng thấp và nó có khả năng chạy Java. Chúng tôi sử dụng các thiết bị di động chạy năng lượng mặt trời và 3G tích hợp để truyền dữ liệu. Các sensor đo điện thế, nhiệt độ, độ ẩm cho phép chúng ta phân tích trạng thái của thiết bị. SensorPod: SensorPod là một nền tảng tính toán di động, được thiết kế tùy biến, có khả năng thích ứng cho các mạng Sensor phối hợp với các điện
  16. CHƯƠNG 1. MÔ HÌNH TÍCH HỢP GIÁM SÁT MÔI TRƯỜNG BỜ BIỂN 9 thoại di động Android với các sensor môi trường và một hệ thống quản trị dữ liệu điện đoán đám mây. Kiến trúc mang tính modun của nó được dựa trên các chuẩn mở và phần mềm mã nguồn mở. SensorPod có thể Giám sát thời gian thực môi trường và các hệ thống sensor Cung cấp cho các nhà khoa học siêu dữ liệu (metadata) như tình trạng, QA, và các tham số được xác định bởi người sử dụng. Cho phép những người phát triển tùy biến với các dự án của họ với thực tế công nghiệp tốt nhất và các xu thế công nghệ. Với SensorPod dựa trên điện thoại Android, trạm phía bờ không còn cần thiết nữa. Dữ liệu đươc truyền về Amazon Cloud trong thời gian thực. Bằng cách tận dụng lợi thế của các hệ thống thương mại mạnh SensorPod trở thành một cách kinh tế và tin cậy để đơn giản hóa việc triển khai sensor. Dưới đây là những lý do tại sao lại sử dụng SensorPod? • Trang bị cho các nhà nghiên cứu công nghệ dễ sử dụng. Tăng cường sức mạnh nghiên cứu với công nghệ có thể tiếp cận được • Đưa ra một hạ tầng mạnh cho triển khai và bảo trì sensor lâu dài • Đơn giản hóa kiến trúc-quản lý trị dữ liệu và mạng truyền tin • Cài đặt một kiến trúc mở và linh hoạt • Tránh phải mua hệ thống phần cứng và phần mềm thương mại • Hệ thống được thiết kế để có thể chấp nhận được cả các sensor số và tương tự. Thử nghiệm đã chỉ ra rằng, trước khi sử dụng SensorPod, các sensor dưới nước đã được triển khai dưới nước vài tháng. Thông thường, các senssor sẽ hoạt động sai do cạn kiệt pin hoặc các vấn đề khác, dẫn tới việc bỏ sót hoặc các điểm dữ liệu chất lượng thấp. Với SensorPod, thông tin thời gian thực, các nhà khoa học có thể giám sát và phản ứng lại tình trạng của pin, và các kết quả đọc sensor bằng cách lên lịch bảo trì. Điều này cực kỳ quan trọng trong việc đảm bảo rằng dữ liệu được thu thập là phù hợp và chính xác và mất mát dữ liệu là tối thiểu trong một tiến trình thu thập dài.
  17. Chương 2 Giới thiệu về DataTurbine 2.1 DataTurbine DataTurbine là một phần mềm mã nguồn mở được viết bằng ngôn ngữ lập trình Java. Nó cung cấp các dịch vụ truyền dữ liệu nhanh chóng và đáng tin cậy với nhiều kiểu dữ liệu được hỗ trợ như: số, âm thanh, video hay văn bản. Với DataTurbine, chúng ta có thể quan sát được dữ liệu trong thời gian thực, dừng và tua lại việc truyền dữ liệu, chia sẻ nó với bất cứ ai trên mạng, thực hiện xử lý thời gian thực và còn nhiều hơn thế nữa ?. DataTurbine được phát triển bởi công ty Creare, một công ty tư vấn kỹ thuật và phát triển phần mềm ở Hanover, New Hampshire. Lúc mới ra đời, nó là một sản phẩm thương mại. Sự phát triển của DataTurbine diễn ra cùng lúc với sự tiến bộ trong công nghệ cảm biến và truyền thông và mong muốn của cộng đồng khoa học kỹ thuật là triển khai các mạng cảm biến quy mô lớn trong thế giới thực và các hệ thống quan sát về môi trường. DataTurbine đã được phát triển như một công cụ truyền dữ liệu cho các ứng dụng thu nhận dữ liệu thời gian thực và độc lập với các ứng dụng cụ thể. Sau nhiều năm cộng tác và nhiều tháng đàm phán, giám đốc điều hành của công ty Creare đã ký quyết định về việc phát hành DataTurbine như là một sản phẩm phần mềm mã nguồn mở. Tháng 10/2007, DataTurbine chính thức được chuyển từ phần mềm độc quyền sang phần mềm mã nguồn mở theo giấy phép Apache 2.0. Tất cả mã nguồn và tài liệu được công khai trên website của dự án. Hiện nay, các nhà phát triển và cộng đồng người dùng vẫn tiếp tục phát triển phần mềm và hỗ trợ việc phát triển ứng dụng. DataTurbine gồm có 3 thành phần chính, đó là: • Server: nhận và phân phát dữ liệu. • Source: chương trình đưa dữ liệu vào server. 10
  18. CHƯƠNG 2. GIỚI THIỆU VỀ DATATURBINE 11 Hình 2.1: Kiến trúc của DataTurbine • Sink: chương trình lấy dữ liệu từ server. Mỗi thành phần có thể được đặt trên cùng một máy hoặc các máy khác nhau, điều này tạo nên sự linh hoạt trong việc triển khai ứng dụng. 2.1.1 Kiến trúc của DataTurbine 2.1.2 Server Server của DataTurbine được chứa trong rbnb.jar (viết tắt của Ring Buffered Network Bus), nó là phần cốt lõi của DataTurbine và được sử dụng như điểm trung tâm mà các ứng dụng (source và sink) giao tiếp với. Server hoàn toàn độc lập với dữ liệu mà nó nhận và có thể chấp nhận nhiều kiểu dữ liệu khác nhau bao gồm số, âm thanh, video, văn bản, . . . Server có thể được nghĩ tới như một chuỗi các bộ đệm vòng với dữ liệu mới được thêm vào và dữ liệu cũ bị xóa đi khi vùng lưu trữ đầy. Source sẽ định rõ kích thước lưu trữ (archive size) và kích thước bộ nhớ cache (cache size) của chúng. • Kích thước lưu trữ quyết định kích thước bộ đệm vòng và lượng dữ liệu được
  19. CHƯƠNG 2. GIỚI THIỆU VỀ DATATURBINE 12 đưa vào bộ đệm trước khi bị bỏ đi. Một giá trị tốt phụ thuộc vào không gian lưu trữ của thiết bị mà server đang chạy trên đó và nhu cầu của dự án. • Kích thước bộ nhớ cache quyết định có bao nhiêu bộ đệm vòng được chứa trong bộ nhớ (RAM). Điều này một lần nữa được quyết định bởi bản chất của hệ thống và các ứng dụng. Bộ nhớ cache có thể làm tăng tốc độ xử lý nhưng một bộ nhớ cache lớn hơn không đồng nghĩa với một hệ thống nhanh hơn. Cách tiếp cận này cho phép các ứng dụng tương tác với dữ liệu trong thời gian gần với thời gian thực (near real-time). Sink có thể đọc dữ liệu khi nó được thu thập và hiển thị nó trực tuyến, trong Matlab hoặc các ứng dụng khác. Sink cũng có thể tương tác với dữ liệu và đưa nó vào thiết bị lưu trữ lâu dài. Server yêu cầu một nhãn thời gian (timestamp) chính xác cho mỗi điểm dữ liệu. Một hạn chế của điều này là dữ liệu không thể được tải lại vào server. Điều này có nghĩa là dữ liệu phải được đi vào theo thứ tự và như vậy, mỗi điểm dữ liệu phải có một nhãn thời gian lớn hơn nhãn thời gian được ghi nhận trước đó. Kích thước được xác định trong số lượng frame. Frame là một cấu trúc dữ liệu gồm một hoặc nhiều kênh (channel) với một hoặc nhiều đối tượng dữ liệu trên một kênh. Do đó kích thước của frame có thể nhỏ hoặc lớn và có thể khác nhau giữa các frame. 2.1.3 Source Source là chương trình đưa dữ liệu vào server. Source chạy độc lập với server như một ứng dụng riêng biệt và sử dụng mạng để giao tiếp. Nó có thể chạy trên cùng máy với server hoặc trên một máy khác. Mỗi source có thể chứa nhiều kênh và mỗi kênh có thể có kiểu dữ liệu riêng của nó. Source điều khiển việc cấp phát không gian lưu trữ trên ổ cứng và bộ nhớ của phía server. Cấu tạo của source như sau: • Tên: Xác định source. • Server đích: Server mà source gửi dữ liệu tới. • Kích thước bộ nhớ cache: Source định rõ có bao frame dữ liệu để cấp phát bộ đệm cho nó trong bộ nhớ của server. • Kích thước lưu trữ: Source định rõ có bao nhiêu frame dữ liệu để lưu trữ trên ổ cứng của server. • Các kênh:Mỗi kênh gồm:Tên: Xác định kênh cụ thể; Kiểu MIME: Kiểu truyền thông mà các ứng dụng có thể sử dụng để đưa ra các quyết định về dữ liệu
  20. CHƯƠNG 2. GIỚI THIỆU VỀ DATATURBINE 13 chúng đang nhận. Mỗi kênh chỉ có thể lưu trữ một kiểu dữ liệu;Dữ liệu: chuỗi các điểm dữ liệu, bao gồm thời gian và giá trị. Chúng ta hãy tưởng tượng về một tháp khí tượng đo nhiệt độ và độ ẩm được đặt trên một ngọn đồi. Gần đó là một trạm đo nhiệt độ. Chúng ta muốn đưa dữ liệu này vào DataTurbine trên một chiếc laptop ở trạm đó. Các bước chúng ta cần thực hiện là: • Khởi động server trên laptop (rbnb.jar). • Khởi động source thứ nhất trên laptop, cái đọc dữ liệu từ tháp khí tượng và đưa nó vào DataTurbine, source này chứa 2 kênh (nhiệt độ và độ ẩm). • Khởi động source thứ hai trên laptop, cái đọc dữ liệu từ trạm và đưa nó vào server, source này chỉ chứa 1 kênh (nhiệt độ). Laptop của chúng ta hiện đang có 3 chương trình đang chạy độc lập. Bây giờ chúng ta đã có dữ liệu trong server và chúng ta cần một cách để truy cập nó. Điều này sẽ được thảo luận trong phần sau. PlugIn là một kiểu source đặc biệt. Trong khi source thông thường chủ động gửi dữ liệu tới DataTurbine server thì plugin gửi dữ liệu để đáp lại các yêu cầu được gửi tới nó thông qua kết nối plugin server. 2.1.4 Sink Sink là chương trình lấy dữ liệu từ server và sử dụng nó, ví dụ đưa nó vào Matlab hoặc Real-time Data Viewer hoặc đặt nó vào một cơ sở dữ liệu quan hệ hoặc một file để lưu trữ lâu dài. Cũng giống như source, sink chạy độc lập với server như một ứng dụng riêng biệt và sử dụng mạng để giao tiếp. Nó có thể chạy trên cùng máy với server hoặc trên một máy khác. Các kiểu sink thường gặp • Viewer: Ứng dụng mà có thể được sử dụng để truy cập và tương tác với việc truyền dữ liệ nhu Real-time Data Viewer (RDV), Google Earth, . . . • Web Server: Ứng dụng mà cung cấp dữ liệu như là nội dung trang web cho việc hiển thị công khai. VD: Các đồ thị trên một website công cộng. • Analysis: Lấy dữ liệu và thực hiện một số loại phân tích thủ công hoặc tự động. VD: Mat lab, R, ESPER, . . . Export: Xuất dữ liệu vào trong một file hoặc tập hợp các file cho việc phân phối hoặc tích hợp. VD: CSV files, Excel,
  21. CHƯƠNG 2. GIỚI THIỆU VỀ DATATURBINE 14 • Storage: Lưu trữ lâu dài trong cơ sở dữ liệu hoặc một tập các file. VD: Lưu trữ trong một cơ sở dữ liệu quan hệ. Khác: Dễ dàng code bất kỳ sink nào mà sử dụng dữ liệu. Ví dụ thực hành Trở lại với ví dụ trong phần trước. Giả sử có một tháp khí tượng đo nhiệt độ và độ ẩm được đặt trên một ngọn đồi. Gần đó là một trạm đo nhiệt độ. Chúng ta đã đưa dữ liệu này vào DataTurbine trên một chiếc laptop ở trạm và bây giờ chúng ta muốn quan sát nó và chắc chắn rằng nó đã được lưu trữ. Các bước tiến hành như sau 1. Khởi động server trên laptop (rbnb.jar). 2. Khởi động source trên laptop đọc dữ liệu từ tháp khí tượng. 3. Khởi động source trên laptop đọc dữ liệu từ trạm đo nhiệt độ. 4. Khởi động sink để quan sát dữ liệu lúc nó được thu thập trong thời gian thực. Trong trường hợp này chúng ta sẽ sử dụng Real-time Data Viewer (RDV). 5. Khởi động sink để đưa dữ liệu vào thiết bị lưu trữ lâu dài. Laptop của chúng ta hiện đang có 5 chương trình chạy độc lập (1 server, 2 source và 2 sink). Chúng ta hầu như chắc chắn sẽ giữ cho server, source và sink (cái đưa dữ liệu vào thiết bị lưu trữ) chạy mọi thời điểm. Nhưng chúng ta sẽ chạy và dừng sink quan sát (trong trường hợp này là RDV) khi cần thiết. 2.2 Những điểm mạnh và hạn chế của DataTur- bine DataTurbine có những điểm mạnh sau • DataTurbine là một công cụ truyền dữ liệu đáng tin cậy. • DataTurbine có khả năng tương tác với dữ liệu trong thời gian thực hoặc gần thời gian thực. • Dễ dàng làm việc với nhiều kiểu dữ liệu khác nhau. • Tách biệt cái thu nhận dữ liệu (source) với cái sử dụng dữ liệu (sink). • Liên tục truy cập dữ liệu trong lịch sử và dữ liệu thời gian thực. • Truy cập đồng bộ qua các kênh dữ liệu khác nhau.
  22. CHƯƠNG 2. GIỚI THIỆU VỀ DATATURBINE 15 Tuy nhiên nó có các hạn chế • DataTurbine không phải là sự thay thế cho cơ sở dữ liệu, nó nên được sử dụng với một cơ sở dữ liệu. • Dữ liệu được nhận theo thứ tự thời gian và không chấp nhận dữ liệu không đúng thứ tự. • Dữ liệu không thể được tải lại vào DataTurbine.
  23. Chương 3 Lập trình với DataTurbine 3.1 Tổng quan Khi đề cập tới việc lập trình cho DataTurbine, chúng ta thường sử dụng hai cách sau đây: • Chỉnh sửa mã nguồn của DataTurbine để phù hợp với ứng dụng cụ thể. • Viết một ứng dụng chạy trên DataTurbine (trường hợp thường gặp). Thường thì ta sẽ chỉ cần viết một ứng dụng giao tiếp với DataTurbine. Trong trường hợp đó, ta không cần mã nguồn của DataTurbine, thay vào đó tất cả những gì ta cần là file rbnb.jar. Thư việnnày sẽ cung cấp cho bạn tất cả các công cụ cần thiết để ta có thể tạo ra chương trình của riêng mình. • Chỉnh sửa mã nguồn của DataTurbine: Trước khi thực hiện việc chỉnh sửa mã nguồn của DataTurbine bạn nên chắc chắn rằng điều đó thực sự cần thiết cho ứng dụng của bạn. Hầu hết các ứng dụng chỉ cần viết một source hoặc sink chạy trên DataTurbine. DataTurbine là một hệ thống môđun có khả năng mở rộng và một phần sức mạnh của nó là tính linh hoạt nó cung cấp mà không cần chỉnh sửa phần lõi của nó. • Viết một ứng dụng giao tiếp với DataTurbine: Thường thì trong trường hợp này bạn sẽ cần viết một source hoặc sink giao tiếp với DataTurbine. Điều này không quá phức tạp và nó không yêu cầu bạn phải đọc và chỉnh sửa mã nguồn của DataTurbine. Thay vào đó, bạn sẽ cần file rbnb.jar. 16
  24. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 17 3.2 Lập trình sử dụng SAPI Phần này sẽ cung cấp cho ta cái nhìn tổng quan về RBNB API (Application Programing Interface). SAPI bao gồm một tập các lớp cùng với các phương thức giúp cho bạn dễ dàng tương tác với phần lõi của DataTurbine. Nó được thiết kế để cung cấp khả năng tối đa với sự phức tạp tối thiểu. Vì lý do đó nên nó được gọi là Simple API. Bài báo cáo này không liệt kê hết tất cả các phương thức mà SAPI cung cấp. Bởi vậy, để có thể hiểu sâu hơn bạn cần tham khảo thêm trong RBNB JavaDoc. Bạn có thể download RBNB JavaDoc tại trang dataturbine.org. 3.2.1 Các kiểu đối tượng trong SAPI Có hai kiểu đối tượng chính trong trong SAPI: ChannelMap và Client. Đối tượng ChannelMap tổ chức dữ liệu. ChannelMap được sử dụng bởi RBNB client để gửi, yêu cầu và lấy dữ liệu từ RBNB server. Một đối tượng Client có thể là một trong các lớp con sau: Source, Sink hoặc PlugIn Client giao tiếp với RBNB server để gửi và lấy dữ liệu thông qua ChannelMap. Source gửi dữ liệu tới Server. Sink lấy dữ liệu từ Server. Plugin nhận các yêu cầu và trả lại dữ liệu (thực tế nó giống cả Sink và Source). • ChannelMap Tất cả dữ liệu RBNB được tổ chức trong các channel map. Client thao tác với channel map như là cách thức để đưa ra các yêu cầu (sink) và gửi dữ liệu (source). Một ChannelMap bao gồm một tập hợp các đối tượng Channel (kênh), mỗi cái có 3 thành phần chính: Tên: Tên của kênh; Dữ liệu: Dữ liệu nhị phân của các kiểu khác nhau;Nhãn thời gian (timestamp): Dãy đơn điệu tăng các số dấu phẩy động. Một source client xây dựng một ChannelMap bao gồm một hoặc nhiều kênh. Đối với mỗi kênh, nó cung cấp dữ liệu của một kiểu cụ thể và số lượng. Nó cũng chỉ rõ một nhãn thời gian đối với toàn bộ ChannelMap hoặc đối với từng phần khác nhau của ChannelMap. Sau khi xây dựng xong, ChannelMap được gửi từ source client tới RBNB server. Việc thêm các kênh mới hoặc dữ liệu mới tới các kênh đã tồn tại có thể được lặp lại. Một sink client xây dựng một channel map để yêu cầu dữ liệu. Ở đây channel map bao gồm các kênh và các nhãn thời gian, cái được gửi tới RBNB server như một yêu cầu. Đáp lại yêu cầu này là một channel map khác với dữ liệu được đưa vào các kênh khác nhau. • Source Client Source client là client chủ động, chúng khởi đầu việc truyền dữ liệu tới server. Mỗi lần source gửi dữ liệu tới server, nó được gọi là một
  25. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 18 frame. Mỗi source có thể gửi một dãy các frame tới server. Mỗi frame có thể gồm một hoặc nhiều kênh, mỗi kênh có thể gồm một hoặc nhiều điểm dữ liệu. Điểm then chốt trong ý tưởng về RBNB là tất cả dữ liệu có các nhãn thời gian. Các nhãn thời gian có thể trên mỗi frame, mỗi kênh hoặc mỗi điểm dữ liệu. Nhãn thời gian có thể tường minh (được cung cấp bởi source) hoặc ngầm định (được cung cấp tự động bởi client API hoặc RBNB server). • Sink Client Sink client là client chủ động, chúng khởi đầu việc lấy dữ liệu từ server. Cũng như source, sink lấy các frame dữ liệu từ server. Mỗi frame gồm một hoặc nhiều kênh, mỗi kênh gồm một hoặc nhiều điểm dữ liệu. Sink yêu cầu dữ liệu bằng cả tên kênh và nhãn thời gian. Dữ liệu được gửi lại sink có thể gồm nhiều frame hoặc một phần frame của source phụ thuộc vào khoảng thời gian yêu cầu. Sink có thể lấy dữ liệu từ server theo 3 chế độ: Request, Subscribe và Monitor. Chế độ Request được áp dụng với một khoảng thời gian cụ thể, với mỗi yêu cầu sẽ có một sự đáp trả tương ứng. Nó cũng có khả năng đưa ra một yêu cầu mà được tự động lặp lại sau một khoảng thời gian xác định. Chế độ Subscribe và Monitor là chế độ mở. Trong 2 chế độ này dữ liệu mới sẽ tự động được gửi từ server tới sink client khi nó sẵn sàng. Chế độ Subscribe lấy về tất cả dữ liệu, ngay cả khi điều này làm mất đi tính thời gian thực. Chế độ Monitor bỏ qua dữ liệu để tới vị trí hiện tại. • PlugIn Client PlugIn client là source thụ động. Các client khác xem PlugIn client như là RBNB source, nhưng chúng phải đợi các yêu cầu dữ liệu trước khi gửi dữ liệu đáp lại các yêu cầu đó. PlugIn thực thi cả 2 kết nối sink và source. 3.2.2 ChannelMap Client thao tác với dữ liệu thông qua đối tượng ChannelMap. Một ChannelMap gồm có một hoặc nhiều RBNB Channel, mỗi RBNB Channel gồm có tên, nhãn thời gian và dữ liệu (tùy chọn). Channel được thêm vào ChannelMap bằng phương thức ChannleMap.Add() trước khi được truyền đi bằng phương thức Fetch() hoặc Flush(). Tên kênh Một tên kênh đầy đủ bao gồm 3 phần chính: Server/- Source/Channel Trong đó: Server: Tên server được gán lúc khởi động server (từ đối dòng lệnh). Source: Tên source được xác định bởi source thông qua phương thức OpenRBNBConnetion(). Channel: Tên kênh được xác định bởi source thông qua phương thức ChannelMap.Add(). Source định nghĩa các kênh với phần Server và Source được ngầm định, bởi vậy khi sử dụng phương thức ChannelMap.Add()
  26. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 19 Kiểu dữ liệu Mô tả TYPE_FLOAT32 Số thực 32 bit (kiểu float) TYPE_FLOAT64 Số thực 64 bit (kiểu double) TYPE_INT8 Số nguyên 8 bit (kiểu byte) TYPE_INT16 Số nguyên 16 bit (kiểu short) TYPE_INT32 Số nguyên 32 bit (kiểu int) TYPE_INT64 Số nguyên 64 bit (kiểu long) TYPE_STRING Chuỗi độ dài thay đổi được TYPE_UNKNOWN Không xác định (mảng byte) TYPE_BYTEARRAY Mảng 2 chiều kiểu byte (byte[][]) TYPE_USER Siêu dữ liệu người dùng Bảng 3.1: Các kiểu dữ liệu của SAPI chỉ cần cung cấp tên kênh là đủ. Sink yêu cầu các kênh sử dụng tên tuyệt đối hoặc tương đối. Server/MySource/Test43/C2 (tên tuyệt đối) MySource/Test43/C2 (tên tương đối) Tên tuyệt đối bắt đầu với dấu gạch chéo (/) và bao gồm từ cấp cao nhất là server cho tới các kênh. Tên tương đối không bắt đầu với dấu gạch chéo (/) mà bắt đầu với tên source trên server cục bộ. Đối với sink, khi yêu cầu một danh sách các kênh khả dụng, các ký tự đại diện có thể được sử dụng. *: Đại diện cho tất cả các đối tượng (server, source, channel) ở cấp này. . . . : Đại diện cho tất cả các kênh ở cấp này. Kiểu dữ liệu của kênh Dữ liệu của ChannelMap có thể được xác định như là một kiểu dữ liệu nguyên thủy cụ thể. Dưới đây là các kiểu dữ liệu của SAPI. Các phương thức của ChannelMap Lớp ChannelMap bao gồm các phương thức sau đây: • Cấu tử (Constructor) Lớp ChannelMap chỉ có có cấu tử mặc định: public ChannelMap(). • public final int Add(String channelName) throws SAPIException:Phương thức này thêm một kênh (hoặc nhiều kênh, nếu một ký tự đại diện được sử dụng) tới channel map. Phương thức trả về chỉ số của kênh vừa được thêm. Nếu kênh đã tồn tại, chỉ số hiện tại của nó được trả về và không có hành động nào khác được thực hiện.
  27. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 20 Kiểu MIME Giá trị AUDIO audio/basic BINARY application/octet-stream GPS application/x-gps JPG image/jpeg META text/x-meta MP3 audio/mpeg3 PNG image/png RDV_EVENT text/x-eventmarker TEXT text/plain XML text/xml Bảng 3.2: Các kiểu MIME • public final void Clear():Phương thức này xóa tất cả các kênh của channel map đồng thời thu hồi lại vùng nhớ đã cấp phát cho chúng trước đó. • Đặt kiểu MIME cho kênh public void PutMIME(int index, String mime): Phương thức này đặt kiểu MIME (Multipurpose Internet Mail Extenstions) cho kênh có chỉ số index dựa vào giá trị được cung cấp (chuỗi mime). Dưới đây là danh sách các kiểu MIME được DataTurbine hỗ trợ. • Đặt nhãn thời gian cho điểm dữ liệu public void PutTime(double start, double duration) Phương thức này thiết lập nhãn thời gian cho tất cả dữ liệu được thêm vào channel map sau này. Tham số start cho biết thời gian bắt đầu tuyệt đối của frame kế tiếp. Tham số duration cho biết khoảng thời gian của frame kế tiếp. public void PutTimes(double[] times) Phương thức này thiết lập mảng thời gian cho tất cả dữ liệu được thêm vào channel map sau này. Mảng times (mảng các điểm thời gian áp dụng tới tập dữ liệu) phải có kích thước bằng với số điểm dữ liệu được thêm sau này, nếu không sẽ gây ra một ngoại lệ khi gọi phương thức PutData. public void PutTimeRef(ChanelMap sourceMap, int channelIndex) throws IllegalArgumentException Phương thức này sao chép nhãn thời gian của một kênh trong channel map (sourceMap) được xác định bởi chỉ số kênh (channelIndex). Nhãn thời gian này phải tương thích với dữ liệu được thêm vào sau này, nếu không sẽ gây ra một ngoại lệ. Cả 3 phương thức trên đều xóa thiết lập PutTimeAuto nếu có. Tất cả các lời gọi phương thức PutData theo sau một lời gọi phương thức PutTime sẽ được đặt nhãn thời gian phù hợp. Ví dụ bạn có thể gọi phương thức PutTime
  28. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 21 một lần cho toàn bộ ChannleMap, trong trường hợp này tất cả dữ liệu của tất cả các kênh cùng dùng chung một nhãn thời gian. Hoặc bạn có thể gọi phương thức PutTime trước mỗi lời gọi phương thức PutData, điều này đưa ra các nhãn thời gian duy nhất tới mỗi điểm dữ liệu của mỗi kênh. public void PutTimeAuto(String timeMode) Phương thức này thiết lập chế độ sinh nhãn thời gian tự động mà sẽ được sử dụng vào lời gọi phương thức Flush() tiếp theo. Trong đó timeMode có thể nhận các giá trị sau: next: Nhãn thời gian sẽ tăng bắt đầu từ 1 mỗi lần phương thức Source.Flush được gọi. timeofday: Nhãn thời gian được thiết lập bằng với thời gian hệ thống phía client mỗi lần phương thức PutData được gọi. server: Đây là chế độ mặc đinh. Nhãn thời gian được thiết lập bằng với thời gian hệ thống phía server tại thời điểm frame được đặt vào bộ đệm vòng. Chế độ này không nên được sử dụng cùng với bất kỳ kiểu nhãn thời gian nào khác trong một frame đơn. • Đưa dữ liệu vào ChannelMap Các phương thức sau đưa dữ liệu vào Chan- nelMap, chúng thường được sử dụng bởi Source và PlugIn. Chú ý rằng việc đưa dữ liệu vào ChannelMap không gửi dữ liệu tới RBNB server, nó xây dựng một ChannelMap cục bộ. Sau khi xây dựng xong ChannelMap, nó được gửi từ client tới RBNB server thông qua phương thức Source.Flush. public void PutData(int channelIndex, byte[] rawData, int typeID) throws SAPIEx- ception Phương thức này thêm dữ liệu (rawData) vào channel map ở dạng mảng byte tới kênh được xác định bằng chỉ số kênh (channelIndex). Tham số thứ 3 (typeID) là một số nguyên biểu diễn kiểu dữ liệu, nó là một trong các kiểu dữ liệu của SAPI. public void PutDataAsXXX(int channelIndex, XXX[] data) throws SAPIException Các phương thức PutDataAsXXX chỉ rõ kiểu dữ liệu nguyên thủy của mảng dữ liệu được cung cấp, XXX tương ứng với một trong các kiểu dữ liệu của SAPI. Ví dụ phương thức Put- DataAsFloat32 cho phép bạn gửi trực tiếp một mảng dữ liệu kiểu float mà không cần chuyển đổi nó thành mảng byte. PutDataAsFloat64 PutDataAs- Float32 PutDataAsInt64 PutDataAsInt32 PutDataAsInt16 PutDataAsInt8 PutDataAsString PutDataAsByte (phiên bản ản toàn của PutData) • Lấy nhãn thời gian từ ChannelMap public double[] GetTimes(int index) Phương thức này trả về một mảng các giá trị thời gian của kênh có chỉ số kênh là index. Sẽ có một điểm thời gian trên mỗi điểm dữ liệu. Một tham chiếu tới mảng double được lưu trữ trong channel map được trả về, nó không nên được chỉnh sửa bởi người dùng cuối. Mảng trả về chỉ được tính toán khi phương thức này được gọi lần đầu tiên trên chỉ số kênh đó và vẫn là mảng đó
  29. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 22 được trả về vào các lời gọi tiếp theo. Nếu không có dữ liệu khả dụng, phương thức sẽ trả về null. • Lấy dữ liệu từ ChannelMap Các phương thức sau truy cập dữ liệu trong Chan- nelMap, chúng thường được sử dụng bởi Sink và PlugIn. Chú ý rằng việc lấy dữ liệu từ ChannelMap không lấy nó từ RBNB server mà từ một ChannelMap cục bộ. Trước đó, ChannelMap được gửi từ RBNB server tới client thông qua phương thức Sink.Fetch. public byte[] GetData(int index) Phương thức này trả về dữ liệu thô của kênh có chỉ số index dưới dạng mảng byte. public XXX[] GetDataAsXXX(int index) Các phương thức GetDataAsXXX chỉ rõ kiểu dữ liệu nguyên thủy của mảng dữ liệu được trả về, XXX tương ứng với một trong các kiểu dữ liệu của SAPI. Ví dụ phương thức GetDataAsFloat32 trả về một mảng dữ liệu kiểu float mà không cần chuyển đổi nó từ một mảng byte. Nếu dữ liệu được lấy không phù hợp với kiểu thì sẽ gây ra một ngoại lệ. Để kiểm tra kiểu bạn sử dụng phương thức ChannelType • Lấy thông tin của kênh Các phương thức sau cung cấp thông tin về một kênh. public final int GetType(int index) Phương thức này trả về kiểu dữ liệu của kênh có chỉ số kênh là index. Chú ý rằng phương thức này không trả về TYPE_USER. public int TypeID(String type) public String TypeName(int typeID) Hai phương thức trên thực hiện chuyển đổi chuỗi mô tả kiểu dữ liệu sang giá trị ở dạng số và ngược lại. Có một số phương thức cho phép bạn kiểm tra và lấy về tên của các kênh trong một đối tượng ChannelMap. Các phương thức này là: public final String[] GetChannelList() Phương thức này trả về tên của tất cả các kênh được chứa trong đối tượng ChannelMap. Nếu đối tượng ChannelMap đó không chứa kênh nào cả thì một mảng rỗng được trả về. • public final int GetIndex(String channelName):Phương thức này cung cấp cách thức để lấy về chỉ số của kênh có tên là channelName. 3.2.3 Client Client thao tác với ChannelMap để gửi và lấy dữ liệu từ RBNB server. Lớp Client là lớp cơ sở của tất cả tất cả các client: Source, Sink, PlugIn. Lớp cơ sở Client đóng gói chức năng chung cho tất cả các client. Client có các phương thức để mở và đóng kết nối giữa ứng dụng client và RBNB server. Để mở một kết nối ta cần quan tâm đến các tham số sau: • serverAddress: Địa chỉ của server muốn kết nối tới.
  30. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 23 • clientName: Tên được sử dụng để xác định client này trên server. • userName: Tên được sử dụng để đăng nhập vào server. Giá trị này được truyền đi ở dạng văn bản thuần túy và không thực sự được sử dụng để giới hạn truy cập. Đây là tham số tùy chọn. • password: Được kết hợp với userName. Giá trị này được truyền đi ở dạng văn bản thuần túy. Nếu được thiết lập thì chỉ có những client có password giống nhau mới được quyền truy cập dữ liệu. Dưới đây là 3 phương thức được sử dụng để kết nối tới server. 1. public final void OpenRBNBConnection() throws SAPIException. Mở một kết nối tới server, sử dụng các tham số mặc định: • serverAddress = localhost:3333 • clientName = MyClient • userName =  • password =  2. public final void OpenRBNBConnection(String serverAddress, String client- Name) throws SAPIException: Phương thức này mở một kết nối tới server, sử dụng các tham số mặc định: • userName =  • password =  3. public final void OpenRBNBConnection(String serverAddress, String client- Name, String userName, String password) throws SAPIException: Mở một kết nối tới server mà không sử dụng tham số mặc định nào. Các phương thức kết nối tới server public final void CloseRBNBConnection() Phương thức này đóng kết nối với server và giải phóng các tài nguyên liên quan. Vùng nhớ cache trên server sẽ bị xóa nhưng vùng lưu trữ trên đĩa cứng vẫn được giữ nguyên mặc dù lúc này không thể truy cập dữ liệu ở server nữa. Nếu bạn có một Source và bạn muốn đóng kết nối nhưng vẫn cho phép truy cập dữ liệu, hãy sử dụng phương thức Source.Detach(). Lấy thông tin của server Hai phương thức dưới đây trả tên của RBNB server cục bộ mà client này đang kết nối tới và tên của chính client đó. Hai phương thức này đều sinh ra ngoại lệ IllegalStateException nếu client đó hiện không kết nối tới server
  31. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 24 nào cả. public final String GetServerName() public final String GetClientName() Các thuộc tính của bộ đệm vòng (Ring Buffer) Các client có thể thiết lập kích thước bộ đệm vòng của RBNB server mà gắn với dữ liệu của chúng. Thông thường, điều này chỉ áp dụng cho các Source client. Các tham số cacheSize và archiveSize xác định dung lượng RAM và dung lượng ổ cứng của bộ đệm vòng (trong các frame). Mỗi lời gọi phương thức Flush của Source tạo nên một frame. public void SetRingBuffer(int cache, String mode, int archive) Tham số mode có thể nhận một trong các giá trị sau: none: Không có vùng lưu trữ nào được sử dụng (mặc định). load: Tải vùng lưu trữ phù hợp với ứng dụng client này. create: Tạo vùng lưu trữ mới và xóa cái cũ đi (nếu tồn tại). append: Thêm dữ liệu tới vùng lưu trữ đã tồn tại hoặc tạo mới nếu vùng lưu trữ đó chưa tồn tại. 3.2.4 Source Client RBNB source gửi dữ liệu tới RBNB server. Để gửi dữ liệu tới server, source cần thực hiện các bước sau: • Bước 1: Xây dựng ChannelMap (tạo mới đối tượng ChanneMap và thêm các kênh tới ChannelMap đó). • Bước 2: Đặt kiểu MIME cho kênh (sử dụng phương thức PutMIME). • Bước 3: Đặt nhãn thời gian (sử dụng các phương thức PutTime). • Bước 4: Đưa dữ liệu vào ChannelMap (sử dụng các phương thức PutData). • Bước 5: Đưa dữ liệu tới RBNB server (sử dụng phương thức Flush). Các bước từ bước 1 tới bước 4 đã được trình bày trong phần về ChanneMap. Bước 5 chúng ta sẽ được biết trong phần này. Đưa dữ liệu tới RBNB server. public int Flush(ChannelMap ch, boolean doSynch) throws SAPIException Phương thức này gửi các kênh trong ChannelMap ch tới server. Nếu doSynch là true thì source sẽ giao tiếp với server để xác minh xem việc đưa dữ liệu tới server có thành công không. Dữ liệu và các nhãn thời gian trong ChannelMap bị xóa hết sau khi chúng được gửi đi, mặc dù tên vẫn được giữ lại. Bởi vậy chỉ dữ liệu mới được thêm vào ChannelMap sau lời gọi phương thức Flush trước đó được gửi đi. Phương thức này trả về số kênh được gửi tới server. public int Flush(ChannelMap ch) throws SAPIException Phương thức này gửi dữ liệu tới server trong chế độ không đồng bộ. Nó tương ứng với việc gọi phương thức Flush(ChannelMap, boolean) với giá trị false cho tham số doSynch. Đóng kết nối nhưng vẫn cho phép truy cập dữ liệu public final void
  32. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 25 1 import com.rbnb.sapi.*; 2 3 public class SimpleSource { 4 public static void main(String[] args) throws SAPIException { 5 6 Source src = new Source(); 7 src.OpenRBNBConnection("localhost", "MySource"); 8 9 10 ChannelMap cmap = new ChannelMap(); 11 cmap.Add("MyChannel"); 12 13 14 cmap.PutMime(0, "text/plain"); 15 16 17 cmap.PutTimeAuto("timeofday"); 18 19 20 cmap.PutDataAsString(0, "Hello World!"); 21 22 23 src.Flush(cmap); 24 25 26 src.Detach(); 27 } 28 } Hình 3.1: Tải dữ liệu vào RBNB server Detach() Lớp Client đã cung cấp phương thức Client.CloseRBNBConnection() để đóng kết nối với server. Tuy nhiên, sau khi gọi phương thức này thì các sink client không thể tiếp tục truy cập dữ liệu được ghi trước đó nữa. Lớp Source cung cấp thêm phương thức Detach cho phép đóng kết nối với server nhưng vẫn giữ lại bộ xử lý phía server và các bộ đệm vòng của nó. Bởi vậy các sink client vẫn có thể tiếp tục truy cập dữ liệu được ghi trước đó. Hình 3.1 chỉ ra đoạn mã mở kết nối tới RBNB server và gửi chuỗi Hello World tới nó. Hình 3.2 chỉ ra đoạn mã mở kết nối tới RBNB server và đưa hình ảnh có định dạng JPEG tới nó. Cần chú ý rằng đối với file ảnh có kích thước nhỏ như trong ví dụ này bạn có thể dùng phương thức Files.readAllBytes() để đọc tất cả các byte từ file đó rồi đưa vào kênh sử dụng phương thức PutDataAsByteArray. Nhưng đối với những file ảnh có kích thước lớn bạn nên dùng cách sau:
  33. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 26 1 import java.nio.file.*; 2 import java.io.*; 3 4 public class ImageSource { 5 public static void main(String[] args) throws SAPIException, IOException { 6 7 Source src = new Source(); 8 src.OpenRBNBConnection("localhost", "ImageSource"); 9 10 11 ChannelMap cmap = new ChannelMap(); 12 cmap.Add("MyChannel"); 13 14 15 cmap.PutMime(0, "image/jpeg"); 16 17 18 cmap.PutTimeAuto("timeofday"); 19 20 21 Path path = Paths.get("D:/Images", "MyImage.jpg"); 22 cmap.PutDataAsByteArray(0, Files.readAllBytes(path)); 23 24 25 src.Flush(cmap); 26 27 28 src.Detach(); 29 } 30 } Hình 3.2: Tải dữ liệu ảnh vào RBNB server 1 BufferedImage img = ImageIO.read(new File("D:/Images/MyImage.jpg")); 2 ByteArrayOutputStream os = new ByteArrayOutputStream(); 3 ImageIO.write(img, "jpg", os); 4 cmap.PutDataAsByteArray(0, os.toByteArray()); Hình 3.3: Một cách khác để tải dữ liệu ảnh vào RBNB server
  34. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 27 3.2.5 Sink Client RBNB sink lấy dữ liệu từ RBNB server. Để lấy dữ liệu từ server, sink thực hiện các bước sau: • Bước 1: Tạo một đối tượng ChannelMap và thêm các kênh mà sink muốn lấy dữ liệu vào ChannelMap đó. • Bước 2: Thiết lập chế độ lấy dữ liệu cho sink. • Bước 3: Tạo một ChannelMap mới, sau đó lấy dữ liệu từ RBNB server đưa vào ChannelMap đó (sử dụng phương thức Fetch). • Bước 4: Lấy dữ liệu và thời gian từ ChannelMap vừa tạo ở bước 3 (sử dụng các phương thức GetData). • Bước 5: Lặp lại bước 3 nếu muốn với chế độ Subscribe và Monitor hoặc bước 2 và 3 với chế độ Request. Như đã đề cập trong phần trước thì sink có thể lấy dữ liệu từ server theo 3 chế độ: Request, Subscribe và Monitor. 1. Request:public final void Request(ChannelMap cm, double startTime, double duration, String timeReference) throws SAPIException Chế độ này yêu cầu một lát thời gian của dữ liệu, bắt đầu từ startTime và chạy trong khoảng duration, đơn vị là giây. Tham số timeReference xác định tham chiếu thời gian cho startTime, trong đó: 2. Subscribe: Đây là chế độ hiệu quả nhất. Nó khởi tạo một luồng dữ liệu từ server tới client, sau đó các frame dữ liệu được truyền từ server mà không cần đợi xác nhận của client. Nếu client không theo kịp, dữ liệu được truyền sẽ lùi dần về phía sau cho tới điểm bắt đầu của dữ liệu (cũ nhất) trong bộ đệm vòng, lúc này luồng ngừng lại. 3. Monitor: Đây là một biến thể của chế độ Subscribe. Điểm khác biệt của Mon- itor so với Subscribe là luồng sẽ không ngừng lại nếu client không theo kịp nhưng dữ liệu có thể bị mất. Trong chế độ này, server sẽ cố gắng gửi dữ liệu mới nhất. Ví dụ 3: Viết sink lấy dữ liệu đã đưa vào RBNB server trong ví dụ 1. Ví dụ 4: Viết sink lấy dữ liệu đã đưa vào RBNB server trong ví dụ 2
  35. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 28 1 import com.rbnb.sapi.*; 2 3 public class SimpleSink { 4 public static void main(String[] args) throws SAPIException { 5 6 Sink sink = new Sink(); 7 sink.OpenRBNBConnection("localhost", "MySink"); 8 9 10 ChannelMap reqmap = new ChannelMap(); 11 reqmap.Add("MySource/MyChannel"); 12 13 14 sink.Request(reqmap, 0.0, 0.0, "newest"); 15 16 17 ChannelMap getmap = sink.Fetch(1000); 18 19 20 System.out.println(getmap.GetName(0) + ": " + getmap.GetDataAsString(0)[0]) ; 21 22 23 sink.CloseRBNBConnection(); 24 } 25 } Hình 3.4: Sink lấy dữ liệu đã đưa vào RBNB server
  36. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 29 1 import com.rbnb.sapi.*; 2 import java.io.*; 3 4 public class ImageSink { 5 public static void main(String[] args) throws SAPIException, IOException { 6 7 Sink sink = new Sink(); 8 sink.OpenRBNBConnection("localhost", "ImageSink"); 9 10 11 ChannelMap reqmap = new ChannelMap(); 12 reqmap.Add("ImageSource/MyChannel"); 13 14 15 sink.Request(reqmap, 0.0, 0.0, "newest"); 16 17 18 ChannelMap getmap = sink.Fetch(1000); 19 20 21 byte[][] b = getmap.GetDataAsByteArray(0); 22 FileOutputStream fos = new FileOutputStream("D:/ImageSinkTest.jpg"); 23 fos.write(b[0]); 24 25 sink.CloseRBNBConnection(); 26 } 27 } Hình 3.5: Sink lấy dữ liệu ảnh đã đưa vào RBNB server
  37. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 30 Hình 3.6: Kênh nhiệt độ Hình 3.7: Kênh ánh sáng 3.3 Một số kết quả thử nghiệm 3.3.1 Thử nghiệm trên dữ liệu sensor Intel Tập dữ liệu này chứa dữ liệu được thu thập từ 54 cảm biến được triển khai tại phòng thí nghiệm Intel Berkeley Research từ ngày 28 tháng 2 đến ngày 5 tháng 4 năm 2004. Cấu trúc của file như sau: Cấu trúc của file như sau: Trong đó, moteid nhận giá trị từ 1-54 tương ứng với 54 cảm biến; epoch:int thể hiện đây là lần đo thứ epcho của cảm biến moteid; temperature là nhiệt độ tính theo đơn vị do C; humidity là độ ẩm nhận giá trị từ 0-100 % ; light là ánh sáng tính theo đơn vị Lux; voltage là điện áp nhận giá trị từ 2-3 V. Chúng tôi sẽ đọc
  38. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 31 Hình 3.8: Kênh độ ẩm Hình 3.9: Kênh điện thế
  39. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 32 file này và đưa dữ liệu đo được từ cảm biến có moteid là 1 vào DataTurbine Server trên 4 kênh tương ứng với 4 trường thông tin temperature (nhiệt độ), humidity (độ ẩm), light (ánh sáng) và voltage (điện áp). 3.3.2 Thử nghiệm trên dữ liệu video qua chương trình video chat Như chúng tôi đã đề cập trong phần giới thiệu, một trong những khả năng mạnh mẽ mà DataTurbine cung cấp chính là tính thời gian thực. Sink có thể truy cập và sử dụng dữ liệu ngay khi nó vừa được đưa tới server, bất chấp quá trình truyền dữ liệu vẫn đang diễn ra. Ý tưởng đầu tiên khi xây dựng hệ thống mới này chính là tận dụng tính thời gian thực của DataTurbine. Bây giờ, chúng ta hãy suy nghĩ về những việc cần phải làm khi xây dựng phần mềm video chat. Dữ liệu cần trao đổi và truyền tải trong mạng là video. Hệ thống client cần có khả năng giao tiếp với webcam và microphone để thu được dữ liệu thích hợp và gửi nó tới cho phía bên kia; đồng thời nó cũng cần có khả năng nhận dữ liệu từ phía bên kia gửi lại và phát video nó nhận được. Giả sử bây giờ có 2 client chat với nhau, để tiện cho việc mô tả sau này, chúng ta sẽ gọi chúng là A và B. Theo cách tiếp cận thông thường, chúng ta sẽ cần có thêm một server C đóng vai trò cung cấp dịch vụ cho A và B. Trước khi có thể chat với nhau, cả A và B đều phải kết nối tới server C. Khi A muốn chat với B, nó yêu cầu địa chỉ IP của B từ server C và thực hiện kết nối tới B. Nếu kết nối thành công A và B sẽ có thể chat với nhau. Tuy nhiên, công việc sẽ trở nên đơn giản hơn khi chúng ta sử dụng thêm RBNB server. Khi A gửi tới server C yêu cầu chat với B, server C sẽ gửi yêu cầu đó tới cho B, nếu B chấp nhận yêu cầu, server C sẽ ghi nhận A và B đang ở trạng thái chat. Lúc này, A tạo ra một source mới và kết nối nó tới RBNB server. Tiếp theo đó, A gửi dữ liệu tới RBNB server. Quá trình diễn ra như đã được mô tả trong phần 2.1. Server C cần gửi cho B vị trí cụ thể của dữ liệu mà A đã gửi tới RBNB server theo cú pháp tên_source tên_kênh. Bây giờ chính là lúc, chúng ta tận dụng sức mạnh thời gian thực của DataTurbine. Ngay khi dữ liệu gửi từ A được đưa tới RBNB server và B đã biết vị trí của dữ liệu, B sẽ tạo sink kết nối tới RBNB server và lấy dữ liệu đó về. Vào lúc này, A vẫn tiếp tục gửi dữ liệu tới RBNB server. Tương tự B cũng thực hiện hoạt động giống như A. Quá trình gửi và nhận dữ liệu kết thúc khi A hoặc B ngừng chat hoặc ngắt kết nối với server.
  40. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 33 1 package chatwebcamserver; 2 3 import java.net.*; 4 import java.util.Iterator; 5 import java.io.*; 6 7 public class QuanLyKetNoi extends Thread { 8 private Socket socket; 9 private BufferedReader br; 10 private PrintWriter pw; 11 private AmThanhThread amThanhThread; 12 13 public QuanLyKetNoi(Socket socket) throws IOException { 14 this.socket = socket; 15 br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 16 pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket. getOutputStream()))); 17 this.start(); 18 } 19 20 public void run() { 21 try { 22 while ( true ){ 23 boolean thoat = false ; 24 try { 25 String msg = br.readLine(); 26 String header = msg.substring(0, 7); 27 if (header.equals("connect")) { 28 guiDuLieuToiTatCaClient("insert" + msg.substring(7, msg.length())); 29 FrmServer.addClient(msg.substring(7, msg.indexOf(" ")), msg. substring(msg.indexOf(" ")+5, msg.length())); 30 FrmServer.sockets.put(msg.substring(7, msg.indexOf(" ")), socket ); 31 guiDuLieuLanDau(FrmServer.clients.size()-1); 32 } 33 else if (header.equals("disconn")) { 34 guiDuLieuToiTatCaClient("delete" + msg.substring(10, msg.length())) ; 35 FrmServer.removeClient(msg.substring(10, msg.length())); 36 FrmServer.sockets.remove(msg.substring(10, msg.length())); 37 thoat = true ; 38 39 } 40 else { 41 String h = msg.substring(0, 4); 42 String a,b; 43 String receiver = msg.substring(msg.indexOf("@@@")+3, msg. lastIndexOf(" ")); 44 switch (h) { 45 case " acce ": 46 a = msg.substring(6, msg.indexOf(" ")); 47 b = msg.substring(msg.indexOf("@@@") + 3, msg.lastIndexOf(" ")); 48 guiDuLieuToiTatCaClient("busy" + msg.substring(6, msg.indexOf(" @@@")) + "###" + msg.substring(msg.indexOf("@@@") + 3, msg. length())); 49 FrmServer.danhSachClientDangBan.add(a); 50 FrmServer.danhSachClientDangBan.add(b); 51 amThanhThread = new AmThanhThread(); 52 amThanhThread.start(); 53 break ; 54 case " stop ": 55 a = msg.substring(4, msg.indexOf(" ")); 56 b = msg.substring(msg.indexOf("@@@") + 3, msg.lastIndexOf(" ")); 57 guiDuLieuToiTatCaClient("free" + msg.substring(4, msg.indexOf(" @@@")) + "###" + msg.substring(msg.indexOf("@@@") + 3, msg. length())); 58 FrmServer.danhSachClientDangBan.remove(a); 59 FrmServer.danhSachClientDangBan.remove(b); 60 } 61 try { 62 PrintWriter printWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(FrmServer.sockets.get(receiver). getOutputStream()))); 63 printWriter.println(msg); 64 printWriter.flush(); 65 } 66 catch(Exception e) { 67 e.printStackTrace(); 68 } 69 } 70 //guiDuLieuToiTatCaClient(); 71 if( thoat == true ){ 72 break ; 73 } 74 } catch (Exception e) { 75 76 } 77 } 78 } catch (Exception e) { 79 e.printStackTrace(); 80 } finally { 81 try { 82 socket.close(); 83 } catch (IOException e) { 84 e.printStackTrace(); 85 } 86 } 87 } 88 89 90 public void guiDuLieuLanDau(int a) { 91 String soLuongClient = String.valueOf(FrmServer.sockets.size()); 92 Socket socket = FrmServer.sockets.get(FrmServer.clients.get(a)); 93 try { 94 PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))); 95 pw.println(soLuongClient); 96 pw.flush(); 97 for (int j=0;j<FrmServer.sockets.size();j++) { 98 String tt = ""; 99 if(FrmServer.danhSachClientDangBan.contains(FrmServer.clients.get(j)) ){ 100 tt = " (Dang chat)"; 101 } 102 pw.println(FrmServer.clients.get(j) + " " + FrmServer.users.get(j ) + tt); 103 pw.flush(); 104 } 105 } 106 catch(Exception e) { 107 e.printStackTrace(); 108 } 109 } 110 111 112 public void guiDuLieuToiTatCaClient(String data) { 113 for (int i=0;i<FrmServer.sockets.size();i++) { 114 try { 115 Socket socket = FrmServer.sockets.get(FrmServer.clients.get(i)); 116 PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))); 117 pw.println(data); 118 pw.flush(); 119 } 120 catch(Exception e) { 121 e.printStackTrace(); 122 } 123 } 124 } 125 }
  41. CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE 34 Đoạn mã trên quản lý các kết nối giữa client và server.
  42. Chương 4 Kết luận Trong báo cáo khoa học này chúng tôi đã đề xuất một mô hình giám sát tích hợp nói chung cho các khu vực bờ biển. Trong đó chúng tôi chỉ ra rằng giám sát dữ liệu có vai trò quan trọng trong mô hình giám sát tích hợp này. Một trong những thách thức của việc thu thập dữ liệu từ xa là làm thế nào để có được dữ liệu từ các thử nghiệm có độ chính xác, chất lượng cao, mà không bỏ sót hay mất mát thông tin. DataTurbine là một giải pháp cho phép thu thập dữ liệu thời gian thực. DataTurbine có thể được sử dụng như là một động cơ dữ liệu dòng thời gian thực, phần mềm chi phép người sử dụng tạo ra các dòng dữ liệu trực tiếp từ các sensors, các phòng thí nghiệm, và các điện thoại di động Công cụ này khả chuyển và có thể dễ dàng khả mở để đáp ứng dung lượng dữ liệu được tạo ra bởi một dự án khi nó phát triển. DataTurbine cung cấp một giao diện lập trình ứng dụng tốt-giao thức cần mở rộng phần mềm với các ứng dụng tùy chọn vì thế người sử dụng có thể tùy biến chương trình cho nhu cầu bất kỳ. Một trong những đặc trưng riêng biệt của DataTurbine là khả năng cho phép các ứng dụng dừng và tua lại các dòng dữ liệu trực tiếp. Người sử dụng có thể làm việc với dữ liệu khi nó đến từ một phòng lab hoặc từ thực địa mà không cản trở quá trình thu thập dữ liệu từ các tiến trình khác. Dữ liệu đến từ một nguồn bất kỳ đều có chung một khuôn dạng thống nhất. Người sử dụng đặc tả metadata, vì thế một khi dữ liệu đã đi vào DataTurbine, tất cả dữ liệu đều có cùng khuôn dạng và có thể được chuyển tiếp trong những khoảng thời gian liên tục. Với những đặc trưng trên, DataTurbine có thể được lựa chọn như là một giải pháp cho thu thập và quản trị dữ liệu thời gian thực có được từ thực địa trong mô hình giám sát môi trường bờ biển tích hợp. 35