完成数字键盘取数据(密码数据)
This commit is contained in:
parent
63a9070f56
commit
478d88f3c4
|
@ -7,11 +7,14 @@ import com.dpkj.common.dto.LexMarkDTO;
|
||||||
import com.dpkj.common.utils.ThirdServiceUtil;
|
import com.dpkj.common.utils.ThirdServiceUtil;
|
||||||
import com.dpkj.common.vo.Result;
|
import com.dpkj.common.vo.Result;
|
||||||
import com.dpkj.modules.keypad.service.KeypadService;
|
import com.dpkj.modules.keypad.service.KeypadService;
|
||||||
|
import com.dpkj.modules.keypad.util.WebSocketClient;
|
||||||
import com.dpkj.modules.readcard.vo.IDCardReadResultVO;
|
import com.dpkj.modules.readcard.vo.IDCardReadResultVO;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @BelongsProject: 银医通-澜沧中医院-DLL-台式机
|
* @BelongsProject: 银医通-澜沧中医院-DLL-台式机
|
||||||
* @BelongsPackage: com.dpkj.modules.keypad.service.impl
|
* @BelongsPackage: com.dpkj.modules.keypad.service.impl
|
||||||
|
@ -45,34 +48,70 @@ public class KeypadServiceImpl implements KeypadService {
|
||||||
connectParam.put("ServiceName", LexMarkConst.ENCRYPTOR);
|
connectParam.put("ServiceName", LexMarkConst.ENCRYPTOR);
|
||||||
connect.setParam(connectParam.toJSONString());
|
connect.setParam(connectParam.toJSONString());
|
||||||
IDCardReadResultVO connectResult = thirdServiceUtil.callDevice(connect, IDCardReadResultVO.class);
|
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 {
|
} 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
|
* @return
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue