Chương 1: Tổng quan. Chương này trình bày cái nhìn tổng quan về đề tài, bao gồm tính cấp thiết, lý do chọn đề tài, mục tiêu, tình hình nghiên cứu, phương pháp nghiên cứu, và bố cục của đề tài. • Chương 2: Cơ sở lý thuyết. Trong chương này giới thiệu sơ lược về công cụ phần mềm chính được sử dụng trong đề tài bao gồm MERN Stack, giao thức truyền thông HTTP, MQTT, Websocket, các dịch vụ Amazon Web Services như EC2, IoT Core, SNS, S3, DynamoDB.
Đồng thời chương này cũng giới thiệu về Docker, Kubernetes và Terraform, các công cụ quan trọng để tự động hóa quy trình triển khai ứng dụng và quản lý hạ tầng của hệ thống. • Chương 3: Thiết kế hệ thống. Trình bày về thiết kế hệ thống, thiết kế mô phỏng dữ liệu của nhiều cảm biến, tính toán thiết kế từng khối hoạt động ở backend, giới thiệu giao diện frontend, chức năng của ứng dụng di động giao tiếp với người dùng, quy trình thực hiện một sản phẩm phần mềm IoT và triển khai trên môi trường Amazon Cloud Services. • Chương 4: Kết quả.
Chương này trình bày kết quả các thành phần chức năng của hệ thống, phương thức phát hiện, cảnh báo và thông báo về ứng dụng của người dùng. • Chương 5: Kết luận và hướng phát triển. Tóm tắt những kết quả chính và kết luận về đề tài nghiên cứu, đồng thời đề xuất những hướng mở rộng, phát triển tiếp theo của đề tài trong tương lai, bao gồm cả những ý tưởng mới và tiềm năng ứng dụng thực tế.1 TỔNG QUAN VỀ NODEJS 2.1 Giới thiệu về NodeJS NodeJS là một môi trường chạy mã nguồn mở phổ biến được sử dụng cho các ứng dụng web và đa nền tảng. NodeJS cho phép các nhà phát triển và tận dụng nó để tạo các ứng dụng web có tính linh hoạt và mạnh mẽ nhờ sử dụng đồng bộ hóa, xử lý đa luồng và xử lý dữ liệu trên máy chủ.
Ngoài ra, NodeJS, một nền tảng JavaScript, cho phép các nhà phát triển tạo ra các ứng dụng web bằng cách sử dụng các ngôn ngữ lập trình phổ biến như JavaScript, HTML và CSS [6]. • Lịch sử hình thành của NodeJS Node.js là một phần của Công cụ JavaScript V8 của Google Chrome. Ryan Dahl đã phát triển Node.js vào năm 2009 và nó sử dụng vòng lặp sự kiện và API I/O cấp thấp để quản lý nhiều kết nối đồng thời. Điều này làm cho nó trở nên lý tưởng cho các ứng dụng liên quan đến thời gian thực, chẳng hạn như trò chuyện trực tuyến và trò chơi trực tuyến.js đã trở thành một trong những nền tảng phổ biến nhất để tạo ứng dụng web.
Netflix, Uber và PayPal là một số công ty lớn đã sử dụng nó [7]. Dưới đây là một số mốc quan trọng trong lịch sử phát triển của Node.js được phát hành lần đầu tiên. - 2010: Trình quản lý gói npm được giới thiệu. - 2011: Phiên bản Windows gốc của Node.js được phát hành.
- 2012: Ryan Dahl bước sang một bên và Isaac Schlueter trở thành người quản lý dự án.js, một nhánh của Node.js, được tạo ra.js Foundation được thành lập và Nodejs và io.js được hợp nhất lại với nhau. - 2018: Demo, một thay thế Node.js dựa trên TypeScript, được phát hành. - 2019: JS Foundation và Node.js Foundation hợp nhất để tạo thành OpenJS Foundation.js vẫn đang được phát triển và cải thiện và là một nền tảng mạnh mẽ và linh hoạt có thể được sử dụng để xây dựng nhiều loại ứng dụng web [6]. • Kiến trúc của NodeJS Hình 2.
1 Kiến trúc của NodeJS [6].js áp dụng mô hình xử lý đơn luồng dựa trên sự kiện, khác với mô hình đa luồng mà nhiều môi trường runtime khác sử dụng. Trong mô hình đa luồng, mỗi yêu cầu sẽ được xử lý bởi một luồng riêng lẻ cho đến khi tất cả các luồng có sẵn bị chiếm dụng, buộc máy chủ phải chờ đợi cho đến khi một luồng trở nên rảnh rỗi. Điều này có thể làm chậm ứng dụng và giảm hiệu quả, gây ảnh hưởng tiêu cực đến trải nghiệm người dùng. Ngược lại, Node.js xử lý tất cả các yêu cầu từ ứng dụng bởi duy nhất một luồng xử lý chính, sử dụng vòng lặp sự kiện để thực hiện các hoạt động I/O không đồng bộ, từ đó tăng cường hiệu suất xử lý đồng thời cải thiện tốc độ, phản hồi về ứng dụng [7].
• Một số khái niệm: - Event Queue: hàng đợi sự kiện là nơi tất cả các sự kiện (event) đã đi vào sẽ lần lượt được xử lý theo cơ chế FIFO, tức là các sự kiện đến server trước sẽ được NodeJS xử lý trước, các sự kiện đến server sau sẽ được xử lý sau. - Callbacks: là các thao tác, các xử lý, các hàm sẽ được thực hiện sau khi đã thực thi hoàn thành một hàm định nghĩa callback. Việc sử dụng callback giúp cho lập trình viên quản lý các vấn đề về. - Message: nội dung thông báo tương ứng với từng callback.
10 - Blocking I/O: là một cơ chế được sử dụng trong nhiều ngôn ngữ bên cạnh server. Nó quản lý các yêu cầu gửi đến server và lần lượt thực hiện các yêu cầu của yêu cầu tiếp theo sau khi yêu cầu đang xử lý đã hoàn thành. - Thread Pool là một chương trình được viết bởi ngôn ngữ lập trình C++, được tích hợp vào NodeJS cho phép xử lý nhiều luồng. Đây là môi trường xử lý chung và đóng vai trò chính cho tất cả các tác vụ được xử lý bởi server NodeJS, và các tác vụ này được xử lý trên nhiều luồng.
- Event Loop: là một vòng lặp vô tận chuyển các yêu cầu đã nhận được sang Threadpool đồng thời tự động đăng ký một Callback cho mỗi yêu cầu. Mỗi khi yêu cầu được xử lý xong, hàm Callback tương ứng sẽ được thực thi [8].2 Ưu nhược điểm của NodeJS • Ưu điểm của NodeJS Node.js được thiết kế dựa trên mô hình hướng sự kiện, điều này nhằm giúp I/O không đồng bộ nhưng vẫn hoạt động hiệu quả, xử lý nhiều sự kiện đồng thời trong một luồng đơn. Điều này giúp Node.js trở nên nhẹ, nhanh, có thể mở rộng và hiệu quả trong việc xử lý các tác vụ I/O và dữ liệu lớn, rất phù hợp cho một số ứng dụng web nhất định. Với những lợi thế này, Node.js được sử dụng rất phổ biến trong các ứng dụng, nghiên cứu về lĩnh vực IoT [9].
Dưới đây là một số ưu điểm nổi bật của Node.js: - Internet of Things (IoT): IoT là một mạng lưới các thiết bị như cảm biến, các thiết bị nhúng có chứa các vi xử lý, vi điều khiển, cho phép tạo ra nhũng kết nối giữa các thiết bị này và trao đổi dữ liệu lẫn nhau nhằm phục vụ các ứng dụng IoT trên nền tảng từ các thiết bị điện tử. Với kiến trúc dựa trên sự kiện và xử lý không đồng bộ, các máy chủ Node.js rất thích hợp cho các tác vụ I/O nặng trong hệ thống IoT, có thể bao gồm hàng nghìn thiết bị.js được sử dụng nó đại diện một lớp ứng dụng giữa các thiết bị, cảm biến tạo ra cơ sở dữ liệu lưu trữ dữ liệu giúp hiệu suất được cải thiện đáng kể. - Trò chuyện thời gian thực: Node.js cung cấp mọi thành phần cần thiết để xây dựng các ứng dụng trò chuyện thời gian thực với mức độ phức tạp khác nhau. API sự kiện mạnh mẽ của Node.js cho phép tạo các bộ phát sự kiện và sau đó phân tán 11 các sự kiện được đặt tên cho bộ xử lý sự kiện.
Tính năng này hỗ trợ triển khai các thông báo đẩy, thường được sử dụng trong nhắn tin trong ứng dụng cần tính nhanh chóng, lập tức. - Fullstack JavaScript: Trước khi Node.js ra đời, JavaScript chỉ được sử dụng cho phát triển phía khách hàng. Việc sử dụng các ngôn ngữ lập trình khác nhau cho phía máy chủ và máy khách là cần thiết. Tuy nhiên, với sự xuất hiện của Node.js, JavaScript đã trở thành một ngôn ngữ fullstack, cho phép các nhà phát triển sử dụng cùng một ngôn ngữ cho cả front-end và back-end.
Điều này làm cho việc phát triển ứng dụng web trở nên dễ dàng và hiệu quả hơn nhiều [9]. • Nhược điểm của NodeJS Bên cạnh những lợi ích mà NodeJS mang lại, nó cũng có một số nhược điểm, bao gồm: - Đa luồng chưa tốt: NodeJS được biết đến là một platform đơn luồng, vì vậy nó chỉ xử lý tất cả các yêu cầu bằng một luồng. Nói cách khác, NodeJS xử lý kém các ứng dụng có các tình huống cần xử lý đa luồng. - NodeJS thường được sử dụng để phát triển các ứng dụng nhiều I/O.
Do đó, nó không phù hợp với các ứng dụng sử dụng nhiều CPU. NodeJS sẽ không phù hợp với các ứng dụng sử dụng nhiều CPU. - Quản lý bộ nhớ kém và cấu trúc mã lệnh phức tạp: NodeJS chạy trên môi trường JavaScript, vì vậy nó có thể dễ dàng gây ra tình trạng "bộ nhớ rò rỉ", khiến bộ nhớ máy tính bị kín. Cấu trúc mã lệnh của NodeJS khá phức tạp, đặc biệt là khi so sánh với các nền tảng phát triển web khác như PHP hoặc Ruby on Rails [9].2 TỔNG QUAN VỀ NODEJS FRAMEWORK EXPRESS 2.1 Giới thiệu về ExpressJS Một framework phổ biến được xây dựng dựa trên Nodejs là Expressjs.
Nó cung cấp các khả năng vượt trội cho phát triển web và ứng dụng di động. Các API mạnh mẽ và dễ sử dụng được tạo ra bởi Expressjs, được hỗ trợ bởi các phương pháp HTTP và middleware [8]. 12 • Tính năng của ExpressJS: - Phát triển máy chủ: ExpressJS có khả năng cung cấp nhiều phương thức và các hàm, thư viện để xử lý các nhu cầu tạo ra tác vụ lập trình web phổ biến, đồng thời tối ưu hóa cú pháp lập trình. - Hệ thống định tuyến (Routing): Hệ thống định tuyến mạnh mẽ của ExpressJS cung cấp khả năng xác định các tuyến đường để xử lý yêu cầu và phản hồi từ người dùng một cách hiệu quả.
Điều này giúp dễ dàng sắp xếp, quản lý các phần của ứng dụng, và nâng cao trải nghiệm người dùng. - Middleware: Hỗ trợ việc sử dụng middleware cho các công việc thêm chức năng trung gian trong các quá trình xử lý yêu cầu và phản hồi. Middleware mang tính linh hoạt cao, hỗ trợ nhiều nhiệm vụ như xác thực người dùng, xử lý lỗi, nén dữ liệu, và nhiều tác vụ khác. - Cấu hình môi trường: ExpressJS không chỉ cung cấp phương tiện để cấu hình môi trường cho cả giai đoạn phát triển và sản xuất, mà còn cho phép người dùng linh hoạt thiết lập các biến môi trường, định dạng và quy tắc cấu hình.