CHƯƠNG 3 THIẾT KẾ MÔ HÌNH TRIỂN KHAI
3.3 Thiết kế mơ hình triển khai các vi dịch vụ:
Từ ý tưởng tạo gói chứa các mơ-đun hỗ trợ cho từng loại thiết bị, cũng như phân lớp xử lý dữ liệu từ các phần trên, em đã thiết kế, xây dựng một mơ hình triển khai vi dịch vụ thiết bị như sau:
25
Hình 3.4 Mơ hình triển khai vi dịch vụ thiết bị
Mơ hình gói hỗ trợ dịch vụ thiết bị gồm 4 lớp:
Lớp ứng dụng (Application): Lớp này triển khai các xử lý cho từng loại thiết bị hay hồ sơ thiết bị, số lượng đối tượng trong lớp này chính là số lượng các hồ sơ thiết bị mà hệ thống hỗ trợ. Lớp này sẽ nhận các u cầu từ chương trình chính của vi dịch vụ thiết bị, xử lý các logic theo yêu cầu của từng loại thiết bị với các hàm có chức năng giống các hàm ở chương trình chính của dịch vụ thiết bị. Các hàm của lớp này gồm: hàm xử lý lệnh đọc-ghi (Read-Write Command), khởi tạo (Initialize), khám phá thiết bị mới (Discovery), các hàm gọi lại
26
(Add-Update-Delete Callback, EventCallback). Lớp này có thể gọi các hàm của lớp mạng bên dưới hoặc lớp hỗ trợ.
Lớp mạng (Network):
o Lớp này chịu trách nhiệm xử lý các yêu cầu liên quan tới giao thức mạng mà thiết bị đang sử dụng, nhưng chủ yếu là chuyển đổi, tổ chức dữ liệu theo cấu trúc quy định của mạng. Nó chịu trách nhiệm khởi tạo thơng tin mạng (hàm Initialize), đóng mạng (hàm Close), khám phá thiết bị mới (hàm Discovery), lắng nghe dữ liệu thiết bị gửi về và chuyển thành các bản đọc (hàm ListenEvent), xử lý các vấn đề liên quan đến thay đổi thông tin thiết bị: thêm, cập nhập, xóa (hàm Add-Update-Delete), nhận các yêu cầu đọc-ghi (hàm Read-Write) từ lớp trên để xử lý, tổ chức dữ liệu, chuyển thành các yêu cầu theo chuẩn của loại mạng đó. Lớp này có thể gọi các hàm của lớp chuyển giao bên dưới hoặc lớp hỗ trợ.
o Các hàm cần gửi yêu cầu xuống lớp bên dưới như Discovery, Add- Update-Delete, Read-Write sẽ gọi đến hàm gửi (Send) bên trong, ở đây sử dụng cơ chế “mutex” để tại một thời điểm, chỉ cho phép một hàm trong số các hàm vừa nêu được sử dụng hàm gửi. Trong hàm gửi, nó sẽ gọi đến hàm gửi (Send) ở lớp dưới để gửi yêu cầu đi (mơ tả bằng khối “Send Request”), sau đó sẽ đợi phản hồi bằng cách gọi hàm lắng nghe phản hồi (Listen) ở lớp dưới (mô tả bằng khối “Listen Response”). Hàm lắng nghe phản hồi chỉ nhận các dữ liệu thuộc loại phản hồi lệnh bằng cách cung cấp hàm lọc khi gọi hàm Listen ở lớp dưới.
o Bên cạnh đó, lớp này sẽ chạy một luồng riêng chỉ để nhận dữ liệu được thiết bị báo cáo tới. Luồng này đăng ký với lớp dưới (thông qua hàm Listen ở lớp dưới) để lắng nghe chỉ các dữ liệu mà thiết bị ở ngoài báo cáo bằng cách cung cấp hàm lọc dữ liệu khi nhận. Luồng này đóng vai trị như một bộ cơng bố (Publisher), nó đẩy dữ liệu nhận được tới kênh lọc “filter”, còn hàm lắng nghe (Listen) của lớp này đóng vai trị như bộ đăng ký (Subscriber) để nhận dữ liệu. Hàm Listen khi đăng ký nhận dữ liệu sẽ truyền thêm hàm lọc dữ liệu mà lớp bên trên gửi xuống, kênh lọc sẽ gọi các hàm lọc đó, nếu thỏa mãn điều kiện lọc thì sẽ
27
gửi dữ liệu tới đối tượng đã đăng ký tương ứng. Ví dụ luồng vừa nêu nhận được dữ liệu báo cáo bởi các thiết bị 1, 2, 3… nhưng lớp trên chỉ muốn nhận các báo cáo của thiết bị 1, thì khi lớp trên gọi hàm Listen, sẽ đăng ký hàm lọc để chỉ lấy các báo cáo của thiết bị 1. Nếu lớp trên gọi hàm Listen mà không truyền bộ lọc, tức là nó muốn nhận mọi dữ liệu báo cáo.
o Lưu ý: Những khối màu trắng trong hình của lớp này để chỉ rằng chúng chỉ được sử dụng nội bộ trong lớp, bên ngồi khơng thể gọi tới chúng.
Lớp chuyển giao (Transfer):
o Lớp này chịu trách nhiệm đóng gói tất cả các dữ liệu từ lớp bên trên gửi xuống qua hàm gửi (Send) thành một chuỗi dữ liệu theo khung có cấu trúc quy định sẵn, thường gọi là tin nhắn (message) hoặc gói tin (packet), sau đó gửi chúng ra bên ngồi theo giao thức kết nối của thiết bị sử dụng bằng hàm truyền “TX”. Đồng thời, nó lắng nghe, nhận các dữ liệu từ bên ngoài gửi tới bằng hàm nhận “RX”, sau đó chuyển tới các đối tượng đã đăng ký nhận dữ liệu bởi hàm lắng nghe (Listen). Và giống như lớp mạng, lớp này cũng có hàm khởi tạo (Initialize) để khởi tạo kết nối, và hàm đóng (Close) để đóng kết nối.
o Lớp này cũng dùng cơ chế tương tự như lớp mạng, đó là hàm RX có nhiệm vụ nhận dữ liệu từ bên ngoài gửi tới, và nó đóng vai trị như bộ cơng bố (Publisher), đẩy dữ liệu đã nhận tới kênh lọc “filter”, còn hàm lắng nghe (Listen) của lớp này đóng vai trị như bộ đăng ký (Subscriber) để nhận dữ liệu. Hàm Listen khi đăng ký nhận dữ liệu sẽ truyền thêm hàm lọc dữ liệu mà lớp bên trên gửi xuống, kênh lọc sẽ gọi các hàm lọc đó, nếu thỏa mãn điều kiện lọc thì sẽ gửi tới đối tượng đã đăng ký tương ứng. Ví dụ lớp mạng gửi lệnh với mã lệnh là 01 cho thiết bị 1, thì lớp mạng sẽ gọi hàm Listen ở lớp chuyển giao với hàm lọc chỉ nhận dữ liệu phản hồi với mã lệnh 01 của thiết bị 1. Nếu lớp trên gọi hàm Listen mà không truyền bộ lọc, tức là nó muốn nhận mọi dữ liệu.
28
o Lưu ý: Những khối màu trắng trong hình của lớp này để chỉ rằng chúng chỉ được sử dụng nội bộ trong lớp, bên ngồi khơng thể gọi tới chúng.
Lớp hỗ trợ (support): Lớp này nằm dọc theo lớp ứng dụng và lớp mạng, chỉ thị rằng nó sẽ được sử dụng bởi hai lớp này. Lớp hỗ trợ là một lớp mở để người phát triển cung cấp các chức năng hỗ trợ cho lớp ứng dụng, lớp mạng. Hiện tại, lớp này sẽ hỗ trợ lưu trữ dữ liệu tạm thời (mất khi khởi động lại) cho lớp ứng dụng và mạng. Có thể coi như một cơ sở dữ liệu động đơn giản, có hàm cơ bản là ghi dữ liệu và đọc dữ liệu, giúp các lớp tùy ý lưu trữ dữ liệu tạm mà chúng cần.
Một số đặc điểm khi áp dụng mơ hình:
Theo mơ hình này, người phát triển sẽ khơng trực tiếp lập trình, xử lý tất cả các thiết bị nó quản lý trong chương trình chính của vi dịch vụ, mà sẽ được xử lý trong gói hỗ trợ phát triển dịch vụ thiết bị độc lập, nằm bên ngồi so với chương trình chính của vi dịch vụ thiết bị. Trong chương trình chính của vi dịch vụ thiết bị, người phát triển sẽ chỉ cần thêm, liên kết gói hỗ trợ dịch vụ thiết bị vào, và chuyển tiếp các yêu cầu tới các hàm tương ứng trong gói hỗ trợ dịch vụ thiết bị. Đoạn chương trình thêm, liên kết gói trong chương trình chính của vi dịch vụ sẽ được viết giống nhau trong tất cả các vi dịch vụ thiết bị triển khai theo mơ hình này, chỉ khác nhau ở việc lựa chọn tên các đối tượng sẽ sử dụng trong gói hỗ trợ dịch vụ thiết bị. Điều này làm cho quá trình triển khai các vi dịch vụ thiết bị sẽ nhanh hơn vì có thể tái sử dụng các đoạn mã lệnh trong chương trình chính của vi dịch vụ thiết bị.
Sau khi thêm, liên kết gói hỗ trợ dịch vụ thiết bị vào chương trình chính của vi dịch vụ thiết bị đang triển khai, tất cả những việc người phát triển cần làm sau này đều thực hiện ở gói hỗ trợ dịch vụ thiết bị, khơng cần phải lập trình thêm bất kỳ đoạn mã nào trong chương trình chính của vi dịch vụ thiết bị. Trọng tâm của quá trình tạo vi dịch vụ thiết bị là phát triển gói hỗ trợ dịch vụ thiết bị. Khi đó, các bước triển khai, phát triển vi dịch vụ như sau: từ yêu cầu → phát triển trên gói hỗ trợ dịch vụ thiết bị → biên dịch lại chương trình vi dịch vụ thiết bị để cập nhập lại gói hỗ trợ dịch vụ thiết bị, hồn thành yêu cầu, chạy vi dịch vụ.
29
Các hàm được đưa ra trong gói hỗ trợ phát triển dịch vụ là những hàm tối thiểu phải có để có thể đáp ứng được các yêu cầu cơ bản của một vi dịch vụ thiết bị.
Đây là một mơ hình triển khai mở cho gói hỗ trợ phát triển dịch vụ thiết bị. Trong một vi dịch vụ thiết bị, có thể chỉ sử dụng một số lớp trong mơ hình của gói hỗ trợ dịch vụ thiết bị bên trên, không nhất thiết phải triển khai đầy đủ các lớp; các chức năng, ý nghĩa của từng lớp cũng có thể được thay đổi ít nhiều để phù hợp với từng bài toán.
Khi đã phát triển được nhiều đối tượng cho gói này, việc tạo ra một vi dịch vụ thiết bị mới sẽ rất linh động và nhanh chóng, thậm chí chỉ cần cấu hình lựa chọn các chức năng trong gói mà khơng phải lập trình thêm, vì mơ hình này có ưu điểm nổi bật là tính tái sử dụng cao, dễ sử dụng.
Để minh họa tính tái sử dụng của gói, xét ví dụ sau: giả sử gói hỗ trợ dịch vụ thiết bị đã phát triển được:
Lớp ứng dụng: đã triển khai các lệnh cho loại thiết bị A. Lớp mạng: đã triển khai loại mạng N1, N2.
Lớp vận chuyển: đã triển khai các giao thức mạng T1, T2.
Gateway đang quản lý một thiết bị thực tên là DA thuộc loại thiết bị A. Lúc này, ta có thể cấu hình để tạo ra nhiều loại dịch vụ thiết bị mới đáp ứng các bài toán khác nhau như:
Một dịch vụ thiết bị mà gửi lệnh tới thiết bị DA theo quy định dữ liệu của mạng N1 qua kết nối T1.
Một dịch vụ thiết bị mà gửi lệnh tới thiết bị DA theo quy định dữ liệu của mạng N2 qua kết nối T1.
Một dịch vụ thiết bị mà gửi lệnh tới thiết bị DA theo quy định dữ liệu của mạng N1 qua kết nối T2.
Một dịch vụ thiết bị mà gửi lệnh tới thiết bị DA theo quy định dữ liệu của mạng N2 qua kết nối T2.
30
Hình 3.5 Nhiều tùy chọn để gửi lệnh tới thiết bị
Sự linh hoạt, nhiều lựa chọn để điều khiển một thiết bị như trên cho thấy ưu điểm rằng: có thể nhanh chóng tạo ra dịch vụ thiết bị đáp ứng thay đổi các u cầu bài tốn. Chương trình của dịch vụ thiết bị mới có thể giống hệt chương trình của dịch vụ thiết bị cũ, chúng chỉ khác nhau ở phần cấu hình để lựa chọn ứng dụng, loại mạng hay kiểu chuyển giao. Khả năng cho phép sử dụng cùng một chương trình vi dịch vụ cho nhiều bài toán khác nhau này cho thấy khả năng tái sử dụng vi dịch vụ khi áp dụng mơ hình. [8]
Tiếp tục với ví dụ trên, giả sử bài toán yêu cầu muốn thêm lệnh A3 cho thiết bị, lúc này, người phát triển chỉ cần thêm chức năng ở lớp ứng dụng cho loại thiết bị A, khơng phải lập trình để xử lý kết nối, chuyển đổi dữ liệu theo loại mạng của thiết bị, vì các cơng việc đó được hỗ trợ bởi các lớp khác, độc lập với lớp ứng dụng. Điều này chứng minh tính tái sử dụng các lớp của mơ hình.
Tính tái sử dụng của mơ hình triển khai vi dịch vụ thiết bị, theo quan điểm cá nhân là ưu điểm nổi bật để phát triển theo mơ hình này. Mơ hình hướng tới việc triển khai các vi dịch vụ thiết bị nhanh chóng, linh động, thậm chí chỉ cần thay đổi cấu hình bằng cách tái sử dụng các chức năng có sẵn nếu có.
31