用PN532對RFID進行讀寫和複製(附winfrom軟體)
1、前言
通過本文你可以瞭解到PN523的通訊協議,並且能夠對RFID卡進行讀寫和複製操作。這裡不會深度探討理論,而是重點展示如何使用。
2、PN523串列埠通訊協議
2.1 喚醒模組
按照模組的文件來看,在每次上電的時候需要喚醒,讓他退出休眠模式。
對其傳送:
55 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 03 FD D4 14 01 17 00
將會收到回覆
00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00
這幀沒啥變化,就不進行解析了
2.2掃描卡
先舉例一幀資料
00 00 FF 04 FC D4 4A 01 00 E1 00
其中 00 00 FF 04 FC 屬於包頭
資料 | 說明 |
---|---|
00 00 FF | 固定頭 |
04 | 資料包長度 |
FC | 包長度校驗(04+FC=0X10) |
其中 D4 4A 01 00 屬於資料包
資料 | 說明 |
---|---|
D4 4A | 指令標識碼 |
01 | 尋卡數量 |
00 | 通訊速率 106kbps |
其中E1 00 屬於包尾
資料 | 說明 |
---|---|
E1 | 校驗(0x100-(0xD4+0x4A+0x01+0x00)) |
00 | 固定尾巴 |
傳送之後模組會回覆兩幀,一幀是應答,一幀是回覆
00 00 FF 00 FF 00
00 00 FF 0C F4 D5 4B 01 01 00 04 08 04 94 8A 3B 0B 6A 00
資料 | 說明 |
---|---|
00 00 FF | 固定頭 |
0C | 資料包長度 |
F4 | 包長度校驗 |
D5 4B | 指令的標識碼(是主機發送的指令 加 1,主機發的 D4 AA,回 D5 4B) |
01 | 目標卡 1 |
01 | 找到目標卡的數量 |
00 04 | Mifare S50 卡,00 44是UltraLight卡 |
08 | 卡的容量 08=1K |
04 | UID 的位元組數 |
94 8A 3B 0B | 卡的 UID |
6A | (0X100—累加和)校驗 |
00 | 包尾 |
2.3 授權
這裡就是對資料包進行修改,完整請求如下:
00 00 FF F F1 D4 40 01 60 03 FF FF FF FF FF FF C8 70 47 E9 26 0
上文討論過的包頭包尾去掉,僅僅看資料包
D4 40 01 60 03 FF FF FF FF FF FF C8 70 47 E9
資料 | 說明 |
---|---|
D4 40 | 命令格式 |
01 | 資料大於6位元組這裡為1 |
60 | 驗證密碼A(命令位元組,具體含義見下表) |
03 | 在第三塊儲存密碼 |
FF FF FF FF FF FF | 密碼 |
94 8A 3B 0B | UID |
命令類別
資料 | 說明 |
---|---|
0x60 / 0x61 | Authentication A / Authentication B |
0x30 | 16 bytes reading |
0xA0 | 16 bytes writing |
0xA2 | 4 bytes writing |
0xC1 | Incrementation |
0xC0 | Decrementation |
0xB0 | Transfer |
0xC2 | Restore |
返回幀資料:
00 00 FF 03 FD D5 41 00 EA 00
這裡只關注 D5 41 00中的最後一位,如果是00則表示驗證成功。
補充說明一下,上面舉例幀是驗證的塊3,也就是我們僅能對扇區0進行操作,如何想對其他塊操作需要先進行授權喲,但是UltraLight卡不需要授權就可以直接讀寫。
2.4 讀
同樣首先來看一幀完整請求
00 00 FF 05 FB D4 40 01 30 02 B9 00
其中資料包是D4 40 01 30 02
資料 | 說明 |
---|---|
D4 40 | 命令格式 |
01 | 資料大於6位元組這裡為1 |
30 | 命令字,讀16位元組資料 |
02 | 從第二塊開始讀 |
返回兩幀資料
00 00 FF 00 FF 00
00 00 FF 13 ED D5 41 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 72 00
提取資料幀
D5 41 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
資料 | 說明 |
---|---|
D5 41 | 命令格式 |
00 | 成功 |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | 讀取結果 |
2.5 寫
完整請求
00 00 FF 15 EB D4 40 01 A0 02 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F D1 00
資料
D4 40 01 A0 02 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
資料 | 說明 |
---|---|
D4 40 | 命令格式 |
01 | 大於 6 位元組 |
A0 | 16位元組寫資料指令 |
02 | 往第 02 塊寫 |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | 寫入資料 |
返回資料:
00 00 FF 03 FD D5 41 00 EA 00
D5 41 返回的指令標示符,00 說明寫入成功
3、M1卡、UID卡和UltraLight卡
MI卡的0塊是儲存UID的不能進行修改,也就是如果你想複製什麼卡的話,最好不要選用M1卡,而是選擇能夠修改任何位置的UID卡。UltraLight卡是沒有密碼的,並且每塊大小隻有四個位元組,也就是在寫入的時候選擇命令請選擇0xA2來寫哦。
4、使用軟體進行讀寫
這裡簡單介紹下使用上位機軟體進行讀寫卡的操作
首先將你的模組和串列埠模組連線,然後把串列埠模組插上電腦,再開啟軟體。之後按照2-3-4的點就好了,UltraLight的話是點不動4的。
這時就可以進行讀寫操作咯,讀和寫的右邊都有一個下拉選單,用來選擇讀寫的塊,我只寫了前面幾個塊,並且沒有給輸入功能。讀一次讀16個位元組,無論哪種卡都是這樣,但是寫會根據卡的不同,寫入16位元組或是4位元組。卡的型別在左下角可以看到。例如我對塊2進行寫和讀,額對了,授權哪裡我只對第一個扇區授權了,之後軟體版本迭代會弄個下拉框的。。。忘記了 - -|.
下面三個圖分別是,先讀塊2,寫塊2,再讀塊2
5、使用軟體進行復制
這裡是使用網上別人編寫的程式進行復制,介面如下
先點選PN532來串列埠連線,然後點選讀整卡來把M1卡所以類容讀取出來,讀取出來後點擊左邊的三角可以儲存。
將讀取的檔案儲存起來,換一個白卡後,再點選寫整卡
就可以複製卡的類容了,但是0塊由於是UID的位置M1卡是不能被改寫的,如果你需要複製門禁卡的話,可以寫在UID卡里面而不是M1卡,價格十幾塊錢20張的樣子。
6、下載
相關推薦
用PN532對RFID進行讀寫和複製(附winfrom軟體)
1、前言 通過本文你可以瞭解到PN523的通訊協議,並且能夠對RFID卡進行讀寫和複製操作。這裡不會深度探討理論,而是重點展示如何使用。 2、PN523串列埠通訊協議 2.1 喚醒模組 按照模組的文件來看,在每次上電的時候需要喚醒,讓他退出休眠模
【Python】用python對excel進行讀寫
Description 0014 :純文字檔案 student.txt為學生資訊, 裡面的內容(包括花括號)如下所示: { "1":["張三",150,120,100], "2":["李四",90,99,95], "3":[
IO練習(FileReader和Writer對檔案進行讀寫)
package aa; import java.io.*; public class aaa { public static void main(String[] args) throws IOException { File file=new Fi
分別使用(字元流)和(位元組流)對檔案進行讀寫操作
一.使用(字元流)對檔案進行讀寫操作/* * 使用字元流對檔案進行讀寫操作 */ import java.io.BufferedReader; import java.io.FileInputSt
linux c通過檔案描述符以及write和read方法對檔案進行讀寫
1、write和read方法講解 #include<unistd.h> ssize_t read(int fd, void *buf,size_t count); fd為檔案描述符,buf
Python—對Excel進行讀寫操作
href ace 需要 文件中 tle net 過程 ova 設置 學習Python的過程中,我們會遇到Excel的讀寫問題。通過搜索得知,我們可以使用xlwt module將數據寫入Excel表格,使用xlrd module從Excel讀取數據。下面介紹如何實現使用pyt
Office加載項對Excel進行讀寫操作
ted 是否 nta 文字 個人 asc log account col 轉載自我的個人主頁 前言 在開發ExcelWeb插件的時候,一大亮點就是可以在web項目中操作Excel,讀取Excel的內容,也可以將服務端的數據寫入的 Excel中,大大方便的用戶使用Excel
如何使用x86彙編對硬碟進行讀寫
硬碟讀寫的基本單位是扇區。就是說,要讀就至少讀一個扇區,要寫就至少寫一個扇區,不可能僅讀寫一個扇區中的幾個位元組。這樣一來,就使得主機和硬碟之間的資料交換是成塊的,所以硬碟是典型的塊裝置。 從硬碟讀寫資料,最經典的方式是向硬碟控制器分別傳送磁頭號、柱面號和扇區
Office載入項對Excel進行讀寫操作
轉載自我的個人主頁 前言 在開發ExcelWeb外掛的時候,一大亮點就是可以在web專案中操作Excel,讀取Excel的內容,也可以將服務端的資料寫入的 Excel中,大大方便的使用者使用Excel,提高工作效率 Ranges Ranges表示Excel的區域,例如一個單元格的區域是=A1,多個單元格的
Java用HWPFDocument對03word進行插入表格和內容
import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.usermodel.Range; import org.apach
redis基礎簡介(六)- jedis使用管道(pipeline)對redis進行讀寫(使用hmset、hgetall測試)
一般情況下,Redis Client端發出一個請求後,通常會阻塞並等待Redis服務端處理,Redis服務端處理完後請求命令後會將結果通過響應報文返回給Client。這有點類似於HBase的Scan,通常是Client端獲取每一條記錄都是一次RPC呼叫服務端。在Redis中,有沒有類似HBase Scan
LinuxC程式設計之IO-通過lseek對檔案進行讀寫
1.相關API 通過lseek對檔案進行讀寫 1)open函式 int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 2)re
mysql 命令列對檔案進行讀寫操作
首先在mysql中,使用如下指令: secure_file_priv後面跟著的路徑就是我們進行檔案操作的路徑: 檔案讀入: 將要讀的檔案放在上述路徑中, 使用如下指令: mysql> load data infile'c:/ProgramData/MySQL/My
使用C#對Excel進行讀寫操作(NPOI)以及使用EF對Mysql進行CURD
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq;
linux程式設計——對FIFO進行讀寫操作(第十三章)
4.對FIFO進行讀寫操作 使用O_NONBLOCK模式會影響的對FIFO的read和write呼叫. 對一個空的,阻塞的FIFO(即沒有用O_NONBLOCK標誌開啟)的read呼叫將等待,直到有資料可以讀時才繼續執行.與此相反,對一個空的,非阻塞的FIFO的read呼叫
Java建立一個text文字檔案,並對其進行讀寫操作
package test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.
通過位元組流來對檔案進行讀寫操作
import java.io.*; public class OutPutStreamDemo01 { public static void main(String[] args) throws
C++對檔案進行讀寫操作
1、 定義資料流物件指標 對檔案進行讀寫操作首先必須要定義一個數據流物件指標,資料流物件指標有三種類型,它們分別是: Ifstream:表示讀取檔案流,使用的時候必須包含標頭檔案“ifstream”; Ofstream:表示檔案寫入流,使用的時候必須包含標頭檔案“ofstr
使用CFile類對檔案進行讀寫
CFile類提供了對檔案進行開啟,關閉,讀,寫,刪除,重新命名以及獲取檔案資訊等檔案操作的基本功能,足以處理任意型別的檔案操作 一個讀寫檔案的例子:檔案I/O 雖然使用CArchive類內建的序列化功能是儲存和載入永續性資料的便捷方式,但有時在程式中需要對檔案處理過程擁有更多的控制權,對於這種檔案輸入輸
用Keras進行手寫字型識別(MNIST資料集)
資料 首先載入資料 from keras.datasets import mnist (train_images, train_labels), (test_images, test_labels) = mnist.load_data() 接下來,看