1. Trang chủ
  2. » Luận Văn - Báo Cáo

Nghiên cứu giao thức MQTT ứng dụng cho giải pháp tưới nước thông minh

110 7 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 110
Dung lượng 7,67 MB

Nội dung

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN - Nguyễn Hữu Bắc NGHIÊN CỨU GIAO THỨC MQTT ỨNG DỤNG CHO GIẢI PHÁP TƯỚI NƯỚC THÔNG MINH LUẬN VĂN THẠC SĨ KHOA HỌC Hà Nội – 2021 ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN - Nguyễn Hữu Bắc NGHIÊN CỨU GIAO THỨC MQTT ỨNG DỤNG CHO GIẢI PHÁP TƯỚI NƯỚC THƠNG MINH Chun ngành: Vật lý vơ tún điện tư Mã số: 8440130.03 LUẬN VĂN THẠC SĨ KHOA HỌC NGƯỜI HƯỚNG DẪN KHOA HỌC TS LÊ QUANG THẢO LỜI CAM ĐOAN Tôi xin cam đoan nội dung luận văn: “Nghiên cứu giao thức MQTT ứng dụng cho giải pháp tưới nước thông minh” Là thực hiện hướng dẫn TS Lê Quang Thảo Các số liệu, kết nêu luận văn trung thực chưa công bố cơng trình khác Tác giả Ngũn Hữu Bắc LỜI CẢM ƠN Để hồn thiện luận văn, tơi xin bày tỏ lòng biết ơn sâu sắc đến thầy hướng dẫn tôi, TS Lê Quang Thảo Trong suốt trình thực hiện luận văn, thầy tận tình hướng dẫn, giúp đỡ để tơi hồn thành luận văn Tiếp đến, tơi xin chân thành cảm ơn thầy cô giáo Bộ môn Vật lý Vô tuyến, Khoa Vật lý, Trường Đại học Khoa học Tự nhiên - Đại học Quốc gia Hà Nội truyền đạt cho kiến thức kinh nghiệm quý báu trình học tập nghiên cứu Tơi bày tỏ lịng biết ơn đến gia đình Bố mẹ, anh chị em bạn bè, bạn khóa cao học 2018-2020, người ủng hộ, giúp đỡ động viên thời gian làm luận văn Hà Nội, tháng 11 năm 2020 Nguyễn Hữu Bắc MỤC LỤC MỞ ĐẦU CHƯƠNG TỔNG QUAN VỀ MẠNG CẢM BIẾN KHÔNG DÂY 1.1 Khái niệm 1.2 Các thành phần node cảm biến 1.3 Kiến trúc giao thức mạng WSN 1.3.1 Lớp ứng dụng 1.3.2 Lớp liên kết liệu 1.3.3 Lớp truyền tải 1.3.4 Lớp mạng 1.3.5 Lớp vật lý 1.3.6 Phần quản lý công suất, quản lý di động, quản lý nhiệm vụ 1.4 Các đặc điểm mạng cảm biến khơng dây 1.4.1 Kích thước vật lý, lượng tiêu thụ 1.4.2 Khả chịu lỗi, khả thích nghi 10 1.4.3 Hoạt động đồng thời với độ tập trung cao, tin cậy .10 1.4.4 Đa dạng thiết kế, chi phí sản xuất thấp 11 1.5 IoT giao thức thường sư dụng IoT 11 1.5.1 Giao thức CoAP 12 1.5.2 Giao thức XMPP 13 1.5.3 Giao thức MQTT 13 1.6 Ứng dụng mạng cảm biến không dây 14 1.6.1 Mạng cảm biến không dây y tế giám sát sức khoẻ 15 1.6.2 Mạng cảm biến không dây quân 15 1.6.3 Mạng cảm biến không dây ứng dụng tự động hố gia đình 16 1.6.4 Mạng cảm biến không dây ứng dụng công nghiệp .17 1.6.5 Mạng cảm biến không dây ứng dụng vào môi trường 17 1.6.6 Mạng cảm biến không dây ứng dụng nông nghiệp .19 CHƯƠNG GIAO THỨC MQTT 21 2.1 Khái niệm MQTT 21 2.2 Vị trí MQTT mơ hình IoT 22 2.3 Lịch sư hình thành 22 2.4 Các thành phần lõi kiến trúc MQTT 23 2.5 Mơ hình Pub/Sub chế hoạt động MQTT theo mơ hình Pub/Sub 23 2.5.1 Mơ hình Pub/Sub 23 2.5.2 Cơ chế hoạt động MQTT theo mơ hình Pub/Sub 25 2.6 Các gói tin quan trọng giao thức MQTT 27 2.6.1 Định dạng thông điệp 27 2.6.2 Gói CONNECT 30 2.6.3 Gói CONNACK 31 2.6.4 Gói PUBLISH 31 2.6.5 Gói SUBSCRIBE 32 2.6.6 Gói PINGREQ 33 2.6.7 Gói PINGRESP 33 2.6.8 Gói DISCONNECT 33 2.7 Quy trình truyền nhận liệu MQTT 33 2.7.1 Kết nối đăng ký 33 2.7.2 Xuất thông điệp 35 2.8 Ưu điểm, tính bật giao thức MQTT 37 2.9 Một số giao thức cạnh tranh với giao thức MQTT 38 2.10 Một số ứng dụng MQTT triển khai 38 CHƯƠNG MƠ HÌNH TƯỚI NƯỚC THÔNG MINH SỬ DỤNG CẢM BIẾN KHÔNG DÂY SỬ DỤNG GIAO THỨC MQTT 41 3.1 Bản thiết kế sơ đồ mạng cảm biến 41 3.2 Kiến trúc node cảm biến 42 3.3 Phần cứng node cảm biến 43 3.3.1 Cảm biến ánh sáng CdS 43 3.3.2 Độ ẩm đất cảm biến độ ẩm MEC10 44 3.3.2.1 Độ ẩm đất 44 3.3.2.2 Giới thiệu số cảm biến độ ẩm đất 47 3.3.2.3 Cảm biến độ ẩm đất MEC10 50 3.3.3 Chuẩn giao tiếp dây cảm biến nhiệt độ - độ ẩm DHT11 .51 3.3.3.1 Chuẩn giao tiếp dây 51 3.3.3.2 Cảm biến nhiệt độ - độ ẩm DHT11 52 3.3.4 Bộ truyền sóng vơ tuyến nRF24L01 55 3.3.5 Bộ xư lý trung tâm sư dụng Atmega8 56 3.3.6 Sơ đồ mạch điện khối thu thập liệu 57 3.3.7 Thuật toán hoạt động node thu thập liệu 57 3.4 Kiến trúc node trung tâm 59 3.5 Phần cứng node trung tâm 59 3.5.1 Bộ xư lý trung tâm Atmega128 59 3.5.2 Sơ đồ mạch điện khối xư lý trung tâm 60 3.5.3 Thuật toán hoạt động trạm trung tâm 61 3.6 Một số hình ảnh triển khai thực tế mạng cảm biến 62 CHƯƠNG KẾT QUẢ THỰC NGHIỆM VÀ THẢO LUẬN 64 4.1 Khảo sát thay đổi môi trường node center theo ngày 64 4.1.1 Dữ liệu ánh sáng theo ngày 65 4.1.2 Dữ liệu nhiệt độ theo ngày 67 4.1.3 Dữ liệu độ ẩm môi trường theo ngày 69 4.1.4 Dữ liệu độ ẩm đất theo ngày 71 4.2 Khảo sát thay đổi môi trường node theo ngày tuần .73 4.2.1 Dữ liệu ánh sáng theo ngày tuần 73 4.2.2 Dữ liệu nhiệt độ theo ngày tuần 74 4.2.3 Dữ liệu độ ẩm môi trường theo ngày tuần 75 4.2.4 Dữ liệu độ ẩm đất theo ngày tuần 76 KẾT LUẬN CHUNG 78 TÀI LIỆU THAM KHẢO 80 PHỤ LỤC 82 DANH MỤC CÁC KÍ HIỆU VÀ CHỮ VIẾT TẮT Từ viết tắt Cụm từ Nghĩa tiếng Việt 6LowPAN IPv6 over Low-Power Wireless Personal Area Networks ACK acknowledgement ADC AD HOC AI ALU ARQ Analog Digital Convert Wireless ad-hoc network Artificial Intelligence Arithmetic Logic Unit Automatic Repeat-reQuest Automatic Voltage Regulator Complex Instruction Set Computer AVR CISC CMOS CoAP CRC CSMA/CA Complementary MetalOxide-Semiconductor Constrained Applications Protocol Cyclic Redundancy Check Carier Sense Multiple Access/ Collision Avoidance DDS Data Distribution Service EEPROM Electrically Programmable Memory FEC Forward Error Correction Tín hiệu sư dụng truyền thơng số để đảm bảo liệu nhận Bộ chuyển đổi tương tự - số Mạng tùy biến khơng dây Trí tuệ nhân tạo Đơn vị logic số học Yêu cầu tự động lặp lại Điều chỉnh điện áp tự động thuật ngữ loại công nghệ dùng để chế tạo mạch tích hợp Giao thức CoAP Giao thức DDS Erasable Read-Only Chuyển tiếp trình sưa lỗi Generic Sensor Network Architecture for Wireless Automation General Packet Radio Service Identification Institute of Electrical and Electronics Engineers Internet of Things Internet Protocol Industrial, Scientific and Medical Liquid Crystal Display Light-dependent resistor low-rate wireless personal area networks Kiến trúc mạng cảm biến chung cho Tự động hóa Khơng dây Dịch vụ vơ tuyến gói tổng hợp Địa mạng Viện kỹ sư điện, điện tư quốc tế Internet vạn vật Giao thức Internet M2M Machine to machine Máy để truyền thông máy MAC Media Access Control Điều khiển truy cập đường truyền MCU Microcontroller unit Micro Electro Mechanical Hệ vi điện tư Systems Message Queue Telemetry Giao thức MQTT Transport Negative acknowledgement Organization for the Tổ chức phát triển tiêu Advancement of Structured chuẩn thơng tin có cấu trúc Information Standards Open Systems Mơ hình tham chiếu hệ Interconnection thống mở Định tuyến theo chất lượng Quanlity of Service dịch vụ GENSEN GPRS ID IEEE IoT IP ISM LCD LDR LR-WPANs MEMS MQTT NACK OASIS OSI QoS Màn hình tinh thể lỏng Điện trở quang RF RISC RTOS Sensor SMP SPI SQDDP SRAM SurfNet Radio frequency Reduced Instruction Set Computer Real-time Operating System sensor Sensor Management Protocol Serial Peripheral Interface Sensor Query and Data Dissemination Static random-access memory Su TADAP Task Assignment and Data Advertisement TCP Transmission Protocol UART Universal Asynchronous Receiver – Transmitter UDP UWASA XMPP WirelessHART WSN Control User Datagram Protocol Utilization of Extensible Messaging and Presence Protocol Wireless sensor networking technology based on the Highway Addressable Remote Transducer Protocol Wireless Sensor Network Bộ thu phát sóng vơ tún Cảm biến giao thức quản lí mạng cảm biến giao thức phân phối liệu truy vấn cảm biến Bộ nhớ truy cập ngẫu nhiên tĩnh giao thức quảng bá liệu định nhiệm vụ cho sensor giao thức điều khiển truyền tải internet Thường làmột mạch tích hợp sư dụng việc truyền dẫn liệu nối tiếp máy tính thiết bị ngoại vi giao thức gói người dùng Giao thức XMPP Mạng cảm biến không dây PHỤ LỤC 1-Thư viện MQTT static inline uint16_t htons(uint16_t x) { #if BYTE_ORDER == ORDER_LITTLE_ENDIAN return ((x & 0xff) > 8); #else return x; #endif } #define umqtt_insert_messageid(conn, ptr) \ { \ ptr[0] = conn->message_id >> 8; ptr[1] = conn->message_id & 0xff; conn->message_id++; \ \ \ } while (0) #define umqtt_build_header(type, dup, qos, retain) \ (((type) 0) digit |= 0x80; data[i] = digit; i+ +; } while (len); return i; /* Return the amount of bytes used */ } void umqtt_circ_init(struct umqtt_circ_buffer *buff) { buff->pointer = buff->start; buff->datalen = 0; } int umqtt_circ_push(struct uint8_t *data, int len) umqtt_circ_buffer *buff, { uint8_t *bend = buff->start + buff->length - 1; uint8_t *dend buff->datalen) = (buff->pointer - buff->start + % buff->length + buff->start; /* This points to new byte */ for (; len > 0; len ) { if (dend > bend) dend = buff->start; if >pointer) (buff->datalen != && dend == break; *dend = *data; dend++; data+ +; buff->datalen++; } return len; /* Return amount of bytes left */ } buff- int umqtt_circ_peek(struct uint8_t *data, int len) umqtt_circ_buffer *buff, { uint8_t *ptr = buff->pointer; uint8_t *bend = buff->start + buff->length - 1; int i; for (i = 0; i < len && i < buff->datalen; i++) { data[i] = ptr[i]; if (ptr > bend) ptr = buff->start; } return i; /* Return the amount of bytes actually peeked */ } int umqtt_circ_pop(struct uint8_t *data, int len) umqtt_circ_buffer *buff, { uint8_t *bend = buff->start + buff->length - 1; int i; for (i = 0; i < len && buff->datalen > 0; i++) { data[i] = *buff->pointer; buff->pointer++; buff->datalen ; if (buff->pointer > bend) buff->pointer = buff->start; } return i; /* Return the amount of bytes actually popped */ } void umqtt_connect(struct umqtt_connection *conn) { int cidlen = strlen(conn->clientid); uint8_t fixed; uint8_t remlen[4]; uint8_t variable[12]; uint16_t paylen; umqtt_circ_init(&conn->rxbuff); umqtt_circ_init(&conn->txbuff); conn->state = UMQTT_STATE_INIT; conn->nack_ping = 0; conn->nack_publish = 0; conn->nack_subscribe = 0; conn->message_id = 1; fixed = umqtt_build_header(UMQTT_CONNECT, 0, 0, 0); variable[0] = 0; /* UTF Protocol name */ variable[1] = 6; variable[2] = 'M'; variable[3] = 'Q'; variable[4] = 'I'; variable[5] = 's'; variable[6] = 'd'; variable[7] = 'p'; variable[8] = 3; /* Protocol version */ variable[9] = 0b00000010; /* Clean session flag */ variable[10] = conn->kalive >> 8; /* Keep Alive timer */ variable[11] = conn->kalive & 0xff; paylen = htons(cidlen); umqtt_circ_push(&conn->txbuff, &fixed, 1); umqtt_circ_push(&conn->txbuff, remlen, umqtt_encode_length(sizeof(variable) sizeof(paylen) + cidlen, remlen)); umqtt_circ_push(&conn->txbuff, sizeof(variable)); + variable, umqtt_circ_push(&conn->txbuff, (uint8_t *) &paylen, sizeof(paylen)); umqtt_circ_push(&conn->txbuff, cidlen); conn->clientid, conn->state = UMQTT_STATE_CONNECTING; if (conn->new_packet_callback) conn->new_packet_callback(conn); } void umqtt_subscribe(struct umqtt_connection *conn, char *chủ đề) { uint16_t chủ đềlen = strlen(chủ đề); uint8_t fixed; uint8_t remlen[4]; uint8_t messageid[2]; uint16_t paylen; uint8_t qos = 0; fixed = umqtt_build_header(UMQTT_SUBSCRIBE, 0, 1, 0); umqtt_insert_messageid(conn, messageid); paylen = htons(chủ đềlen); umqtt_circ_push(&conn->txbuff, &fixed, 1); umqtt_circ_push(&conn->txbuff, remlen, umqtt_encode_length( sizeof(messageid) + sizeof(paylen) + chủ đềlen + sizeof(qos), remlen)); umqtt_circ_push(&conn->txbuff, sizeof(messageid)); messageid, umqtt_circ_push(&conn->txbuff, (uint8_t *) &paylen, sizeof(paylen)); umqtt_circ_push(&conn->txbuff, chủ đề, chủ đềlen); umqtt_circ_push(&conn->txbuff, &qos, sizeof(qos)); conn->nack_subscribe++; if (conn->new_packet_callback) conn->new_packet_callback(conn); } void umqtt_publish(struct umqtt_connection *conn, *chủ đề, char uint8_t *data, int datalen) { int toplen = strlen(chủ đề); uint8_t fixed; uint8_t remlen[4]; uint8_t len[2]; fixed = umqtt_build_header(UMQTT_PUBLISH, 0, 0, 0); umqtt_circ_push(&conn->txbuff, &fixed, 1); umqtt_circ_push(&conn->txbuff, remlen, umqtt_encode_length(2 + toplen + datalen, remlen)); len[0] = toplen >> 8; len[1] = toplen & 0xff; umqtt_circ_push(&conn->txbuff, len, sizeof(len)); umqtt_circ_push(&conn->txbuff, (uint8_t *) chủ đề, toplen); umqtt_circ_push(&conn->txbuff, data, datalen); if (conn->new_packet_callback) conn->new_packet_callback(conn); } void umqtt_ping(struct umqtt_connection *conn) { uint8_t packet[] = umqtt_build_header(UMQTT_PINGREQ, 0, 0, 0), }; umqtt_circ_push(&conn->txbuff, sizeof(packet)); { packet, conn->nack_ping++; if (conn->new_packet_callback) conn->new_packet_callback(conn); } static void umqtt_handle_publish(struct umqtt_connection *conn, uint8_t *data, int len) { uint16_t toplen = (data[0] message_callback(conn, sizeof(payload)); } static void umqtt_packet_arrived(struct umqtt_connection *conn, uint8_t header, int len) { uint8_t data[len]; umqtt_circ_pop(&conn->rxbuff, data, len); switch (umqtt_header_type(header)) { case UMQTT_CONNACK: if (data[1] == 0x00) { conn->state = UMQTT_STATE_CONNECTED; if (conn->connected_callback) conn->connected_callback(conn); } else { conn->state = UMQTT_STATE_FAILED; } break; case UMQTT_SUBACK: conn->nack_subscribe ; break; case UMQTT_PINGRESP: conn->nack_ping ; break; case UMQTT_PUBLISH: umqtt_handle_publish(conn, data, len); break; } } void umqtt_process(struct umqtt_connection *conn) { uint8_t buf[5]; unsigned int i = 2; while (conn->rxbuff.datalen >= 2) { /* We have the fixed header */ umqtt_circ_pop(&conn->rxbuff, buf, 2); for (i sizeof(buf); i++) = 2; buf[i - 1] & 0x80 umqtt_circ_pop(&conn->rxbuff, 1); umqtt_packet_arrived(conn, buf[0], && i < &buf[i], umqtt_decode_length(&buf[1])); } } 2-Mã nguồn chương trình thu thập số liệu node cảm biến #include #include #include #include "mqtt.c" #include "dht.c" #define CE PORTC.3 #define CSN PORTD.4 #define SCK PORTD.2 #define MOSI PORTB.6 #define MISO PIND.1 #define IRQ PIND.7 unsigned char buff[20]; unsigned char dht_nhiet_do,dht_do_am; int light.sm; void main(void) { Init_system(); Common_Config(); umqtt_connect(conn); delay_ms(1000); while (1) { if(DHT_GetTemHumi(&dht_nhiet_do,&dht_do_am)) { sprintf(buff, "%u", (unsigned int)dht_do_am); sprintf(buff, "%u", (unsigned int)dht_nhiet_do); } light=(int)read_adc(6)/4; sm= (int)read_adc(7)*2048/5; umqtt_publish(conn,"tram1/thongso/nhietdo",dht_nhiet_do,1); umqtt_publish(conn,"tram1/thongso/doam",dht_do_am,1); umqtt_publish(conn,"tram1/thongso/light",light,1); umqtt_publish(conn,"tram1/thongso/sm",sm,1); delay_ms(200); } } Mã nguồn chương trình Node trung tâm #include #include #include #include #include #include #include #include #define ON 0; #define OFF 1; typedef struct { int temp; int humi; int light; int sm; } station_info; station_info station_receive; char buf[20],order[6] int max_sm_limit = 80, min_sm_limit=60, node; void main(void) { init_system(); Address1 = 0xA1; Address2 = 0xA2; Address3 = 0xA3; Address4 = 0xA4; mqtt_init(); umqtt_connect(conn); Common_Config(); umqtt_subscribe(conn,"/1/thongso"); umqtt_subscribe(conn,"/2/thongso"); umqtt_subscribe(conn,"/3/thongso"); while (1) { nethandler_umqtt_appcall() while( umqtt_packet_arrived() = true) { station_receive=umqtt_process(); uint16_t toplen = (data[0] message_callback(conn, chủ đề, station_receive, sizeof(station_receive)); int temp = station_receive.temp; int humi = station_receive.humi; int light = station_receive.light; int sm = station_receive.sm; umqtt_circ_push(&conn->txbuff, &fixed, 1); for(i=0;inew_packet_callback; umqtt_insert_messageid(conn, station_receive); } } order=chủ đề.Split('/'); node= int(order[1]); if(smmax_sm_limit) { relay[node] = OFF; } } } ... TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN - Nguyễn Hữu Bắc NGHIÊN CỨU GIAO THỨC MQTT ỨNG DỤNG CHO GIẢI PHÁP TƯỚI NƯỚC THÔNG MINH Chuyên ngành: Vật lý vô tuyến điện tư Mã số: 8440130.03... LÊ QUANG THẢO LỜI CAM ĐOAN Tôi xin cam đoan nội dung luận văn: ? ?Nghiên cứu giao thức MQTT ứng dụng cho giải pháp tưới nước thông minh? ?? Là thực hiện hướng dẫn TS Lê Quang Thảo Các số liệu, kết... MQTT mơ hình Pub/ Sub, gói tin quan trọng quy trình nhận liệu MQTT, ưu điểm MQTT số ứng dụng MQTT triển khai Chương 3: Mơ hình tưới nước thông minh sư dụng cảm biến không dây sư dụng giao thức

Ngày đăng: 23/12/2021, 16:03

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w