树莓派通过MFRC522写UIC卡0扇区

time:2019/11/06
前几天门禁卡丢失了,去物业买需要30块大洋。有点不值。然后从tb上买了RC522 RFID刷卡模块,用自己的树莓派来复制卡
下面说下过程:
在网上搜了下教程,详情请参照https://blog.csdn.net/coder9999/article/details/79196753

  1. 连线
    3.3V–>1
    GND—>GND
    MISO–>21
    MOSI–>19
    SCK—>23
    RST—>22
    SDA—>24
  2. 打开SPI功能,树莓派默认是关闭的
  3. 下载spidev
    用其中的demo进行读没有问题,写也没有问题,但是无法向0扇区写入数据。于是在网上各种搜索,最后整理了下,向0扇区不能按常规的步骤进行读写。
    步骤:
  4. 寻卡
  5. 开启防冲撞
  6. 选卡
  7. 重点来了,休眠
  8. 发送40,寄存器7位
  9. 发送43,寄存器8位(默认值)
  10. 开始敲小黑板了,不要进行auth,直接写入数据
  11. MFRC522_StopCrypto1
  12. 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扇区相关推荐

  1. ic卡复制软件_使用MCT复制IC卡0扇区的方法(适用于NFC手机复制或模拟门禁卡)...

    部分IC卡无法被手机门禁卡模拟功能直接添加,但可使用CUID空白卡提取门禁卡0扇区数据直接使用,或提取并转储进CUID空白卡后再行模拟到手机内,实现"曲线救国". 1.自行下载手机 ...

  2. Delphi 复制IC卡写UID卡0区0块

    本示例使用的发卡器:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.11.7154789eKODONP&id= ...

  3. 树莓派复制MFRC522 门禁IC卡(支持block0写入,亲测可用)

    1. 基本原理 友情提示:本篇文章只用于学习交流使用,请不要用于其它用途 我们总共需要三个组件:树莓派,MFRC522模块,IC卡 树莓派与MFRC522模块的交互通过SPI方式:树莓派首先通过&qu ...

  4. 手把手教你做树莓派魔镜-MagicMirror(二)-烧写系统卡

    本系列文章: 手把手教你做树莓派魔镜-MagicMirror(一)-准备工作 手把手教你做树莓派魔镜-MagicMirror(二)-烧写系统卡 手把手教你做树莓派魔镜-MagicMirror(三)-系 ...

  5. 树莓派魔镜MagicMirror —— 2 烧写系统卡

    本系列文章仅做作业做的记录! 树莓派魔镜MagicMirror: 树莓派魔镜MagicMirror -- 1 前期准备工作 树莓派魔镜MagicMirror -- 2 烧写系统卡 树莓派魔镜Magic ...

  6. 【MFRC522】STM32 MFRC522 IC读卡 程序及原理图

    [RC522芯片简介] MF RC522是应用于13.56MHz非接触式通信中高集成度的读写卡芯片,是NXP公司针对"三表"应用推出的一款低电压.低成本.体积小的非接触式读写卡芯片 ...

  7. STM32 MFRC522 IC读卡 程序及原理图

    https://blog.csdn.net/cxw312864660/article/details/89384584 [RC522芯片简介] MF RC522是应用于13.56MHz非接触式通信中高 ...

  8. android 近场通信,Android NFC近场通信03----读写MifareClassic卡(示例代码)

    Android NFC近场通信02----读写MifareClassic卡 一.MifareClassic卡 相关 一般来说,给予MifareClassic的射频卡,一般内存大小有3种: 1K: 16 ...

  9. IC卡 M1卡 各个扇区 控制块 密码 详解

    该内容由部分转载和部分自己见解.整理出来方便小白和自己后期使用. M1卡介绍 这次我们主要介绍的是非接触式IC卡.M1卡就是非接触式IC卡中应用最广泛的卡.M1卡就是Mifare非接触式感应卡,M1卡 ...

最新文章

  1. maven打包war,导入本地jar包
  2. HDU 1544 Palindromes(回文子串)
  3. 关于C#泛型列表ListT的基本用法总结
  4. clion phpstorm 等jetbrains编辑器激活教程
  5. boost::sort::block_indirect_sort相关的测试程序
  6. Mono,CLR,.net,Net Framework之间的关系
  7. JetBrains 开发者调查 - 编程语言趋势
  8. 深入理解equals和hashCode关系和区别
  9. JS获取指定月的前N个月数据
  10. 瑞萨e2studio(5)----使用UART串口烧写程序到瑞萨芯片
  11. 免费下载谷歌地球高清卫星影像和高程DEM教程
  12. 移动端 - adb shell常用命令
  13. GEE导出图像到本地结果全部为空
  14. TensorFlow的MNIST手写数字分类问题 基础篇
  15. linux编译安装madam,madam、Linux LVM的使用
  16. java计算机毕业设计学生健康信息管理源程序+mysql+系统+lw文档+远程调试
  17. python完美测试数据之faker
  18. 数据分析 - 基础原理 之 第三章:数据质量管理 - 第二节:数据生命周期
  19. java之 数字加密器
  20. Windows Edge 浏览器的有关 URL 链接的复制粘贴

热门文章

  1. 在python将字符串中的空格转换为下划线_Python中下划线---完全解读(转)
  2. 【博客8】缤果PyQt5串口调试助手V1.1(初级篇)
  3. 微信小程序 音乐播放控件,监听播放事件, 音乐播放的基本实现
  4. Android背景和音乐
  5. 各种格式的文档互相转换(MOBI_to_PDF)
  6. 华为内部实施微服务架构
  7. 厦门one_理想汽车称厦门事故系因用户驾驶不慎碰撞所致,曾现多次起火情况
  8. gradle迁到kts, 以及module管理
  9. 看顶级渣男如何邀约100个女朋友(二)
  10. NTC热敏电阻原理及应用