Sau quá trình nghiên cứu và hoàn thiện sản phẩm, nhóm xin đề ra một số hướng phát triển sau: Tạo một địa chỉ website online để tiện cho việc đăng nhập và theo dõi
đúng bằng loa. Xây dựng thêm chức năng log out cho web và app để dễ dàng thay đổi tài khoản khi có nhu cầu, thiết kế thêm chức năng đăng kí tài khoản. Có thể thay đổi trực tiếp hình ảnh trên điện thoại và đồng thời xây dựng app tương thích được trên điện thoại sử dụng hệ điều hành IOS và trên Window. Thiết kế một bộ nguồn riêng có chức năng hiển thị dung lượng của pin để người dễ dàng quan sát và tiến hành sạc.
TÀI LIỆU THAM KHẢO
[1] Nguyễn Thị Quỳnh, “Nghiên cứu ứng dụng RFID vào thực tế”, Đại học CNTT, (http://doc.edu.vn), ngày truy cập: 14/5/2020.
[2] Th.s Phạm Nguyễn Hoài An, “Tìm hiểu về RFID”, Đại học Kinh Tế Đà Nẵng, (https://123doc.net/), ngày truy cập: 14/5/2020.
[3] Mai Văn Tráng, Lê Thị Quỳnh Trang, “Ứng dụng công nghệ RFID trong quản lí sinh viên ra vào phòng thí nghiệm”, Đại Học Công Nghệ, (https://123doc.net/), ngày truy cập: 15/5/2020.
[4] Ivan Duroc, “RFID: A key technology for Humanity”, (https://www.sciencedirect.com), ngày truy cập: 26/6/2020.
[5] Xiaolin Jia, Quanyuan Feng, Taihua Fan, Quanshui Lei “RFID Technology and Its Applications in Internet of Things (IOT)” (https://www.semanticscholar.org/), ngày truy cập: 14/06/2020.
[6] Chang-I Chen, Cheng-Yaw Liu, Yu-Chuan Li, Chia- Cheng Chao,Chien- Tsai Liu,Chieh-Feng Chen, Ching-Feng Kuan “The Application of RFID to Improve Patient Safety in Observation Unit of Hospital Emergency Department”, (https://www.researchgate.net/), ngày truy cập: 18/07/2020
[7] Jason Miller, “What is Automatic Identification and Data Capture (AIDC)?”, (https://www.abr.com), ngày truy cập: 10/06/2020.
[8] “WHAT IS RFID”, (https://www.atlasrfidstore.com), ngày truy cập: 14/05/2020.
[9] “What is RFID?”, (https://www.epc-rfid.info), ngày truy cập: 22/5/2020. [10] “Web sever là gì?”, (https://developer.mozilla.org/), ngày truy cập: 14/06/2020.
[11] “Web Server Là Gì - Chức Năng Của Web Server”, (https://firerox.org), ngày truy cập: 6/6/2020.
[12] Hải Giang, “HTML là gì? Giải thích rõ về ngôn ngữ Markup Hypertext”, (https://www.hostinger.vn/), ngày truy cập 14/02/2020.
[13] Đỗ Đức Đình Đạt, “XAMPP là gì? Cách cài đặt và sử dụng XAMPP trên Windows và Linux”, (matbao.net), ngày truy cập 24/04/2020.
[14] Hải Giang, “JavaScript là gì? Giới thiệu cơ bản về JS cho người mới bắt đầu”, (https://www.hostinger.vn/), ngày truy cập 24/04/2020.
[15] Hạnh Thịnh, “Git bash là gì?”, (www.bkns.vn), ngày truy cập 24/02/2020. [16] “Cáp chuyển đổi PL2303HX”, (https://www.dientu4u.com), ngày truy cập 22/10/2019.
[17] “Hướng dẫn tạo project Android Studio”, (http://giasutinhoc.vn/), ngày truy cập 22/04/2020.
[18] “MFRC522_Datasheet”, (https://app.box.com/), ngày truy cập 25/04/2020.
[19] “Module RFID NFC PN532”, (https://iotlabchannel.com/), ngày truy cập 25/04/2020.
[20] “Module RFID NFC RDM6300”, (https://iotlabchannel.com/), ngày truy cập 26/04/2020.
[21] “Thu phát wifi ESP8266 12F”, (https://nshopvn.com/), ngày truy cập 26/04/2020.
[22] “Oled 0.96 inch”, (https://hshop.vn), ngày truy cập 26/04/2020.
[23] “Mạch nguồn giảm áp DC mini 3A”, (https://nshopvn.com/), ngày truy cập 25/05/2020.
[24] “Miếng dán Thẻ từ RFID 13.56MHZ”,( https://iotlabchannel.com/), ngày truy cập 26/04/2020.
PHỤ LỤC CODE WEBSERVER:
CHƯƠNG TRÌNH CHÍNH
var mysql = require('mysql'); var pool = mysql.createPool({ connectionLimit: 20,
host: "localhost", user: "root", password: "", dateStrings: true,
database: "rfid" // Tên database });
exports.queryDisplayInfo = () => {
return new Promise(function (resolve, reject) {
pool.query("SELECT * FROM info;", function (err, rows, fields) { if (err) reject(err); if (rows.length > 0) { resolve(rows); } else resolve("queryDisplayInfo-ERROR"); }); }); } exports.queryDisplayInfoByID = (id) => {
let sql = `SELECT * from info where id = '${id}'` return new Promise(function (resolve, reject) { pool.query(sql, function (err, rows, fields) { if (err) reject(err);
if (rows.length > 0) { resolve(rows); } else resolve("queryDisplayInfoByID-ERROR"); }); }); } exports.updateInfo = (info) => {
let sql = `UPDATE info SET name = '${info.name}', age = '${info.age}', address = '${info.address}', \
sex = '${info.sex}', phone = '${info.phone}'\ WHERE id = '${info.id}';`
return new Promise((resolve, reject) => { pool.query(sql, function (err, rows, fields) { if (err) reject(err);
resolve("updateInfo-SUCCESS"); });
}) }
exports.insertInfo = async (info) => {
var result = await this.queryDisplayInfoByID(info.id); let sql = ``;
exports.setIndexExcel = (value)=>{
let sql = `UPDATE id SET value = '${value}' WHERE id='3' ;` return new Promise((resolve, reject) => {
pool.query(sql, function (err, rows, fields) { // Truy vấn if (err) resolve('setIndexExcel-ERROR');
else resolve("setIndexExcel-SUCCESS"); });
}) }
CODE ANDROID STUDIO
package com.example.rfidmonitor import android.os.Bundle import android.os.Handler import android.os.Looper import android.util.Log import android.view.View import android.widget.Button import android.widget.ImageView import android.widget.ListView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.squareup.picasso.Picasso import kotlinx.android.synthetic.main.activity_main.* import org.json.JSONObjec
class MainActivity : AppCompatActivity() {
private val ip :String = "http://192.168.43.138:3000" private val linkAPI: String = "/api/app_get_data" private val imageFolder: String = "/uploads/" private val url :String = ip + linkAPI
private val imageURL: String = ip + imageFolder private var list = mutableListOf<Model>()
private var userToken: String = ""
val mainHandler = Handler(Looper.getMainLooper())
private var runnable = object : Runnable { override fun run() { updateData()
mainHandler.postDelayed(this, 2000) }
}
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) // Chạy giao diện activity_main.xml
val lv_data = findViewById<ListView>(R.id.lv_data)
val bt_update = findViewById<Button>(R.id.bt_update) bt_update.visibility = View.VISIBLE; userToken = intent.getStringExtra("token")!! list.add(0, Model("ID:","")) list.add(1, Model("Name:","")) list.add(2, Model("Age:","")) list.add(3, Model("Gender:","")) list.add(4, Model("Address:","")) list.add(5, Model("Phone:",""))
lv_data.adapter = ListViewAdapter(applicationContext, R.layout.row, list) }
override fun onStop() { super.onStop()
mainHandler.removeCallbacks(runnable) }
override fun onResume() { super.onResume() mainHandler.post(runnable) bt_update.setOnClickListener(){ updateData() android.widget.Toast.makeText(applicationContext, "Updated", android.widget.Toast.LENGTH_SHORT).show() } }
private fun updateData() {
val jsonToken: JSONObject = JSONObject() jsonToken.put("token", userToken)
postJson(jsonToken) }
private fun postJson(jsonData: JSONObject) {
val jsonRequest = com.android.volley.toolbox.JsonObjectRequest( com.android.volley.Request.Method.POST, url, jsonData,
com.android.volley.Response.Listener { response -> Log.d("response", response.toString())
var id: String = "" var name: String = "" var age: String = "" var sex: String = "" var address: String = "" var phone: String = ""
var imageName: String = imageURL if (response["result"].toString() != "null"){
val responseJSONArray = response.getJSONArray("result") for (i in 0 until responseJSONArray.length()) { val actor = responseJSONArray.getJSONObject(i)
id = actor.getString("id") name = actor.getString("name") age = actor.getString("age") sex = actor.getString("sex") address = actor.getString("address") phone = actor.getString("phone") imageName += actor.getString("image") }
Picasso.with(applicationContext) // .load(imageName) .into(img_avatar) } else{ id = "Empty Data" name = "Empty Data" age = "Empty Data" sex = "Empty Data" address = "Empty Data" phone = "Empty Data"
img_avatar.setImageResource(R.drawable.avartar_logo) } list[0] = Model("ID:",id) list[1] = Model("Name:",name) list[2] = Model("Age:",age) list[3] = Model("Gender:",sex) list[4] = Model("Address:",address) list[5] = Model("Phone:",phone) lv_data.adapter = ListViewAdapter(applicationContext, R.layout.row, list) } } } CODE PHẦN CỨNG #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h> #include <ArduinoJson.h>
/*===================Request link==============*/
#define REQUEST_LINK "http://192.168.0.118:3000/api/id_from_client" /*===================Wifi======================*/
const char* ssid = "#404*Not found"; const char* pwdWifi = "hunicute";
/*===================RFID======================*/ #include <MFRC522.h> #define RST_PIN 15 #define SS_PIN 2 MFRC522 mfrc522(SS_PIN, RST_PIN); String readCard() {
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent()) { delay(50);
return String(""); }
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial { delay(50);
return String(""); }
// dump cardid bytes to hex string String strID="";
for (byte i = 0; i < mfrc522.uid.size; i {
String valHex = String(mfrc522.uid.uidByte[i],HEX); if(valHex.length() == 1) {
}
strID+=valHex; }
strID.toUpperCase();
return strID; // tra gia tri ID the }