基于RFID的防伪系统设计
基于RFID的防偽系統設計
近幾年來,由于茶葉質量安全危機頻繁發生,引起了廣大消費者的關注,如何對茶葉質量安全進行有效追蹤與追溯,已成為一個急需解決的課題。利用RFID技術建立一個茶葉質量安全追蹤與追溯體系,一旦發現茶葉存在質量安全的問題,通過RFID讀寫器讀寫貼合在茶葉產品上帶有唯一標識的RFID標簽,結合茶葉產品數據庫就可以對茶葉質量進行跟蹤與追溯,查清哪個環節出了問題。本文主要針對茶葉質量安全進行追蹤與追溯研究。
關鍵詞: RFID,防偽系統,茶葉溯源,數據庫
Fragile RFID-based security systems tea
IN recent years, due to the frequent occurrence of tea quality and safety crisis, causing the concerns of consumers, how to tea quality and safety for effective tracking and tracing, has become an urgent problem to be solved. The use of RFID technology to establish a tea quality and safety tracking and tracing system, once found in tea quality and safety issues, through the RFID reader to read and write RFID tags with lamination uniquely identified on tea products, tea products combine the database can tea quality tracking and tracing, to identify which aspects of a problem. Tracking and tracing paper mainly research on tea quality and safety.
Key Words: RFID,Security systems,Origin of tea,database
論文+代碼下載地址:下載地址
目錄:
第1章 緒論 1
1.1 研究背景 1
1.2 研究意義 1
1.3 研究內容 2
第2章 茶葉物流追溯系統支撐技術 3
2.1 RFID技術 3
2.1.1 RFID系統工作原理 3
2.1.2 RFID標簽 3
2.1.3 讀寫器 4
2.1.4 RFID技術特點與優勢 5
2.2 Visual Studio技術 5
2.3 My Sql 5
2.4 c#語言 6
第3章 茶葉防偽的數據庫的設計 7
3.1 數據庫 7
第4章 基于茶葉防偽的系統設計 9
4.1 功能設計 9
4.2 概要設計 9
4.3 詳細設計 10
4.3.1 茶葉種植 10
4.3.2 茶葉采摘 10
4.3.3 茶葉加工 11
4.3.4 茶葉銷售 11
4.4 用戶界面邏輯設計 12
4.4.1 茶葉采摘錄入界面 12
4.4.2 用戶查詢防偽界面 13
第5章 系統測試 14
5.1 完成采摘環節 14
5.2 完成所有環節 15
5.3 假冒偽劣產品 16
結論 17
參考文獻 18
致謝 19
附錄1 部分關鍵源碼及解釋 20
附錄2 翻譯 31
RFID技術
什么是RFID,RFID就是一種利用空間耦合來自動實現捕獲目標對象并且獲得相關數據的技術,如果你的標簽發出的頻率在讀卡器的接收頻率范圍內,就能成功讀取信息。比如我們日常出入的小區大門中就有使用到。RFID與讀卡器的結合不需要硬件上的連接,也就是說不需要焊在一起等,也不需要像二維碼,需要攝像頭掃描清楚二維碼的圖像才能成功掃描,RFID發出的無線電就像無孔不入的信息流,只要有配對的讀卡器,像淘寶上買的手持式讀卡器,讀寫距離可以延伸到幾百米,實用性很強操作方便。
2.1.1 RFID系統工作原理
RFID系統主要是由電子標簽、讀寫器還有PC終端三大部分組成。工作原理就是我們物理中學習到的:rfid標簽與讀卡器主要通過磁場來互相傳遞能量和相關信息,當RFID標簽進入磁場,讀寫器發出的操作需求,RFID可以自行接收,此時感應線圈將被激活,同時RFID將信息傳到讀卡器再通過讀卡器翻譯后發到電腦端,便于操作人員使用
2.1.2 RFID標簽
RFID標簽就是向讀卡器發射信號的,電子標簽由天線、線圈、存儲器和集成電路組成,電子標簽最大的特點莫過于他的唯一性,這也是他能夠成功防偽的特點之一。下面我們將從三個部分來說說這個RFID標簽
(1)主動式標簽。何為主動式標簽,就是自己能提供能量發送信號。并且由于這個特點,他的讀寫距離遠,但是呢,沒有十全十美的東西,這種標簽也是如此,因為本身帶有電源,一旦電源耗盡電量,他的所有優點就會變成缺點,這樣一來,隨著使用次數越來越多,傳輸距離也有可能從幾百米縮短到幾米甚至幾厘米。這樣就太不穩定了。
(2)被動式標簽。被動式標簽相對于上面那種最大的區別就是沒有電源,所以在使用的時候,就需要外界給予刺激,讀卡器就承擔了這份工作。被動式標簽的最大特點就是耐用,可以說這是一個永久牌的標簽,只要沒有特殊原因導致標簽損壞,他就還能用。人無完人,他也是有缺點的,相較于前者,他并沒有那么長的讀寫距離。信號強點,可以讀的遠一點,信號弱的話,距離就會更近。
(3)半主動式標簽。第三種標簽叫做半主動式標簽,他是比較中肯的一款產品,集聚了上面兩款的優點,既有電源,使得讀寫距離比被動式遠,又耐用,這樣比較中肯的產品也深受企業家的喜愛,像我們圖書館,宿舍門禁實用的門禁卡,多數使用的就是這一種標簽。
2.1.3 讀寫器
讀寫器就是與標簽配套使用的讀取標簽信息的工具。讀取到信息后,再將翻譯后的信息發送到電腦端,讀寫器既能讀,也可以寫。讀寫器一般是由天線、射頻模塊和讀寫模塊組成。除此之外,讀寫器還分為固定式讀寫器和手持式讀寫器兩種,一般來說,手持式使用更加方便,但是制作成本更大,也是的價格略高,在某寶上,固定式讀寫器只需一兩百,而手持式至少上千。本文所使用的是固定式讀寫器ER302NFC讀寫器。ER302和電腦是通過USB數據線連接的。也就是說,電腦端發送指令給讀卡器,讀卡器再發送指令給RFID標簽,最后再返回結果給電腦端。如果電腦端沒有給讀卡器發送指令。讀卡器便不會工作,比如讀卡,寫卡等等。
2.1.4 RFID技術特點與優勢
RFID技術是近幾年比較盛行的,用讀卡器讀取標簽很方便,三歲兒童也可以完成,只要與讀卡器在一定的距離范圍內即可識別,不需要像條形碼或者二維碼一樣對準取景入框。并且,相比較條形碼來說,標簽不僅是可以讀取信息還可以寫。對比之前的那些防偽方法,有點真是有過之而無不及。下面我們將從四個方面來分析RFID技術到底有哪些優點,也對我們為什么要選取它來進行防偽來進行解釋。
(1)易讀:RFID標簽不需要與讀卡器進行實物上的連接,只需在讀卡范圍內,或者這樣說,讀卡器在讀取信息的時候,也可以將標簽遮蓋,這樣也能有效讀取。以上我們討論的三種標簽的第一種,他自己具有電源,所以距離遠。即使是后面兩種標簽也比條形碼和二維碼來得遠。在茶葉加工后入庫時,操作員工也可以一次性讀取比較多的標簽,這樣既能縮短時間,提高效率,還能便于管理。
(2)唯一性:我們通常買東西后會刷刷二維碼,接著打開一個網頁或者一行字,其實二維碼很容易復制,如果黑心商家將假冒的產品每個都貼上相同的二維碼,在制作一個網頁。消費者在掃瞄二維碼后成功打開網頁,網頁上文字顯示下產品的真實性,就很容易欺騙到消費者。而RFID標簽,在設計的時候就已保證他自身的唯一性,且具有唯一的卡號。正品商家在自家網站上建立好完整的產品信息庫,消費者購買后通過掃描標簽,即可知道產品的真偽并得到想要的信息。
(3)范圍廣:買過有二維碼標簽的人都知道,一旦不小心將物品弄臟,再要掃描二維碼就不容易了,而RFID標簽。及時在有水,煙的情況下,仍舊能有效讀取。這就決定了RFID標簽的使用防偽更加廣。不僅是安靜潔凈的房間里,在臟兮兮的地方也能使用,真是能屈能伸啊。
(4)實時:操作人員在錄入信息的時候可以實時動態讀取和錄入。操作效率高,節約時間和人力。
本系統是基于RFID的茶葉防偽的從茶園到茶杯的一系列溯源追蹤。主要調查內容包括茶葉種植、采摘、加工、包裝、物流運輸、經銷商、零售價等。通過不同階段掃描標簽,不同種類的數據都被整合到后臺數據庫,通過用戶界面呈現出來。管理員可以根據現實情況對茶葉制作等相關數據的修改和更新。用戶在pc端可通過讀卡器讀取rfid標簽讀取每個階段的信息。
系統展示
部分代碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;using System.Runtime.InteropServices;
using MySql.Data.MySqlClient;namespace Mifare1K
{public partial class Mifare_1K : Form{[DllImport("kernel32.dll")]static extern void Sleep(int dwMilliseconds);[DllImport("MasterRD.dll")]static extern int lib_ver(ref uint pVer);[DllImport("MasterRD.dll")]static extern int rf_init_com(int port, int baud);[DllImport("MasterRD.dll")]static extern int rf_ClosePort();[DllImport("MasterRD.dll")]static extern int rf_antenna_sta(short icdev, byte mode);[DllImport("MasterRD.dll")]static extern int rf_init_type(short icdev, byte type);[DllImport("MasterRD.dll")]static extern int rf_request(short icdev, byte mode, ref ushort pTagType);[DllImport("MasterRD.dll")]static extern int rf_anticoll(short icdev, byte bcnt, IntPtr pSnr, ref byte pRLength);[DllImport("MasterRD.dll")]static extern int rf_select(short icdev, IntPtr pSnr, byte srcLen, ref sbyte Size);[DllImport("MasterRD.dll")]static extern int rf_halt(short icdev);[DllImport("MasterRD.dll")]static extern int rf_M1_authentication2(short icdev, byte mode, byte secnr, IntPtr key);[DllImport("MasterRD.dll")]static extern int rf_M1_initval(short icdev, byte adr, Int32 value);[DllImport("MasterRD.dll")]static extern int rf_M1_increment(short icdev, byte adr, Int32 value);[DllImport("MasterRD.dll")]static extern int rf_M1_decrement(short icdev, byte adr, Int32 value);[DllImport("MasterRD.dll")]static extern int rf_M1_readval(short icdev, byte adr, ref Int32 pValue);[DllImport("MasterRD.dll")]static extern int rf_M1_read(short icdev, byte adr, IntPtr pData, ref byte pLen);[DllImport("MasterRD.dll")]static extern int rf_M1_write(short icdev, byte adr, IntPtr pData);[DllImport("MasterRD.dll")]static extern int rf_ul_select(short icdev, IntPtr pSnr, ref byte pRLength);[DllImport("MasterRD.dll")]static extern int rf_ul_write(short icdev, byte page, IntPtr pData);[DllImport("MasterRD.dll")]static extern int rf_beep(short icdev, char msec);//bool bConnectedDevice;/*是否連接上設備*/static char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};public static byte GetHexBitsValue(byte ch){byte sz = 0;if (ch <= '9' && ch >= '0')sz = (byte)(ch - 0x30);if (ch <= 'F' && ch >= 'A')sz = (byte)(ch - 0x37);if (ch <= 'f' && ch >= 'a')sz = (byte)(ch - 0x57);return sz;}//#region byteHEX/// <summary>/// 單個字節轉字字符./// </summary>/// <param name="ib">字節.</param>/// <returns>轉換好的字符.</returns>public static String byteHEX(Byte ib){String _str = String.Empty;try{char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A','B', 'C', 'D', 'E', 'F' };char[] ob = new char[2];ob[0] = Digit[(ib >> 4) & 0X0F];ob[1] = Digit[ib & 0X0F];_str = new String(ob);}catch (Exception){new Exception("對不起有錯。");}return _str;}#endregionpublic static string ToHexString(byte[] bytes){String hexString = String.Empty;for (int i = 0; i < bytes.Length; i++)hexString += byteHEX(bytes[i]);return hexString;}public static byte[] ToDigitsBytes(string theHex){byte[] bytes = new byte[theHex.Length / 2 + (((theHex.Length % 2) > 0) ? 1 : 0)];for (int i = 0; i < bytes.Length; i++){char lowbits = theHex[i * 2];char highbits;if ((i * 2 + 1) < theHex.Length)highbits = theHex[i * 2 + 1];elsehighbits = '0';int a = (int)GetHexBitsValue((byte)lowbits);int b = (int)GetHexBitsValue((byte)highbits);bytes[i] = (byte)((a << 4) + b);}return bytes;}/**/public Mifare_1K(){InitializeComponent();}private void Mifare_1K_Load(object sender, EventArgs e){bConnectedDevice = false;tscbxPort.SelectedIndex = 2; // default port 3tscbxBaud.SelectedIndex = 6; // default 115200}private void tsbtnConnect_Click(object sender, EventArgs e){/*toolbar button[connect] clicked*/if (!bConnectedDevice){int port = 0;int baud = 0;int status;port = Convert.ToInt32(tscbxPort.Text);baud = Convert.ToInt32(tscbxBaud.Text);status = rf_init_com(port, baud);if (0 == status){tsbtnConnect.Text = "Disconnect";bConnectedDevice = true;MessageBox.Show("Connect device success!");}else{string strError;strError = "Connect device failed";bConnectedDevice = false;MessageBox.Show(strError, "error", MessageBoxButtons.OK, MessageBoxIcon.Error);}}else {rf_ClosePort();bConnectedDevice = false;tsbtnConnect.Text = "Connect";}}//查找并讀取標簽的7個字節UID號// This command include 2 commands: request and UL_Select,finally get the 7 bytes UID of Ultralight tag.private void btnUID7_Click(object sender, EventArgs e){short icdev = 0x0000;int status;// byte type = (byte)'A';//mifare one type is A 卡詢卡方式為Abyte mode = 0x26; // Request the card which is not halted.ushort TagType = 0;// byte bcnt = 0x04;//mifare 卡都用4, hold on 4IntPtr pSnr;byte len = 255;// sbyte size = 0;if (!bConnectedDevice){MessageBox.Show("Not connect to device!!", "error", MessageBoxButtons.OK, MessageBoxIcon.Error);return;}txtUID7.Text = "";pSnr = Marshal.AllocHGlobal(1024);for (int i = 0; i < 2; i++){// Sleep(50); // After open the antenna, it needs about 50ms delay before request.status = rf_request(icdev, mode, ref TagType);//搜尋沒有休眠的卡,request card if (status != 0)continue;status = rf_ul_select(icdev, pSnr, ref len);//防沖突得到返回卡的序列號,--get the card UID if (status != 0)continue;byte[] szBytes = new byte[len];for (int j = 0; j < len; j++){szBytes[j] = Marshal.ReadByte(pSnr, j);}String m_cardNo = "";for (int q = 0; q < len; q++){m_cardNo += byteHEX(szBytes[q]);}txtUID7.Text = m_cardNo;//連接數據庫信息string constr = "server=localhost;User Id=root;password=root;Database=tea_info";using (MySqlConnection mycon = new MySqlConnection(constr)){mycon.Open();MySqlCommand mycmd = new MySqlCommand("select* from tea_table where UID = '" + txtUID7.Text + "'", mycon);using (MySqlDataReader reader = mycmd.ExecuteReader()){if (reader.Read()){/*從數據庫里查詢出和用戶相對應的teaName的值 *reader.GetOrdinal("teaName")的作用是得到teaName的為這行數據中的第幾列,返回回值是int *reader.GetString()的作用是得到第幾列的值,返回類型為String. */string teaName = reader.GetString(reader.GetOrdinal("teaName"));string teaGrade = reader.GetString(reader.GetOrdinal("teaGrade"));string plantLoc = reader.GetString(reader.GetOrdinal("plantLoc"));string locWorker = reader.GetString(reader.GetOrdinal("locWorker"));string pickTime = reader.GetString(reader.GetOrdinal("pickTime"));string pickWorker = reader.GetString(reader.GetOrdinal("pickWorker"));string processNum = reader.GetString(reader.GetOrdinal("processNum"));string wdWorker = reader.GetString(reader.GetOrdinal("wdWorker"));string zqWorker = reader.GetString(reader.GetOrdinal("zqWorker"));string sqWorker = reader.GetString(reader.GetOrdinal("sqWorker"));string rhWorker = reader.GetString(reader.GetOrdinal("rhWorker"));string rkWorker = reader.GetString(reader.GetOrdinal("rkWorker"));string wareTime = reader.GetString(reader.GetOrdinal("wareTime"));string sellers = reader.GetString(reader.GetOrdinal("sellers"));string price = reader.GetString(reader.GetOrdinal("price"));String str = "該" + teaName + "是真貨\r\n\r\n";textBox1.AppendText(str);str = "茶葉等級:" + teaGrade + "\r\n\r\n";textBox1.AppendText(str);str = "種植地:" + plantLoc + "\t種植員工:" + locWorker + "\r\n\r\n";textBox1.AppendText(str);str = "采摘時間:" + pickTime + "\t采摘員工:" + pickWorker + "\r\n\r\n";textBox1.AppendText(str);str = "加工批號:" + processNum + "\r\n\r\n";textBox1.AppendText(str);str = "加工工序:\r\n\r\n";textBox1.AppendText(str);str = "\t萎凋\t負責員工:" + wdWorker + "\r\n\r\n";textBox1.AppendText(str);str = "\t做青\t負責員工:" + zqWorker + "\r\n\r\n";textBox1.AppendText(str);str = "\t殺青\t負責員工:" + sqWorker + "\r\n\r\n";textBox1.AppendText(str);str = "\t揉捻\t負責員工:" + rhWorker + "\r\n\r\n";textBox1.AppendText(str);str = "入庫時間:" + wareTime + "\t負責員工:" + rkWorker + "\r\n\r\n";textBox1.AppendText(str);str = "銷售商:" + sellers + "\r\n\r\n";textBox1.AppendText(str);str = "全國統一售價:" + price;textBox1.AppendText(str);}else{ char msec = (char)80;//蜂鳴器響的時間,1個單位10msrf_beep(icdev, msec);textBox1.Text = "該產品是假貨";}}}break;}Marshal.FreeHGlobal(pSnr);}}
}
**參考文獻:**```bash
[1] C程序設計 譚浩強 清華大學出版社
[2] C++程序設計 譚浩強 清華大學出版社
[3] ARM體系結構與編程 杜春雷 清華大學出版社
[4] Windows程序設計 王艷平 人民郵電出版社
[5] 射頻識別系統設計、仿真與應用 周曉光 人民郵電出版社
[6] 智能卡技術-----ic卡、rfid標簽與物聯網 王愛英 清華大學出版社
[7] 超高頻識別技術與應用 Dominique paret|安建平譯 電子工業出版社
總結
以上是生活随笔為你收集整理的基于RFID的防伪系统设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英美大学放榜日期汇总!哪些国际学校是英美
- 下一篇: 温控自动烘焙系统的研究与实现