Baocaocuoiki3 0

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 64

BỘ GIÁO DỤC & ĐÀO TẠO

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP. HỒ CHÍ MINH


KHOA ĐIỆN – ĐIỆN TỬ
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP

---------------------------------

ĐỒ ÁN MÔN HỌC
CÔNG NGHỆ KHÔNG DÂY
ĐỀ TÀI:
ỨNG DỤNG CÔNG NGHỆ RFID
TRONG ĐIỂM DANH SINH VIÊN TẠI TRƯỜNG HỌC

GVHD: TS Nguyễn Thanh Nghĩa


SVTH: Cao Văn Vinh MSSV: 21161386
SVTH: Nguyễn Văn Lân MSSV: 21161062
SVTH: Dương Trung Kiên MSSV: 21161328

Tp. Hồ Chí Minh – 05/2024


BỘ GIÁO DỤC & ĐÀO TẠO
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP. HỒ CHÍ MINH
KHOA ĐIỆN – ĐIỆN TỬ
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP

---------------------------------

ĐỒ ÁN MÔN HỌC
CÔNG NGHỆ KHÔNG DÂY
ĐỀ TÀI:
ỨNG DỤNG CÔNG NGHỆ RFID
TRONG ĐIỂM DANH SINH VIÊN TẠI TRƯỜNG HỌC

GVHD: TS Nguyễn Thanh Nghĩa


SVTH: Cao Văn Vinh MSSV: 21161386
SVTH: Nguyễn Văn Lân MSSV: 21161062
SVTH: Dương Trung Kiên MSSV: 21161328

Tp. Hồ Chí Minh – 05/2024

ii
DANH SÁCH THÀNH VIÊN THAM GIA BÀI BÁO CÁO
HỌC KÌ I NĂM HỌC 2024 – 2025
Lớp: WITE332463_23_2_02CLC
Tên đề tài:Ứng dụng công nghệ RFID trong việc điểm danh sinh viên
STT Họ & TÊN SV MSSV % HOÀN THÀNH
1 Nguyễn Văn Lân 21161062 100%
2 Cao Văn Vinh 21161386 100%
3 Dương Trung Kiên 21161328 100%
Ghi chú:
- Tỷ lệ % = 100%: Mức độ phần trăm của từng sinh viên tham gia.
- Trưởng nhóm: Cao Văn Vinh - SĐT:

Điểm số: ..........................................................................................................


Nhận xét của giáo viên:
...........................................................................................................................
...........................................................................................................................
...........................................................................................................................

TP. Thủ Đức, ngày 5 tháng 5 năm 2024


Ký xác nhận của giảng viên

i
MỤC LỤC
LỜI CAM ĐOAN...................................................................................................................v
LỜI CẢM ƠN.........................................................................................................................6
CHƯƠNG 1. TỔNG QUAN..................................................................................................1
1.1. LÝ DO CHỌN ĐỀ TÀI..............................................................................................1
1.2. MỤC TIÊU..................................................................................................................1
1.3. NỘI DUNG NGHIÊN CỨU.......................................................................................1
1.4. ĐỐI TƯỢNG VÀ PHẠM VI NGHIÊN CỨU..........................................................1
1.4.1. Đối tượng nghiên cứu........................................................................................1
1.4.2. Phạm vi nghiên cứu...........................................................................................2
CHƯƠNG 2. CƠ SỞ LÝ THUYẾT......................................................................................3
2.1 CÔNG NGHỆ RFID....................................................................................................3
2.1.1 Tổng quan về công nghệ RFID...............................................................................3
2.1.2 Hệ thống RFID........................................................................................................3
2.1.3 Các kỹ thuật điều chế được sử dụng với RFID.......................................................5
2.2.CÁC KHÁI NIỆM VỀ CƠ BẢN VỀ TỔ CHỨC BỘ NHỚ VÀ BẢO MẬT THẺ.6
2.2.1 Cơ cấu tổ chức bộ nhớ EEPROM...........................................................................6
2.2.2 Cơ cấu bảo mật thẻ Mifare......................................................................................7
2.3.GIỚI THIỆU PHẦN CỨNG.....................................................................................11
2.3.1. NodeMCU ESP8266............................................................................................11
2.3.2. RC522..................................................................................................................12
2.3.3. Thẻ trắng RFID 13.56Mhz...................................................................................13
2.3.4. Màn hình OLED SSD1306 & OLED SH1106...................................................14
2.4. Chuẩn các chuẩn truyền dữ liệu..............................................................................16
2.4.1. Chuẩn IIC.........................................................................................................16
2.4.2. Chuẩn SPI........................................................................................................16
2.4.3. Phương thức POST và GET HTTP..................................................................17
2.5. CÁC CÔNG CỤNG THỰC HIỆN WEBSITE...................................................19
2.5.1. Cơ sở dữ liệu....................................................................................................19
2.5.2. SQL..................................................................................................................19
2.5.4. HTML & CSS..................................................................................................20
2.5.5. Bootstrap..........................................................................................................20
2.6. Các kỹ thuật được sử dụng...................................................................................20
2.6.1. Kỹ thuật bảo mật thẻ........................................................................................20
2.6.2. Kỹ thuật Ajax...................................................................................................23
ii
2.6.3. Kỹ thuật mã hoá Hash......................................................................................24
CHƯƠNG 3: TÍNH TOÁN – THIẾT KẾ, THI CÔNG & KẾT QUẢ............................25
3.1. TÍNH TOÁN VÀ THIẾT KẾ HỆ THỐNG........................................................25
3.1.1. Thiết kế sơ đồ khối hệ thống................................................................................25
3.1.2. Hoạt động của hệ thống.......................................................................................25
3.2. SƠ ĐỒ NGUYÊN LÍ HỆ THỐNG.........................................................................26
3.3. THỰC THI HỆ THỐNG..........................................................................................26
3.3.1.Bảo mật thẻ và xác thực thẻ..................................................................................26
3.3.2. Gửi dữ liệu lên CSDL & nhận dữ liệu trả về.......................................................29
3.3.3. Xử lý dữ liệu phía Server.....................................................................................31
3.3.4 Thiết kế layout.....................................................................................................32
3.3.5 Thi công mạch thực tế...........................................................................................32
3.3.6. Lập trình hệ thống................................................................................................33
3.4. KẾT QUẢ.................................................................................................................35
CHƯƠNG 4: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN..................................................38
4.1 KẾT LUẬN............................................................................................................38
4.2 HẠN CHẾ..............................................................................................................38
4.3 HƯỚNG PHÁT TRIỂN........................................................................................38
TÀI LIỆU THAM KHẢO...................................................................................................39

iii
LỜI CAM ĐOAN

Đề tài này là công trình nghiên cứu của nhóm 6 dưới sự hướng dẫn và giám sát của
TS Nguyễn Thanh Nghĩa - Giảng viên tại khoa Điện – Điện tử.
Mọi thông tin , ý kiến và kết quả được trình bày trong báo cáo này là trung thực và
không vi phạm bản quyền hoặc quy định về trí tuệ .
Nhóm 6 đã tuân thủ đúng quy trình nghiên cứu , bao gốm việc thu thập dữ liệu , phân
tích , đánh giá và trình bày kết quả một cách trung thực và chính xác.
Chúng tôi không sao chép hoặc sao chép từ bất kì nguồn nào mà không được phép ,
và tất cả tài liệu tham khảo được trích dẫn đầy đủ và đúng cách .

Nhóm SV thực hiện đề tài


Nhóm 6

iv
LỜI CẢM ƠN

Em xin gửi lời cảm ơn sâu sắc đến TS Nguyễn Thanh Nghĩa - Giảng viên tại khoa
Điện – Điện tử
Em xin gởi lời chân thành cảm ơn các thầy cô trong Khoa Điện-Điện Tử đã tạo
những điều kiện tốt nhất cho em hoàn thành đề tài.
Em cũng gửi lời đồng cảm ơn đến các bạn lớp Công nghệ không dây sáng thứ 3 đã
chia sẻ trao đổi kiến thức cũng như những kinh nghiệm quý báu trong thời gian thực hiện đề
tài.
Xin chân thành cảm ơn!

Người thực hiện đề tài


Nhóm 6
LIỆT KÊ HÌNH ẢNH

Hình 2.1: Sơ đồ khối hệ thống RFID....................................................................................4


Hình 2.2: Các thành phần của hệ thống RFID....................................................................4
Hình 2.3: Các thành phần chính của một Reader điển hình..............................................5
Hình 2.5. Cấu trúc bộ nhớ Eprom trên thẻ.........................................................................6
Hình 2.6: Thẻ Mifare trong thực tế......................................................................................8
Hình 2.7: Cấu trúc của 1 Sector Trailer và vị trí của Key A,B và Access bit...................9
Hình 2.8: NodeMCU ESP8266............................................................................................11
Hình 2.9: Sơ đồ chân NodeMCU ESP8266........................................................................12
Hình 2.10: Module RC522 trong thực tế............................................................................13
Hình 2.11: Thẻ trắng RFID 13.56MHz trong thực tế.......................................................14
Hình 2.12: Màn hình OLED SHH1106 1.3 inch................................................................15
Hình 2.13: Giao tiếp IIC......................................................................................................16
Hình 2.14: Giao tiếp SPI......................................................................................................17
Hình 2.15: Giao thức HTTP của ESP8266 với Web Service............................................17
Hình 2.16: Giao diện của phpMyAdmin............................................................................19
Hình 2.17: Sơ đồ thay đổi Key A........................................................................................21
Hình 2.18: Sơ đồ giải thuật cho máy ghi thẻ......................................................................22
Hình 2.19: Sơ đồ giải thuật cho máy điểm danh...............................................................23
Hình 2.20: Sơ đồ cách thức hoạt động của kỹ thuật AJAX.............................................24
Hình 2.21: Mô tả kỹ thuật mã hoá Hash...........................................................................24
Hình 3.1: Sơ đồ khối hệ thống.............................................................................................25
Hình 3.2: Sơ đồ nguyên lý của mạch..................................................................................26
Hình 3.3: Thi công trên Breadboard..................................................................................32
Hình 3.4 Hình ảnh sản phẩm thực tế.................................................................................32
Hình 3.5: Lập trình trên ESP8266 với Arduino IDE........................................................33
Hình 3.6: Lập trình phía Server với Visual Studio Code.................................................33
Hình 3.7: Các file sau khi được giải nén và được nằm trong folder thuctapnhung.......34
Hình 3.8: Upload file Spl để tạo database..........................................................................34
Hình 3.9 : Thay đổi các cấu hình kết nối tới database......................................................35
Hình 3.10: Hình ảnh kết quả sản phẩm.............................................................................35
Hình 3.11: Giao diện trang đăng nhập web.......................................................................36
Hình 3.12: Giao diện trang chủ sau khi đăng nhập vào...................................................36
Hình 3.13: Danh sách đăng nhập theo thời gian thực......................................................37
vi
Hình 3.14: Thẻ của các thành viên trong nhóm dành để điểm danh..............................37

vii
LIỆT KÊ BẢNG

Bảng 2.2: Thông số kỹ thuật các RC522............................................................................10


Bảng 2.3: Mô tả thông số kỹ thuật các chân của OLED...................................................11
Bảng 2.4: bảng thông tin về giao tiếp SPI..........................................................................14
Bảng 2.5: Sự khác nhau của phương thức POST & GET:..............................................15
Bảng 2.6: Bảng trạng thái HTTP Status Code tiểu biểu..................................................15
Bảng 3.1: Bảng kết nối chân giữa ESP8266 và RC522....................................................23

viii
TÓM TẮT

CSDL Cơ sở dữ liệu
SQL Structured Query Language
PHP Hypertext Preprocessor
HTML HyperText Markup Language
CSS Cascading Style Sheets

ix
CHƯƠNG 1. TỔNG QUAN

1.1. LÝ DO CHỌN ĐỀ TÀI


Xuất phát từ nhu cầu thực tế, việc quản lý, điểm danh sinh viên thủ công hiện nay
đang gặp nhiều hạn chế như: tốn thời gian, dễ xảy ra sai sót, thiếu chính xác, khó khăn trong
việc thống kê và báo cáo. Hệ thống điểm danh sinh viên bằng thẻ RFID có hỗ trợ
webserver và cơ sở dữ liệu ra đời nhằm khắc phục những hạn chế này, mang lại giải pháp
chấm công tự động, hiệu quả và chính xác hơn.

1.2. MỤC TIÊU


Mục tiêu của đồ án này là một hệ thống có khả năng điểm danh tự động bằng RFID.
Giúp dễ dàng quản lý cho các trường học.
- Đề tài có thể lưu trữ thông tin cơ bản của sinh viên như Họ tên, Giới tính, Email,
MSSV. Đồng thể có thể thao tác CRUD (Create, Read, Update & Delete).
- Phải có chức năng bảo mật thẻ
Quá trình nghiên cứu đề tài cũng mang đến cho chúng em cơ hội kiểm tra lại kiến thức
đã học trong suốt thời gian học. Nghiên cứu cơ sở lý thuyết về RFID, về kết nối không dây,
sử dụng các bo vi điều khiển cũng như nâng cao khả năng về lập trình IoT cũng như CSDL.
1.3. NỘI DUNG NGHIÊN CỨU
Đề tài tập trung nghiên cứu về ứng dụng điểm danh sinh viên sử dụng thẻ RFID, tìm
hiểu về cách thức hoạt động của RFID. Đồng thời nghiên cứu cách tạo một website để dễ
dàng thao tác, quản lý, điểm danh sinh viên một cách hiệu quả.
1.4. ĐỐI TƯỢNG VÀ PHẠM VI NGHIÊN CỨU
1.1.1. Đối tượng nghiên cứu
Về phần cứng:
- ESP8266
- RC522
- Thẻ Mifare
- Màn hình OLED
Về phần mềm:
- Nghiên cứu ngôn ngữ C/ C++ để lập trình ESP8266 giao tiếp với RC522 qua giao thức
SPI và Oled qua giao thức I2C , sau đó ESP8266 sẽ cập nhật dữ liệu lên cơ sở dữ liệu.
- Nghiên cứu về ngôn ngữ PHP: Ngôn ngữ xử lý phía server thực hiện phương thức
HTTP POST & GET dữ liệu từ cơ sở dữ liệu. Đồng thời xử lý các số liệu cần thiết
- Nghiên cứu ngôn ngữ HTML & CSS: Nhằm thực hiện một website đơn giản
1
- Nghiên cứu SQL: Nhằm thực hiện các truy vấn từ cơ sở dữ liệu
- Nghiên cứu về Bootstrap: Nhằm thực hiện giao diện website một cách dễ dàng hơn
Về lý thuyết:
- Nghiên cứu về cơ cấu tổ chức bộ nhớ EEPROM và cơ cấu bảo mật thẻ Mifare Classic.
1.1.2. Phạm vi nghiên cứu
- Dự án có phạm vi truyền nhận dữ liệu toàn cầu
- Sử dụng ESP8266, Module Reader RC522, màn hình OLED SSD1306, thẻ Mifare
Classic
- Bố cục :
 Chương 1: Tổng Quan
 Chương 2: Cơ Sở Lý Thuyết.
 Chương 3: Thiết Kế, Tính Toán – Thi Công & Kết Quả
 Chương 4: Kết Luận và Hướng Phát Triển

2
CHƯƠNG 2. CƠ SỞ LÝ THUYẾT
2.1 CÔNG NGHỆ RFID
2.1.1 Tổng quan về công nghệ RFID
Công nghệ RFID sử dụng sóng vô tuyến để nhận dạng một cách tự động những đối tượng
vật lý như những vật thể sống và vật thể thụ động… vì thế phạm vi mà RFID sẽ nhận dạng
bao gồm toàn bộ vật thể sống và không sống trên trái đất và ở xa hơn. Do đó có thể xem
công nghệ RFID là một trường hợp của kỹ thuật nhận dạng tự động (Auto-ID) như: mã
vạch, sinh trắc, nhận dạng dọng nói…
2.1.2 Hệ thống RFID
Một hệ thống RFID là một tập hợp các thành phần mà nó thực thi giải pháp RFID. Một hệ
thống RFID bao gồm các thành phần sau:
- Tag (thẻ gắn vào đối tượng cần nhận dạng): là một thành phần bắt buộc đối với
mọi hệ thống RFID
- Reader (Bộ đọc): là thành phần bắt buộc.
- Reader angten: là thành phần bắt buộc. Một vài reader hiện hành ngày nay cũng
đã có sẵn angten
- Mạch điều khiển: là thành phần bắt buộc. Tuy nhiên các reader ngày nay hầu hết
có thành phần gắn liền với chúng
- Cảm biến, cơ cấu chấp hành và bảng tín hiệu điện báo: những thành phần này hỗ
trợ nhập xuất của hệ thống
- Máy chủ và hệ thống phần mềm: Về mặt lý thuyết, một hệ thống RFID có thể
hoạt động độc lập không có thành phần này. Thực tế, một hệ thống RFID gần như
không có ý nghĩa nếu không có thành phần này.
- Cơ sở hạ tầng truyền thông: là thành phần bắt buộc, nó là một tập gồm cả hai
mạng có dây và không dây và các bộ phận kết nối để kết nối các thành phần đã
liệt kê ở trên với nhau tạo việc thông tin hiệu quả.

3
Hình 2.1: Sơ đồ khối hệ thống RFID

Hình 2.2: Các thành phần của hệ thống RFID


TAG (thẻ gắn vào đối tượng cần nhận dạng)
Các tag RFID có thể được phân loại theo hai phương pháp khác nhau. Danh sách sau
trình bày việc phân loại theo nguồn năng lượng, dựa trên việc tag có chứa nguồn cung cấp
gắn bên trong hay là được cung cấp bởi reader:
• Thụ động (Passive): không có nguồn năng lượng bên trong, nhận năng lượng từ
Reader để tiến hành việc truyền dữ liệu.
• Tích cực (Active): có nguồn năng lượng riêng (pin) và dùng nguồn năng lượng này
để truyền dữ liệu, không phụ thuộc vào Reader.
• Bán tích cực (Semi-active, cũng như bán thụ động semi-passive): dùng năng
lượng của Reader để truyền dữ liệu nhưng vẫn có nguồn riêng cung cấp cho các
chức năng khác
READER
Reader RFID được gọi là vật tra hỏi (interrogator), là một thiết bị đọc và ghi dữ liệu
lên tag RFID tương thích. Hoạt động ghi dữ liệu lên tag bằng reader được gọi là tạo tag.
Quá trình tạo tag và kết hợp tag với một đối tượng được gọi là đưa tag vào hoạt động
(commissioning the tag). Decommissioning tag có nghĩa là tách tag ra khỏi đối tượng được
gắn tag và tùy ý làm mất hiệu lực hoạt động của tag. Thời gian mà reader có thể phát năng
lượng RF để đọc tag được gọi là chu kỳ làm việc của reader.
Reader là hệ thần kinh trung ương của toàn hệ thống phần cứng RFID, việc thiết lập
truyền thông, điều khiển reader là một yêu cầu rất quan trọng.

4
Hình 2.3: Các thành phần chính của một Reader điển hình
2.1.3 Các kỹ thuật điều chế được sử dụng với RFID
Các thẻ tag được thiết kế sử dụng hiện tượng phân tán ngược đã có những phương
pháp điều chế để gửi dữ liệu phản hồi về reader. Kỹ thuật điều chế theo biên độ (ASK) là
phương pháp cơ bản và dễ thực hiện nhất, tuy nhiên nó giống như tất cả các kỹ thuật điều
biên là nó thường bị ảnh hưởng bởi nhiễu. Khi điều chế tải (load modulation) được sử dụng
để truyền thông tin thì có nhiều phương pháp điều chế phong phú hơn. Điều chế theo pha
(PSK_ Phase Shift Keying) cải tiến hơn so với ASK, và trong nhiều thiết kế kỹ thuật điều
chế pha nhị phân (BPSK_ Binary Phase Shift Keying) được dùng rất hiệu quả. Hình dưới
đây thể hiện dạng sóng tín hiệu của tag gửi phản hồi về reader.

Hình 2.4: So sánh các đặc tính vận hành của hệ thống RFID tại các dãy tần khác
nhau

5
Với tính đa dạng cao của các thẻ RFID được mô tả, ta có thể tóm tắt các đặc tính cơ
bản của nó dựa vào tần số. Hình trên phân loại các nhóm thẻ tag theo: tần số thấp (LF), tần
số cao (HF), và tần số cực cao (UHF) - cả 900MHz và 2,45GHz và các đặc điểm điển hình
của chúng. Tuy nhiên, cần phải nhấn mạnh rằng, cách phân loại này mang tính chất tương
đối và các đặc tính có thể thay đổi đáng kể tùy thuộc vào nhà sản xuất và ứng dụng. Ví dụ,
kích thước angten được sử dụng trong các reader và thiết kế tag tương ứng, sẽ có ảnh hưởng
đáng kể đến phạm vi đọc. Vì vậy, ta không nên áp dụng một cách máy móc từ bảng, ví dụ
theo bảng thì có vẻ angten lớn hơn được yêu cầu cho các thẻ tần số cao hơn. Một angten
UHF có thể rất nhỏ nếu nó chỉ cần đọc ở một khoảng cách chỉ vài cm.

2.2. CÁC KHÁI NIỆM VỀ CƠ BẢN VỀ TỔ CHỨC BỘ NHỚ VÀ BẢO MẬT THẺ
2.2.1. Cơ cấu tổ chức bộ nhớ EEPROM
Trong cấu trúc của 1 thẻ Mifare bất kỳ thì bộ nhớ Eeprom là phần đóng vai trò quan
trọng nhất trong hoạt động lưu trữ dữ liệu và cơ cấu bảo mật của thẻ. Trước khi bắt đầu lập
trình với Mifare, người dùng buộc phải nắm rõ được cơ cấu tổ chức bên trong loại thẻ này
để có được phương án lập trình thích hợp và tối ưu nhất, hơn nữa còn hạn chế được rủi ro
trong quá trình sử dụng thẻ.
Hình dưới đây cho ta thấy được cấu trúc của bộ nhớ Eeprom trên 1 thẻ Mifare Classic

Hình 2.5. Cấu trúc bộ nhớ Eprom trên thẻ


Bộ nhớ Eeprom có dung lượng 1 KByte được chia thành 16 Sectors hay vùng nhớ.
Các Sector này được đánh số từ 0 đến 15, được truy xuất không theo thứ tự nghĩa là các

6
vùng nhớ được đọc/ghi một các độc lập, không ràng buộc với nhau. Trong mỗi Sector lại
được chia thành 4 Block (được đánh số từ 0 đến 3) chứa dữ liệu người dùng và các khóa bảo
mật, dung lượng của mỗi Block là 16 Bytes được đánh số từ trái sang phải từ Byte 0 đến 15.
Trong mỗi Sector, có một Block rất quan trọng, nếu nhìn theo không gian sắp xếp
của thẻ thì Block này nằm ở vị trí cao nhất và được đánh số cuối cùng trong các Block, nhà
sản xuất gọi là Sector Trailer. Mỗi Sector Trailer gồm 3 thành phần chính là 2 mã bảo mật
có thể lập trình được gọi là Key A(nằm từ Byte 0 đến Byte 5) và Key B(nằm từ Byte 10 đến
Byte 15) để truy cập đọc/ghi vào chính Sector mà nó quy định. Và thành phần còn lại là
AccessBit (nằm từ Byte 6 đến Byte 9) có khả năng quy định chức năng cho Key A, B và
khả năng truy xuất thông tin của thẻ.
Duy chỉ có Sector 0 là đặc biệt hơn so với 15 Sector còn lại, đó là việc nó có 1 Block
của nhà sản xuất gọi là Manafacturer Block. Block này được nhà sản xuất ghi mã Serial
Number vào nhằm phân biệt các thẻ với nhau và các mã Serial Number này là duy nhất.
Người lập trình không được ghi, xóa dữ liệu vào Block này để tránh việc bị lỗi Sector này
(theo khuyến cáo của nhà sản xuất).
Như vậy, mỗi Sector sẽ sử dụng được 3 Block để phục vụ cho việc lưu trữ(Data
Block), trong đó Sector 0 là chỉ sử dụng được 2 Block lưu trữ (do 1 Block nhà sản xuất đã
sử dụng để ghi số Seri lên). Như vậy, qua phép tính đơn giản chúng ta có thể biết được tổng
số Block có thể sử dụng cho việc lưu trữ dữ liệu là: 2 + 15x3 = 47 Block, mỗi Block có độ
lớn 16 Bytes nên độ lớn dữ liệu tối đa là 47x16 = 752 Bytes.

2.2.2. Cơ cấu bảo mật thẻ Mifare


Đầu tiên ta cần tìm hiểu thẻ Mifare là gì?
MIFARE (bắt nguồn từ thuật ngữ MIkron FARE Collection System) là thương hiệu
nổi tiếng của NXP về chip RFID thụ động được sử dụng trong thẻ RFID với khoảng cách
đọc / ghi điển hình là 10 cm (4 inch).

MIFARE đủ nhỏ và có tính linh hoạt để được đặt ở mọi nơi, từ thẻ nhựa và dây đeo cổ
tay RFID cho đến những chiếc chìa khóa và thậm chí cả điện thoại thông minh. Điều đó có
nghĩa là nó có thể giúp mọi người làm bất cứ điều gì. Hiện nay thẻ Mifare đã có tích hợp
trong những thứ như thẻ đi xe buýt, phù hiệu nhân viên, thẻ thư viện, thẻ đi tàu điện ngầm,

7
thẻ sinh viên, thẻ khách hàng thân thiết, thẻ thu phí, thẻ vào sân vận động và ngày càng
nhiều điện thoại thông minh được tích hợp sẵn công nghệ này.

Ngày nay, có tổng cộng khoảng hơn 1,2 tỷ người có quyền truy cập vào các hệ thống
dựa trên MIFARE tại hơn 70 quốc gia. Các sản phẩm của MIFARE đã được chứng minh và
đáng tin cậy hơn bất kỳ công nghệ nào khác trên thị trường. Chúng tuân thủ tiêu chuẩn quốc
tế ISO / IEC 14443, được sử dụng trong hơn 80% các loại thẻ thông minh không tiếp xúc
hiện nay.

Hình 2.6: Thẻ Mifare trong thực tế

Đối với 1 thẻ Mifare Classic thì ta có 4 cách để bảo mật thông tin trên thẻ:
- Dựa vào UID độc nhất của mỗi thẻ: Mỗi thẻ Mifare đều có 1 Seri Number độc nhất do
nhà sản xuất quy định và chúng ta sẽ không thể thay đổi và tác động vào. Do đó trong
những yêu cầu đơn giản, cần bảo mật nhưng không phải là tuyệt đối thì ta có thể sử dụng
chính UID này như là mã bảo mật. Ví dụ như các bãi giữ xe trong các trường học, bệnh
viện, siêu thị…
- Dựa vào thuật toán truy xuất: Khi nhà sản xuất phát hành các loại thẻ thì đồng thời
họ cũng cung cấp cho người dùng datasheet đi kèm, dựa vào data shet này chúng ta
có thể biết được lược đồ thời gian truy câp vào thẻ. Từ đó có cách lập trình đọc/ghi
thẻ đúng đắn. Mỗi nhà loại thẻ có một lưu đồ thuật toán khác nhau nên chỉ có đầu
đọc được thiết kế cho loại thẻ đó mới có thể đọc/ghi dữ liệu trên thẻ được. Đáng tiếc
rằng thuật toán truy xuất vào thẻ thì có thể bị sao chép nên phương án bảo mật này
không được đánh giá cao.
• Dựa vào KeyA, Key B: đây là hai khóa bảo mật được đặt trong Trailer Block của
mỗi Block, được coi như chìa khóa mở ra thông tin trên mỗi Block của thẻ vì khi
8
lập trình, người dùng buộc phải khai báo đúng hai khóa này trước khi tác động vào
thông tinh trên thẻ. Phương án này được đánh giá khá cao bởi người dùng thẻ Mifare
chỉ sau Access Bit.
• Dựa vào Access Bit: đây là phương án bào mật cao nhất trên thẻ Mifare. Access Bit
là tổ hợp các bộ ba bit điều khiển chức năng của Key A, Key B cũng như khả năng
được xuất hiện của dữ liệu trên thẻ.
Trong đồ án môn học này, nhóm 6 sẽ đi sâu vào cách thức bảo mật dùng Key A.

Hình 2.7: Cấu trúc của 1 Sector Trailer và vị trí của Key A,B và Access bit

Một thẻ mifare khi mới mua về, dữ liệu bên trong chưa bị thay đổi, các khóa bảo
mật Key A, Key B đang là mặc định của nhà sản xuất. Người dùng có thể đọc thông tin
trên thẻ một cách toàn vẹn mà không gặp bất kỳ một trở ngại nào.
Nhóm tiến hành dùng một bo Arduino Uno R3 kết nối với RC522 qua chuẩn giao
tiếp SPI và sử dụng chương trình dump_info trong thư viện Mfrc522 để tiến hành đọc toàn
bộ dữ liệu có trong thẻ.

Card UID: 79 E3 7B 2C
Card SAK: 08
PICC type: MIFARE 1KB
Sector Block 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
AccessBits
15 63 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
62 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
14 59 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
58 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
57 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
56 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
13 55 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
53 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
52 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
12 51 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
49 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
11 47 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
46 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
10 43 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
9
41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
9 39 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
37 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
8 35 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
7 31 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
29 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
28 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
6 27 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
26 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
25 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
5 23 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
22 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
4 19 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
16 30 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 [ 0 0 0 ]
3 15 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
2 11 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
9 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
1 7 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
6 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
5 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
0 3 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]
2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]
0 79 E3 7B 2C CD 08 04 00 01 39 92 24 93 E5 DD 1D [ 0 0 0 ]

Tại đây, chúng ta có thể thấy được UID, Key A, Key B trong mỗi Trailer sector.
Một lưu ý nhỏ và rất quan trọng đó là các mặc định của nhà sản xuất thì Key A không được
xuất hiện trong tất cả các trường hợp. vì thế mặc dù mã bảo mật A, B mặc định là
FFFFFFFFFFFF nhưng khi đọc thẻ thì chỉ mã B xuất hiện, còn mã A sẽ được trả về là dãy
số 0. Điều này được đánh giá rất cao trong cơ cấu bảo mật dùng Key A, Key B.
10
Sở dĩ chương trình Dumpinfo đọc được tất cả các dữ liệu trong thẻ vì chương trình
này được người viết cài sẵn Key A, Key B mặc định, khi đọc thẻ, tất cả các Block được áp
dụng hai Key này, chính vì lý do đó thẻ mới mua về thì chưa hề có bảo mật.

2.3.GIỚI THIỆU PHẦN CỨNG


2.3.1. NodeMCU ESP8266
Bảng phát triển NodeMCU ESP8266 đi kèm với mô-đun ESP-12E chứa chip
ESP8266 có bộ vi xử lý Tensilica Xtensa 32-bit LX106 RISC. Bộ vi xử lý này hỗ trợ RTOS
và hoạt động ở tần số xung nhịp có thể điều chỉnh từ 80MHz đến 160 MHz.
NodeMCU có 128 KB RAM và 4MB bộ nhớ Flash để lưu trữ dữ liệu và chương
trình. Sức mạnh xử lý cao của nó với Wi-Fi và các tính năng Điều hành Ngủ sâu tích hợp
khiến nó trở nên lý tưởng cho các dự án IoT.
NodeMCU có thể được cấp nguồn bằng giắc cắm Micro USB và chân VIN (Chân
nguồn cung cấp bên ngoài). Nó hỗ trợ giao diện UART, SPI và I2C.

Hình 2.8: NodeMCU ESP8266

11
Bảng 2.1: Thông số kỹ thuật của NodeMCU ESP8266
Vi điều khiển CPU RISC 32-bit Tensilica Xtensa LX106
Điện áp hoạt động 3.3V
Số chân I/O (Digital) 16
Số chân ADC 1
UARTs 1
SPI 1
I2C 1
Bộ nhớ Flash 4MB
SRAM 64KB
Tốc độ xung Clock 80MHz
Chuẩn nạp CP2102

12
Hình 2.9: Sơ đồ chân NodeMCU ESP8266
2.3.2. RC522
Mạch RFID NFC 13.56MHz RC522 sử dụng IC MFRC522 được sử dụng để đọc và
ghi dữ liệu cho thẻ RFID/ NFC tần số 13.56MHz, mạch có thiết kế nhỏ gọn được sử dụng
rất phổ biến hiện nay với Arduino hoặc các loại Vi điều khiển khác trong các ứng dụng cần
ghi, đọc thẻ RFID/ NFC.
- Điện áp hoạt động: 3.3V DC
- Dòng ở chế độ chờ: 1013mA
- Dòng ở chế độ nghỉ: <80uA
- Tần số sóng mang: 13.56Mhz
- Khoảng cách hoạt động: 0 – 60mm
- Chuẩn giao tiếp: SPI
- Tốc độ truyền tối đa: 10Mbit/s
- Kích thước: 40 mm x 60mm

Hình 2.10: Module RC522 trong thực tế

Bảng 2.2: Thông số kỹ thuật các RC522


Số chân Tên chân Mô tả
1 Vcc Nguồn 3.3VDC
2 RST D4
3 GND Nối đất
4 IRQ NC
5 MISO D6
6 MOSI D7
7 SCK D5
8 SDA D3

13
2.3.3. Thẻ trắng RFID 13.56Mhz
Thẻ trắng RFID 13.56 MHz dùng để đọc/ghi dữ liệu với tốc độ rất cao. Thẻ được
ứng dụng trong nhiều lĩnh vực như bảo mật, nhà thông minh, chấm công, gửi xe thông
minh, v.v… Thẻ trắng RFID 13.56Mhz tương thích với module RFID RC522 13.56MHz
và các module tương tự.
- Bộ nhớ: 8Kbits, chia thành 16 vùng
- Tần số hoạt động: 13.56MHz
- Khoảng cách đọc: 2.5-10cm
- Thời gian đọc: 1-2ms
- Độ bền: 100.000 lần
- Thời gian đảm bảo không mất dữ liệu: 10 năm
- Kích thước: 0.87 × 85.5 × 54 mm (dày x dài x rộng)
- Chuẩn: ISO 14443, ISO 10536
- Màu: Trắng

Hình 2.11: Thẻ trắng RFID 13.56MHz trong thực tế


2.3.4. Màn hình OLED SSD1306 & OLED SH1106
- Điện áp hoạt động : 2.2V ~ 5.5V
- Công suất tiêu thụ: 0.04W
- Góc hiển thị: >160 độ
- Số điểm ảnh: 128x64
- Độ rộng màn hình:
0.96 inch(SSD1306)
1.3 inch (SSH1106)
- Màu hiển thị: Trắng – Đen
- Giao tiếp: IIC

14
Bảng 2.3: Mô tả thông số kỹ thuật các chân của OLED
Số chân Tên chân Mô tả
1 GND Nối đất
2 VCC 3.3VDC
3 SCL D1
4 SDA D2

Hình 2.12: Màn hình OLED SHH1106 1.3 inch

15
2.4. Chuẩn các chuẩn truyền dữ liệu
2.2.3. Chuẩn IIC
Giao tiếp I2C là quá trình truyền thông đồng bộ nối tiếp, hỗ trợ nhiều master (thiết bị
chủ) và slave (thiết bị tớ) trên đường truyền. I2C phù hợp với các ngoại vi mà sự ưu tiên về
kết nối đơn giản và chi phí sản xuất thấp quan trọng hơn là yêu cầu về tốc độ truyền như
giao tiếp giữa vi điều khiển và mảng cảm biến, các thiết bị hiển thị, thiết bị IoT, EEPROMs,
v.v …

Hình 2.13: Giao tiếp IIC


Chuẩn giao tiếp I2C sử dụng 2 dây để truyền dữ liệu giữa các thiết bị:
SDA (Serial Data) – Đường truyền cho chủ và tớ để gửi và nhận dữ liệu.
SCL (Serial Clock) – Dòng mang tín hiệu xung nhịp.
Đây là một giao thức truyền thông nối tiếp, vì vậy dữ liệu được truyền từng bit dọc
theo một dây duy nhất (đường SDA).
2.2.4. Chuẩn SPI
Giao tiếp SPI là 1 giao tiếp thường được dùng trong vi điều khiển với 4 dây. 2 dây để
truyền và nhận dữ liệu là MOSI (Master Out Slave In) và MISO (Master In Slave Out). 1
dây SCK để tạo tín hiệu đồng hồ đồng bộ giữa các thiết bị. Còn dây cuối cùng CS để chọn
thiết bị sẽ giao tiếp khi trong mạng có nhiều slave.

16
Hình 2.14: Giao tiếp SPI
Số dây sử dụng 4
Tốc độ truyền dữ liệu tối đa 10Mbps
Đồng bộ / Không đồng bộ Đồng bộ
Giao tiếp nối tiếp / song song Nối tiếp
Bảng 2.4: bảng thông tin về giao tiếp SPI
2.2.5. Phương thức POST và GET HTTP
HTTP (Hypertext Transfer Protocol) là giao thức truyền tải siêu văn bản. Đây là
giao thức tiêu chuẩn cho World Wide Web (www) để truyền tải dữ liệu dưới dạng văn bản,
âm thanh, hình ảnh, video từ Web Server tới trình duyệt web của người dùng và ngược lại.

Hình 2.15: Giao thức HTTP của ESP8266 với Web Service
HTTP hoạt động theo mô hình Client (máy khách) – Server (máy chủ). Việc truy cập
website được tiến hành dựa trên các giao tiếp giữa 2 đối tượng trên. Khi bạn truy cập một
trang web qua giao thức HTTP, trình duyệt sẽ thực hiện các phiên kết nối đến server của
trang web đó thông qua địa chỉ IP do hệ thống phân giải tên miền DNS cung cấp. Máy chủ

17
sau khi nhận lệnh, sẽ trả về lệnh tương ứng giúp hiển thị website, bao gồm các nội dung
như: văn bản, ảnh, video, âm thanh,…
Phương thức POST & GET
GET và POST là hai phương thức của giao thức HTTP, đều là gửi dữ liệu về server
xử lí. Trước khi gửi thông tin, nó sẽ được mã hóa bằng cách sử dụng một giản đồ gọi là url
encoding. Giản đồ này là các cặp name/value được kết hợp với các kí hiệu = và các kí hiệu
khác nhau được ngăn cách bởi dấu &.
Bảng 2.5: Sự khác nhau của phương thức POST & GET:
Phương thức GET gửi thông tin người Phương thức POST truyền thông tin thông
dùng đã được mã hóa thêm vào trên yêu qua HTTP header, thông tin này được mã
cầu trang: hóa như phương thức GET. Dữ liệu đươc
http://www.example.com/index.php? gửi bởi phương thức POST rất bảo mật vì
name=value1&name1=value1
dữ liệu được gửi ngầm, không đưa lên URL,
Chúng ta thấy rằng GET lộ thông tin trên
đường dẫn URL. Băng thông của nó chỉ bằng việc sử dụng Secure HTTP nên thông
khoảng 1024 kí tự vì vây GET hạn chế về
tin được an toàn. POST không có bất kì hạn
số kí tự được gửi đi. GET không thể gửi dữ
liệu nhị phân, hình ảnh ... Có thể cached và chế nào về kích thước dữ liệu sẽ gửi, có thể
được bookmark (đánh dấu trên trình
gửi dữ liệu nhị phân, hình ảnh.
duyệt). Lưu trong browser history.

Bảng 2.6: Bảng trạng thái HTTP Status Code tiểu biểu

Mã trạng thái Cụm từ chỉ lý Giải thích


do
200 OK Phản hồi tiêu chuẩn cho các yêu cầu HTTP thành
công.
301 Moved Nếu máy chủ được thiết lập đúng cách, nó sẽ tự động
Permanently chuyển hướng người đọc đến vị trí mới của file.
400 Bad Request Có một lỗi cú pháp trong yêu cầu và yêu cầu bị từ
chối.
404 Not Found Các file được yêu cầu không có trên máy chủ. Có thể
bởi vì những file này đã bị xóa, hoặc chưa từng tồn
tại trước đây. Nguyên nhân thường là do lỗi chính tả
trong URL.

18
2.3. CÁC CÔNG CỤNG THỰC HIỆN WEBSITE
2.5.1. Cơ sở dữ liệu
MySQL là một hệ thống quản trị cơ sở dữ liệu mã nguồn mở (gọi tắt là RDBMS)
hoạt động theo mô hình client-server. Với RDBMS là viết tắt của Relational Database
Management System. MySQL được tích hợp apache, PHP. MySQL quản lý dữ liệu thông
qua các cơ sở dữ liệu. Mỗi cơ sở dữ liệu có thể có nhiều bảng quan hệ chứa dữ liệu. MySQL
cũng có cùng một cách truy xuất và mã lệnh tương tự với ngôn ngữ SQL.

Hình 2.16: Giao diện của phpMyAdmin

2.5.2. SQL
SQL là viết tắt của cụm từ tiếng anh Structured Query Language , là ngôn ngữ truy
vấn có cấu trúc. Nó là công cụ được thiết kế nhằm để quản lý dữ liệu sử dụng trong nhiều
lĩnh vực, cho phép truy cập và và thực hiện các thao tác lấy các hàng hoặc sửa đổi các hàng,
trích xuất, tạo, xóa dữ liệu.
SQL cung cấp cho ta rất nhiều lợi ích:
- Tạo ra cơ sở dữ liệu mới khi thiết kế website hoặc lập trình phần mềm.
- Tạo bảng và view mới trong CSDL
- Dễ dàng tạo, chèn, xóa các bản ghi trong một CSDL
- Lấy dữ liệu từ một cơ sở dữ liệu
2.5.3 Ngôn ngữ PHP
PHP là từ viết tắt của thuật ngữ Personal Home Page và hiện nay đang có tên
Hypertext Preprocessor. Đây là một dạng mã lệnh hoặc một chuỗi ngôn ngữ kịch bản. Trong
đó, ngôn ngữ PHP chủ yếu được phát triển để dành cho những ứng dụng nằm trên máy chủ.

19
Mỗi khi các lập trình viên PHP viết các chương trình thì các chuỗi lệnh sẽ được chạy
ở trên server, từ đó sinh ra mã HTML. Nhờ vậy mà những ứng dụng trên các website có thể
chạy được một cách dễ dàng.
2.5.3. HTML & CSS
HTML (HyperText Markup Language): là một ngôn ngữ đánh dấu được thiết kế ra
để tạo nên các trang web, nghĩa là các mẩu thông tin được trình bày trên World Wide Web.
CSS (Cascading Style Sheets): định nghĩa về cách hiển thị của một tài liệu HTML.
CSS đặc biệt hữu ích trong việc thiết kế Web. Nó giúp cho người thiết kế dễ dàng áp đặt các
phong cách đã được thiết kế lên bất kì page nào của website một cách nhanh chóng, đồng
bộ.
2.5.4. Bootstrap
Bootstrap là một front-end framework mã nguồn mở miễn phí giúp quá trình phát
triển web được nhanh và dễ dàng hơn. Nó cung cấp một bộ công cụ và các lớp CSS có sẵn
để tạo giao diện người dùng, bao gồm hệ thống lưới, nút, biểu mẫu và nhiều thành phần
khác.
Với Bootstrap, chúng ta không cần phải viết CSS từ đầu, mà chỉ cần sử dụng các lớp
CSS đã được định nghĩa sẵn. Điều này giúp tiết kiệm thời gian và công sức trong việc tạo
kiểu trong trang web.
Một điểm mạnh của Bootstrap là khả năng tương thích với đa dạng các thiết bị và
kích thước màn hình khác nhau. Với việc sử dụng các lớp CSS và các thành phần đáp ứng
sẵn có trong Bootstrap, trang web sẽ tự động thích ứng và hiển thị tốt trên điện thoại di
động, máy tính bảng và máy tính để bàn.
Với sự phổ biến và mã nguồn mở của nó, Bootstrap đã trở thành một trong những
framework CSS phổ biến nhất trên thế giới, được sử dụng rộng rãi trong cộng đồng phát
triển web.
2.6. Các kỹ thuật được sử dụng
2.6.1. Kỹ thuật bảo mật thẻ
Như đã đề cập ở phần 2.1, cơ cấu tổ chức thẻ và cách thức bảo mật thẻ. Thì thẻ
Mifare có thể bị đánh cắp dữ liệu như UID. Điều này khiến những tin tặc, hacker có thể
copy hàng loạt thẻ với mã UID tương tự. Chính vì thế nhóm sẽ tiến hành bảo mật thẻ bằng
Key A.

20
Để truy xuất thông tin trên thẻ Mifare, sau khi nhận được tín hiệu có thẻ được đưa
vào, đầu đọc sẽ yêu cầu người dùng xác thực với các mã bảo mật, nếu mã bảo mật được
cung cấp là đúng thì sẽ trả về “True” ngược lại trả về “False”. Dựa vào các trạng thái
True/False đầu đọc sẽ tiếp tục thực hiện yêu cầu hay không.
Khi mã bảo mật được cung cấp là đúng, Đọc mã xác nhận trên thẻ và tiến hành các
hoạt động đọc/ghi dữ liệu. Khi một thẻ mới được mua về và chuẩn bị được sử dụng thì việc
thay đổi các khóa bảo mật nên được thực hiện. ở phần này nhóm chỉ tác động với Key A để
thấy được rõ vai trò của chúng, nên các Access Bit nên được giữ nguyên, các Access Bit và
Key B sẽ được giữ nguyên.
Việc thay đổi Key A được thực hiện thông qua các bước chính như sau:

21
Hình 2.17: Sơ đồ thay đổi Key A
Ban đầu sẽ có hai máy, ở lần đầu tiên chúng ta sẽ tiến hành ghi dữ liệu vào Key A
vào Block 3 của Sector 0 ở máy thêm thẻ. Vùng địa chỉ này được nhóm chọn ngẫu nhiên để
tiến hành bảo mật.
Thứ nhất: mã xác thực gồm 6 bytes được điền vào mảng knownKeys[]. Chúng ta
phải điền đúng mã xác thực chứa trong Trailer Block của Sector cần truy cập. Mặc được key
của nhà sản xuất là FF FF FF FF FF FF. Ta sẽ tiến hành thay đổi sang 00 11 22 33 44 55. Ở
máy điểm danh, ta sẽ tiến hành kiểm tra key A ở Block 3 Sector 0 với mã 00 11 22 33 44
55, vì đây là một mã bảo mật đã ghi ở máy thêm thẻ nên ở máy điểm danh chúng ta tiến
hành xác thực. Nếu sai thì sẽ không đọc UID thẻ, nếu đúng thì đọc UID thẻ và gửi lên
Webserver.
Lưu đồ giải thuật máy ghi thẻ mới:

Hình 2.18: Sơ đồ giải thuật cho máy ghi thẻ

22
Lưu đồ giải thuật máy điểm danh sinh viên:

Hình 2.19: Sơ đồ giải thuật cho máy điểm danh

2.6.2. Kỹ thuật Ajax


Nhóm sử dụng kỹ thuật Ajax. AJAX là chữ viết tắt của cụm từ Asynchronous
Javascript and XML. AJAX là phương thức trao đổi dữ liệu với máy chủ và cập nhật một
hay nhiều phần của trang web, hoàn toàn không reload lại toàn bộ trang. Việc làm này sẽ
giúp người dùng không phải nhấn Reset lại trang mới xem được dữ liệu được cập nhật, thay
vào đó dữ liệu sẽ được làm mới liên tục.

23
Hình 2.20: Sơ đồ cách thức hoạt động của kỹ thuật AJAX

2.6.3. Kỹ thuật mã hoá Hash


Hash hay còn gọi là hàm băm, là một trong những phần quan trọng nhất của công
nghệ bảo mật. Hashing là quá trình sử dụng những thuật toán, công thức toán học biến nội
dung đầu vào có kích thước, độ dài bất kỳ thành đầu ra tiêu chuẩn có độ dài nhất định. Quá
trình đó sử dụng những Hàm băm

Hình 2.21: Mô tả kỹ thuật mã hoá Hash

24
CHƯƠNG 3: TÍNH TOÁN – THIẾT KẾ, THI CÔNG & KẾT QUẢ

3.1. TÍNH TOÁN VÀ THIẾT KẾ HỆ THỐNG


3.1.1. Thiết kế sơ đồ khối hệ thống

Hình 3.1: Sơ đồ khối hệ thống

3.1.2. Hoạt động của hệ thống


Ta có 2 thiết bị, một thiết bị có nhiệm vụ ghi thêm những thẻ mới và gửi UID thẻ lên
CSDL, thiết bị này thường sẽ được đặt ở phòng nhân sự. Một thiết bị có nhiệm vụ dùng để
điểm danh sinh viên, thường thiết bị này sẽ được đặt ở phòng học hoặc ở mỗi khoa để sinh
viên có thể điểm danh lúc đi học. Đầu tiên để thêm thẻ mới, ta sẽ quẹt thẻ mới vào thiết bị
thêm thẻ. Lúc này thiết bị thêm thẻ sẽ chèn một mã bảo mật 00 11 22 33 44 55 vào Key A
của Block 3 Sector 0. Sau đó gửi UID này lên CSDL. Lúc này ta cần thêm các thông tin cơ
bản như Họ & tên, Emai, MSSV để gán cho một sinh viên nào đó. Tiếp theo, thẻ này được
đưa tới tay sinh viên, sinh viên dùng thẻ này để điểm danh ở các máy điểm danh. Khi quẹt
vào máy điểm danh, máy điểm danh tiến hành kiểm tra Key A Block 3 Sector 0 có khớp hay
không, nếu không khớp sẽ không cho phép sinh viên đó điểm danh vì đây là một thẻ giả
mạo. Nếu đúng, thiết bị điểm danh sẽ đọc UID thẻ và gửi UID thẻ này lên CSDL và ghi
nhận điểm danh thành công!

25
3.2. SƠ ĐỒ NGUYÊN LÍ HỆ THỐNG

Hình 3.2: Sơ đồ nguyên lý của mạch

3.3. THỰC THI HỆ THỐNG


3.3.1.Bảo mật thẻ và xác thực thẻ
a. Thiết kế ở máy thêm thẻ
Ta tiến hành giao tiếp ESP8266 với Module RC522 qua giao thức SPI
Sơ đồ kết nối chân cụ thể như sau:

Số chân Tên chân Mô tả


1 Vcc Nguồn 3.3VDC
2 RST D4
3 GND Nối đất
4 IRQ NC
5 MISO D6
6 MOSI D7
7 SCK D5
8 SDA D3
Bảng 3.1: Bảng kết nối chân giữa ESP8266 và RC522
Ở máy thêm thẻ, ta tiến hành một mảng 6 phần từ là và gán giá trị là 0xFF. Đây là
Key mặc định của nhà sản xuất, mục đích để xác thực key A và thay đổi Key A

for (byte i = 0; i < 6; i++) {

26
newKeyA.keyByte[i] = 0xff;

Tiếp theo ta tiến hành thay đổi Key A ở Block 3 Sector 0:

// Nhận thấy được thẻ!

if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {

// Thực hiện thay đổi khóa A của sector 0 nếu là thẻ mới

if (mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 0,
&newKeyA, &(mfrc522.uid)) == MFRC522::STATUS_OK) {

// Tạo dữ liệu mới cho khóa A (thay đổi giá trị theo ý muốn)

byte newKeyAData[16] = {0x00, 0x11, 0x22, 0x33, 0x44,


0x55,0xFF,0x07,0x80,0x69,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF};

// Thực hiện thay đổi khóa A

if (mfrc522.MIFARE_Write(3, newKeyAData, 16) == MFRC522::STATUS_OK) {

Serial.println("Thay đổi khóa A thành công!");

Serial.println("Đây là Key");

for(int k=0; k<6; k++)

Serial.print(newKeyAData[k],HEX);

Serial.print(" ");

} else {

Serial.println("Thay đổi khóa A không thành công!");

Sau đó ta sẽ tiến hành đọc UID thẻ và gửi UID thẻ CSDL.
b. Thiết kế ở máy điểm danh

27
Cũng như ở máy thêm thẻ, ta kết nối module RC522 với ESP8266 tương tự. Tuy nhiên ở
máy điểm danh, ta sẽ tạo một mảng 6 phần từ và gán giá trị lần lượt như sau:

key.keyByte[0] = 0x00;
key.keyByte[1] = 0x11;
key.keyByte[2] = 0x22;
key.keyByte[3] = 0x33;
key.keyByte[4] = 0x44;
key.keyByte[5] = 0x55;
Key này trùng khớp với key A Block 3 Sector 0 mà ở máy thêm thẻ chúng ta đã
thêm, mục đích để kiểm tra có trùng khớp hay không rồi mới tiến hành đọc UID thẻ
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;//got to start of loop if there is no card present
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;//if read card serial(0) returns 1, the uid struct contians the ID of the read
card.
}
byte status;
byte block = 3;
// Authenticate using key A
Serial.println(F("Authenticating using key A..."));
// Kiem tra Key A Sector 0 Block 3
status = (MFRC522::StatusCode)
mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block,
&key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();

28
}
else{
String CardID ="";
for (byte i = 0; i < mfrc522.uid.size; i++) {
CardID += mfrc522.uid.uidByte[i];
}

Đoạn code trên sẽ tiến hành kiểm tra Key A Block 3 Sector có hợp lệ hay không, nếu
sai sẽ không cho phép đọc UID thẻ, nếu đúng thì mới đọc UID thẻ rồi gửi đi.

3.3.2. Gửi dữ liệu lên CSDL & nhận dữ liệu trả về


ESP8266 sau khi đọc được UID thẻ sẽ tiến hành gửi UID thẻ lên CSDL.

Đoạn code sau mô tả quá trình gửi dữ liệu lên CSDL:

if(WiFi.isConnected()){

WiFiClientSecure *client = new WiFiClientSecure;

client->setInsecure(); //khai bao cho bao mat

HTTPClient https;

https.begin(*client, URL);

https.addHeader("Content-Type", "application/x-www-form-urlencoded"); //Specify


content-type header

String httpRequestData = "card_uid=" + String(Card_uid) + "&device_token=" +


String(device_token);

int httpCode = https.POST(httpRequestData); //Send the request

Serial.print("httpRequestData: ");

Serial.println(httpRequestData);

Serial.println(httpCode);

29
// nhan ve chuoi ki tu tu website

String payload = https.getString(); //Get the response payload

Nhóm chúng em sử dụng phương thức HTTP_POST để gửi dữ liệu, lúc ban đầu
nhóm có sử dụng thử phương thức HTTP_GET. Tuy nhiên ở máy chủ localhost thì hoạt
động bình thường, tuy nhiên khi deploy lên hosting thì gặp lỗi HTTP Code Respone 301.
Lỗi này được đề cập ở mục 2.3.2, nguyên nhân là do sử dụng chứng chỉ bảo mật SSL nên sẽ
bị lỗi này. Để khắc phục, nhóm đã chuyển sang phương thức HTTP_POST và đã truyền dữ
liệu lên CSDL thành công.

Payload là biến lưu trữ giá trị kiểu chuỗi khi giao tiếp với file php, nhóm đã thực hiện
câu lệnh echo, echo sẽ giúp gửi một chuỗi ngược về cho ESP8266 và ta dùng hàm
https.getString để thực hiện nhận chuỗi này và lưu vào biến payload.

Có rất nhiều dữ liệu trả về khác nhau trong nhiều trường hợp ở máy điểm danh và
máy thêm thẻ, tuy nhiên nhóm sẽ chọn 2 trường hợp tiêu biểu là lúc điểm danh vào và lúc
điểm danh ra. Khi ta tiến hành quẹt thẻ ở máy điểm danh, nếu thành công thì webserver sẽ
trả về chuỗi theo cú pháp: login-mssv-hovaten. Ví dụ với sinh viên Cao Văn Vinh được lưu
trên CSDL là Họ và tên: Cao Văn Vinh, MSSV: 21161386. Khi tiến hành đăng nhập vào thì
webserver sẽ trả về một chuỗi như sau: login21161386Cao Van Vinh. Ta sẽ sử dụng hàm
substring, một hàm tách chuỗi có sẵn để tách chuỗi này ra và hiển thị lên màn hình OLED.

if (payload.substring(0, 5) == "login") {

String mssv = payload.substring(5,13);

String user_name = payload.substring(13);

Từ vị trí số 0 đến 5 ta lấy được chữ login, tức là phát hiện người dùng quẹt thẻ điểm
danh vào, tiếp theo từ vị trí số 5 tới 13, ta sẽ lấy được MSSV, và từ vị trí 13 trở đi, ta sẽ lấy
được họ & tên sinh viên.

Tương tự khi quẹt thẻ đi ra, chúng ta nhận được chuỗi: logout21161386Cao Van
Vinh. Ta cũng sẽ tiến hành tách chuỗi:

else if (payload.substring(0, 6) == "logout") {

String mssv = payload.substring(6,14);

30
String user_name = payload.substring(14);

Ta dễ dàng biết rằng, đó là lúc sinh viên đó quẹt thẻ đi ra và hiển thị các thông tin cơ
bản lên màn hình OLED.

3.3.3. Xử lý dữ liệu phía Server.


Phía Server, nhóm sử dụng ngôn ngữ PHP để tiến hành các thao tác CRUD trên cơ sở
dữ liệu. Một trong những tệp php quan trọng nhất là tệp getdata.php, đây là tệp có chức
năng trung gian hỗ trợ giao tiếp giữ ESP8266 và CSDL, cũng như truyền về các dữ liệu cần
thiệt cho ESP8266.

Giải thích các file:


- Index.php: Là trang chủ của web, khi truy cập rfid.vinhcaodabase.com thì sẽ được
trỏ về trang này.
- File login.php: tiến hàng kiểm tra session xem đã đăng nhập hay chưa, nếu chưa
đăng nhập thì mọt trang khác sẽ tự động trỏ về file này để yêu cầu đăng nhập.
- File list.php: File này thực hiện đọc dữ liệu và hiển thị ra toàn bộ thông tin sinh
viên tồn tại trên hệ thống.
- File ManageUsers.php: File này có chức năng thêm, xoá, sửa dữ liệu cho các thẻ
RFID. Đồng thời sử dụng kỹ thuật ajax. Khi ta thêm thẻ mới ở máy thêm thẻ thì
UID sẽ tự động cập nhật lên đây và chúng ta có thể dễ dàng thay đổi thông tin ở
file này.
- File UsersLog.php: Hiển thị toàn bộ dữ liệu, lịch sử đăng nhập của sinh viên. Dữ
liệu truy xuất chỉ một ngày.
- File devices.php: Giúp thay đổi chế độ là máy thêm thẻ hay là máy điểm danh.
Đồng thời ta có thể tạo thêm những máy mới ở mục này.
- File update_tai_khoan_admin.php: Để cập nhật lại thông tin cho tài khoản admin
- File logout.php: File này kết thúc phiên đăng nhập khi gọi file này
- File header.php: Khi thiết kế một website thì phải có thanh điều hướng, hay còn
gọi là navigations. Thanh điều hướng này nằm ở mọi trang ở website để giúp
chúng ta điều hướng dễ dàng. Vì vậy nhóm tạo một file tên header.php để tạo các
liên kết chuyển hướng. Và gọi file này ở cho các file ở trên để dễ dàng thao tác và
quản lý.

31
3.3.4 Thiết kế layout

Hình 3.3: Thi công trên Breadboard

3.3.5 Thi công mạch thực tế

Hình 3.4 Hình ảnh sản phẩm thực tế


3.

32
3.3.6. Lập trình hệ thống
Lập trình cho ESP8266

Hình 3.4: Lập trình trên ESP8266 với Arduino IDE


Lập trình phía Server với PHP

Hình 3.5: Lập trình phía Server với Visual Studio Code

33
Đẩy code lập trình lên File Manager
Những code lập trình được nhóm tiến hành đẩy dữ liệu lên File Manager. Filer
Manager là một công cụ trong Cpanel. Trước đó, nhóm đã đăng kí tên miền và hosting
riêng. Địa chỉ tên miền có tên https://diemdanhsinhvien.vinhcaodatabase.com

Tiếp theo, nén những file xử lý phía server lại dưới dạng .zip, vì file manager hỗ trợ
giải nén dưới dạng .zip. Sau khi giải nén, ta được các file sau:

Hình 3.7: Các file sau khi được giải nén và được nằm trong folder thuctapnhung
Tạo Table trong phpmyAdmin
Tiếp theo, upload file sql để tạo database.

Hình 3.8: Upload file Spl để tạo database


Thay đổi lại các cấu hình kết nối tới database:

34
Hình 3.9 : Thay đổi các cấu hình kết nối tới database
3.4. KẾT QUẢ

Hình 3.10: Hình ảnh kết quả sản phẩm


35
Hình 3.11: Giao diện trang đăng nhập web

Hình 3.12: Giao diện trang chủ sau khi đăng nhập vào

36
Hình 3.13: Danh sách đăng nhập theo thời gian thực

Hình 3.14: Thẻ của các thành viên trong nhóm dành để điểm danh

37
CHƯƠNG 4: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN

4.1 KẾT LUẬN


Nhìn chung, sản phẩm đầu ra đã được những yêu cầu ban đầu. Hệ thống hoạt động tốt
và ổn định trong suốt thời gian thử nghiệm. Trang web thân thiện và và dễ sử dụng.

4.2 HẠN CHẾ


- Hệ thống thiết kế cố định, cần nạp lại code thay đổi wifi mỗi khi di chuyển.
- Chưa tạo trang tra cứu cho sinh viên mà chỉ dừng lại ở admin.

4.3 HƯỚNG PHÁT TRIỂN


Sản phẩm này thực hiện trong thời gian ngắn và gấp rút, cùng với kinh nghiệm non trẻ
nên hệ thống còn nhiều hạn chế. Trong tương lai, nhóm sẽ cố gắng tạo một trang đăng nhập
bằng chế độ AP Mode trên ESP8266 và lưu Wifi, Password vào EEPROM. Tiếp tục xây
dựng một trang tra cứu hoàn chỉnh cho sinh viên, đồng thời tích hợp thêm camera, mỗi lần
quẹt thẻ sẽ chụp lại hình ảnh. Cuối cùng, xây dựng thêm chức năng xuất file Excel để dễ
dàng quản lý hơn nữa.

38
TÀI LIỆU THAM KHẢO

Sách tham khảo

[1] Ths. Nguyễn Văn Hiệp, “Công nghệ nhận dạng bằng sóng vô tuyến”, Nhà xuất bản Đại
học Quốc gia Thành phố Hồ Chí Minh, 2014

[2] Sandip Lahiri, “RFID SourceBook”, Prentice Hall PTR, 31/08/2005.

[3] Một số trang web liên quan:

https://kysungheo.com/

https://randomnerdtutorials.c

39
PHỤ LỤC
Code máy thêm thẻ:

//RFID-----------------------------
#include <SPI.h>
#include <MFRC522.h>
//NodeMCU--------------------------
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
//OLED---------------------------
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

//************************************************************************
#define SS_PIN D3 //D8
#define RST_PIN D4 //D3

#define SCREEN_WIDTH 128 // OLED display width, in pixels


#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// khai bao cau hinh oled


#define OLED_RESET -1 // Reset pin
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire,
OLED_RESET);

//************************************************************************
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
MFRC522::MIFARE_Key newKeyA;
//************************************************************************
const char *ssid = "Duy Binh";
const char *password = "12346789";
const char* device_token = "768cf8f7c951803e";
//************************************************************************
// String URL = "http://192.168.102.74/project_rfid/getdata.php";
String URL = "https://diemdanhsinhvien.vinhcaodatabase.com/getdata.php";
String getData, getmssv, Link;
String OldCardID = "";
unsigned long previousMillis = 0;
int dem=0, i = 0;
//************************************************************************
void setup() {
delay(1000);
Serial.begin(115200);
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
//---------------------------------------------
40
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.display();
//-------------------
connectToWiFi();
display.clearDisplay();

//key A mac dinh tu NSX


for (byte i = 0; i < 6; i++) {
newKeyA.keyByte[i] = 0xff;
}

}
//************************************************************************
void loop() {
if(!WiFi.isConnected()){
connectToWiFi();
}
if(WiFi.isConnected()){
if(dem==0) {
//############OLED#############////
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,20);
display.print("KET NOI THANH CONG!");
display.setCursor(0,30);
display.print("SSID: "); display.print(ssid);
display.setCursor(0,40);
display.print("IP: "); display.print(WiFi.localIP());
display.display();
delay(3000);
dem++;
//############OLED#############////
}
}
WRITE_TAG();
}

void WRITE_TAG()
{
// Nhận thấy được thẻ!
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
// Thực hiện thay đổi khóa A của sector 0 nếu là thẻ mới

41
if (mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 0,
&newKeyA, &(mfrc522.uid)) == MFRC522::STATUS_OK) {
// Tạo dữ liệu mới cho khóa A (thay đổi giá trị theo ý muốn)
byte newKeyAData[16] = {0x00, 0x11, 0x22, 0x33, 0x44,
0x55,0xFF,0x07,0x80,0x69,0xFF,0xFF ,0xFF,0xFF,0xFF,0xFF};
// Thực hiện thay đổi khóa A
if (mfrc522.MIFARE_Write(3, newKeyAData, 16) == MFRC522::STATUS_OK) {
Serial.println("Thay đổi khóa A thành công!");
Serial.println("Đây là Key");
for(int k=0; k<6; k++)
{
Serial.print(newKeyAData[k],HEX);
Serial.print(" ");
}
} else {
Serial.println("Thay đổi khóa A không thành công!");
}
}
else {
Serial.println("Thẻ này đã được thay đổi khoá A từ trước!");
}
//Gửi UID thẻ lên khi đã thay đổi khoá A!
String CardID ="";
for (byte i = 0; i < mfrc522.uid.size; i++) {
CardID += mfrc522.uid.uidByte[i];
}
SendCardID(CardID);
delay(1000);
//Gửi UID thẻ lên khi đã thay đổi khoá A!
}

// Ghi 1 lan khi quet the


mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
}

//************send the Card UID to the website*************


void SendCardID( String Card_uid ){
Serial.println("Sending the Card ID");
//############OLED#############////
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE); // 'inverted' text
display.setCursor(10,28);
display.println("Sending the Card ID");

42
display.display();
//############OLED#############////
if(WiFi.isConnected()){
// neu wifi da ket noi thi thuc hien phuong thuc http post
WiFiClientSecure *client = new WiFiClientSecure;
client->setInsecure(); //khai bao cho bao mat
HTTPClient https;
//

https.begin(*client, URL);
https.addHeader("Content-Type", "application/x-www-form-urlencoded"); //Specify
content-type header

String httpRequestData = "card_uid=" + String(Card_uid) + "&device_token=" +


String(device_token);

int httpCode = https.POST(httpRequestData); //Send the request


// String payload = https.getString(); //Get the response payload
Serial.print("httpRequestData: ");
Serial.println(httpRequestData);
Serial.println(httpCode);
// nhan ve chuoi ki tu tu website
String payload = https.getString(); //Get the response payload
// // Serial.println(Link); //Print HTTP return code

// Serial.println(httpCode); //Print HTTP return code


Serial.println(Card_uid); //Print Card ID
Serial.println(payload); //Print request response payload
//############OLED#############////
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE); // 'inverted' text
if (httpCode == -1) {
display.setCursor(0,30);
display.println("KHONG THE KET NOI TOI DATABASE");
}
display.setCursor(0,40);
display.println(payload);
display.display();
//############OLED#############////

if (httpCode == 200) {

if (payload == "succesful") {

43
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,20);
display.print("ID THE:");
display.println(Card_uid); //Print Card ID
display.setCursor(0,30);
display.println("THEM THE THANH CONG!");
display.print("KIEM TRA TREN WEBSITE");
display.display();
delay(2000);
display.clearDisplay();
}
else if (payload == "available") {
//############OLED#############////
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,20);
display.print("ID THE:");
display.println(Card_uid); //Print Card ID
display.setCursor(0,30);
display.println("THE DA TON TAI! ");
display.print("VUI LONG THU THE KHAC");
display.display();
delay(2000);
display.clearDisplay();
//############OLED#############////
}

}
delay(100);
https.end(); //Close connection
}

//********************connect to the WiFi******************


void connectToWiFi(){
WiFi.mode(WIFI_OFF); //Prevents reconnection issue (taking too long to connect)
delay(1000);
WiFi.mode(WIFI_STA);

Serial.print("Connecting to ");

44
Serial.println(ssid);
WiFi.begin(ssid, password);
//############OLED#############////
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE); // 'inverted' text
display.setCursor(0,20);
display.print("DANG KET NOI WIFI");
display.setCursor(0,30);
display.print("SSID: "); display.print(ssid);
//############OLED#############////
while (WiFi.status() != WL_CONNECTED) {
delay(999); i++;
Serial.print(".");
display.setCursor(45,40);
display.setTextColor(BLACK,WHITE);
display.print(" ");
display.print(i);
display.print("s ");
display.display();
}

Serial.println("");
Serial.println("Connected");

Serial.print("IP address: ");


Serial.println(WiFi.localIP()); //IP address assigned to your ESP

delay(1000);
}
//
=================================================================
======

CODE MÁY ĐIỂM DANH:

//RFID-----------------------------
#include <SPI.h>
#include <MFRC522.h>
//NodeMCU--------------------------
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
//OLED---------------------------
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>

//************************************************************************

45
#define SS_PIN D3 //D8
#define RST_PIN D4 //D3

#define i2c_Address 0x3c //initialize with the I2C addr 0x3C Typically eBay OLED's
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // QT-PY / XIAO
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT,
&Wire, OLED_RESET);
//************************************************************************
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
MFRC522::MIFARE_Key key;
//************************************************************************
const char *ssid = "Duy Binh";
const char *password = "12346789";
const char* device_token = "7b458c9f230c9cf7";
//************************************************************************
// String URL = "http://192.168.102.74/project_rfid/getdata.php";
String URL = "https://diemdanhsinhvien.vinhcaodatabase.com/getdata.php";
String getData, getmssv, Link;
String OldCardID = "";
unsigned long previousMillis = 0;
int dem=0;
//************************************************************************
void setup() {
delay(1000);
Serial.begin(115200);
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
//---------------------------------------------

display.begin(i2c_Address, true);
display.display();
//-------------------
connectToWiFi();
display.clearDisplay();
// gan gia tri de chuyan bi kiem tra
key.keyByte[0] = 0x00;
key.keyByte[1] = 0x11;
key.keyByte[2] = 0x22;
key.keyByte[3] = 0x33;
key.keyByte[4] = 0x44;
key.keyByte[5] = 0x55;

}
//************************************************************************
void loop() {

46
if(!WiFi.isConnected()){
connectToWiFi();
}
if(WiFi.isConnected()){
if(dem==0) {
//############OLED#############////
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
display.setCursor(0,20);
display.print("KET NOI THANH CONG!");
display.setCursor(0,30);
display.print("SSID: "); display.print(ssid);
display.setCursor(0,40);
display.print("IP: "); display.print(WiFi.localIP());
display.display();
delay(3000);
dem++;
//############OLED#############////
}
}
READ_TAG();
}

void READ_TAG()
{
//---------------------------------------------
// if (millis() - previousMillis >= 15000) {
// previousMillis = millis();
// OldCardID="";
// }
// delay(50);
//---------------------------------------------
//look for new card
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;//got to start of loop if there is no card present
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;//if read card serial(0) returns 1, the uid struct contians the ID of the read card.
}
byte status;
byte block = 3;
// Authenticate using key A
Serial.println(F("Authenticating using key A..."));
//############OLED#############////
display.clearDisplay();

47
display.setTextSize(1);
display.setTextColor(SH110X_WHITE); // 'inverted' text
display.setCursor(0,30);
display.println("Dang xac thuc the...");
display.display();
display.clearDisplay();
//############OLED#############////
// Kiem tra KEy A Sector 0 Block 3
status = (MFRC522::StatusCode)
mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key,
&(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
//############OLED#############////
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE); // 'inverted' text
display.setCursor(0,30);
display.println("XAC THUC THE THAT BAI");
display.display();
delay(2000);
display.clearDisplay();
//############OLED#############////
}
else{
String CardID ="";
for (byte i = 0; i < mfrc522.uid.size; i++) {
CardID += mfrc522.uid.uidByte[i];
}
//---------------------------------------------
// if( CardID == OldCardID ){
// return;
// }
// else{
// OldCardID = CardID;
// }
Serial.println(CardID);
SendCardID(CardID);
delay(1000);

}
// Ghi 1 lan khi quet the
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
}

48
//************send the Card UID to the website*************
void SendCardID( String Card_uid ){
Serial.println("Sending the Card ID");
//############OLED#############////
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE); // 'inverted' text
display.setCursor(10,28);
display.println("Sending the Card ID");
display.display();
//############OLED#############////
if(WiFi.isConnected()){
WiFiClientSecure *client = new WiFiClientSecure;
client->setInsecure(); //don't use SSL certificate
HTTPClient https;
// String postData = "card_uid=" + Card_uid + "&device_token=" + device_token;

https.begin(*client, URL);
https.addHeader("Content-Type", "application/x-www-form-urlencoded"); //Specify
content-type header

String httpRequestData = "card_uid=" + String(Card_uid) + "&device_token=" +


String(device_token);

int httpCode = https.POST(httpRequestData); //Send the request


// String payload = https.getString(); //Get the response payload
Serial.print("httpRequestData: ");
Serial.println(httpRequestData);
Serial.println(httpCode);

// HTTPClient http; //Declare object of class HTTPClient


// //GET Data
// getData = "?card_uid=" + String(Card_uid) + "&device_token=" +
String(device_token); // Add the Card ID to the GET array in order to send it
// //GET methode
// Link = URL + getData;
// http.begin(Link); //initiate HTTP request
// Serial.println(Link);
// int httpCode = http.GET(); //Send the request
String payload = https.getString(); //Get the response payload
// // Serial.println(Link); //Print HTTP return code

// Serial.println(httpCode); //Print HTTP return code

49
Serial.println(Card_uid); //Print Card ID
Serial.println(payload); //Print request response payload
//############OLED#############////
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE); // 'inverted' text
if (httpCode == -1) {
display.setCursor(0,30);
display.println("KHONG THE KET NOI TOI DATABASE");
}
display.setCursor(0,40);
display.println(payload);
display.display();
//############OLED#############////

if (httpCode == 200) {
if (payload.substring(0, 5) == "login") {
String mssv = payload.substring(5,13);
String user_name = payload.substring(13);
//############OLED#############////
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE); // 'inverted' text
display.setCursor(0,20);
display.print("ID THE:");
display.println(Card_uid); //Print Card ID
display.setCursor(30,30);
display.println("Xin chao");
display.setCursor(15,40);
display.println(user_name);
display.setCursor(0,50);
display.print("MSSV:");
display.println(mssv);
display.display();
delay(2000);
display.clearDisplay();
//############OLED#############////

}
else if (payload.substring(0, 6) == "logout") {
String mssv = payload.substring(6,14);
String user_name = payload.substring(14);
//############OLED#############////
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE); // 'inverted' text

50
display.setCursor(0,20);
display.print("ID THE:");
display.println(Card_uid); //Print Card ID
display.setCursor(30,30);
display.println("Tam biet");
display.setCursor(15,40);
display.println(user_name);
display.setCursor(0,50);
display.print("MSSV:");
display.println(mssv);
display.display();
delay(2000);
display.clearDisplay();
//############OLED#############////

else if (payload.substring(0, 10) == "Not found!") {


//############OLED#############////
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
display.setCursor(0,20);
display.print("ID THE:");
display.println(Card_uid); //Print Card ID
display.setCursor(0,30);
display.println("THE KHONG TON TAI!");
display.display();
delay(2000);
display.clearDisplay();
//############OLED#############////
// Serial.println(user_name);

}
else if (payload.substring(0, 12) == "Not Allowed!") {
//############OLED#############////
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
display.setCursor(0,20);
display.print("ID THE:");
display.println(Card_uid); //Print Card ID
display.setCursor(0,30);
display.println("SINH VIEN KHOA KHAC!");
display.setCursor(0,40);
display.println("KHONG THE DIEM DANH!");
display.display();

51
delay(2000);
display.clearDisplay();
}
}
delay(100);
https.end(); //Close connection
}

//********************connect to the WiFi******************


void connectToWiFi(){
WiFi.mode(WIFI_OFF); //Prevents reconnection issue (taking too long to connect)
delay(1000);
WiFi.mode(WIFI_STA);

Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
//############OLED#############////
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE); // 'inverted' text
display.setCursor(0,20);
display.print("DANG KET NOI WIFI");
display.setCursor(0,30);
display.print("SSID: "); display.print(ssid);

//############OLED#############////
int i = 0;
while (WiFi.status() != WL_CONNECTED) {

delay(999); i++;
Serial.print(".");
display.setCursor(45,40);
display.setTextColor(SH110X_BLACK,SH110X_WHITE);
display.print(" ");
display.print(i);
display.print("s ");
display.display();
}

Serial.println("");
Serial.println("Connected");

Serial.print("IP address: ");

52
Serial.println(WiFi.localIP()); //IP address assigned to your ESP

delay(1000);
}
//
=================================================================
======

53

You might also like