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 Hệ thống giám sát tích hợp . . . . . . . . . . . . . . . . . . . . . . 1 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

2.1 DataTurbine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 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

2 MỤC LỤC

3 Lập trình với DataTurbine

3.1 Tổng quan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 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

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

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

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

ii MỞ ĐẦU

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.

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

2 CHƯƠNG 1. MÔ HÌNH TÍCH HỢP GIÁM SÁT MÔI TRƯỜNG BỜ BIỂN

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

3 CHƯƠNG 1. MÔ HÌNH TÍCH HỢP GIÁM SÁT MÔI TRƯỜNG BỜ BIỂN

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

4 CHƯƠNG 1. MÔ HÌNH TÍCH HỢP GIÁM SÁT MÔI TRƯỜNG BỜ BIỂN

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

5 CHƯƠNG 1. MÔ HÌNH TÍCH HỢP GIÁM SÁT MÔI TRƯỜNG BỜ BIỂN

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 đồ

6 CHƯƠNG 1. MÔ HÌNH TÍCH HỢP GIÁM SÁT MÔI TRƯỜNG BỜ BIỂN

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

7 CHƯƠNG 1. MÔ HÌNH TÍCH HỢP GIÁM SÁT MÔI TRƯỜNG BỜ BIỂN

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

8 CHƯƠNG 1. MÔ HÌNH TÍCH HỢP GIÁM SÁT MÔI TRƯỜNG BỜ BIỂN

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

9 CHƯƠNG 1. MÔ HÌNH TÍCH HỢP GIÁM SÁT MÔI TRƯỜNG BỜ BIỂN

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.

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

11 CHƯƠNG 2. GIỚI THIỆU VỀ DATATURBINE

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

12 CHƯƠNG 2. GIỚI THIỆU VỀ DATATURBINE

đư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

13 CHƯƠNG 2. GIỚI THIỆU VỀ DATATURBINE

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,

. . .

14 CHƯƠNG 2. GIỚI THIỆU VỀ DATATURBINE

• 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.

15 CHƯƠNG 2. GIỚI THIỆU VỀ DATATURBINE

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.

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

17 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

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

18 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

“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()

19 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

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.

20 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

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

21 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

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 đó

22 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

đượ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.

23 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

• 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

24 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

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

Source src = new Source () ;

src . OpenRBNBConnection ( " localhost " , " MySource " ) ;

ChannelMap cmap = new ChannelMap () ;

cmap . Add ( " MyChannel " ) ;

cmap . PutMime (0 , " text / plain " ) ;

cmap . PutTimeAuto ( " timeofday " ) ;

cmap . PutDataAsString (0 , " Hello World ! " ) ;

src . Flush ( cmap ) ;

src . Detach () ;

http://pastebin.com/ 1 import com . rbnb . sapi .*; 2 3 public class SimpleSource { 4 public static void main ( String [] args ) throws SAPIException { 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 } 28 }

25 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

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:

public static void main ( String [] args ) throws SAPIException , IOException {

Source src = new Source () ;

src . OpenRBNBConnection ( " localhost " , " ImageSource " ) ;

ChannelMap cmap = new ChannelMap () ;

cmap . Add ( " MyChannel " ) ;

cmap . PutMime (0 , " image / jpeg " ) ;

cmap . PutTimeAuto ( " timeofday " ) ;

Path path = Paths . get ( " D :/ Images " , " MyImage . jpg " ) ;

cmap . PutDataAsByteArray (0 , Files . readAllBytes ( path ) ) ;

src . Flush ( cmap ) ;

src . Detach () ;

}

http://pastebin.com/ 1 import java . nio . file .*; 2 import java . io .*; 3 4 public class ImageSource { 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 }

26 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

Hình 3.2: Tải dữ liệu ảnh vào RBNB server

Byt eArr ayOu tputS trea m os = new By teArr ayOu tput St re a m () ;

http://pastebin.com/ 1 BufferedImage img = ImageIO . read ( new File ( " D :/ Images / MyImage . jpg " ) ) ; 2 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

27 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

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

public static void main ( String [] args ) throws SAPIException {

Sink sink = new Sink () ;

sink . OpenRBNBConnection ( " localhost " , " MySink " ) ;

ChannelMap reqmap = new ChannelMap () ;

reqmap . Add ( " MySource / MyChannel " ) ;

sink . Request ( reqmap , 0.0 , 0.0 , " newest " ) ;

ChannelMap getmap = sink . Fetch (1000) ;

System . out . println ( getmap . GetName (0) + " : " + getmap . GetDataAsString (0) [0])

http://pastebin.com/ 1 import com . rbnb . sapi .*; 2 3 public class SimpleSink { 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

;

sink . CloseRBNBConnection () ;

}

21 22 23 24 25 }

28 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

Hình 3.4: Sink lấy dữ liệu đã đưa vào RBNB server

public static void main ( String [] args ) throws SAPIException , IOException {

Sink sink = new Sink () ;

sink . OpenRBNBConnection ( " localhost " , " ImageSink " ) ;

ChannelMap reqmap = new ChannelMap () ;

reqmap . Add ( " ImageSource / MyChannel " ) ;

sink . Request ( reqmap , 0.0 , 0.0 , " newest " ) ;

ChannelMap getmap = sink . Fetch (1000) ;

byte [][] b = getmap . GetDa ta As By te Ar ra y (0) ;

FileOutputStream fos = new FileOutputStream ( " D :/ ImageSinkTest . jpg " ) ;

fos . write ( b [0]) ;

sink . CloseRBNBConnection () ;

}

http://pastebin.com/ 1 import com . rbnb . sapi .*; 2 import java . io .*; 3 4 public class ImageSink { 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 }

29 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

Hình 3.5: Sink lấy dữ liệu ảnh đã đưa vào RBNB server

30 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

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

31 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

Hình 3.8: Kênh độ ẩm

Hình 3.9: Kênh điện thế

32 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

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.

private Socket socket ;

private BufferedReader br ;

private PrintWriter pw ;

private AmThanhThread amThanhThread ;

public QuanLyKetNoi ( Socket socket ) throws IOException {

this . socket = socket ;

br = new BufferedReader ( new InputStreamReader ( socket . getInputStream () ) ) ;

pw = new PrintWriter ( new BufferedWriter ( new Ou tp utStreamWriter ( socket .

http://pastebin.com/ 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 9 10 11 12 13 14 15 16

getOutputStream () ) ) ) ;

this . start () ;

}

public void run () {

try {

33 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

while ( true ) {

boolean thoat = false ;

try {

String msg = br . readLine () ;

String header = msg . substring (0 , 7) ;

if ( header . equals ( " connect " ) ) {

g ui D uL ie u To i Ta tC a C l i en t ( " insert " + msg . substring (7 , msg . length () ) ) ;

FrmServer . addClient ( msg . substring (7 , msg . indexOf ( " ----- " ) ) , msg .

17 18 19 20 21 22 23 24 25 26 27 28 29

substring ( msg . indexOf ( " -----" ) +5 , msg . length () ) ) ;

FrmServer . sockets . put ( msg . substring (7 , msg . indexOf ( " ----- " ) ) ,

30

socket ) ;

guiDuLieuLanDau ( FrmServer . clients . size () -1) ;

}

else if ( header . equals ( " disconn " ) ) {

g ui D uL ie u To i Ta tC a C l i en t ( " delete " + msg . substring (10 , msg . length () ) )

31 32 33 34

;

FrmServer . removeClient ( msg . substring (10 , msg . length () ) ) ;

FrmServer . sockets . remove ( msg . substring (10 , msg . length () ) ) ;

thoat = true ;

}

else {

String h = msg . substring (0 , 4) ;

String a , b ;

String receiver = msg . substring ( msg . indexOf ( " @@@ " ) +3 , msg .

35 36 37 38 39 40 41 42 43

lastIndexOf ( " ----- " ) ) ;

switch ( h ) {

case " acce " :

a = msg . substring (6 , msg . indexOf ( " ----- " ) ) ;

b = msg . substring ( msg . indexOf ( " @@@ " ) + 3 , msg . lastIndexOf ( "

44 45 46 47

-----" ) ) ;

g ui D uL ie u To i Ta tC a C l i en t ( " busy " + msg . substring (6 , msg . indexOf ( "

48

@@@ " ) ) + " ### " + msg . substring ( msg . indexOf ( " @@@ " ) + 3 , msg .

length () ) ) ;

FrmServer . danh Sach Clie ntD an gB an . add ( a ) ;

FrmServer . danh Sach Clie ntD an gB an . add ( b ) ;

amThanhThread = new AmThanhThread () ;

49 50 51

amThanhThread . start () ;

52

break ;

53

case " stop " :

54

a = msg . substring (4 , msg . indexOf ( " ----- " ) ) ;

55

b = msg . substring ( msg . indexOf ( " @@@ " ) + 3 , msg . lastIndexOf ( "

56

-----" ) ) ;

g ui D uL ie u To i Ta tC a C l i en t ( " free " + msg . substring (4 , msg . indexOf ( "

57

@@@ " ) ) + " ### " + msg . substring ( msg . indexOf ( " @@@ " ) + 3 , msg .

length () ) ) ;

FrmServer . danh Sach Clie ntD an gB an . remove ( a ) ;

58

FrmServer . danh Sach Clie ntD an gB an . remove ( b ) ;

59

}

60

try {

61

PrintWriter printWriter = new PrintWriter ( new BufferedWriter ( new

62

OutputStreamWrit er ( FrmServer . sockets . get ( receiver ) .

getOutputStream () ) ) ) ;

printWriter . println ( msg ) ;

63

printWriter . flush () ;

64

}

65

catch ( Exception e ) {

66

e . printStackTrace () ;

67

}

68

}

69

// gu i Du Li e uT o iT at C aC l i e n t () ;

70

if ( thoat == true ) {

71

break ;

72

}

73

} catch ( Exception e ) {

74

75

}

76

}

77

} catch ( Exception e ) {

78

e . printStackTrace () ;

79

} finally {

80

try {

81

socket . close () ;

82

} catch ( IOException e ) {

83

e . printStackTrace () ;

84

}

85

}

86

}

87

88

89

public void guiDuLieuLanDau ( int a ) {

90

String soLuongClient = String . valueOf ( FrmServer . sockets . size () ) ;

91

Socket socket = FrmServer . sockets . get ( FrmServer . clients . get ( a ) ) ;

92

try {

93

PrintWriter pw = new PrintWriter ( new BufferedWriter ( new

94

OutputStreamWriter ( socket . getOutputStream () ) ) ) ;

pw . println ( soLuongClient ) ;

95

pw . flush () ;

96

for ( int j =0; j < FrmServer . sockets . size () ; j ++) {

97

String tt = " " ;

98

if ( FrmServer . danh Sach Clien tDan gBan . contains ( FrmServer . clients . get ( j ) )

99

) {

tt = " ( Dang chat ) " ;

100

}

101

pw . println ( FrmServer . clients . get ( j ) + " ----- " + FrmServer . users . get ( j

102

) + tt ) ;

pw . flush () ;

103

}

104

}

105

catch ( Exception e ) {

106

e . printStackTrace () ;

107

}

108

}

109

110

111

public void gu i Du Li e uT o iT at C a C l ie nt ( String data ) {

112

for ( int i =0; i < FrmServer . sockets . size () ; i ++) {

113

try {

114

Socket socket = FrmServer . sockets . get ( FrmServer . clients . get ( i ) ) ;

115

PrintWriter pw = new PrintWriter ( new BufferedWriter ( new

116

OutputStreamWriter ( socket . getOutputStream () ) ) ) ;

pw . println ( data ) ;

117

pw . flush () ;

118

}

119

catch ( Exception e ) {

120

e . printStackTrace () ;

121

}

122

}

123

}

124

125 }

34 CHƯƠNG 3. LẬP TRÌNH VỚI DATATURBINE

Đoạn mã trên quản lý các kết nối giữa client và server.

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