1. 硬件准备
在标有丝印为TF Card 的卡槽处,插入SD卡;
在标有丝印为DUART的模块上,将TTL转USB串口模块的TX与板子丝印为RXD连接,TTL转USB串口模块的RX与板子丝印为TXD相连;并将串口模块的USB端口接入电脑;
在标有丝印为Type-C 的接口处,插上Type-C线,并将Type-C线的另一端USB口插入电脑;
在标有丝印为NET0 或 NET1的RJ45插座处接上网线的水晶头,网线另一端水晶接头插在PC的网络插座上。
2.1 硬件连接
选择ZLG600A(支持TTL,RS232以及RS485接口通信)与PC端通信的方式,本文选用TTL通信。将TTL转USB串口模块的TX与ZLG600A模块丝印为 RXD 连接,TTL转USB串口模块的RX与ZLG600A模块丝印为 TXD 相连,TTL转USB串口模块的GND与ZLG600A模块丝印为 GND 相连,TTL转USB串口模块的VCC与ZLG600A模块丝印为 VCC 相连;并将串口模块的USB端口接入电脑。接线如下图所示。
若想了解该模块更多信息请访问致远电子ZLG600A相关资料进行查阅,本文只讲解如何利用EsDA快速使用该模块。
ZLG600A资料:
https://www.zlg.cn/data/upload/software/Tm/ZLG600A_pcdemo.rar
解压缩后,双击执行ZLG600A_Configure V1.00.exe这个上位机程序。
找到在设备管理器中对应的串口设备,选择波特率为 19200 ,点击连接读卡器,因为使用TTL通信,所以其他配置按默认的即可,点击配置模块,若配置成功则如下图所示。
本业务是向模块内加载密码,而非改变Mifare卡内扇区的密码。每个区有密钥A和密钥B两个,对应的cmd指令是load_mifare1_keya
,load_mifare1_keyb
。后续若想改变Mifare卡内的密钥,可以使用原密码验证通过后,直接用写块数据指令将密码块进行改写。
添加timer,fscript,rfid_zlg600,和log节点到画布中并连线如下图,为了和后面的业务进行区分,timer的消费者fscript的显示名称在此改为加载密钥A。
load_mifare1_keya
,密钥B的cmd指令为load_mifare1_keyb
,在fscript中指定验证密钥的类型,密钥的值以及操作的块区号。print("load_mifare1_keya")
output.cmd = 'load_mifare1_keya'
buf = wbuffer_create()
wbuffer_write_uint8(buf, 0xAA) //低字节
wbuffer_write_uint8(buf, 0xFF)
wbuffer_write_uint8(buf, 0xFF)
wbuffer_write_uint8(buf, 0xFF)
wbuffer_write_uint8(buf, 0xFF)
wbuffer_write_uint8(buf, 0xFF) //高字节
output.key_data = wbuffer_get_data(buf)
output.key_data_len = 6
output.section_id = 1
var i = 0
print('result::::::::::::::::::::')
if (msg.cmd == "load_mifare1_keya") {
if(msg.result == 0) {
output.payload = "load_mifare1_keya_ok"
} else {
output.payload = "load_mifare1_keya_err"
}
}
双击timer节点,配置周期性去读卡号的时间。
print("get_mifare1_uid")
output.cmd = 'get_mifare1_uid'
output.keytype = 0x60
buf = wbuffer_create()
wbuffer_write_uint8(buf, 0xAA) //低字节
wbuffer_write_uint8(buf, 0xFF)
wbuffer_write_uint8(buf, 0xFF)
wbuffer_write_uint8(buf, 0xFF)
wbuffer_write_uint8(buf, 0xFF)
wbuffer_write_uint8(buf, 0xFF) //高字节
output.key_data = wbuffer_get_data(buf)
output.key_data_len = 6
//一个扇区有4个块
output.section_id = 1
output.block_id = 4
双击rfid_zlg600的消费者节点fscript,若成功验证密钥后则将读取的卡UID进行显示。
var i = 0
print('result::::::::::::::::::::')
if(msg.cmd == "get_mifare1_uid") {
if(msg.result == 0) {
print('mifare1_uid_len: ' + msg.mifare1_uid_len)
print('mifare1_uid: start')
len = msg.mifare1_uid_len
rbuf = rbuffer_create(msg.mifare1_uid, len)
for (i = 0; i < len; i = i + 1) {
data = rbuffer_read_uint8(rbuf)
print('data'+ i + ':' + data)
}
print('mifare1_uid: end')
output.payload = "get_mifare1_uid_ok"
} else {
output.payload = "get_mifare1_uid_err"
}
}
双击timer的fscript节点(显示标签为写块数据),写块数据之前必需成功进行密钥验证。设置需要写入的指定的扇区和写入的数据。
print("write_mifare1_data")
output.cmd = "write_mifare1_data"
output.keytype = 0x60
buf = wbuffer_create()
wbuffer_write_uint8(buf, 0xAA) //低字节
wbuffer_write_uint8(buf, 0xFF)
wbuffer_write_uint8(buf, 0xFF)
wbuffer_write_uint8(buf, 0xFF)
wbuffer_write_uint8(buf, 0xFF)
wbuffer_write_uint8(buf, 0xFF) //高字节
output.key_data = wbuffer_get_data(buf)
buf1 = wbuffer_create()
wbuffer_write_uint8(buf1, 0x12) //低字节
wbuffer_write_uint8(buf1, 0x34)
wbuffer_write_uint8(buf1, 0x56)
wbuffer_write_uint8(buf1, 0x78)
wbuffer_write_uint8(buf1, 0x90)
wbuffer_write_uint8(buf1, 0x01)
wbuffer_write_uint8(buf1, 0x02)
wbuffer_write_uint8(buf1, 0x03)
wbuffer_write_uint8(buf1, 0x04)
wbuffer_write_uint8(buf1, 0x05)
wbuffer_write_uint8(buf1, 0x06)
wbuffer_write_uint8(buf1, 0x07)
wbuffer_write_uint8(buf1, 0x08)
wbuffer_write_uint8(buf1, 0x09)
wbuffer_write_uint8(buf1, 0x11)
wbuffer_write_uint8(buf1, 0x12) //高字节
output.data = wbuffer_get_data(buf1)
output.data_len = 16
output.section_id = 1
output.block_id = 4
双击rfid_zlg600的消费者节点fscript,查看写入块数据的结果并打印。
var i = 0
print('result::::::::::::::::::::')
if (msg.cmd == "write_mifare1_data") {
if(msg.result == 0) {
output.payload = "write_mifare1_data_ok"
} else {
output.payload = "write_mifare1_data_err"
}
}
绘制完流图后,点击CTRL+S 即可保存流图,点击下载流图。
可以看到串口助手上显示写块数据成功的打印信息。
本业务需要对指定块区域进行密钥验证后,才可对同一扇区内的数据进行读操作(一个扇区包含四个块区,且一个扇区共用一个密钥)。
双击timer的fscript节点(显示标签为读块数据),读块数据之前必需成功进行密钥验证。设置需要读取的指定的扇区。
print("read_mifare1_data")
output.cmd = 'read_mifare1_data'
output.keytype = 0x60
buf = wbuffer_create()
wbuffer_write_uint8(buf, 0xAA) //低字节
wbuffer_write_uint8(buf, 0xFF)
wbuffer_write_uint8(buf, 0xFF)
wbuffer_write_uint8(buf, 0xFF)
wbuffer_write_uint8(buf, 0xFF)
wbuffer_write_uint8(buf, 0xFF) //高字节
output.key_data = wbuffer_get_data(buf)
output.key_data_len = 6
//一个扇区有4个块
output.section_id = 1
output.block_id = 4
双击rfid_zlg600的消费者节点fscript,查看读取到的块数据的内容并打印。
var i = 0
print('result::::::::::::::::::::')
if (msg.cmd == "read_mifare1_data") {
if(msg.result == 0) {
print('mifare1_data_len: ' + msg.mifare1_data_len)
print('mifare1_data: start')
len = msg.mifare1_data_len
rbuf = rbuffer_create(msg.mifare1_data, len)
for (i = 0; i < len; i = i + 1) {
data = rbuffer_read_uint8(rbuf)
print('data'+ i + ':' + data)
}
print('mifare1_data: end')
output.payload = "read_mifare1_data_ok"
} else {
output.payload = "read_mifare1_data_err"
}
}
更多往期文章,请点击“ 阅读原文 ”。