Professional Documents
Culture Documents
Baocaocuoiki3 0
Baocaocuoiki3 0
Baocaocuoiki3 0
---------------------------------
ĐỒ Á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
---------------------------------
ĐỒ Á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
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Ụ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 .
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!
vii
LIỆT KÊ BẢNG
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
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
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
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.
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.
Đố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.
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
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
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
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 …
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
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.
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:
22
Lưu đồ giải thuật máy điểm danh sinh viên:
23
Hình 2.20: Sơ đồ cách thức hoạt động của kỹ thuật AJAX
24
CHƯƠNG 3: TÍNH TOÁN – THIẾT KẾ, THI CÔNG & KẾT QUẢ
25
3.2. SƠ ĐỒ NGUYÊN LÍ HỆ THỐNG
26
newKeyA.keyByte[i] = 0xff;
// 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)
Serial.println("Đây là Key");
Serial.print(newKeyAData[k],HEX);
Serial.print(" ");
} else {
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.
if(WiFi.isConnected()){
HTTPClient https;
https.begin(*client, URL);
Serial.print("httpRequestData: ");
Serial.println(httpRequestData);
Serial.println(httpCode);
29
// nhan ve chuoi ki tu tu website
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") {
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:
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.
31
3.3.4 Thiết kế layout
32
3.3.6. Lập trình hệ thống
Lập trình cho ESP8266
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.
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.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
38
TÀI LIỆU 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
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
//************************************************************************
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();
}
//************************************************************************
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!
}
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
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
}
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");
delay(1000);
}
//
=================================================================
======
//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
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, 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
}
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");
52
Serial.println(WiFi.localIP()); //IP address assigned to your ESP
delay(1000);
}
//
=================================================================
======
53