
















Preview text:
HỌC VIỆN 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 TẬP IOT VÀ ỨNG DỤNG
HỆ THỐNG 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 MỤC LỤC
Phần I. Giới thiệu .......................................................................................................... 3
1. Mục tiêu .................................................................................................................. 3
2. Phạm vi và đối tượng nghiên cứu ......................................................................... 3
3. Tổng quan hệ thống ............................................................................................... 3
Phần II. Cơ sở lý thuyết ................................................................................................ 4
1. Phần cứng ............................................................................................................... 4
2. Công nghệ sử dụng cho website ............................................................................ 5
Phần III. Phân tích và thiết kế hệ thống ..................................................................... 7
1. Phần cứng ............................................................................................................... 7
2. Backend ................................................................................................................ 10
3. Front end .............................................................................................................. 14
Phần IV. Kết quả ......................................................................................................... 14
1. Mô hình phần cứng .............................................................................................. 14
2. Giao diện website ................................................................................................. 15
Phần V. Tài liệu tham khảo ........................................................................................ 17
Phần VI. Phụ lục .......................................................................................................... 17
MỤC LỤC 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. Giới thiệu 1. Mục 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 cứu
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. Tổng quan hệ thống
Hình 1. Tổng quan hệ thống 3
Phần II. Cơ sở lý thuyết
1. Phần cứng Tên linh kiện Hình ảnh
Thông số kỹ thuật 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ử 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ế 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 Mô 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 của 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ệ thống
1. Phần cứng 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ơ đồ 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. ( 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 phần cứng
Hình 7 Mô hình phần cứng 14 2. Giao diện 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 liệu tham khảo 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ụ lục 1. Source code 2. API doc 17