Giới thiệu dự án
Sốt xuất huyết Dengue (Dengue Hemorrhagic Fever - DHF) là một trong những bệnh truyền nhiễm nhiệt đới có tốc độ lây lan nhanh nhất thế giới. Theo Tổ chức Y tế Thế giới (WHO), mỗi năm có khoảng 390 triệu ca nhiễm Dengue trên toàn cầu, trong đó 96 triệu ca có biểu hiện lâm sàng nghiêm trọng. Tại Việt Nam, các đợt bùng phát dịch theo mùa thường xuyên dẫn đến tình trạng quá tải nghiêm trọng tại các bệnh viện tuyến đầu (tỷ lệ lấp đầy giường bệnh vượt mức 150-200%). Thách thức lớn nhất trong quản lý bệnh nhân sốt xuất huyết là giai đoạn nguy hiểm (critical phase, thường từ ngày thứ 3 đến ngày thứ 7 của bệnh), khi bệnh nhân có nguy cơ hạ tiểu cầu đột ngột, cô đặc máu, tràn dịch màng và sốc Dengue. Việc theo dõi liên tục các chỉ số sinh tồn (vital signs) đóng vai trò quyết định trong việc phát hiện sớm biến chứng và can thiệp kịp thời.
Phương pháp theo dõi lâm sàng truyền thống tại bệnh viện phụ thuộc vào việc điều dưỡng đo sinh hiệu thủ công định kỳ (khoảng 4-6 giờ/lần). Phương thức này bộc lộ nhiều điểm nghẽn:
- Độ trễ thông tin cao: Không thể phát hiện kịp thời các biến đổi sinh hiệu đột ngột giữa hai lần đo.
- Tiêu tốn nhân lực y tế: Gây áp lực cực lớn lên đội ngũ bác sĩ và điều dưỡng trong các đợt cao điểm dịch.
- Nguy cơ lây nhiễm chéo: Việc bệnh nhân phải nằm viện nội trú để theo dõi các trường hợp nhẹ hoặc trung bình làm gia tăng nguy cơ lây nhiễm chéo các mầm bệnh cơ hội.
Đồ án tốt nghiệp "An IoT-based Remote Patient Monitoring System for Tackling the Dengue Fever Outbreak" của nhóm tác giả Nguyễn Hoàng Long và Đỗ Nguyễn Đạt (Khoa Khoa học & Kỹ thuật Máy tính, Trường Đại học Bách Khoa – ĐHQG-HCM, dưới sự hướng dẫn của PGS.TS. Quản Thành Thơ) được nghiên cứu và phát triển nhằm giải quyết triệt để bài toán trên. Hệ thống cung cấp một giải pháp toàn diện từ phần cứng thiết bị biên (Edge IoT Device) đến nền tảng đám mây phân tán (Distributed Cloud Platform), cho phép theo dõi liên tục các chỉ số sinh hiệu của bệnh nhân sốt xuất huyết từ xa theo thời gian thực (real-time).
+------------------+ MQTT / TLS 1.3 +-----------------------------------------+
| ESP32 Edge Node | -----------------------> | Kong API Gateway (v3.4) |
| (SpO2, Temp, HR) | +-----------------------------------------+
+------------------+ | |
(gRPC / Stream) (REST / JSON)
v v
+---------------+ +-------------------+
| IoT Ingestion | | Patient & Auth |
| Service (Go) | | Service (NestJS) |
+---------------+ +-------------------+
| |
+-----------+-----------+ v
v v +---------------+
+---------------+ +-----------+ | PostgreSQL 15 |
| InfluxDB v2.7 | | Alert/Rule| +---------------+
+---------------+ | Engine |
+-----------+
| (WebSocket / FCM)
v
+---------------------------+
| Doctor/Patient Dashboard |
| (React 18 / Vite TS) |
+---------------------------+
Mục tiêu cụ thể của dự án
- Thiết kế thiết bị IoT đeo biên (Wearable Edge Node): Thu thập liên tục 4 chỉ số sinh tồn quan trọng: Nồng độ oxy trong máu ($SpO_2$), Nhịp tim (Heart Rate - HR), Nhiệt độ cơ thể (Body Temperature - BT), và Huyết áp không xâm lấn (NIBP).
- Xây dựng kiến trúc xử lý dữ liệu phân tán (Microservices): Chuyển đổi thành công từ mô hình Monolithic nguyên khối sang Microservices trên nền tảng Docker Container và Kubernetes, đảm bảo khả năng mở rộng (horizontal scalability) khi lưu lượng dữ liệu tăng đột biến.
- Phát triển Rule Engine phát hiện bất thường lâm sàng: Tự động đối soát chỉ số sinh tồn với các ngưỡng cảnh báo sốc sốt xuất huyết và kích hoạt cảnh báo đa kênh (Push Notification, SMS, WebSocket Dashboard) dưới 1.5 giây.
- Xây dựng giao diện trực quan hóa cho y bác sĩ và bệnh nhân: Dashboard thời gian thực trên Web và Mobile, hỗ trợ theo dõi đồng thời hàng trăm bệnh nhân tại nhà hoặc tại các khoa phòng.
Phạm vi và giới hạn
- Phạm vi: Triển khai giám sát bệnh nhân sốt xuất huyết giai đoạn cảnh báo tại nhà hoặc khu cách ly dã chiến; tích hợp thiết bị IoT sử dụng giao thức truyền thông không dây WiFi/MQTT.
- Giới hạn: Thiết bị chưa tích hợp mô-đun phân tích xét nghiệm máu tự động (công thức máu toàn phần như Hematocrit, tiểu cầu vẫn cần nhập thủ công từ kết quả xét nghiệm định kỳ).
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
| Tiêu chí |
Đo thủ công tại viện |
Máy Monitor chuyên dụng (VD: Philips IntelliVue) |
Thiết bị Smartwatch thương mại (Apple/Garmin) |
Hệ thống IoT RPM Đề xuất |
| Tính liên tục |
Gián đoạn (4-6h/lần) |
Liên tục (24/7) |
Liên tục |
Liên tục (1s/lần cho HR/SpO2, 10s/lần Temp) |
| Chi phí phần cứng |
Thấp (thiết bị rời) |
Rất cao ($1,500 - $5,000/node) |
Trung bình ($200 - $500/node) |
Tối ưu (< $35/node) |
| Độ trễ cảnh báo |
Rất cao (chờ đo) |
Tức thời (< 1s) |
Trung bình (cảnh báo cá nhân) |
Tức thời (< 1.2s tới Bác sĩ) |
| Khả năng mở rộng |
Giới hạn theo nhân sự |
Giới hạn số cổng/giường |
Không tập trung cho y tế |
Rất cao (Microservices, K8s) |
| Cảnh báo chuyên biệt Dengue |
Phụ thuộc kinh nghiệm |
Cảnh báo ngưỡng chung |
Không hỗ trợ |
Tích hợp tiêu chuẩn cảnh báo sốc Dengue |
Yêu cầu người dùng được phân loại theo mô hình MoSCoW:
- Must have: Đo chính xác $SpO_2$ ($\pm 2%$), Nhiệt độ ($\pm 0.2^\circ C$), Nhịp tim ($\pm 3\text{ bpm}$); gửi dữ liệu qua MQTT bảo mật TLS 1.3; Rule engine kích hoạt cảnh báo nguy cơ hạ thân nhiệt đột ngột hoặc nhịp nhanh phản xạ; giao diện bác sĩ cập nhật dữ liệu sinh hiệu thời gian thực.
- Should have: Chế độ tiết kiệm năng lượng Deep-sleep/Tickless Idle trên vi điều khiển; lưu trữ dữ liệu chuỗi thời gian (Time-series database); phân quyền RBAC đa cấp độ (Super Admin, Doctor, Nurse, Patient).
- Could have: Dự báo xu hướng suy giảm chỉ số dựa trên thuật toán lọc hồi quy; tích hợp cổng thanh toán bảo hiểm y tế.
- Won't have (giai đoạn này): Cảm biến đo tiểu cầu liên tục không xâm lấn.
Thiết kế hệ thống
Hệ thống được thiết kế theo kiến trúc Microservices phân tán, loại bỏ các điểm nghẽn chịu tải của mô hình Monolithic ban đầu:
1. Hardware & Edge Layer
- MCU: Espressif ESP32-WROOM-32 (Dual-core Xtensa 32-bit LX6 @ 240MHz, 520KB SRAM).
- Cảm biến:
- MAX30102: Đo $SpO_2$ và Nhịp tim thông qua nguyên lý đo quang thể tích xung (Photoplethysmography - PPG).
- MLX90614 / DS18B20: Cảm biến hồng ngoại đo thân nhiệt không tiếp xúc / áp sát y tế.
- Hệ điều hành nhúng: FreeRTOS kernel v10.4.
2. Communication & Ingestion Layer
- Giao thức: MQTT v5.0 qua mTLS (cổng 8883), QoS level 1 đảm bảo không thất thoát gói tin.
- Broker: Eclipse Mosquitto v2.0.18 được cấu hình chịu tải cao (high-concurrency tuning).
- Ingestion Service: Viết bằng Go (Golang 1.20) giúp tối ưu hóa Goroutines, đọc trực tiếp từ Message Broker và phân phối vào Time-Series Engine.
3. Data & Storage Layer
- Time-series Database: InfluxDB v2.7 lưu trữ dữ liệu sinh hiệu tần số cao (ghi nhận 10,000+ data points/giây).
- Relational Database: PostgreSQL 15 quản lý hồ sơ bệnh án điện tử, phân công giường bệnh, dữ liệu danh mục y tế.
- Cache & Message Stream: Redis v7.2 cho phiên đăng nhập (Session Store) và Redis Streams phục vụ Rule Engine.
-- Schema cơ sở dữ liệu quan hệ (PostgreSQL 15) cho quản lý bệnh nhân Dengue
CREATE TABLE patients (
patient_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
national_id VARCHAR(20) UNIQUE NOT NULL,
full_name VARCHAR(100) NOT NULL,
dengue_day_of_illness INT NOT NULL CHECK (dengue_day_of_illness BETWEEN 1 AND 14),
warning_signs_present BOOLEAN DEFAULT FALSE,
assigned_doctor_id UUID REFERENCES doctors(doctor_id),
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE clinical_alerts (
alert_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
patient_id UUID REFERENCES patients(patient_id) ON DELETE CASCADE,
alert_type VARCHAR(50) NOT NULL,
severity VARCHAR(20) NOT NULL CHECK (severity IN ('LOW', 'MEDIUM', 'HIGH', 'CRITICAL')),
trigger_value JSONB NOT NULL,
acknowledged BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
# InfluxDB Line Protocol Format (Telemetry Ingestion)
vitals_stream,patient_id=p-9842a,device_id=esp32-node-01 spo2=97.5,heart_rate=104i,body_temp=38.9,pulse_pressure=22i 1698223945000000000
4. Application & Presentation Layer
- Backend Services: NestJS (Node.js v18 LTS) cung cấp RESTful API & GraphQL endpoints; Go Alert Engine xử lý song song các tác vụ phát hiện ngưỡng.
- Frontend Dashboard: React 18, TypeScript, TailwindCSS v3.3, Chart.js & WebSockets truyền phát biểu đồ thời gian thực.
- API Gateway: Kong Gateway v3.4 quản lý định tuyến, xác thực JWT, và Rate Limiting.
API Endpoints Summary:
- POST /api/v1/auth/login (Authenticate user & issue JWT)
- GET /api/v1/patients/{id}/vitals/live (WebSocket stream for live telemetry)
- GET /api/v1/patients/{id}/telemetry (Query historical time-series data from InfluxDB)
- POST /api/v1/alerts/acknowledge (Acknowledge critical alert by medical staff)
Phương pháp luận phát triển (Methodology)
Dự án áp dụng mô hình phát triển Agile Scrum với các chu kỳ Sprint kéo dài 2 tuần. Quy trình kiểm thử chất lượng (QA) được tích hợp CI/CD qua GitHub Actions:
- Unit Testing: Đạt độ bao phủ kiểm thử code (Code Coverage) trên 86% sử dụng Jest (NestJS) và Go Test Suite.
- Load Testing: Giả lập 5,000 thiết bị kết nối đồng thời qua công cụ k6 và Apache JMeter.
Implementation và kết quả
Quá trình phát triển và Thuật toán cốt lõi
Một trong những đóng góp kỹ thuật trọng tâm của đồ án là việc xây dựng thuật toán lọc nhiễu tín hiệu quang thể tích (PPG Moving Average Filter) trực tiếp tại thiết bị biên ESP32 để loại bỏ nhiễu chuyển động (motion artifacts), kết hợp với Clinical Anomaly Detection Engine viết bằng Go trên Backend.
// ESP32 FreeRTOS Task: Thu thập và lọc dữ liệu sinh hiệu (C++)
#include <Arduino.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#define WINDOW_SIZE 10
float spo2_buffer[WINDOW_SIZE];
int buffer_index = 0;
float apply_moving_average(float new_sample) {
spo2_buffer[buffer_index] = new_sample;
buffer_index = (buffer_index + 1) % WINDOW_SIZE;
float sum = 0.0;
for(int i = 0; i < WINDOW_SIZE; i++) {
sum += spo2_buffer[i];
}
return sum / WINDOW_SIZE;
}
void vSensorTelemetryTask(void *pvParameters) {
TickType_t xLastWakeTime = xTaskGetTickCount();
const TickType_t xFrequency = pdMS_TO_TICKS(1000); // 1 Hz
for (;;) {
float raw_spo2 = read_max30102_spo2();
float filtered_spo2 = apply_moving_average(raw_spo2);
float temperature = read_mlx90614_temp();
int heart_rate = read_heart_rate();
// Publish payload JSON qua MQTT khi chỉ số hợp lệ
if (filtered_spo2 > 70.0 && temperature > 34.0) {
StaticJsonDocument<256> doc;
doc["patient_id"] = "p-9842a";
doc["spo2"] = filtered_spo2;
doc["heart_rate"] = heart_rate;
doc["temp"] = temperature;
doc["ts"] = millis();
char buffer[256];
serializeJson(doc, buffer);
mqttClient.publish("vitals/telemetry/p-9842a", buffer, 1);
}
vTaskDelayUntil(&xLastWakeTime, xFrequency);
}
}
// Go Microservice: Clinical Alert Rule Engine
package main
import (
"context"
"encoding/json"
"fmt"
"github.com/go-redis/redis/v8"
)
type VitalsTelemetry struct {
PatientID string `json:"patient_id"`
SpO2 float64 `json:"spo2"`
HeartRate int `json:"heart_rate"`
Temp float64 `json:"temp"`
}
func EvaluateDengueWarningSigns(v VitalsTelemetry) (bool, string, string) {
// Tiêu chuẩn cảnh báo sốc Dengue: Nhịp tim nhanh kết hợp tụt SpO2 hoặc hạ nhiệt độ đột ngột
if v.SpO2 < 94.0 {
return true, "CRITICAL", fmt.Sprintf("SpO2 nguy hiểm: %.1f%% (Nguy cơ suy hô hấp/thoát huyết tương)", v.SpO2)
}
if v.HeartRate > 120 && v.Temp < 36.0 {
return true, "CRITICAL", fmt.Sprintf("Dấu hiệu sốc sốt xuất huyết: Hạ thân nhiệt (%.1f C) kèm mạch nhanh (%d bpm)", v.Temp, v.HeartRate)
}
if v.Temp >= 39.5 {
return true, "HIGH", fmt.Sprintf("Sốt cao liên tục: %.1f C", v.Temp)
}
return false, "NORMAL", "Chỉ số ổn định"
}
Quá trình chuyển đổi kiến trúc (Monolithic sang Microservices)
Ban đầu, hệ thống được thiết kế dưới dạng Monolithic Node.js kết nối trực tiếp PostgreSQL. Khi tiến hành kiểm thử tải với 1,000 kết nối MQTT đồng thời gửi dữ liệu 1 Hz:
- Tải CPU của Monolith tăng vọt lên 98%.
- Tỷ lệ mất gói tin đạt mức 14.2%.
- Thời gian phản hồi API p99 tăng lên 240ms.
Nhóm tác giả đã tiến hành tái cấu trúc toàn diện sang kiến trúc Microservices phân tán: tách riêng luồng Ingestion (Go + Mosquitto + InfluxDB) và luồng Nghiệp vụ (NestJS + PostgreSQL). Kết quả sau chuyển đổi: CPU chỉ duy trì ở mức 28%, độ trễ p99 giảm xuống 85ms dưới cùng mức tải.
+-----------------------------------------------------------------------------------------+
| PERFORMANCE BENCHMARK: MONOLITHIC VS. MICROSERVICES |
+------------------------------------+------------------------+---------------------------+
| Metric | Monolithic (Node/Postgres)| Microservices (Go/InfluxDB)|
+------------------------------------+------------------------+---------------------------+
| Max Concurrent Device Connections | 1,200 nodes | 12,500+ nodes |
| End-to-End Telemetry Latency (p99) | 240 ms | 85 ms (-64.5%) |
| Database Write Throughput | 1,800 records/sec | 25,000+ points/sec (+1288%)|
| Alert Trigger-to-Delivery Time | 4.2 seconds | 0.95 seconds (-77.3%) |
| Packet Drop Rate (Under Stress) | 14.2% | < 0.05% |
+------------------------------------+------------------------+---------------------------+
Đổi mới và đóng góp
- Kiến trúc dữ liệu Hybrid tối ưu cho eHealth: Kết hợp hài hòa giữa InfluxDB v2.7 (xử lý dữ liệu chuỗi thời gian lớn với dung lượng nén dữ liệu đạt 85% so với RDBMS truyền thống) và PostgreSQL 15 (đảm bảo tính toàn vẹn ACID cho hồ sơ bệnh án).
- Hệ thống cảnh báo chuyên biệt cho sốt xuất huyết: Thay vì chỉ cảnh báo ngưỡng đơn lẻ (single-threshold), hệ thống tích hợp luật liên kết đa tham số (Multi-parameter Association Rules), phát hiện sớm tổ hợp triệu chứng "hạ thân nhiệt kèm mạch nhanh" – dấu hiệu kinh điển của giai đoạn tiền sốc Dengue.
- Thiết bị phần cứng chi phí thấp - hiệu năng y tế: Tối ưu hóa thuật toán lọc số trên chip nhúng ESP32 với FreeRTOS, giúp thiết bị vận hành liên tục 42 giờ với pin Li-ion 2500mAh mà vẫn đảm bảo độ sai lệch nhịp tim dưới 2.5% so với máy đo tiêu chuẩn y tế Spacelabs.
Ứng dụng thực tế và triển khai
Kịch bản ứng dụng lâm sàng
- Giám sát bệnh nhân ngoại trú giai đoạn nguy hiểm (Ngày 3 - Ngày 7): Bệnh nhân được phát thiết bị đeo IoT tại nhà. Bác sĩ tại trung tâm y tế theo dõi tình trạng từ xa qua Web Dashboard. Khi xuất hiện dấu hiệu thoát huyết tương hoặc hạ nhiệt độ đột ngột, hệ thống tự động gọi điện cảnh báo người nhà và bác sĩ điều trị để nhập viện cấp cứu tức thời.
- Triển khai tại bệnh viện dã chiến / Khoa truyền nhiễm: Giảm tải 75% khối lượng công việc đo thủ công của điều dưỡng, giảm thiểu nguy cơ phơi nhiễm và lây nhiễm chéo.
# Hướng dẫn triển khai cụ thể với Docker Compose
git clone https://github.com/dengue-rpm/system-core.git
cd system-core/deployments
# Khởi tạo toàn bộ hạ tầng Microservices
docker compose -f docker-compose.prod.yml up -d --scale ingestion-service=3
# Kiểm tra trạng thái các cụm dịch vụ
docker compose ps
Hạn chế và hướng phát triển
- Hạn chế: Cảm biến quang thể tích PPG vẫn chịu ảnh hưởng bởi hiện tượng co mạch ngoại vi khi bệnh nhân sốt cao rét run hoặc cử động mạnh; hệ thống phụ thuộc vào độ phủ sóng WiFi/4G tại hộ gia đình.
- Hướng phát triển:
- Tích hợp mô-đun kết nối mạng diện rộng năng lượng thấp (NB-IoT / LoRaWAN) cho khu vực vùng sâu, vùng xa.
- Ứng dụng mô hình mạng nơ-ron học sâu (LSTM / Temporal Fusion Transformer) để dự báo biến chứng sốc Dengue sớm trước 4-6 giờ dựa trên chuỗi dữ liệu lịch sử.
Đối tượng hưởng lợi
- Sinh viên & Nghiên cứu sinh: Cung cấp tài liệu tham khảo chi tiết, có thể kiểm chứng về quy trình di chuyển kiến trúc từ Monolithic sang Microservices trong lĩnh vực IoT y tế.
- Kỹ sư phát triển phần mềm / IoT: Nắm bắt kỹ thuật lập trình nhúng FreeRTOS tối ưu tài nguyên, xử lý luồng dữ liệu thời gian thực quy mô lớn với Go, InfluxDB và MQTT.
- Cơ sở y tế & Doanh nghiệp: Một giải pháp công nghệ giá rẻ (< $35 phần cứng), sẵn sàng tích hợp với bệnh án điện tử (EMR) chuẩn HL7/FHIR, giúp tiết kiệm hàng tỷ đồng chi phí đầu tư thiết bị ngoại nhập.
Câu hỏi thường gặp
1. Yêu cầu kỹ thuật tối thiểu để triển khai hệ thống là gì?
- Phía máy chủ: Cụm máy chủ Kubernetes (tối thiểu 3 Nodes: 4 vCPU, 8GB RAM mỗi node), hỗ trợ lưu trữ SSD để tối ưu hóa tốc độ ghi InfluxDB.
- Phía biên: Thiết bị dựa trên vi điều khiển ESP32, nguồn cấp pin 3.7V - 5V, kết nối mạng WiFi 802.11 b/g/n băng tần 2.4GHz.
2. Hệ thống xử lý thế nào khi mất kết nối mạng Internet tại nhà bệnh nhân?
Thiết bị biên ESP32 được tích hợp chip nhớ Flash SPIFFS. Khi mất kết nối MQTT Broker, dữ liệu sinh hiệu sẽ được ghi đệm cục bộ (Local Caching) lên bộ nhớ flash với dung lượng đủ lưu trữ 12 giờ dữ liệu. Ngay khi kết nối mạng phục hồi, dữ liệu được đẩy bù (Backfill synchronization) với nhãn thời gian thực (Timestamp) chính xác.
3. Hệ thống có khả năng tích hợp với các hệ thống quản lý bệnh viện hiện nay không?
Hệ thống hỗ trợ xuất dữ liệu chuẩn RESTful API và tuân thủ định dạng trao đổi thông tin y tế HL7 FHIR v4.0.1 (Fast Healthcare Interoperability Resources), cho phép tích hợp trực tiếp vào các phần mềm HIS/EMR của bệnh viện.
Kết luận
Đồ án "An IoT-based Remote Patient Monitoring System for Tackling the Dengue Fever Outbreak" của nhóm tác giả Nguyễn Hoàng Long và Đỗ Nguyễn Đạt đã giải quyết xuất sắc bài toán cấp bách trong giám sát y tế bệnh nhân sốt xuất huyết. Với việc kết hợp hoàn chỉnh giữa kỹ thuật vi điều khiển nhúng, giao thức truyền thông IoT tối ưu và kiến trúc phân tán Microservices hiệu năng cao, công trình đã chứng minh tính khả thi vượt trội cả về mặt kỹ thuật lẫn hiệu quả kinh tế. Hệ thống mở ra hướng tiếp cận mới trong chuyển đổi số y tế dự phòng, giảm áp lực cho ngành y tế và bảo vệ sức khỏe cộng đồng trong các đợt bùng phát dịch bệnh tương lai.