完成数字键盘取数据(密码数据)

This commit is contained in:
王志成 2025-02-13 16:34:10 +08:00
parent 63a9070f56
commit 478d88f3c4
2 changed files with 143 additions and 22 deletions

View File

@ -7,11 +7,14 @@ import com.dpkj.common.dto.LexMarkDTO;
import com.dpkj.common.utils.ThirdServiceUtil;
import com.dpkj.common.vo.Result;
import com.dpkj.modules.keypad.service.KeypadService;
import com.dpkj.modules.keypad.util.WebSocketClient;
import com.dpkj.modules.readcard.vo.IDCardReadResultVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
/**
* @BelongsProject: 银医通-澜沧中医院-DLL-台式机
* @BelongsPackage: com.dpkj.modules.keypad.service.impl
@ -45,34 +48,70 @@ public class KeypadServiceImpl implements KeypadService {
connectParam.put("ServiceName", LexMarkConst.ENCRYPTOR);
connect.setParam(connectParam.toJSONString());
IDCardReadResultVO connectResult = thirdServiceUtil.callDevice(connect, IDCardReadResultVO.class);
if (connectResult.getResult() == 0) {
// 明文输入
LexMarkDTO plaintext = new LexMarkDTO();
plaintext.setDevName(LexMarkConst.ENCRYPTOR);
plaintext.setActionName(MiddlewareFunctionsConst.INPUT_DATA);
plaintext.setCallID(1000);
JSONObject plaintextParam = new JSONObject();
// 密码最小长度
plaintextParam.put("MINLength", 0);
// 密码最大长度
plaintextParam.put("MAXLength", 6);
// 是否自动结束
plaintextParam.put("bAutoEnd", 1);
// 超时时间
plaintextParam.put("TimeOut", 30000);
plaintext.setParam(plaintextParam.toJSONString());
IDCardReadResultVO plaintextResult = thirdServiceUtil.callDevice(plaintext, IDCardReadResultVO.class);
if (plaintextResult.getResult() == 0) {
return null;
WebSocketClient webSocketClient = null;
try {
if (connectResult.getResult() == 0) {
// 明文输入
LexMarkDTO plaintext = new LexMarkDTO();
plaintext.setDevName(LexMarkConst.ENCRYPTOR);
plaintext.setActionName(MiddlewareFunctionsConst.INPUT_DATA);
plaintext.setCallID(1000);
JSONObject plaintextParam = new JSONObject();
// 密码最小长度
plaintextParam.put("MINLength", 0);
// 密码最大长度
plaintextParam.put("MAXLength", 6);
// 是否自动结束
plaintextParam.put("bAutoEnd", 1);
// 超时时间
plaintextParam.put("TimeOut", 30000);
plaintextParam.put("ActiveKeys", 81919);
plaintextParam.put("TerminateKeys", 1024);
plaintext.setParam(plaintextParam.toJSONString());
// 创建 WebSocket 客户端
webSocketClient = new WebSocketClient("ws://127.0.0.1:12347");
IDCardReadResultVO plaintextResult = thirdServiceUtil.callDevice(plaintext, IDCardReadResultVO.class);
if (plaintextResult.getResult() == 0) {
try {
// 适当延长等待时间
while (true) {
TimeUnit.SECONDS.sleep(1);
String password = webSocketClient.getPassword();
if (password.length() >= plaintextParam.getIntValue("MAXLength")) {
break;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
String password = webSocketClient.getPassword();
return Result.ok(password);
} else {
return Result.error("密码输入异常!详情:" + connectResult.getDesc());
}
} else {
return Result.error("密码输入异常!详情:" + connectResult.getDesc());
return Result.error("数字键盘设备连接失败!详情:" + connectResult.getDesc());
}
} finally {
if (webSocketClient != null) {
webSocketClient.close();
}
// 关闭身份证读卡设备
LexMarkDTO close = new LexMarkDTO();
close.setDevName(LexMarkConst.ENCRYPTOR);
close.setCallID(0);
close.setActionName(MiddlewareFunctionsConst.CLOSE_CONNECTION);
IDCardReadResultVO closeResult = thirdServiceUtil.callDevice(close, IDCardReadResultVO.class);
if (closeResult.getResult() != 0) {
log.info("数字键盘设备关闭异常!");
}
} else {
return Result.error("数字键盘设备连接失败!详情:" + connectResult.getDesc());
}
}
/**
* 取消输入 明文或者密文
* @return

View File

@ -0,0 +1,82 @@
package com.dpkj.modules.keypad.util;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import javax.websocket.*;
import java.io.IOException;
import java.net.URI;
@ClientEndpoint
@Slf4j
public class WebSocketClient {
private Session session;
private String password = "";
public WebSocketClient(String uri) {
try {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
session = container.connectToServer(this, new URI(uri));
} catch (Exception e) {
e.printStackTrace();
}
}
@OnOpen
public void onOpen(Session session) {
this.session = session;
}
@OnMessage
public void onMessage(String message) {
// 解析外层 JSON 对象
JSONObject outerObj = JSONObject.parseObject(message);
// 获取 "param" 字段对应的 JSON 对象
JSONObject paramObj = outerObj.getJSONObject("param");
// "param" 对象中获取 "Key" 的值
Integer keyValue = paramObj.getInteger("Key");
if (keyValue != null) {
Integer i = parseAsciiToDigit(keyValue);
if (i != -1) {
password += i.toString();
}
} else {
log.info("按键事件返回值,未找到 Key 字段或其值为空。");
}
}
@OnClose
public void onClose(Session session, CloseReason closeReason) {
}
public String getPassword() {
return password;
}
public void close() {
try {
if (session != null && session.isOpen()) {
session.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static Integer parseAsciiToDigit(Integer asciiValue) {
// 检查输入的 ASCII 值是否在 '0' '9' 的范围内
if (asciiValue >= 48 && asciiValue <= 57) {
// ASCII 值转换为对应的数字
return asciiValue - 48;
} else {
// 如果输入的 ASCII 值不在 '0' '9' 的范围内返回 -1 表示无效输入
return -1;
}
}
}