树莓派通过MFRC522写UIC卡0扇区
树莓派通过MFRC522写UIC卡0扇区
time:2019/11/06
前几天门禁卡丢失了,去物业买需要30块大洋。有点不值。然后从tb上买了RC522 RFID刷卡模块,用自己的树莓派来复制卡
下面说下过程:
在网上搜了下教程,详情请参照https://blog.csdn.net/coder9999/article/details/79196753
- 连线
3.3V–>1
GND—>GND
MISO–>21
MOSI–>19
SCK—>23
RST—>22
SDA—>24 - 打开SPI功能,树莓派默认是关闭的
- 下载spidev
用其中的demo进行读没有问题,写也没有问题,但是无法向0扇区写入数据。于是在网上各种搜索,最后整理了下,向0扇区不能按常规的步骤进行读写。
步骤: - 寻卡
- 开启防冲撞
- 选卡
- 重点来了,休眠
- 发送40,寄存器7位
- 发送43,寄存器8位(默认值)
- 开始敲小黑板了,不要进行auth,直接写入数据
- MFRC522_StopCrypto1
- Close_MFRC522
下面有详细的代码,read为读取数据,write为向0区写数据的
上面需要改写上面链接中的MFRC522.py,详情如下
MFRC522.py
#!/usr/bin/env python
# -*- coding: utf8 -*-
#
# Copyright 2014,2018 Mario Gomez <mario.gomez@teubi.co>
#
# This file is part of MFRC522-Python
# MFRC522-Python is a simple Python implementation for
# the MFRC522 NFC Card Reader for the Raspberry Pi.
#
# MFRC522-Python is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# MFRC522-Python is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with MFRC522-Python. If not, see <http://www.gnu.org/licenses/>.
#
import RPi.GPIO as GPIO
import spidev
import signal
import time
import loggingclass MFRC522:MAX_LEN = 16PCD_IDLE = 0x00PCD_AUTHENT = 0x0EPCD_RECEIVE = 0x08PCD_TRANSMIT = 0x04PCD_TRANSCEIVE = 0x0CPCD_RESETPHASE = 0x0FPCD_CALCCRC = 0x03PICC_REQIDL = 0x26PICC_REQALL = 0x52PICC_ANTICOLL = 0x93PICC_SElECTTAG = 0x93PICC_AUTHENT1A = 0x60PICC_AUTHENT1B = 0x61PICC_READ = 0x30PICC_WRITE = 0xA0PICC_DECREMENT = 0xC0PICC_INCREMENT = 0xC1PICC_RESTORE = 0xC2PICC_TRANSFER = 0xB0PICC_HALT = 0x50MI_OK = 0MI_NOTAGERR = 1MI_ERR = 2Reserved00 = 0x00CommandReg = 0x01CommIEnReg = 0x02DivlEnReg = 0x03CommIrqReg = 0x04DivIrqReg = 0x05ErrorReg = 0x06Status1Reg = 0x07Status2Reg = 0x08FIFODataReg = 0x09FIFOLevelReg = 0x0AWaterLevelReg = 0x0BControlReg = 0x0CBitFramingReg = 0x0DCollReg = 0x0EReserved01 = 0x0FReserved10 = 0x10ModeReg = 0x11TxModeReg = 0x12RxModeReg = 0x13TxControlReg = 0x14TxAutoReg = 0x15TxSelReg = 0x16RxSelReg = 0x17RxThresholdReg = 0x18DemodReg = 0x19Reserved11 = 0x1AReserved12 = 0x1BMifareReg = 0x1CReserved13 = 0x1DReserved14 = 0x1ESerialSpeedReg = 0x1FReserved20 = 0x20CRCResultRegM = 0x21CRCResultRegL = 0x22Reserved21 = 0x23ModWidthReg = 0x24Reserved22 = 0x25RFCfgReg = 0x26GsNReg = 0x27CWGsPReg = 0x28ModGsPReg = 0x29TModeReg = 0x2ATPrescalerReg = 0x2BTReloadRegH = 0x2CTReloadRegL = 0x2DTCounterValueRegH = 0x2ETCounterValueRegL = 0x2FReserved30 = 0x30TestSel1Reg = 0x31TestSel2Reg = 0x32TestPinEnReg = 0x33TestPinValueReg = 0x34TestBusReg = 0x35AutoTestReg = 0x36VersionReg = 0x37AnalogTestReg = 0x38TestDAC1Reg = 0x39TestDAC2Reg = 0x3ATestADCReg = 0x3BReserved31 = 0x3CReserved32 = 0x3DReserved33 = 0x3EReserved34 = 0x3FserNum = []def __init__(self, bus=0, device=0, spd=1000000, pin_mode=10, pin_rst=-1, debugLevel='WARNING'):self.spi = spidev.SpiDev()self.spi.open(bus, device)self.spi.max_speed_hz = spdself.logger = logging.getLogger('mfrc522Logger')self.logger.addHandler(logging.StreamHandler())level = logging.getLevelName(debugLevel)self.logger.setLevel(level)gpioMode = GPIO.getmode()if gpioMode is None:GPIO.setmode(pin_mode)else:pin_mode = gpioModeif pin_rst == -1:if pin_mode == 11:pin_rst = 15else:pin_rst = 22GPIO.setup(pin_rst, GPIO.OUT)GPIO.output(pin_rst, 1)self.MFRC522_Init()def MFRC522_Reset(self):self.Write_MFRC522(self.CommandReg, self.PCD_RESETPHASE)def Write_MFRC522(self, addr, val):self.spi.xfer2([(addr << 1) & 0x7E, val])def Read_MFRC522(self, addr):val = self.spi.xfer2([((addr << 1) & 0x7E) | 0x80, 0])return val[1]def Close_MFRC522(self):self.spi.close()GPIO.cleanup()def SetBitMask(self, reg, mask):tmp = self.Read_MFRC522(reg)self.Write_MFRC522(reg, tmp | mask)def ClearBitMask(self, reg, mask):tmp = self.Read_MFRC522(reg)self.Write_MFRC522(reg, tmp & (~mask))def AntennaOn(self):temp = self.Read_MFRC522(self.TxControlReg)if (~(temp & 0x03)):self.SetBitMask(self.TxControlReg, 0x03)def AntennaOff(self):self.ClearBitMask(self.TxControlReg, 0x03)def MFRC522_ToCard(self, command, sendData):backData = []backLen = 0status = self.MI_ERRirqEn = 0x00waitIRq = 0x00lastBits = Nonen = 0if command == self.PCD_AUTHENT:irqEn = 0x12waitIRq = 0x10if command == self.PCD_TRANSCEIVE:irqEn = 0x77waitIRq = 0x30self.Write_MFRC522(self.CommIEnReg, irqEn | 0x80)self.ClearBitMask(self.CommIrqReg, 0x80)self.SetBitMask(self.FIFOLevelReg, 0x80)self.Write_MFRC522(self.CommandReg, self.PCD_IDLE)for i in range(len(sendData)):self.Write_MFRC522(self.FIFODataReg, sendData[i])self.Write_MFRC522(self.CommandReg, command)if command == self.PCD_TRANSCEIVE:self.SetBitMask(self.BitFramingReg, 0x80)i = 2000while True:n = self.Read_MFRC522(self.CommIrqReg)i -= 1if ~((i != 0) and ~(n & 0x01) and ~(n & waitIRq)):breakself.ClearBitMask(self.BitFramingReg, 0x80)if i != 0:if (self.Read_MFRC522(self.ErrorReg) & 0x1B) == 0x00:status = self.MI_OKif n & irqEn & 0x01:status = self.MI_NOTAGERRif command == self.PCD_TRANSCEIVE:n = self.Read_MFRC522(self.FIFOLevelReg)lastBits = self.Read_MFRC522(self.ControlReg) & 0x07if lastBits != 0:backLen = (n - 1) * 8 + lastBitselse:backLen = n * 8if n == 0:n = 1if n > self.MAX_LEN:n = self.MAX_LENfor i in range(n):backData.append(self.Read_MFRC522(self.FIFODataReg))else:status = self.MI_ERRreturn (status, backData, backLen)def MFRC522_Request(self, reqMode):status = NonebackBits = NoneTagType = []self.Write_MFRC522(self.BitFramingReg, 0x07)TagType.append(reqMode)(status, backData, backBits) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, TagType)if ((status != self.MI_OK) | (backBits != 0x10)):status = self.MI_ERRreturn (status, backBits)def MFRC522_Anticoll(self):backData = []serNumCheck = 0serNum = []self.Write_MFRC522(self.BitFramingReg, 0x00)serNum.append(self.PICC_ANTICOLL)serNum.append(0x20)(status, backData, backBits) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, serNum)if (status == self.MI_OK):i = 0if len(backData) == 5:for i in range(4):serNumCheck = serNumCheck ^ backData[i]if serNumCheck != backData[4]:status = self.MI_ERRelse:status = self.MI_ERRreturn (status, backData)def CalulateCRC(self, pIndata):self.ClearBitMask(self.DivIrqReg, 0x04)self.SetBitMask(self.FIFOLevelReg, 0x80)for i in range(len(pIndata)):self.Write_MFRC522(self.FIFODataReg, pIndata[i])self.Write_MFRC522(self.CommandReg, self.PCD_CALCCRC)i = 0xFFwhile True:n = self.Read_MFRC522(self.DivIrqReg)i -= 1if not ((i != 0) and not (n & 0x04)):breakpOutData = []pOutData.append(self.Read_MFRC522(self.CRCResultRegL))pOutData.append(self.Read_MFRC522(self.CRCResultRegM))return pOutDatadef MFRC522_SelectTag(self, serNum):backData = []buf = []buf.append(self.PICC_SElECTTAG)buf.append(0x70)for i in range(5):buf.append(serNum[i])pOut = self.CalulateCRC(buf)buf.append(pOut[0])buf.append(pOut[1])(status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf)if (status == self.MI_OK) and (backLen == 0x18):self.logger.debug("Size: " + str(backData[0]))return backData[0]else:return 0def MFRC522_Auth(self, authMode, BlockAddr, Sectorkey, serNum):buff = []# First byte should be the authMode (A or B)buff.append(authMode)# Second byte is the trailerBlock (usually 7)buff.append(BlockAddr)# Now we need to append the authKey which usually is 6 bytes of 0xFFfor i in range(len(Sectorkey)):buff.append(Sectorkey[i])# Next we append the first 4 bytes of the UIDfor i in range(4):buff.append(serNum[i])# Now we start the authentication itself(status, backData, backLen) = self.MFRC522_ToCard(self.PCD_AUTHENT, buff)# Check if an error occurredif not (status == self.MI_OK):self.logger.error("AUTH ERROR!!")if not (self.Read_MFRC522(self.Status2Reg) & 0x08) != 0:self.logger.error("AUTH ERROR(status2reg & 0x08) != 0")# Return the statusreturn statusdef MFRC522_StopCrypto1(self):self.ClearBitMask(self.Status2Reg, 0x08)def MFRC522_Read(self, blockAddr):recvData = []recvData.append(self.PICC_READ)recvData.append(blockAddr)pOut = self.CalulateCRC(recvData)recvData.append(pOut[0])recvData.append(pOut[1])(status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, recvData)if not (status == self.MI_OK):self.logger.error("Error while reading!")if len(backData) == 16:self.logger.debug("Sector " + str(blockAddr) + " " + str(backData))return backDataelse:return Nonedef MFRC522_Halt(self):# cmd: 0x0c# buf: 0x50 0x00 crc[2]buf = []buf.append(self.PICC_HALT)buf.append(0)crc = self.CalulateCRC(buf)buf.append(crc[0])buf.append(crc[1])(status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf)return self.MI_OKdef MFRC522_WriteCmd40(self):retStatus = self.MI_OKself.Write_MFRC522(self.BitFramingReg, 0x07)# cmd: 0x0c# buf: 0x40buf = []buf.append(0x40)(status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf)if (status != self.MI_OK) or (backData[0] != 0x0a):retStatus = statusreturn retStatusdef MFRC522_WriteCmd43(self):retStatus = self.MI_OKself.Write_MFRC522(self.BitFramingReg, 0x08)# cmd: 0x0c# buf: 0x43buf = []buf.append(0x43)(status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf)if (status != self.MI_OK) or (backData[0] != 0x0a):retStatus = statusreturn retStatusdef MFRC522_Write(self, blockAddr, writeData):buff = []buff.append(self.PICC_WRITE)buff.append(blockAddr)crc = self.CalulateCRC(buff)buff.append(crc[0])buff.append(crc[1])(status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buff)if not (status == self.MI_OK) or not (backLen == 4) or not ((backData[0] & 0x0F) == 0x0A):status = self.MI_ERRself.logger.debug("%s backdata &0x0F == 0x0A %s" % (backLen, backData[0] & 0x0F))if status == self.MI_OK:buf = []for i in range(16):buf.append(writeData[i])crc = self.CalulateCRC(buf)buf.append(crc[0])buf.append(crc[1])(status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf)if not (status == self.MI_OK) or not (backLen == 4) or not ((backData[0] & 0x0F) == 0x0A):self.logger.error("Error while writing")if status == self.MI_OK:self.logger.debug("Data written")return statusdef MFRC522_DumpClassic1K(self, key, uid):for i in range(64):status = self.MFRC522_Auth(self.PICC_AUTHENT1A, i, key, uid)# Check if authenticatedif status == self.MI_OK:self.MFRC522_Read(i)else:self.logger.error("Authentication error")def MFRC522_Init(self):self.MFRC522_Reset()self.Write_MFRC522(self.TModeReg, 0x8D)self.Write_MFRC522(self.TPrescalerReg, 0x3E)self.Write_MFRC522(self.TReloadRegL, 30)self.Write_MFRC522(self.TReloadRegH, 0)self.Write_MFRC522(self.TxAutoReg, 0x40)self.Write_MFRC522(self.ModeReg, 0x3D)self.AntennaOn()
read.py:读取出ic中的所有内容,key一般为[0xff,0xff,0xff,0xff,0xff,0xff]
import MFRC522
mfrcRead=MFRC522.MFRC522(debugLevel='DEBUG')
mfrcRead.MFRC522_Init()
key=[0xff,0xff,0xff,0xff,0xff,0xff]
while True:status, backBits=mfrcRead.MFRC522_Request(mfrcRead.PICC_REQIDL)print(status,backBits)if status==mfrcRead.MI_OK:break
status, uid=mfrcRead.MFRC522_Anticoll()
print(status,uid)
def print_hex(bytes):hexs = ['0x%02X' % (i) for i in bytes]print(','.join(hexs))
if status==mfrcRead.MI_OK:mfrcRead.MFRC522_SelectTag(uid)datas=[]for i in range(64):status=mfrcRead.MFRC522_Auth(mfrcRead.PICC_AUTHENT1A, i, key, uid)if status==mfrcRead.MI_OK:data = mfrcRead.MFRC522_Read(i)datas.append(data)mfrcRead.MFRC522_StopCrypto1()for data in datas:print_hex(data)
mfrcRead.Close_MFRC522()
write.py:开始写数据了,这个只是写0区的哦,其他的不需要用特殊指令就可以写入的。还要注意不要随便写每个扇区的第3个区(里面有key和控制字,随便写会出问题的)
import MFRC522
mfrcRead=MFRC522.MFRC522(debugLevel='DEBUG')
mfrcRead.MFRC522_Init()
key=[0xff,0xff,0xff,0xff,0xff,0xff]
data=[148, 5, 226, 212, 167, 8, 4, 0, 105, 115, 115, 105, 53, 54, 53, 48]
while True:#寻卡status, backBits=mfrcRead.MFRC522_Request(mfrcRead.PICC_REQIDL)print(status,backBits)if status==mfrcRead.MI_OK:break
#防冲撞
status, uid=mfrcRead.MFRC522_Anticoll()
print(status,uid)
def print_hex(bytes):hexs = ['0x%02X' % (i) for i in bytes]print(','.join(hexs))
if status==mfrcRead.MI_OK:#选卡mfrcRead.MFRC522_SelectTag(uid)i=0#关键步骤1,休眠status = mfrcRead.MFRC522_Halt()print("MFRC522_Halt %d" % status)#关键步骤2,发送40status = mfrcRead.MFRC522_WriteCmd40()if (status != mfrcRead.MI_OK):print("MFRC522_ToCard 0x40 error, status:%d" % status)#关键步骤3,发送43status = mfrcRead.MFRC522_WriteCmd43()if (status != mfrcRead.MI_OK):print("MFRC522_ToCard 0x43 error, status:%d" % status)#注意不要auth,直接写status = mfrcRead.MFRC522_Write(i, data)if(status==mfrcRead.MI_OK):print("write success")mfrcRead.MFRC522_StopCrypto1()
mfrcRead.Close_MFRC522()
树莓派通过MFRC522写UIC卡0扇区相关推荐
- ic卡复制软件_使用MCT复制IC卡0扇区的方法(适用于NFC手机复制或模拟门禁卡)...
部分IC卡无法被手机门禁卡模拟功能直接添加,但可使用CUID空白卡提取门禁卡0扇区数据直接使用,或提取并转储进CUID空白卡后再行模拟到手机内,实现"曲线救国". 1.自行下载手机 ...
- Delphi 复制IC卡写UID卡0区0块
本示例使用的发卡器:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.11.7154789eKODONP&id= ...
- 树莓派复制MFRC522 门禁IC卡(支持block0写入,亲测可用)
1. 基本原理 友情提示:本篇文章只用于学习交流使用,请不要用于其它用途 我们总共需要三个组件:树莓派,MFRC522模块,IC卡 树莓派与MFRC522模块的交互通过SPI方式:树莓派首先通过&qu ...
- 手把手教你做树莓派魔镜-MagicMirror(二)-烧写系统卡
本系列文章: 手把手教你做树莓派魔镜-MagicMirror(一)-准备工作 手把手教你做树莓派魔镜-MagicMirror(二)-烧写系统卡 手把手教你做树莓派魔镜-MagicMirror(三)-系 ...
- 树莓派魔镜MagicMirror —— 2 烧写系统卡
本系列文章仅做作业做的记录! 树莓派魔镜MagicMirror: 树莓派魔镜MagicMirror -- 1 前期准备工作 树莓派魔镜MagicMirror -- 2 烧写系统卡 树莓派魔镜Magic ...
- 【MFRC522】STM32 MFRC522 IC读卡 程序及原理图
[RC522芯片简介] MF RC522是应用于13.56MHz非接触式通信中高集成度的读写卡芯片,是NXP公司针对"三表"应用推出的一款低电压.低成本.体积小的非接触式读写卡芯片 ...
- STM32 MFRC522 IC读卡 程序及原理图
https://blog.csdn.net/cxw312864660/article/details/89384584 [RC522芯片简介] MF RC522是应用于13.56MHz非接触式通信中高 ...
- android 近场通信,Android NFC近场通信03----读写MifareClassic卡(示例代码)
Android NFC近场通信02----读写MifareClassic卡 一.MifareClassic卡 相关 一般来说,给予MifareClassic的射频卡,一般内存大小有3种: 1K: 16 ...
- IC卡 M1卡 各个扇区 控制块 密码 详解
该内容由部分转载和部分自己见解.整理出来方便小白和自己后期使用. M1卡介绍 这次我们主要介绍的是非接触式IC卡.M1卡就是非接触式IC卡中应用最广泛的卡.M1卡就是Mifare非接触式感应卡,M1卡 ...
最新文章
- maven打包war,导入本地jar包
- HDU 1544 Palindromes(回文子串)
- 关于C#泛型列表ListT的基本用法总结
- clion phpstorm 等jetbrains编辑器激活教程
- boost::sort::block_indirect_sort相关的测试程序
- Mono,CLR,.net,Net Framework之间的关系
- JetBrains 开发者调查 - 编程语言趋势
- 深入理解equals和hashCode关系和区别
- JS获取指定月的前N个月数据
- 瑞萨e2studio(5)----使用UART串口烧写程序到瑞萨芯片
- 免费下载谷歌地球高清卫星影像和高程DEM教程
- 移动端 - adb shell常用命令
- GEE导出图像到本地结果全部为空
- TensorFlow的MNIST手写数字分类问题 基础篇
- linux编译安装madam,madam、Linux LVM的使用
- java计算机毕业设计学生健康信息管理源程序+mysql+系统+lw文档+远程调试
- python完美测试数据之faker
- 数据分析 - 基础原理 之 第三章:数据质量管理 - 第二节:数据生命周期
- java之 数字加密器
- Windows Edge 浏览器的有关 URL 链接的复制粘贴
热门文章
- 在python将字符串中的空格转换为下划线_Python中下划线---完全解读(转)
- 【博客8】缤果PyQt5串口调试助手V1.1(初级篇)
- 微信小程序 音乐播放控件,监听播放事件, 音乐播放的基本实现
- Android背景和音乐
- 各种格式的文档互相转换(MOBI_to_PDF)
- 华为内部实施微服务架构
- 厦门one_理想汽车称厦门事故系因用户驾驶不慎碰撞所致,曾现多次起火情况
- gradle迁到kts, 以及module管理
- 看顶级渣男如何邀约100个女朋友(二)
- NTC热敏电阻原理及应用