4 changed files with 184 additions and 1 deletions
-
58src/main/java/com/iflytop/a800/controller/IdChipController.java
-
2src/main/java/com/iflytop/a800/device/Device.java
-
101src/main/java/com/iflytop/a800/device/IdChipReader.java
-
24src/main/java/com/iflytop/a800/model/MdbIdChip.java
@ -0,0 +1,58 @@ |
|||||
|
package com.iflytop.a800.controller; |
||||
|
import com.iflytop.a800.device.Device; |
||||
|
import com.iflytop.a800.model.MdbIdChip; |
||||
|
import com.iflytop.uf.UfActiveRecord; |
||||
|
import com.iflytop.uf.UfActiveRecordCriteria; |
||||
|
import com.iflytop.uf.controller.UfApiControllerBase; |
||||
|
import com.iflytop.uf.controller.UfApiResponse; |
||||
|
import org.springframework.stereotype.Controller; |
||||
|
import org.springframework.web.bind.annotation.PostMapping; |
||||
|
import org.springframework.web.bind.annotation.RequestBody; |
||||
|
import org.springframework.web.bind.annotation.ResponseBody; |
||||
|
import java.util.HashMap; |
||||
|
import java.util.List; |
||||
|
import java.util.Map; |
||||
|
@Controller |
||||
|
public class IdChipController extends UfApiControllerBase { |
||||
|
@PostMapping("/api/id-chip/search") |
||||
|
@ResponseBody |
||||
|
public UfApiResponse search( @RequestBody Map<String, Object> params ) { |
||||
|
var criteria = new UfActiveRecordCriteria(); |
||||
|
criteria.offset = (Integer)params.get("offset"); |
||||
|
criteria.limit = (Integer)params.get("limit"); |
||||
|
String orderBy = (String)params.get("orderBy"); |
||||
|
String orderDirection = (String)params.get("orderDir"); |
||||
|
if ( null != orderBy && null != orderDirection ) { |
||||
|
criteria.orders = new HashMap<>(); |
||||
|
criteria.orders.put(orderBy, orderDirection); |
||||
|
} |
||||
|
var list = UfActiveRecord.find(MdbIdChip.class, criteria); |
||||
|
var totalCount = UfActiveRecord.count(MdbIdChip.class, criteria); |
||||
|
return this.success(Map.of("list", list, "totalCount", totalCount)); |
||||
|
} |
||||
|
|
||||
|
@PostMapping("/api/id-chip/read-and-save") |
||||
|
@ResponseBody |
||||
|
public UfApiResponse readAndSave() { |
||||
|
var reader = Device.getInstance().idChipReader; |
||||
|
var chip = reader.read(); |
||||
|
var existsCount = UfActiveRecord.count(MdbIdChip.class, Map.of("hash", chip.hash)); |
||||
|
if ( 0 == existsCount ) { |
||||
|
chip.save(); |
||||
|
} |
||||
|
return this.success(); |
||||
|
} |
||||
|
|
||||
|
@PostMapping("/api/id-chip/batch-delete") |
||||
|
@ResponseBody |
||||
|
public UfApiResponse batchDelete( @RequestBody Map<String, Object> params ) { |
||||
|
List<String> ids = (List<String>) params.get("ids"); |
||||
|
for ( var id : ids ) { |
||||
|
var chip = UfActiveRecord.findOne(MdbIdChip.class, id); |
||||
|
if ( null != chip ) { |
||||
|
chip.delete(); |
||||
|
} |
||||
|
} |
||||
|
return this.success(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,101 @@ |
|||||
|
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; |
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue