1. Trang chủ
  2. » Luận Văn - Báo Cáo

Thuyết minh đề tài NCKH cấp trường 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

43 11 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề 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ác giả Ts. Trần Đăng Hoan
Trường học Trường Đại Học Hàng Hải Việt Nam
Chuyên ngành Công Nghệ Thông Tin
Thể loại Đề Tài NCKH
Năm xuất bản 2015
Thành phố Hải Phòng
Định dạng
Số trang 43
Dung lượng 544,18 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Cấu trúc

  • M u

  • Mô hình tích hp giám sát môi trng b bin

    • H thng giám sát tích hp

      • Các chi tit v ha tng

      • Quan tri d liu

      • Phân tích d liu

      • Báo cáo và truyn tin

    • Thách thc cua vic thu thp d liu t xa

    • Các kiu giám sát

      • Các báo cáo

    • Mt s ng dung in hình

      • Nghiên cu Acid hóa ai dng

      • Mang cam bin nhm ng phó vi ty trng san hô ao Racha Yai, Thái Lan

    • Quan tri d liu hàng hai và nhng thách thc

    • Kin trúc h thng

      • Kien truc de xuat

      • Phn cng

  • Gii thiu v DataTurbine

    • DataTurbine

      • Kin trúc cua DataTurbine

      • Server

      • Source

      • Sink

    • Nhng im manh và han ch cua DataTurbine

  • Lp trình vi DataTurbine

    • Tng quan

    • Lp trình s dung SAPI

      • Các kiu i tng trong SAPI

      • ChannelMap

        • Kiu d liu cua kênh

        • Các phng thc cua ChannelMap

      • Client

      • Source Client

      • Sink Client

    • Mt s kt qua th nghim

      • Th nghim trên d liu sensor Intel

      • Th nghim trên d liu video qua chng trình video chat

  • Kt lun

Nội dung

Hệ thống giám sát tích hợp

Các chi tiết về hạ tầng

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

Quá trình khai phá dữ liệu bao gồm nhiều bước quan trọng, bắt đầu từ việc tiếp nhận dữ liệu thô cho đến khi công bố dữ liệu và các sản phẩm liên quan Tất cả những bước này diễn ra trong vòng đời của dữ liệu được thu thập từ một chương trình giám sát.

Quản trị dữ liệu

Quản trị dữ liệu là chức năng thiết yếu trong hệ thống giám sát dữ liệu, cung cấp hạ tầng và quy trình cần thiết cho việc lưu trữ, khai thác và truy cập dữ liệu từ các chương trình giám sát và chương trình liên quan Nó đảm bảo luồng dữ liệu đúng lúc và tin cậy từ thiết bị thu thập đến các phân tích viên và báo cáo viên Một hệ thống quản trị dữ liệu hiệu quả là trung tâm của chương trình giám sát tích hợp, vì vòng đời của dữ liệu kéo dài suốt sự nghiệp của các nhà khoa học Tuy nhiên, quản trị dữ liệu trong các chương trình giám sát thường không được chú trọng đầy đủ.

Phân tích dữ liệu

Phân tích dữ liệu trong hệ thống tích hợp đóng vai trò then chốt trong việc đối chiếu các tập dữ liệu từ các chương trình giám sát, giúp hoàn thành phân tích ở quy mô vùng và địa phương Qua đó, nó cho phép đánh giá 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 Bằng cách chuyển đổi dữ liệu giám sát kinh tế, xã hội và sinh thái thành tri thức, phân tích dữ liệu giúp hiểu rõ hơn về các xu thế và áp lực đối với giá trị MNES ở cấp độ vùng và địa phương.

Báo cáo và truyền tin

Báo cáo và truyền tin là chức năng thiết yếu của giám sát tích hợp, nhằm cung cấp thông điệp chủ đạo và thông tin phù hợp về kết quả giám sát cho đúng người vào đúng thời điểm Việc báo cáo và truyền thông tin một cách rõ ràng và dễ hiểu là điều cần thiết để kích hoạt phản ứng quản lý hiệu quả Những chức năng này tạo nên nền tảng cho một hệ thống giám sát tích hợp hiệu quả.

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

5 Phát triển các giao thức giám sát

8 Báo cáo và truyền tin

9 Tổng quát và kiểm tra

Thách thức của việc thu thập dữ liệu từ xa

Để thu thập dữ liệu lâu dài từ các địa điểm xa hàng trăm dặm, cần thiết lập các cảm biến để đo nhiệt độ, độ ẩm và thu thập hình ảnh, đồng thời lưu trữ dữ liệu an toàn cho việc phân tích sau này Tuy nhiên, việc tiếp nhận và lưu trữ dữ liệu một cách đáng tin cậy gặp nhiều khó khăn, như cảm biến có thể bị hỏng trong quá trình thu thập dữ liệu dài hạn và không được kết nối qua mạng LAN, dẫn đến việc nhà khoa học không phát hiện ra sự cố cho đến khi phân tích dữ liệu Việc nhận dữ liệu đúng lúc từ vị trí xa cũng là một thách thức, đặc biệt khi các nhà nghiên cứu muốn thiết lập thử nghiệm để cảnh báo về các điều kiện như bão Dữ liệu không đáng tin cậy có thể làm hỏng kế hoạch nghiên cứu Ngoài ra, việc tích hợp cảm biến từ nhiều nhà sản xuất khác nhau vào một hệ thống thống nhất cũng gặp khó khăn, do thiếu định dạng chung có thể làm mất nhiều thời gian tổ chức dữ liệu Để đảm bảo chất lượng dữ liệu, cần trả lời các câu hỏi quan trọng liên quan đến quy trình thu thập và quản lý dữ liệu.

• 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

Các kiểu giám sát

Các báo cáo

Các thẻ báo cáo cung cấp thông tin dễ hiểu về tình trạng và xu hướng của khu vực báo cáo Một bản báo cáo hàng năm về tình trạng và xu hướng tài nguyên biển và vùng bờ biển bao gồm nhiều thành phần quan trọng.

Báo cáo khung cảnh cung cấp một cái nhìn tổng quan về tài nguyên và atlas, bao gồm thông tin cập nhật về mật độ quần thể ở các vùng bờ biển.

• Phân loại các vùng nước trên bản đồ

Một số ứng dụng điển hình

Nghiên cứu Acid hóa đại dương

Axit hóa đại dương, chủ yếu do sự tích tụ CO2 từ hiệu ứng nhà kính, làm tăng độ axit của nước biển khi khí này hòa tan Hiện nay, cộng đồng khoa học vẫn chưa có nhiều thông tin về axit hóa tại các khu vực bờ biển, vì phần lớn dữ liệu được thu thập ở vùng nước mở Để giải quyết vấn đề này, Smith Lat tại viện Scripps Institue of Oceanography đã triển khai chương trình giám sát axit hóa đại dương lâu dài tại Scripps Pier Hiện tại, hệ thống này hoạt động ổn định với ít sự cố từ tháng 3 năm 2013 và có tiềm năng trở thành chuẩn công nghiệp trong việc giám sát độ pH tại khu vực bờ biển Axit hóa đại dương có thể ảnh hưởng nghiêm trọng đến các sinh vật biển có vỏ như con trai, con hàu và san hô.

Mạng cảm biến nhằm ứng phó với tẩy trắng san hô ở đảo

ở đả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 đã gây tác động tiêu cực đến hệ sinh thái biển, đặc biệt là rạn san hô, vốn rất nhạy cảm với những thay đổi này Tẩy trắng san hô do nhiệt độ nước biển cao đã lan rộng toàn cầu, nhưng một số yếu tố vật lý như ánh sáng thấp, dòng chảy cao và nhiệt độ thấp có thể làm giảm tỷ lệ tẩy trắng Mối liên hệ giữa các điều kiện vật lý và phản ứng sinh học cho phép dự đoán hiện tượng tẩy trắng san hô, do đó, việc giám sát các thông số này là rất quan trọng Một mạng cảm biến đã được lắp đặt tại đảo Racha Yai, Thái Lan vào năm 2011 để cung cấp thông tin thời gian thực về các sự kiện môi trường Hệ thống bao gồm camera dưới nước, cảm biến nhiệt độ, và trạm thời tiết, với dữ liệu được thu thập và truyền qua DataTurbine Kể từ khi triển khai, hệ thống hoạt động ổn định, chỉ gặp gián đoạn do bảo trì hoặc mất điện Mặc dù đảo Racha Yai đã trải qua tẩy trắng san hô vào năm 2010, hiện tượng này đã không còn được quan sát vào năm 2011.

Quản trị dữ liệu hàng hải và những thách thức

Dữ liệu và thông tin là hai khái niệm khác nhau; dữ liệu là các giá trị thô có thể quan sát được từ nghiên cứu và giám sát, trong khi thông tin là dữ liệu đã được xử lý Quản trị dữ liệu hàng hải hoặc đại dương bao gồm các bước nhập, kiểm soát chất lượng, lưu trữ và công bố dữ liệu nghiên cứu từ các vùng biển và đại dương Dữ liệu được chia thành hai loại: dữ liệu vận hành thời gian thực, thu thập qua các mạng sensor và truyền qua vệ tinh, và dữ liệu lưu trữ/dịch vụ, được thu thập từ các nhóm nghiên cứu và dự án nghiên cứu.

Dữ liệu bán vận hành được thu thập tự động trên các tàu nghiên cứu gặp phải nhiều thách thức trong quản trị dữ liệu hàng hải.

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

Sự đa dạng về các kiểu dữ liệu cần quản lý, bao gồm dữ liệu sinh học, địa chất, địa lý và hóa lý, yêu cầu phải được tích hợp một cách hiệu quả Việc phân tích và tạo ra các sản phẩm thông tin từ những dữ liệu này là rất quan trọng để đảm bảo tính chính xác và hữu ích trong nghiên cứu.

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

Các dự án thu thập dữ liệu và thông tin trên quy mô cục bộ trong khoảng thời gian ngắn là rất hiếm Những vấn đề do con người gây ra như nóng lên toàn cầu, mực nước biển dâng, cạn kiệt nguồn cá và ô nhiễm đã làm nổi bật sự cần thiết phải quản lý dữ liệu toàn cầu Việc tích hợp các tập dữ liệu cục bộ là phương pháp duy nhất để xây dựng cơ sở thông tin dữ liệu toàn cầu, từ đó hỗ trợ đưa ra các quyết định quan trọng.

Quản trị dữ liệu hiện đại gắn liền với sự phát triển của công nghệ thông tin, giúp tối ưu hóa việc quản lý và xử lý dữ liệu đa dạng và phong phú Những tiến bộ công nghệ gần đây đã hỗ trợ đáng kể cho các doanh nghiệp trong việc nâng cao hiệu quả và tính chính xác trong quản trị dữ liệu.

Hệ thống giám sát môi trường sử dụng kiến trúc cho phép quản lý hiệu quả các luồng dữ liệu Internet cung cấp giải pháp trao đổi dữ liệu với chi phí thấp, giúp cải thiện khả năng truyền tải thông tin Xu hướng sử dụng ấn bản điện tử ngày càng trở nên phổ biến để truyền đạt kết quả nghiên cứu và thông báo thông tin quan trọng.

Kiến trúc hệ thống

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.

Phần cứng

Chúng tôi đã chọn thiết bị di động Android để thu thập dữ liệu nhờ vào mức tiêu thụ năng lượng thấp và khả năng chạy Java Thiết bị sử dụng năng lượng mặt trời và kết nối 3G để truyền dữ liệu Các cảm biến đo điện thế, nhiệt độ và độ ẩm cho phép phân tích trạng thái thiết bị SensorPod là nền tảng tính toán di động tùy biến, thích ứng với các mạng cảm biến và điện thoại Android, kết hợp với hệ thống quản trị dữ liệu điện toán đám mây Kiến trúc modun của SensorPod dựa trên các chuẩn mở và phần mềm mã nguồn mở.

Giám sát thời gian thực môi trường và các hệ thống cảm biến cung cấp siêu dữ liệu quan trọng như tình trạng, chất lượng (QA) và các tham số do người dùng xác định Điều này cho phép các nhà phát triển tùy chỉnh dự án của họ theo các tiêu chuẩn công nghiệp tốt nhất và xu hướng công nghệ hiện đại.

SensorPod dựa trên điện thoại Android loại bỏ sự cần thiết của trạm phía bờ, cho phép dữ liệu được truyền về Amazon Cloud trong thời gian thực Với việc tận dụng các hệ thống thương mại mạnh mẽ, SensorPod trở thành giải pháp kinh tế và tin cậy để đơn giản hóa việc triển khai cảm biến Đây là những lý do nên lựa chọn 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 cho thấy rằng việc sử dụng SensorPod giúp cải thiện hiệu suất của các sensor dưới nước, vốn thường gặp sự cố do cạn kiệt pin hoặc vấn đề khác sau vài tháng triển khai Với SensorPod, các nhà khoa học có thể theo dõi tình trạng pin và kết quả đọc sensor theo thời gian thực, từ đó lên lịch bảo trì kịp thời Điều này đảm bảo rằng dữ liệu thu thập được chính xác và phù hợp, đồng thời giảm thiểu mất mát dữ liệu trong quá trình thu thập dài hạn.

DataTurbine

Server

Server của DataTurbine, được chứa trong rbnb.jar (Ring Buffered Network Bus), là phần cốt lõi cho phép các ứng dụng giao tiếp với nhau Server này hoàn toàn độc lập với dữ liệu nhận được và hỗ trợ nhiều kiểu dữ liệu như số, âm thanh, video, và văn bản Nó có thể được hình dung như một chuỗi bộ đệm vòng, nơi dữ liệu mới được thêm vào và dữ liệu cũ bị xóa khi vùng lưu trữ đầy Các nguồn dữ liệu sẽ xác định kích thước lưu trữ và bộ nhớ cache của chúng.

Kích thước lưu trữ ảnh hưởng trực tiếp đến kích thước bộ đệm vòng và lượng dữ liệu được đưa vào bộ đệm trước khi bị loại bỏ Để đạt hiệu quả tối ưu, giá trị này cần được điều chỉnh dựa trên không gian lưu trữ của thiết bị mà máy chủ đang hoạt động và nhu cầu cụ thể của dự án.

Kích thước bộ nhớ cache ảnh hưởng đến số lượng bộ đệm vòng có thể được lưu trữ trong RAM, điều này phụ thuộc vào bản chất của hệ thống và các ứng dụng Mặc dù bộ nhớ cache có khả năng tăng tốc độ xử lý, nhưng một bộ nhớ cache lớn hơn không nhất thiết dẫn đến 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 gần như thời gian thực Sink có khả năng đọc và hiển thị dữ liệu ngay khi được thu thập, có thể là trực tuyến, trong Matlab hoặc các ứng dụng khác Ngoài ra, Sink còn có thể tương tác với dữ liệu và chuyển nó vào thiết bị lưu trữ lâu dài.

Mỗi điểm dữ liệu yêu cầu một nhãn thời gian chính xác, điều này dẫn đến việc dữ liệu không thể tải lại vào server Do đó, dữ liệu phải được gửi theo thứ tự, với mỗi nhãn thời gian lớn hơn nhãn thời gian trước đó Kích thước dữ liệu được xác định bằng số lượng frame, là cấu trúc dữ liệu bao gồm một hoặc nhiều kênh với nhiều đối tượng dữ liệu Kích thước frame có thể khác nhau, từ nhỏ đến lớn, tùy thuộc vào số lượng kênh và đối tượng dữ liệu bên trong.

Source

Source là chương trình nhập dữ liệu vào server, hoạt động độc lập 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ột máy hoặc trên máy khác Mỗi source có thể chứa nhiều kênh, với mỗi kênh có kiểu dữ liệu riêng, và Source điều khiển việc phân bổ không gian lưu trữ trên ổ cứng và bộ nhớ của server.

Cấu tạo của source như sau:

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

Mỗi kênh trong hệ thống bao gồm tên xác định kênh cụ thể, kiểu MIME cho biết loại truyền thông mà ứng dụng có thể sử dụng để xử lý dữ liệu, và dữ liệu là chuỗi các điểm dữ liệu bao gồm thời gian và giá trị Mỗi kênh chỉ có thể lưu trữ một kiểu dữ liệu duy nhất.

Chúng ta có thể hình dung một tháp khí tượng nằm trên một ngọn đồi, cùng với một trạm đo nhiệt độ gần đó Mục tiêu của chúng ta là truyền dữ liệu về nhiệt độ và độ ẩm từ tháp khí tượng vào hệ thống DataTurbine trên một chiếc laptop tại trạm Các bước cần thiết để thực hiện việc này sẽ được hướng dẫn cụ thể.

• 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 hiện có ba chương trình chạy độc lập, và chúng ta cần truy cập dữ liệu trên server Điều này sẽ được giải thích trong phần sau Plugin là một loại nguồn đặc biệt, khác với nguồn thông thường, plugin gửi dữ liệu để đáp ứng các yêu cầu từ kết nối plugin server.

Sink

Sink là chương trình lấy dữ liệu từ server để sử dụng, như đưa vào Matlab, Real-time Data Viewer, hoặc lưu trữ trong cơ sở dữ liệu quan hệ và file Sink hoạt động độc lập với server như một ứng dụng riêng biệt và giao tiếp qua mạng, có thể chạy trên cùng máy hoặc máy khác Các loại sink phổ biến thường được sử dụng.

• 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 là ứng dụng cung cấp dữ liệu cho việc hiển thị công khai, bao gồm nội dung trang web Ví dụ, các đồ thị trên một website công cộng được truyền tải qua web server để người dùng có thể truy cập và xem thông tin.

Phân tích dữ liệu có thể thực hiện thông qua các phương pháp thủ công hoặc tự động, sử dụng các công cụ như Matlab, R, hoặc ESPER Sau khi phân tích, dữ liệu có thể được xuất ra dưới dạng file hoặc tập hợp các file để phục vụ cho việc phân phối hoặc tích hợp, ví dụ như file CSV hoặc Excel.

Lưu trữ dữ liệu lâu dài có thể thực hiện trong cơ sở dữ liệu hoặc thông qua một tập hợp các file, chẳng hạn như lưu trữ trong một cơ sở dữ liệu quan hệ Ngoài ra, việc lập trình các sink sử dụng dữ liệu cũng trở nên dễ dàng hơn.

Để theo dõi dữ liệu từ tháp khí tượng đo nhiệt độ và độ ẩm trên ngọn đồi, chúng ta đã sử dụng DataTurbine trên laptop tại trạm đo nhiệt độ Bây giờ, chúng ta cần quan sát và xác nhận rằng dữ liệu đã được lưu trữ thành công Các bước thực hiện sẽ được mô tả chi tiết trong phần tiếp theo.

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 có 5 chương trình chạy độc lập, bao gồm 1 server, 2 source và 2 sink Chúng ta sẽ duy trì hoạt động liên tục của server, source và sink để đảm bảo việc đưa dữ liệu vào thiết bị lưu trữ Tuy nhiên, sink quan sát (RDV) sẽ được chạy và dừng khi cần thiết.

Những điểm mạnh và hạn chế của DataTurbine

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.

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.

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

Để phát triển ứng dụng giao tiếp với DataTurbine, bạn chỉ cần sử dụng file rbnb.jar mà không cần mã nguồn của DataTurbine Thư viện này cung cấp đầy đủ công cụ cần thiết cho việc tạo ra chương trình riêng của bạn.

Trước khi chỉnh sửa mã nguồn của DataTurbine, bạn cần xác định rõ ràng tính cần thiết của việc này cho ứng dụng của mình Đối với 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 là đủ DataTurbine là một hệ thống môđun mở rộng, và sức mạnh của nó đến từ tính linh hoạt mà không cần phải can thiệp vào phần lõi của hệ thống.

Để phát triển một ứng dụng giao tiếp với DataTurbine, bạn cần tạo một source hoặc sink mà không cần phải chỉnh sửa mã nguồn của DataTurbine Quá trình này không quá phức tạp và yêu cầu bạn sử dụng file rbnb.jar.

Lập trình sử dụng SAPI

Các kiểu đối tượng trong SAPI

There are two main types of objects in SAPI: ChannelMap and Client The ChannelMap organizes data and is utilized by the RBNB client to send, request, and retrieve data from the RBNB server A Client object can be one of the following subclasses: Source, Sink, or PlugIn.

Khách hàng tương tác với máy chủ RBNB để truyền tải và nhận dữ liệu thông qua ChannelMap Nguồn dữ liệu gửi thông tin đến máy chủ, trong khi Sink thu thập dữ liệu từ máy chủ Plugin đảm nhận vai trò nhận yêu cầu và cung cấp dữ liệu, thực tế đóng vai trò giống như cả Sink và Source.

ChannelMap tổ chức toàn bộ dữ liệu RBNB trong các bản đồ kênh, cho phép khách hàng thực hiện các yêu cầu (sink) và gửi dữ liệu (source) Mỗi ChannelMap bao gồm một tập hợp các đối tượng Channel, với ba thành phần chính: Tên kênh, dữ liệu và các thông tin liên quan khác.

Dữ liệu nhị phân có nhiều kiểu khác nhau, trong đó nhãn thời gian (timestamp) là dãy số dấu phẩy động tăng dần Một source client tạo ra ChannelMap bao gồm nhiều kênh, cung cấp dữ liệu theo kiểu và số lượng cụ thể, đồng thời chỉ định nhãn thời gian cho toàn bộ hoặc từng phần của ChannelMap Sau khi hoàn thành, ChannelMap được gửi tới RBNB server, và có thể lặp lại việc thêm kênh mới hoặc dữ liệu mới vào các kênh đã tồn tại Ngược lại, một sink client cũng xây dựng một channel map để yêu cầu dữ liệu, bao gồm các kênh và nhãn thời gian, gửi tới RBNB server, và nhận lại một channel map khác chứa dữ liệu từ các kênh tương ứng.

Source client là loại client chủ động, đóng vai trò khởi đầu trong việc truyền dữ liệu tới server Mỗi lần source gửi dữ liệu, quá trình này được gọi là một lần truyền dữ liệu.

Mỗi nguồn có khả năng gửi một chuỗi các frame tới máy chủ, trong đó mỗi frame có thể chứa một hoặc nhiều kênh, và mỗi kênh có thể bao gồm nhiều điểm dữ liệu Điểm quan trọng trong ý tưởng của RBNB là tất cả dữ liệu đều được gán nhãn thời gian Nhãn thời gian này có thể được áp dụng cho từng frame, kênh hoặc điểm dữ liệu, và có thể là tường minh (do nguồn cung cấp) hoặc ngầm định (do API của client hoặc máy chủ RBNB cung cấp tự động).

Sink client là loại client chủ động, bắt đầu quá trình lấy dữ liệu từ server Nó nhận các frame dữ liệu từ server, mỗi frame bao gồm nhiều kênh, và mỗi kênh chứa nhiều điểm dữ liệu Sink yêu cầu dữ liệu bằng tên kênh và nhãn thời gian, và dữ liệu trả về có thể là nhiều frame hoặc một phần frame tùy thuộc vào khoảng thời gian yêu cầu Sink có ba chế độ lấy dữ liệu từ server: Request, Subscribe và Monitor Chế độ Request áp dụng cho khoảng thời gian cụ thể, với mỗi yêu cầu nhận được phản hồi tương ứng và có thể tự động lặp lại Trong khi đó, chế độ Subscribe và Monitor là chế độ mở, trong đó dữ liệu mới tự động được gửi từ server tới sink client khi có sẵn Chế độ Subscribe nhận tất cả dữ liệu, có thể làm mất tính thời gian thực, trong khi chế độ Monitor chỉ nhận dữ liệu đến vị trí hiện tại.

PlugIn Client là một nguồn thụ động, mà các client khác coi như là nguồn RBNB Tuy nhiên, các client này phải chờ đợi các yêu cầu dữ liệu trước khi phản hồi PlugIn thực hiện cả hai kết nối sink và source.

ChannelMap

Client tương tác với dữ liệu thông qua đối tượng ChannelMap, bao gồm một hoặc nhiều RBNB Channel Mỗi RBNB Channel có tên, nhãn thời gian và dữ liệu (tùy chọn) Kênh được thêm vào ChannelMap bằng phương thức ChannelMap.Add() trước khi được truyền đi bằng Fetch() hoặc Flush() Tên kênh bao gồm ba phần chính: Server, Source và Channel Server là tên server gán khi khởi động, Source được xác định bởi phương thức OpenRBNBConnection(), và Channel được xác định thông qua ChannelMap.Add() Source định nghĩa các kênh với phần Server và Source ngầm định.

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 trình bày các kiểu dữ liệu của SAPI, trong đó 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, với tên tuyệt đối bắt đầu bằng dấu gạch chéo (/) và bao gồm từ cấp cao nhất là server đến các kênh, ví dụ như Server/MySource/Test43/C2 Ngược lại, tên tương đối không bắt đầu bằng dấu gạch chéo mà bắt đầu với tên source trên server cục bộ, như MySource/Test43/C2 Khi yêu cầu danh sách các kênh khả dụng, sink có thể sử dụng ký tự đại diện, trong đó “*” đại diện cho tất cả các đối tượng ở cấp này và “ ” đạ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().

Phương thức public final int Add(String channelName) throws SAPIException cho phép thêm một kênh mới vào bản đồ kênh, bao gồm khả năng thêm nhiều kênh nếu sử dụng ký tự đại diện Phương thức này sẽ trả về chỉ số của kênh vừa được thêm; nếu kênh đã tồn tại, nó sẽ trả về chỉ số hiện tại mà không thực hiện thêm hành động nào khác.

• 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 xác định kiểu MIME (Multipurpose Internet Mail Extensions) cho kênh có chỉ số index dựa trên giá trị chuỗi mime được cung cấp Dưới đây là danh sách các kiểu MIME mà DataTurbine hỗ trợ.

Phương thức `PutTime(double start, double duration)` thiết lập nhãn thời gian cho dữ liệu trong channel map, với tham số `start` chỉ định thời gian bắt đầu và `duration` xác định khoảng thời gian của frame tiếp theo Phương thức `PutTimes(double[] times)` cho phép thiết lập mảng thời gian cho dữ liệu, yêu cầu mảng `times` phải có kích thước tương ứng với số điểm dữ liệu được thêm vào, nếu không sẽ gây ra ngoại lệ khi gọi `PutData` Cuối cùng, phương thức `PutTimeRef(ChanelMap sourceMap, int channelIndex)` sao chép nhãn thời gian từ một kênh trong channel map được chỉ định, yêu cầu nhãn thời gian phải tương thích với dữ liệu được thêm vào sau này, nếu không sẽ phát sinh 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 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 thông qua các phương thức thường được sử dụng bởi Source và PlugIn, nhưng lưu ý rằng việc này chỉ tạo ra một ChannelMap cục bộ mà không gửi dữ liệu tới RBNB server Sau khi ChannelMap được xây dựng, nó sẽ được gửi tới RBNB server thông qua phương thức Source.Flush Phương thức PutData cho phép thêm dữ liệu vào ChannelMap dưới dạng mảng byte theo chỉ số kênh, trong khi các phương thức PutDataAsXXX cho phép gửi dữ liệu với kiểu dữ liệu nguyên thủy mà không cần chuyển đổi Ví dụ, PutDataAsFloat32 cho phép gửi trực tiếp mảng dữ liệu kiểu float, và các phương thức khác như PutDataAsFloat64, PutDataAsInt64, PutDataAsInt32, PutDataAsInt16, PutDataAsInt8, PutDataAsString, và PutDataAsByte cũng có sẵn để hỗ trợ các kiểu dữ liệu khác nhau.

Phương thức GetTimes(int index) trong ChannelMap trả về một mảng các giá trị thời gian cho kênh có chỉ số index Mỗi điểm dữ liệu tương ứng với một thời điểm Mảng double được lưu trữ trong channel map không nên bị chỉnh sửa bởi người dùng cuối Mảng này chỉ được tính toán khi phương thức được gọi lần đầu tiên và sẽ được trả về trong các lần gọi tiếp theo Nếu không có dữ liệu khả dụng, phương thức sẽ trả về giá trị null.

Để lấy dữ liệu từ ChannelMap, có một số phương thức thường được sử dụng bởi Sink và PlugIn Lưu ý rằng dữ liệu không được lấy từ máy chủ RBNB mà từ một ChannelMap cục bộ, được gửi tới client qua phương thức Sink.Fetch Phương thức public byte[] GetData(int index) trả về dữ liệu thô của kênh tại chỉ số index dưới dạng mảng byte Các phương thức GetDataAsXXX cho phép chỉ định kiểu dữ liệu nguyên thủy của mảng dữ liệu trả về, với XXX tương ứng với các kiểu dữ liệu của SAPI Ví dụ, phương thức GetDataAsFloat32 trả về mảng dữ liệu kiểu float mà không cần chuyển đổi từ mảng byte Nếu dữ liệu không phù hợp với kiểu yêu cầu, sẽ xảy ra ngoại lệ, do đó cần sử dụng phương thức ChannelType để kiểm tra kiểu dữ liệu.

Để lấy thông tin của kênh, có thể sử dụng các phương thức sau: `public final int GetType(int index)` trả về kiểu dữ liệu của kênh với chỉ số index, lưu ý không trả về TYPE_USER Hai phương thức `public int TypeID(String type)` và `public String TypeName(int typeID)` cho phép chuyển đổi giữa chuỗi mô tả kiểu dữ liệu và giá trị số Để kiểm tra và lấy tên các kênh trong đối tượng ChannelMap, bạn có thể sử dụng `public final String[] GetChannelList()`, phương thức này trả về tên tất cả các kênh trong ChannelMap; nếu không có kênh nào, nó sẽ trả về một mảng rỗng.

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

Client

The Client interacts with ChannelMap to send and receive data from the RBNB server It serves as the foundational class for all clients, including Source, Sink, and PlugIn The Client class encapsulates common functionalities shared across all client types.

Client có nhiều phương thức để thiết lập và kết thúc kết nối với máy chủ RBNB Để mở kết nối, cần chú ý đến các tham số quan trọng sau đây.

• serverAddress: Địa chỉ của server muốn kết nối tới.

• clientName: Tên được sử dụng để xác định client này trên server.

Tên người dùng (userName) là thông tin cần thiết để đăng nhập vào máy chủ Giá trị này được truyền dưới dạng văn bản thuần túy và không thực sự được dùng để giới hạn quyền truy cập Đây là một tham số tùy chọn trong quá trình đăng nhập.

Mật khẩu được kết hợp với tên người dùng và được truyền đi dưới dạng văn bản thuần túy Nếu mật khẩu được thiết lập, chỉ những khách hàng có mật khẩu giống nhau mới có quyền truy cập vào 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:

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:

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.

Phương thức `CloseRBNBConnection()` được sử dụng để đóng kết nối với server và giải phóng tài nguyên liên quan Khi phương thức này được thực hiện, vùng nhớ cache trên server sẽ bị xóa, tuy nhiên, dữ liệu trên đĩa cứng vẫn được bảo tồn, mặc dù không còn khả năng truy cập từ server Nếu bạn cần đóng kết nối nhưng vẫn muốn duy trì quyền truy cập vào 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 `GetServerName()` và `GetClientName()` trả về tên của RBNB server cục bộ mà client đang kết nối và tên của chính client Cả hai phương thức này sẽ ném ra ngoại lệ `IllegalStateException` nếu client không kết nối tới server nào Các client có thể thiết lập kích thước bộ đệm vòng của RBNB server, chủ yếu áp dụng cho các Source client Tham số `cacheSize` và `archiveSize` xác định dung lượng RAM và ổ cứng của bộ đệm vòng Mỗi lần gọi phương thức `Flush` của Source sẽ tạo một frame Phương thức `SetRingBuffer(int cache, String mode, int archive)` cho phép thiết lập bộ đệm với tham số `mode` có thể nhận các giá trị: `none` (không sử dụng vùng lưu trữ), `load` (tải vùng lưu trữ phù hợp), `create` (tạo vùng lưu trữ mới), và `append` (thêm dữ liệu vào vùng lưu trữ hiện có hoặc tạo mới nếu chưa tồn tại).

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 http://pastebin.com/

4 public static void main ( String [] args ) throws S A P I E x c e p t i o n {

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

Lớp Client cung cấp phương thức Client.CloseRBNBConnection() để đóng kết nối với server, nhưng điều này khiến các sink client không thể truy cập dữ liệu đã ghi trước đó Để giải quyết vấn đề này, lớp Source có phương thức Detach, cho phép đóng kết nối với server mà vẫn giữ lại bộ xử lý và các bộ đệm vòng, giúp các sink client tiếp tục truy cập dữ liệu đã ghi Hình 3.1 minh họa đoạn mã mở kết nối tới RBNB server và gửi chuỗi “Hello World”.

Đoạn mã trong Hình 3.2 minh họa cách mở kết nối tới máy chủ RBNB và gửi hình ảnh định dạng JPEG Đối với các tệp ảnh có kích thước nhỏ, như trong ví dụ, có thể sử dụng phương thức Files.readAllBytes() để đọc toàn bộ byte từ tệp và gửi qua kênh.

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: http://pastebin.com/

5 public static void main ( String [] args ) throws SAPIException , I O E x c e p t i o n {

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

Hình 3.2: Tải dữ liệu ảnh vào RBNB server http://pastebin.com/

1 B u f f e r e d I m a g e img = ImageIO read ( new File ( " D :/ Images / MyImage jpg " ) ) ;

3 ImageIO write ( img , " jpg " , os ) ;

Hình 3.3: Một cách khác để tải dữ liệu ảnh vào RBNB server

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.

Example 3: Write a sink to retrieve data that has been sent to the RBNB server in Example 1 Example 4: Write a sink to retrieve data that has been sent to the RBNB server in Example 2.

4 public static void main ( String [] args ) throws S A P I E x c e p t i o n {

20 System out println ( getmap GetName (0) + " : " + getmap G e t D a t a A s S t r i n g (0) [0])

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

5 public static void main ( String [] args ) throws SAPIException , I O E x c e p t i o n {

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

Một số kết quả thử nghiệm

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

Dữ liệu trong tập này được thu thập từ 54 cảm biến tại phòng thí nghiệm Intel Berkeley Research trong thời gian từ 28 tháng 2 đến 5 tháng 4 năm 2004 Cấu trúc của file bao gồm thông tin chi tiết về các cảm biến và dữ liệu thu thập được trong khoảng thời gian này.

Moteid nhận giá trị từ 1-54 tương ứng với 54 cảm biến Epoch:int thể hiện lần đo thứ epcho của cảm biến Các thông số đo lường bao gồm nhiệt độ (đơn vị °C), độ ẩm (từ 0-100%), ánh sáng (đơn vị Lux) và điện áp (từ 2-3 V) Chúng tôi sẽ tiến hành đọc các giá trị này.

The DataTurbine Server receives data from a sensor with moteid 1 through four channels, corresponding to the information fields of temperature, humidity, light, and voltage.

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. http://pastebin.com/

16 pw = new P r i n t W r i t e r ( new B u f f e r e d W r i t e r ( new O u t p u t S t r e a m W r i t e r ( socket g e t O u t p u t S t r e a m () ) ) ) ;

29 F r m S e r v e r a d d C l i e n t ( msg s u b s t r i n g (7 , msg indexOf ( " - - - " ) ) , msg s u b s t r i n g ( msg indexOf ( " - - - " ) +5 , msg length () ) ) ;

30 F r m S e r v e r sockets put ( msg s u b s t r i n g (7 , msg indexOf ( " - - - " ) ) , socket ) ;

36 F r m S e r v e r sockets remove ( msg s u b s t r i n g (10 , msg length () ) ) ;

43 String r e c e i v e r = msg s u b s t r i n g ( msg indexOf ( " @@@ " ) +3 , msg l a s t I n d e x O f ( " - - - " ) ) ;

@@@ " ) ) + " ### " + msg s u b s t r i n g ( msg indexOf ( " @@@ " ) + 3 , msg length () ) ) ;

51 a m T h a n h T h r e a d = new A m T h a n h T h r e a d () ; Đoạn mã trên quản lý các kết nối giữa client và server.

Ngày đăng: 12/07/2021, 20:53

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w