本实例包含4个案例,覆盖了M1卡的几乎所有应用,实例以RC522模块和树莓派实现,这些实例均以MFRC522python库(https:github。commxgxwMFRC522python)为基础 可以参考树莓派3B连接MFRC522模块进行RFID读写全指南和树莓派RC522模块 (https:blog。csdn。netcoder9999articledetails79196753)两个链接的内容,完成硬件连接和库的引用 应该有这么几个步骤:1、硬件连接;2、打开spi和IIC端口;3、安装spipy库;4安装MFRC522python库。 案例1:门禁系统 门禁程序原型说明 根据给定的示例程序,设计的门禁程序原型,采用了直接读卡id号的模式,与登记在sqlite3库中的记录比较,如有记录,点亮led灯,模拟开门,同时登记刷卡开门的记录。 程序特点:因判断的是卡id,须使用登记的ic卡,采用了本地sqlite3库记录,可以根据pymysql。py修改为读取远程mysql的程序。 原有程序文件 MFRC522。py库文件 Dump。py显示所有扇区数据 Read。pypython2的读卡id的程序 Write。pypython2的写扇区8的程序 io。py控制led显示,模拟开门程序,开门程序只需要一个io口,在输出out为1的时候,开门,然后自动关门 dbrz。dbsqlite3的数据库文件,含两个表pycb。pypython3创建sqlite数据库中表的程序 pyinsery。py插入数据 pyselect。py查询数值 pysqlite。py显示表记录 pymysql。pypython3连接mysql数据库的程序 r。pypython3的读卡程序,id为10进制 rid。pypython3的读卡id程序,id为16进制 ck。py门禁主程序,查询卡id是否登记的库中,是,开门,不是,给出提示,只要刷卡,就记录 zk。py注册卡的程序,将卡登记入库可以参考更为方便的另一种web门禁 案例2:web门禁系统 web门禁 基于ic卡的门禁,在主程序中,根据卡id是否登记在sqlite3库中记录情况开门,因主程序记录了登记的ic的记录,也记录了没有登记的ic的记录,因此结合phpliteadmin,web管理sqlite3数据库的软件,通过对记录的处理,完成整个门禁功能 案例3:一卡通系统 M1卡充值消费示例程序 类似一卡通消费,公交卡,地铁卡,饭卡等与数字存取有关的操作 根据给定的示例程序,设计的卡消费程序原型,采用了直接读写block8,存取数字的模式实现了充值与消费,采用了本地数据库sqlite记录流水,卡本身保存剩余金额的方式。block8中数字的存取,没有采用通用的值,反值,校验位的模式保证数据的一致性,而是采用了对block8的16字中的前后8个字保存一样的数字方式方便读写,同时前后对照,也有一定的容错性。因库MFRC522。py不能满足要求,在MFRC522Read函数的基础上增加了MFRC522Readdata库函数,满足对指定扇区读取数据的需求。根据M1卡对扇区读写数据的要求,为简化难度,没有采用将数字转换为16进制存储在扇区的模式,参考inputs。py,没有完全实现。而是采用了直接将10进制数字转换为单个数字列表的方式,将每一个10进制数转换为ascii内码的方式形成列表,储存在block中,读取过程相反,具体的过程可以参考inputstore。py,因采用了block的一半存储数字,考虑到货币需要精确到0。01元,因此采用了将货币金额元乘以100保存,没有考虑存储负值,所以能够保存的货币金额最大是999999。99元,可以满足绝大多数的需求。 原有程序文件 MFRC522。py库文件 Dump。py显示所有扇区数据 Read。pypython2的读卡id的程序 Write。pypython2的写block8的程序 cz。pypython3充值程序,直接写卡,没有库操作 xf。py消费程序,默认直接扣除10元,直接写卡,没有在库中记录 czk。py充值程序,充值金额写库,写卡 xfk。py消费程序,记录记库,卡中金额不能超过库里金额,否则废卡 inputs。py过程测试,没有实现 inputstore。py过程测试,将10进制数字形成适合在卡中保存的数据 up。py本地上传记录程序,将本地sqlite中的消费记录上传到远程总库中,将远程库中的总金额同步到本地 案例4:类身份证系统 M1卡类身份证存、读中文和字符示例程序 M1卡的类似身份证的示例程序,直接将姓名,性别,地址,身份证号写在卡上,然后读出来。根据实例代码中的Write。py和Dump。py程序改写,示例中将性别名字写在一个数据块4,将住址写在数据块5,身份证号写在了数据块9和10,发现对一个扇区写需要验证一次,分两部分写,没有做数据校验,没有做卡作废处理因库MFRC522。py不能满足要求,在MFRC522Read函数的基础上增加了MFRC522Readdata库函数,满足对指定扇区读取数据的需求。根据M1卡对扇区读写数据的要求,对一个扇区写需要验证key,即使所有的key一样,对不同的扇区写仍然要验证一次key,性别名字保存在扇区1的block4,直接采用了GBK编码,一个汉字占两个字节,比UNICODE占用三个字节节省一些,家庭住址保存在扇区1的block5,作为实例程序,地址最多只能有8个汉字,如不能满足要求,自己考虑增加。身份证号保存在扇区2的block9和block10,目前身份证位数为18位,可以考虑将前部分两个数字保存一个字,这样在一个块就可以保存身份证号,可以参考inputstore2。py,涉及编码问题,没有最终实现,最终实现的可以参考inputstore3。py,将身份证号前16位保存在block9,后两位保持在block10,采用了gbk编码,一个数字占一个字,这样身份证最长可以保存32位数字或字母。 原有程序文件 MFRC522。py库文件增加了MFRC522Readdata函数 d。py原有dump。py的改写 inputstore1。py一些测试想法 inputstore2。py想法,对身份证号码合并储存,没有实现 inputstore3。py对性别姓名地址身份证号综合的一个在卡存储的测试 rk。py读身份证rw。py没有实现,发现对多个扇区写需要多个key验证 rw1。py写身份证中姓名性别地址,对扇区1中block4,block5读写 rw2。py写身份证中身份证号,对扇区2中block9,block10读写 w。py测试对多个扇区写的测试 另外一个选择,当更换树莓派的系统,重新配置时候发现,MFRC522python库不是那么稳定,有时拔掉rst线时又可以读卡,经过查找,可以使用pirc522库,这个库在MFRC522python库基础上改进,使用了IRQ也就是中断的模式,原理上效率更高,对系统的占用更小,经测试,这个库比较稳定。