HC VI N NG NGH U CHÍNH VIN THÔNG
KHOA NG NGH THÔNG TIN 1
--------------------------------------
O O I T P IOT VÀ NG D NG
H THNG IOT CHO NHÀ THÔNG MINH
IoT và ng d ng N06
Gi ng viên: Nguy n Qu c Uy
Sinh viên: An Qu c Vi t
Mã sinh viên: B21DCCN787
Hà N i 2024
2
MC L C
Phn I. Gi i thi u .......................................................................................................... 3
1. M c tiêu .................................................................................................................. 3
2. Ph ng nghiên cm vi và đi tư u ......................................................................... 3
3. T ng quan h th ng ............................................................................................... 3
Phn II. Cơ s lý thuyết ................................................................................................ 4
1. Ph n c ng ............................................................................................................... 4
2. Công ngh s d ng cho website ............................................................................ 5
Ph ngn III. Phân tích và thi t k h thế ế ..................................................................... 7
1. Ph n c ng ............................................................................................................... 7
2. Backend ................................................................................................................ 10
3. Front end .............................................................................................................. 14
Phn IV. K t quế ......................................................................................................... 14
1. Mô hình ph n c ng .............................................................................................. 14
2. Giao di n website ................................................................................................. 15
Phn V. Tài li u tham kh o ........................................................................................ 17
Phn VI. Ph lc .......................................................................................................... 17
MC L C HÌNH NH
Hình 1. T ng quan h th ng ........................................................................................................................... 3
Hình 2 hình RESTful API ....................................................................................................................... 6
Hình 3 hình MQTT ................................................................................................................................... 6
Hình 4 Ki n trúc c a Spring bootế ................................................................................................................. 7
Hình 5 đồ chân ESP8266 .......................................................................................................................... 7
Hình 6 đồ tng quát phn cng ............................................................................................................... 8
Hình 7 hình ph n c ng .......................................................................................................................... 14
Hình 8 Trang Dashboard .............................................................................................................................. 15
Hình 9 Trang Data sensor ............................................................................................................................ 15
Hình 10 Trang Action history ..................................................................................................................... 16
Hình 11 Trang Profile ................................................................................................................................... 16
3
Phần I. Gii thiu
1. Mc tiêu
Mc tiêu c a d án là thi t k m ế ế t website cho phép theo dõi trong thi gian th c
các thông s ng trong nhà g m nhi m, ánh sáng và cho u môi trư t đ, đ phép đi
khin t xa các thi t b trong nhà g u hoà. ế m đèn, qut, đi
2. Phm vi và đi tưng nghiên cu
Nghiên c u v các công ngh , thi t b và ph n m c s d xây d ng h ế m đư ng đ
thng. Đi cơ su này có th bao gm c h tng mng, giao thc kết ni, các thiết b
IoT (Internet of Things) và các ng d ng thông minh.
Tính năng và tin ích: tp trung vào các tính năng mà h th ng cung c p như điu
khin t xa, giám sát t xa
Đi tư ng: gia đình, doanh nghing s d p hoc các t ch c, cá nhân có nhu c u
s d ng h th ng
3. Tng quan h th ng
Hình 1. T ng quan h th ng
4
Phần II. Cơ s thuyết
1. Phn c ng
Tên linh ki n
Hình nh
Thông s k thu t
Module thu phát
Wifi ESP8266
NodeMCU
Ngun đin: 3,3V
Dòng n: 20mA đi
Đ u ra: k thut s
S chân I/O: 10 chân
Tn s xung nh p: 80MHz
Module c m
biến nhi t đ, đ
m DHT11
Đin áp hot đng: 3,3 5V
Dòng ho t ng: th đ p hơn 2.5
mA khi đo lư m năng ng, tiết ki
lưng
Di đo nhi t đ : n 50°C, 0°C đế
vi sai s ±2°C.
Di đo đ m: 20% đến 90% RH,
vi sai s ±5% RH.
Tn su t c p nh t: 2 giây (0,5Hz)
Cm bi n ánh ế
sáng LDR
Đin áp hot ng: 3,3 đ 5V
Đ đ đu ra: u ra analog hoc u ra
s
IC so sánh s d ng LM339
5
Breadboard
LED
Dây c m
2. Công ngh s d ng cho website
a) RESTful API
RESTful API là m t tiêu chu n dùng trong vi c thi t k API cho các ng d ng ế ế
web (thi t k ti n cho vi c qu n lý các resource. Nó chú tr ng vào tài ế ế Web services) đ
nguyên h th ng (t n, nh, âm thanh, video, ho li u ng...), bao g m các p văn b c d đ
trng thái tài nguyên đư và đưc đnh dng c truyn ti qua HTTP.
Nguyên lý ho ng: REST ho ng ch y u d a vào giao th c HTTP. c t đ t đ ế
hot đng cơ b phương thn nêu trên s s dng nhng c HTTP riêng.
6
Hình 2 hình RESTful API Mô
b) MQTT mosquitto
MQTT (Message Queuing Telemetry Transport) là giao th c truy n thông nh ,
ti ưu cho các thiết b IoT, cho phép truyn ti d liu nhanh chóng và hiu qu qua
mng không nh ho p. Giao th c này ho ng theo mô hình n đ c băng thông th t đ
"publish-subscribe", t b có th g i và nh n d li u mà không c n k t trong đó các thiế ế
ni tr p. c tiế
Hình 3 Mô hình MQTT
Mosquitto là m t máy ch MQTT mã ngu n m , cung c p n n t ng nh cho n đ
vic giao tiếp gi a các thi t b ế IoT.
c) Spring boot
Spring Boot là m t framework giúp t o ng d n ng Java nhanh chóng, đơn gi
hóa quá trình phát tri n và c u hình nh ng c u hình m nh m , vào các tính năng t đ
gim thi u boilerplate code, và tích h p t t v i các h sinh thái c a Spring.
7
Hình 4 Ki n trúc c a Spring boot ế
d) MySQL: là h qu n tr cơ s ến, dùng đ d liu mã ngun m ph bi lưu tr
và qu n lý d li u. V nh m , hi u su t cao và d s d ng, MySQL là l a ới tính năng m
chn hàng đu trong nhiu ng dng web.
e) HTML, CSS và JavaScript là b ba ngôn ng c t lõi c a giao di n web. HTML
xây d ng c u trúc trang, CSS t o ki u dáng và màu s c, trong khi JavaScript thêm tính
năng tương tác, giúp trang web tr nên sinh đng và thu hút ngư i dùng.
Phần III. Phân tích thiết kế h thng
1. Phn c ng
a) S ơ đ chân ESP8266
Hình 5 S chân ESP8266 ơ đ
8
b) S ơ đ t ng quát ph n c ng:
Hình 6 S t ng quát ph n c ng ơ đ
c) Kết n i đến wifi
void connectToWiFi() {
); Serial. (print "Kết nối đến WiFi"
, ); WiFi ssid. (begin password
( () WL_CONNECTED) { while WiFi.status !=
); delay(500
); Serial.print("."
}
); Serial.println(" Đã kết nối!"
}
d) Kết n i đến MQTT broker
void reconnect() {
( ()) { while !mqttClient.connected
); Serial.print("Đang kết nối đến MQTT..."
( )) { if mqttClient. (connect "ESP8266Client"
); Serial. (println "Đã kết nối đến MQTT!"
); mqttClient.subscribe("led/control"
} { else
); Serial. (print "Lỗi kết nối, lỗi: "
()); Serial mqttClient. (print .state
9
); delay(2000
}
}
}
e) Gi d li u c m bi n ế đến MQTT broker
float h dht = .readHumidity();
(); float t = dht.readTemperature
(A0); int lightLevel = analogRead
( ) )) { if isnan(h || isnan(t
); Serial. (println "Không thể đọc từ cảm biến DHT!"
; return
}
String ) mqttPayload = String("Temp: " + t + ", Hum: " + h + ",
Light: " ; + lightLevel
, ()); mqttClient. (publish "sensor/data" mqttPayload.c_str
f) Gi d li u c m bi n ế đến Backend
if (WiFi.status() == WL_CONNECTED) {
String url ; = "http://192.168.1.12:8080/api/iot/data-sensor"
WiFiClient ; wifiClient
HTTPClient ; http
, url); http wifiClient. (begin
, ); http. (addHeader "Content-Type" "application/json"
String httpPayload (t) = "{ temperature :"\" \" + String +
", humidity :" ", brightness :"\" \" + + String(h) \" \" +
String(lightLevel) + "}";
(httpPayload); int httpCode = http.POST
( HTTP_CODE_OK) { if httpCode ==
); Serial. (println "Data sent successfully"
} { else
); Serial httpCode. (println
10
); Serial. (println "Error sending data"
()); Serial http. (println .getString
}
(); http.end
g) Nh n tín hi u điu khi n thi t b ế
void char* * unsigned int mqttCallback( topic, byte payload, length) {
String ; message
( ; ; ) { for int i = 0 i < length i++
( ]; message += char) [payload i
}
( , ) ) { if strcmp(topic "led/control" == 0
( ) { if message == "led1/on"
, HIGH); digitalWrite(LED1
} ( ) { else if message == "led1/off"
, LOW); digitalWrite(LED1
} ( ) { else if message == "led2/on"
, HIGH); digitalWrite(LED2
} ( ) { else if message == "led2/off"
, LOW); digitalWrite(LED2
} ( ) { else if message == "led3/on"
, HIGH); digitalWrite(LED3
} ( ) { else if message == "led3/off"
, LOW); digitalWrite(LED3
}
}
}
2. Backend
a) Model
Data sensor
@Entity
@Table(name = "datasensor")
public class DataSensor {
@Id
@GeneratedValue(strategy = GenerationType. ) IDENTITY
; private long id
11
; private double temperature
; private double humidity
; private double brightness
LocalDateTime ; private dateTime
() { public DataSensor
= LocalDateTime. (); this.dateTime now
}
Action history
@Entity
@Table(name = "actionhistory")
public class ActionHistory {
@Id
@GeneratedValue(strategy = GenerationType. ) IDENTITY
; private long id
String ; private device
String ; private action
LocalDateTime ; private dateTime
() { public ActionHistory
= LocalDateTime. (); this.dateTime now
}
b) Repository
Data sensor
@Repository
public interface extends DataSensorRepository
JpaRepository<DataSensor, Long>,
JpaSpecificationExecutor<DataSensor> {
Page<DataSensor> (Pageable pageable); findAll
@Query("SELECT d FROM DataSensor d ORDER BY d.dateTime
DESC")
List<DataSensor> (Pageable pageable); findLatestRecords
}
Action history
@Repository
public interface extends ActionHistoryRepository
JpaRepository<ActionHistory, Long>,
JpaSpecificationExecutor<ActionHistory> {
@Override
Page<ActionHistory> (Pageable pageable); findAll
}
c) Service
12
Data sensor
@Service
public class DataSensorService {
@Autowired
private final DataSensorRepository dataSensorRepository;
(DataSensorRepository dataSensorRepository) { public DataSensorService
= dataSensorRepository; this.dataSensorRepository
}
Page<DataSensor> public getDataWithSearchAndSort (Double
temperature,Double humidity, Double brightness,LocalDateTime start,
LocalDateTime end, page, size, String sortBy, String direction) { int int
Specification<DataSensor> specification = Specification
.where hasTemperature(DataSensorSpecifications. (temperature))
.and(DataSensorSpecifications.hasBrightness(brightness))
.and(DataSensorSpecifications.hasHumidity(humidity))
.and(DataSensorSpecifications.hasDateTimeBetween(start, end));
Sort sort = Sort.by(Sort.Direction.fromString(direction), sortBy);
.findAll(specification, return this.dataSensorRepository
PageRequest.of(page, size, sort));
}
List<DataSensor> () { public getLatestData
Pageable pageable = PageRequest. ); of(0, 20
.findLatestRecords (pageable); return dataSensorRepository
}
(DataSensor dataSensor) { public void saveData
.save(dataSensor); this.dataSensorRepository
}
}
Action history
@Service
public class ActionHistoryService {
@Autowired
private final ActionHistoryRepository actionHistoryRepository;
(ActionHistoryRepository public ActionHistoryService
actionHistoryRepository) {
= actionHistoryRepository; this.actionHistoryRepository
}
Page<ActionHistory> public getHistoryWithSearch (String device,
LocalDateTime start, LocalDateTime end, page, int int size) {
Specification<ActionHistory> specification = Specification
.where hasDevice(ActionHistorySpecifications. (device))
.and(ActionHistorySpecifications.hasDateTimeBetween(start, end));
Sort sort = Sort.by(Sort.Direction.DESC, "dateTime");
return this.actionHistoryRepository.findAll(specification,
PageRequest.of(page, size, sort));
}
13
(ActionHistory actionHistory) { public void saveActionHistory
.save(actionHistory); this.actionHistoryRepository
}
}
d) Mqtt connect
Thiết l p k t n i t i mosquitto và kênh OutBound (dùng cho vi c g i gói tin) ế
@Configuration
public class MqttBeans {
@Bean
public DefaultMqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new
DefaultMqttPahoClientFactory();
MqttConnectOptions options = MqttConnectOptions(); new
options.setServerURIs(new String[]{"tcp://localhost:1883"});
options.setCleanSession( ); true
factory.setConnectionOptions(options);
factory; return
}
@Bean
public MessageChannel () { mqttOutboundChannel
DirectChannel(); return new
}
@Bean
@ServiceActivator(inputChannel = "mqttOutboundChannel")
MessageHandler () { public mqttOutbound
MqttPahoMessageHandler messageHandler = new
MqttPahoMessageHandler("serverOut", mqttClientFactory());
messageHandler.setAsync( ); true
messageHandler.setDefaultTopic("led/control");
messageHandler; return
}
}
To và g i gói tin qua kênh Outbound:
@Component
public class MqttGateway {
@Autowired
private final MessageChannel mqttOutboundChannel;
@Autowired
public MqttGateway(MessageChannel mqttOutboundChannel) {
= mqttOutboundChannel; this.mqttOutboundChannel
}
(String ledId, String action) { public void sendLedCommand
String topic = "led/control";
String message = ledId + + action; "/"
mqttOutboundChannel.send(MessageBuilder.withPayload(message).setHeader("mqt
t_topic", topic).build());
}
}
14
e) Controller: Gm 6 API chi ti t trong APIdoc ế ti đây.
3. Front end
Gm 4 trang:
- Dashboard: Hin th các ch s nhi sáng theo th i gian th c, t đ, đ m, đ
bi t/tu đ th hin các ch s, các công tc b t thi t bế đèn, qut, điu hoà
- Data Sensor: d li u các ch s trong database và môi trường được đo lưu tr
đư c cp nht liên tc m i 2 giây, tích h p các ch p xc năng s ếp, tìm kiếm ng đáp
các nhu c u c n thi t ế
- Action History: d li u l ch s ho ng c a các thi t b , tích h p các ch c t đ ế
năng s ếm đáp p xếp, tìm ki ng các nhu cu cn thiết
- Profile: thông tin v d b n thân. án cũng như v
Tương tác vi API:
Frontend s tương tác vi backend thông qua RESTful API. c yêu c u s c đư
gi t các component thông qua fetch API đ nhn d li u ho c g i l u khi n cho nh đi
thiết b. Quá trình này bao g m:
- Ly d li i dùng m ng d ng, h th ng s t ng g i yêu c u: Khi ngư đ u đ
ly d li u t các thi t b ế .
- Cp nh t d li u: c API l y d li u v data sensor và action history s đưc
gi m i 2 giây c p nh t d li u lên b ng. đ
- Đi ếu khin thi t b i dùng thao tác u khi: khi ngư đi n thiế t b, API đi u khi n
thiết b s đưc gi đ c p nh t tr ng thái.
Phần IV. Kết qu
1. Mô hình ph n c ng
Hình 7 Mô hình ph n c ng
15
2. Giao di n website
Trang Dashboard
Hình 8 Trang Dashboard
Trang Data sensor
Hình 9 Trang Data sensor
16
Trang Action history
Hình 10 Trang Action history
Trang Profile
Hình 11 Trang Profile
17
Phần V. Tài liu tham kho
1. Spring Boot
"Spring Boot Spring Framework." , . Spring click here
2. Bootstrap 5.2
"Introduction Bootstrap v5.2." , . Bootstrap Documentation click here
3. ESP8266 MQTT DHT22
"ESP8266 NodeMCU MQTT Publish Subscribe DHT22 Readings."
Microcontrollers Lab, click here.
4. Hưng d t Mosquitto MQTT Broker trên Windowsn cài đ
"How to Install Mosquitto MQTT Broker on Windows." , Cedalo Blog click here.
Phần VI. Ph lc
1. Source code
2. API doc

Preview text:

HC VIN CÔNG NGH BƯU CHÍNH VIỄN THÔNG
KHOA CÔNG NGH THÔNG TIN 1
--------------------------------------
BÁO CÁO BÀI TP IOT VÀ NG DNG
HỆ THỐNG IOT CHO NHÀ THÔNG MINH
IoT và ng dng N06
Ging viên: Nguyn Quc Uy
Sinh viên: An Quc Vit Mã sinh viên: B21DCCN787 Hà Nội 2024 MC LC
Phn I. Gii thiu .......................................................................................................... 3
1. Mc tiêu .................................................................................................................. 3
2. Phạm vi và đối tượng nghiên cu ......................................................................... 3
3. Tng quan h thng ............................................................................................... 3
Phần II. Cơ sở lý thuyết ................................................................................................ 4
1. Phn cng ............................................................................................................... 4
2. Công ngh s dng cho website ............................................................................ 5
Phn III. Phân tích và thiết kế h thng ..................................................................... 7
1. Phn cng ............................................................................................................... 7
2. Backend ................................................................................................................ 10
3. Front end .............................................................................................................. 14
Phn IV. Kết qu ......................................................................................................... 14
1. Mô hình phn cng .............................................................................................. 14
2. Giao din website ................................................................................................. 15
Phn V. Tài liu tham kho ........................................................................................ 17
Phn VI. Ph lc .......................................................................................................... 17
MC LC HÌNH NH Hình 1. T ng quan h ổ
ệ thống ........................................................................................................................... 3
Hình 2 Mô hình RESTful API ....................................................................................................................... 6
Hình 3 Mô hình MQTT ................................................................................................................................... 6
Hình 4 Kiến trúc của Spring boot ................................................................................................................. 7
Hình 5 Sơ đồ chân ESP8266 .......................................................................................................................... 7
Hình 6 Sơ đồ tổng quát phần cứng ............................................................................................................... 8
Hình 7 Mô hình phần cứng .......................................................................................................................... 14
Hình 8 Trang Dashboard .............................................................................................................................. 15
Hình 9 Trang Data sensor ............................................................................................................................ 15
Hình 10 Trang Action history ..................................................................................................................... 16
Hình 11 Trang Profile ................................................................................................................................... 16 2
Phần I. Gii thiu 1. Mc tiêu
Mục tiêu của dự án là thiết kế một website cho phép theo dõi trong thời gian thực
các thông số môi trường trong nhà gồm nhiệt độ, độ ẩm, ánh sáng và cho phép điều
khiển từ xa các thiết bị trong nhà gồm đèn, quạt, điều hoà.
2. Phạm vi và đối tượng nghiên cu
Nghiên cứu về các công nghệ, thiết bị và phần mềm được sử dụng để xây dựng hệ
thống. Điều này có thể bao gồm cả cơ sở hạ tầng mạng, giao thức kết nối, các thiết bị
IoT (Internet of Things) và các ứng dụng thông minh.
• Tính năng và tiện ích: tập trung vào các tính năng mà hệ thống cung cấp như điều
khiển từ xa, giám sát từ xa
• Đối tượng sử dụng: gia đình, doanh nghiệp hoặc các tổ chức, cá nhân có nhu cầu sử dụng hệ thống
3. Tng quan h thng
Hình 1. Tng quan h thng 3
Phần II. Cơ sở lý thuyết
1. Phn cng Tên linh kin Hình nh
Thông s k thut Nguồn điện: 3,3V Module thu phát Dòng điện: 20mA Wifi ESP8266 Đầu ra: kỹ thuật số NodeMCU Số chân I/O: 10 chân Tần số xung nhịp: 80MHz
Điện áp hoạt động: 3,3 – 5V
Dòng hoạt động: thấp hơn 2.5
mA khi đo lường, tiết kiệm năng Module cảm lượng biến nhiệt độ, độ
Dải đo nhiệt độ: 0°C đến 50°C, ẩm DHT11 với sai số ±2°C.
Dải đo độ ẩm: 20% đến 90% RH, với sai số ±5% RH.
Tần suất cập nhật: 2 giây (0,5Hz)
Điện áp hoạt động: 3,3 – 5V Cảm biến ánh
Đầu ra: đầu ra analog hoặc đầu ra sáng LDR số IC so sánh sử dụng LM339 4 Breadboard LED Dây cắm
2. Công ngh s dng cho website a) RESTful API
RESTful API là một tiêu chuẩn dùng trong việc thiết kế API cho các ứng dụng
web (thiết kế Web services) để tiện cho việc quản lý các resource. Nó chú trọng vào tài
nguyên hệ thống (tệp văn bản, ảnh, âm thanh, video, hoặc dữ liệu động...), bao gồm các
trạng thái tài nguyên được định dạng và được truyền tải qua HTTP.
Nguyên lý hoạt động: REST hoạt động chủ yếu dựa vào giao thức HTTP. Các
hoạt động cơ bản nêu trên sẽ sử dụng những phương thức HTTP riêng. 5
Hình 2 hình RESTful API b) MQTT – mosquitto
MQTT (Message Queuing Telemetry Transport) là giao thức truyền thông nhẹ,
tối ưu cho các thiết bị IoT, cho phép truyền tải dữ liệu nhanh chóng và hiệu quả qua
mạng không ổn định hoặc băng thông thấp. Giao thức này hoạt động theo mô hình
"publish-subscribe", trong đó các thiết bị có thể gửi và nhận dữ liệu mà không cần kết nối trực tiếp. Hình 3 Mô hình MQTT
Mosquitto là một máy chủ MQTT mã nguồn mở, cung cấp nền tảng ổn định cho
việc giao tiếp giữa các thiết bị IoT. c) Spring boot
Spring Boot là một framework giúp tạo ứng dụng Java nhanh chóng, đơn giản
hóa quá trình phát triển và cấu hình nhờ vào các tính năng tự động cấu hình mạnh mẽ,
giảm thiểu boilerplate code, và tích hợp tốt với các hệ sinh thái của Spring. 6
Hình 4 Kiến trúc ca Spring boot
d) MySQL: là hệ quản trị cơ sở dữ liệu mã nguồn mở phổ biến, dùng để lưu trữ
và quản lý dữ liệu. Với tính năng mạnh mẽ, hiệu suất cao và dễ sử dụng, MySQL là lựa
chọn hàng đầu trong nhiều ứng dụng web.
e) HTML, CSS và JavaScript là bộ ba ngôn ngữ cốt lõi của giao diện web. HTML
xây dựng cấu trúc trang, CSS tạo kiểu dáng và màu sắc, trong khi JavaScript thêm tính
năng tương tác, giúp trang web trở nên sinh động và thu hút người dùng.
Phần III. Phân tích và thiết kế h thng
1. Phn cng a) Sơ đồ chân ESP8266
Hình 5 Sơ đồ chân ESP8266 7
b) Sơ đồ tổng quát phần cứng:
Hình 6 Sơ đồ tng quát phn cng c) Kết nối đến wifi void connectToWiFi() { Serial. ( print ); "Kết nối đến WiFi" WiFi. ( begin , ssid ); password while (WiFi. () status WL_CONNECTED) { != delay(500); Serial.print( ); "." } Serial.println( ); " Đã kết nối!" }
d) Kết nối đến MQTT broker void reconnect() { while (!mqttClient. ()) { connected Serial.print( );
"Đang kết nối đến MQTT..." ( if mqttClient. ( connect )) { "ESP8266Client" Serial. ( println );
"Đã kết nối đến MQTT!" mqttClient.subscribe( ); "led/control" } { else Serial. ( print );
"Lỗi kết nối, mã lỗi: " Serial. ( print mqttClient.state()); 8 delay( ); 2000 } } }
e) Gửi dữ liệu cảm biến đến MQTT broker float h = dht .readHumidity();
float t = dht.readTemperature(); int lightLevel = (A0); analogRead ( if isnan(h) || isnan(t)) { Serial. ( println );
"Không thể đọc từ cảm biến DHT!" ; return } String mqttPayload = String( )
"Temp: " + t + ", Hum: " + h + ", Light: " + ; lightLevel mqttClient. ( publish ,
"sensor/data" mqttPayload.c_str());
f) Gửi dữ liệu cảm biến đến Backend
if (WiFi.status() == WL_CONNECTED) { String url = ;
"http://192.168.1.12:8080/api/iot/data-sensor" WiFiClient ; wifiClient HTTPClient ; http http. ( begin , url); wifiClient http. ( addHeader , "Content-Type" ); "application/json" String httpPayload = "{ temperature \" \" :" + (t) String + ", humidity \" :" \" + String + (h) ", brightness \" :" \" + String(lightLevel) + "}"; int httpCode = http. (httpPayload); POST ( if httpCode HTTP_CODE_OK) { == Serial. ( println ); "Data sent successfully" } { else Serial. ( println ); httpCode 9 Serial. ( println ); "Error sending data" Serial. ( println http.getString()); } http. (); end
g) Nhận tín hiệu điều khiển thiết bị void mqttCallback char* ( topic, * byte payload unsigned , int length) { String ; message ( for int i = ; 0 i < ; length i ) { ++ message ( += char) [ payload ]; i } ( if strcmp( , topic "led/control") == 0) { ( if message == ) { "led1/on" digitalWrite( , HIGH); LED1 } else ( if message == ) { "led1/off" digitalWrite( , LOW); LED1 } else ( if message == "led2/on") { digitalWrite( , HIGH); LED2 } else ( if message == ) { "led2/off" digitalWrite( , LOW); LED2 } else ( if message == "led3/on") { digitalWrite( , HIGH); LED3 } else ( if message == ) { "led3/off" digitalWrite( , LOW); LED3 } } } 2. Backend a) Model • Data sensor @Entity @Table(name = "datasensor") public class DataSensor { @Id
@GeneratedValue(strategy = GenerationType. ) IDENTITY private long id; 10 private double temperature; private double ; humidity private double ; brightness LocalDateTime private ; dateTime public () { DataSensor
this.dateTime = LocalDateTime.now(); } • Action history @Entity
@Table(name = "actionhistory") public class ActionHistory { @Id
@GeneratedValue(strategy = GenerationType. ) IDENTITY private long id; String private ; device String private ; action LocalDateTime private ; dateTime public ActionHistory() {
this.dateTime = LocalDateTime.now(); } b) Repository • Data sensor @Repository
public interface DataSensorRepository extends JpaRepository, JpaSpecificationExecutor {
Page findAll(Pageable pageable);
@Query("SELECT d FROM DataSensor d ORDER BY d.dateTime DESC")
List findLatestRecords(Pageable pageable); } • Action history @Repository public interface extends ActionHistoryRepository JpaRepository, JpaSpecificationExecutor { @Override
Page findAll(Pageable pageable); } c) Service 11 • Data sensor @Service
public class DataSensorService { @Autowired
private final DataSensorRepository dataSensorRepository;
public DataSensorService(DataSensorRepository dataSensorRepository) {
this.dataSensorRepository = dataSensorRepository; }
public Page getDataWithSearchAndSort (Double
temperature,Double humidity, Double brightness,LocalDateTime start,
LocalDateTime end,int page, int size, String sortBy, String direction) {
Specification specification = Specification
.where(DataSensorSpecifications.hasTemperature(temperature))
.and(DataSensorSpecifications.hasBrightness(brightness))
.and(DataSensorSpecifications.hasHumidity(humidity))
.and(DataSensorSpecifications.hasDateTimeBetween(start, end));
Sort sort = Sort.by(Sort.Direction.fromString(direction), sortBy);
return this.dataSensorRepository.findAll(specification,
PageRequest.of(page, size, sort)); }
public List getLatestData() {
Pageable pageable = PageRequest.of(0, 20);
return dataSensorRepository.findLatestRecords (pageable); }
public void saveData (DataSensor dataSensor) {
this.dataSensorRepository.save(dataSensor); } } • Action history @Service
public class ActionHistoryService { @Autowired
private final ActionHistoryRepository actionHistoryRepository;
public ActionHistoryService(ActionHistoryRepository actionHistoryRepository) {
this.actionHistoryRepository = actionHistoryRepository; }
public Page getHistoryWithSearch (String device,
LocalDateTime start, LocalDateTime end, int page, int size) {
Specification specification = Specification
.where(ActionHistorySpecifications.hasDevice(device))
.and(ActionHistorySpecifications.hasDateTimeBetween(start, end));
Sort sort = Sort.by(Sort.Direction.DESC, "dateTime");
return this.actionHistoryRepository.findAll(specification,
PageRequest.of(page, size, sort)); } 12
public void saveActionHistory(ActionHistory actionHistory) {
this.actionHistoryRepository.save(actionHistory); } } d) Mqtt connect
• Thiết lập kết nối tới mosquitto và kênh OutBound (dùng cho việc gửi gói tin) @Configuration public class MqttBeans { @Bean
public DefaultMqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new
DefaultMqttPahoClientFactory();
MqttConnectOptions options = new MqttConnectOptions();
options.setServerURIs(new String[]{"tcp://localhost:1883"});
options.setCleanSession(true);
factory.setConnectionOptions(options); return factory; } @Bean
public MessageChannel mqttOutboundChannel() { return new DirectChannel(); } @Bean
@ServiceActivator(inputChannel = "mqttOutboundChannel")
public MessageHandler mqttOutbound() {
MqttPahoMessageHandler messageHandler = new
MqttPahoMessageHandler("serverOut", mqttClientFactory());
messageHandler.setAsync(true);
messageHandler.setDefaultTopic("led/control"); return messageHandler; } }
• Tạo và gửi gói tin qua kênh Outbound: @Component public class MqttGateway { @Autowired
private final MessageChannel mqttOutboundChannel; @Autowired
public MqttGateway(MessageChannel mqttOutboundChannel) {
this.mqttOutboundChannel = mqttOutboundChannel; }
public void sendLedCommand(String ledId, String action) {
String topic = "led/control";
String message = ledId + "/" + action;
mqttOutboundChannel.send(MessageBuilder.withPayload(message).setHeader("mqt t_topic", topic).build()); } } 13
e) Controller: Gồm 6 API chi tiết trong APIdoc tại đây. 3. Front end • Gồm 4 trang:
- Dashboard: Hiển thị các chỉ số nhiệt độ, độ ẩm, độ sáng theo thời gian thực,
biểu đổ thể hiện các chỉ số, các công tắc bật/tắt thiết bị đèn, quạt, điều hoà
- Data Sensor: dữ liệu các chỉ số môi trường được đo lưu trữ trong database và
được cập nhật liên tục mỗi 2 giây, tích hợp các chức năng sắp xếp, tìm kiếm đáp ứng các nhu cầu cần thiết
- Action History: dữ liệu lịch sử hoạt động của các thiết bị, tích hợp các chức
năng sắp xếp, tìm kiếm đáp ứng các nhu cầu cần thiết
- Profile: thông tin về dự án cũng như về bản thân. • Tương tác với API:
Frontend sẽ tương tác với backend thông qua RESTful API. Các yêu cầu sẽ được
gửi từ các component thông qua fetch API để nhận dữ liệu hoặc gửi lệnh điều khiển cho
thiết bị. Quá trình này bao gồm:
- Lấy dữ liệu: Khi người dùng mở ứng dụng, hệ thống sẽ tự động gửi yêu cầu để
lấy dữ liệu từ các thiết bị.
- Cập nhật dữ liệu: Các API lấy dữ liệu về data sensor và action history sẽ được
gọi mỗi 2 giây để cập nhật dữ liệu lên bảng.
- Điều khiển thiết bị: khi người dùng thao tác điều khiển thiết bị, API điều khiển
thiết bị sẽ được gọi để cập nhật trạng thái.
Phần IV. Kết qu
1. Mô hình phn cng
Hình 7 Mô hình phn cng 14 2. Giao din website • Trang Dashboard Hình 8 Trang Dashboard • Trang Data sensor Hình 9 Trang Data sensor 15 • Trang Action history Hình 10 Trang Action history • Trang Profile Hình 11 Trang Profile 16
Phần V. Tài liu tham kho 1. Spring Boot
"Spring Boot – Spring Framework." Spring, click here. 2. Bootstrap 5.2
"Introduction – Bootstrap v5.2." Bootstrap Documentation, click here. 3. ESP8266 MQTT DHT22
"ESP8266 NodeMCU MQTT Publish Subscribe DHT22 Readings."
Microcontrollers Lab, click here.
4. Hướng dẫn cài đặt Mosquitto MQTT Broker trên Windows
"How to Install Mosquitto MQTT Broker on Windows." Cedalo Blog, click here.
Phần VI. Ph lc 1. Source code 2. API doc 17