You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
3.5 KiB
101 lines
3.5 KiB
package com.iflytop.a800.device;
|
|
import com.iflytop.a800.model.MdbIdChip;
|
|
import com.iflytop.uf.UfActuatorCmdExecutor;
|
|
import com.iflytop.uf.UfEventBus;
|
|
import com.iflytop.uf.model.UfMdbNotification;
|
|
import com.iflytop.uf.util.UfCommon;
|
|
import org.springframework.util.DigestUtils;
|
|
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.ByteOrder;
|
|
import java.util.ArrayList;
|
|
import java.util.Base64;
|
|
import java.util.List;
|
|
|
|
public class IdChipReader {
|
|
// constructor
|
|
public IdChipReader() {
|
|
UfEventBus.getInstance().on("ZCanCmderWebSocketEvent", this::handleZCanCmderWebSocketEvent);
|
|
}
|
|
|
|
// 事件处理
|
|
public void handleZCanCmderWebSocketEvent(Object ... args) {
|
|
Integer eventId = (Integer)args[0];
|
|
if ( 0x71C8 == eventId ) { // ID 卡插入
|
|
UfMdbNotification.action("IdChipInsert");
|
|
}
|
|
// if ( 0x71C9 == eventId ) { // ID 拔出
|
|
// UfMdbNotification.action("IdChipPullout");
|
|
// }
|
|
}
|
|
|
|
// 读取数据
|
|
public MdbIdChip read() {
|
|
var buffer = this.readToByteBuffer();
|
|
|
|
// parse to model
|
|
var chip = new MdbIdChip();
|
|
// item name
|
|
byte[] itemNameBytes = new byte[15];
|
|
buffer.get(0x0001, itemNameBytes);
|
|
for (int i = 0; i < itemNameBytes.length; i++) {
|
|
itemNameBytes[i] = -1 == itemNameBytes[i] ? 0 : itemNameBytes[i];
|
|
}
|
|
chip.itemName = new String(itemNameBytes);
|
|
chip.itemName = chip.itemName.trim();
|
|
|
|
// lot code
|
|
byte[] lotCodeBytes = new byte[12];
|
|
buffer.get(0x0010, lotCodeBytes);
|
|
for (int i = 0; i < lotCodeBytes.length; i++) {
|
|
lotCodeBytes[i] = -1 == lotCodeBytes[i] ? 0 : lotCodeBytes[i];
|
|
}
|
|
chip.lotCode = new String(lotCodeBytes);
|
|
chip.lotCode = chip.lotCode.trim();
|
|
|
|
// expire date
|
|
byte expYear = buffer.get(0x001C);
|
|
byte expMon = buffer.get(0x001D);
|
|
byte expDay = buffer.get(0x001E);
|
|
chip.expiredDate = String.format("20%02x-%02x-%02x", expYear, expMon, expDay);
|
|
|
|
// version
|
|
chip.version = Integer.toString(buffer.get(0x0021));
|
|
|
|
// hash
|
|
byte itemCode = buffer.get(0x001F);
|
|
chip.hash = String.format("%d-%s-%s-%s", itemCode, chip.lotCode, chip.expiredDate, chip.version);
|
|
chip.hash = DigestUtils.md5DigestAsHex(chip.hash.getBytes());
|
|
|
|
return chip;
|
|
}
|
|
|
|
// read id chip data to buffer
|
|
private ByteBuffer readToByteBuffer() {
|
|
var sectorSizeStr = UfActuatorCmdExecutor.execute("IdCardReader", "module_get_reg", "10301");
|
|
var sectorSize = Integer.parseInt(sectorSizeStr);
|
|
var sectorNumStr = UfActuatorCmdExecutor.execute("IdCardReader", "module_get_reg", "10302");
|
|
var sectorNum = Integer.parseInt(sectorNumStr);
|
|
|
|
// read bytes
|
|
List<Byte> data = new ArrayList<>();
|
|
for (int i = 0; i<sectorNum; i++ ) {
|
|
String readParam = Integer.toString(i);
|
|
String response = UfActuatorCmdExecutor.execute("IdCardReader","a8000_idcard_reader_read_raw", readParam);
|
|
Base64.Decoder decoder = Base64.getDecoder();
|
|
byte[] bytes = decoder.decode(response);
|
|
for (byte aByte : bytes) {
|
|
data.add(aByte);
|
|
}
|
|
}
|
|
|
|
// convert to buffer
|
|
byte[] result = new byte[data.size()];
|
|
for ( int i = 0; i < data.size(); i++ ) {
|
|
result[i] = data.get(i);
|
|
}
|
|
var buffer = ByteBuffer.wrap(result);
|
|
buffer.order(ByteOrder.LITTLE_ENDIAN);
|
|
return buffer;
|
|
}
|
|
}
|