Browse Source

rfid成功获取TID并打印

master
han\hanst 7 months ago
parent
commit
8c4e6115ad
  1. 1
      src/main/java/com/gaotao/modules/base/entity/LabelSettingData.java
  2. 3
      src/main/java/com/gaotao/modules/base/service/Impl/BaseServiceImpl.java
  3. 141
      src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java
  4. 7
      src/main/resources/mapper/base/BaseMapper.xml

1
src/main/java/com/gaotao/modules/base/entity/LabelSettingData.java

@ -14,6 +14,7 @@ public class LabelSettingData {
private String searchFlag;//是否查询
private String newLabelNo;//新的标签编号
private String printDirection;
private String rfidFlag; //是否使用RFID
private String zplCode;
// 新增纸张尺寸和DPI相关字段

3
src/main/java/com/gaotao/modules/base/service/Impl/BaseServiceImpl.java

@ -45,9 +45,6 @@ public class BaseServiceImpl implements BaseService {
String labelType = inData.getLabelType();
String labelClass = inData.getLabelClass();
//判断空值
if (labelName == null || "".equals(labelName)) {
throw new XJException("报表文件名不能为空!");
}
if (labelType == null || "".equals(labelType)) {
throw new XJException("标签类型不能为空!");
}

141
src/main/java/com/gaotao/modules/base/service/Impl/ReportLabelListServiceImpl.java

@ -155,6 +155,15 @@ public class ReportLabelListServiceImpl extends ServiceImpl<ReportLabelListMappe
@Override
public void printLabel(PrintLabelRequest printRequest) {
String rfidFlag = null;
LabelSettingData labelSettingData = new LabelSettingData();
labelSettingData.setLabelNo(printRequest.getReportId());
List<LabelSettingData> labelSettingDataList = baseService.getLabelSettingList(labelSettingData);
if (labelSettingDataList.isEmpty()) {
throw new RuntimeException("未找到对应的标签");
} else {
rfidFlag = labelSettingDataList.getFirst().getRfidFlag();
}
try {
// 1. 验证打印请求
if (printRequest.getZplCode() == null || printRequest.getZplCode().trim().isEmpty()) {
@ -181,8 +190,8 @@ public class ReportLabelListServiceImpl extends ServiceImpl<ReportLabelListMappe
// 3. 处理打印份数
int requestedCopies = printRequest.getCopies() != null && printRequest.getCopies() > 0 ? printRequest.getCopies() : 1;
// 4. 发送ZPL到打印机RFID模式下始终只处理一张标签
sendZplToPrinter(printerIP, printRequest.getZplCode(), 1);
// 4. 发送ZPL到打印机
sendZplToPrinter(printerIP, printRequest.getZplCode(), requestedCopies,rfidFlag);
// 5. 记录打印日志
log.info("RFID标签打印任务执行成功,请求参数: {}", printRequest);
@ -196,12 +205,12 @@ public class ReportLabelListServiceImpl extends ServiceImpl<ReportLabelListMappe
* 发送ZPL代码到打印机支持RFID标签处理
* 修复每次打印请求只处理一张标签避免重复打印
*/
private void sendZplToPrinter(String printerIP, String zplCode, Integer copies) {
private void sendZplToPrinter(String printerIP, String zplCode, Integer copies, String rfidFlag) {
try {
// 注意这里的copies参数实际上应该在ZPL代码中处理而不是在这里循环
// 每次打印请求只处理一张RFID标签
log.info("开始处理RFID标签打印: {}, 请求份数: {}", printerIP, copies);
RfidProcessResult result = processRfidLabel(printerIP, zplCode, copies);
RfidProcessResult result = processRfidLabel(printerIP, zplCode, copies,rfidFlag);
if (result.isSuccess()) {
log.info("RFID标签处理成功: {}", printerIP);
} else {
@ -216,21 +225,21 @@ public class ReportLabelListServiceImpl extends ServiceImpl<ReportLabelListMappe
/**
* 处理单张RFID标签读取TID -> 写入EPC -> 打印标签
*/
private RfidProcessResult processRfidLabel(String printerIP, String originalZplCode, int labelIndex) {
private RfidProcessResult processRfidLabel(String printerIP, String originalZplCode, int labelIndex, String rfidFlag) {
RfidProcessResult result = new RfidProcessResult(labelIndex);
java.net.Socket socket = null;
try {
// 检查RFID功能是否启用
if (true) {
// 如果RFID功能未启用直接打印普通标签
if (rfidFlag==null || "N".equals(rfidFlag)) {
socket = new java.net.Socket(printerIP, 9100);
socket.setSoTimeout(10000);
OutputStream outputStream = socket.getOutputStream();
printLabel(outputStream, originalZplCode);
result.markCompleted(true, "RFID功能未启用,已打印普通标签");
log.info("第{}张标签 - RFID功能未启用,已打印普通标签", labelIndex);
// 清理原始ZPL代码确保只打印1张
String cleanedZpl = cleanZplForSinglePrint(originalZplCode);
String singlePrintZpl = "^XA\n^PQ1\n" + cleanedZpl.substring(3);
log.info("发送清理后的ZPL(跳过RFID): {}", singlePrintZpl);
printLabel(outputStream, singlePrintZpl);
result.markCompleted(true, "调试模式:跳过RFID,已打印普通标签");
log.info("第{}张标签 - 调试模式:跳过RFID,已打印普通标签", labelIndex);
return result;
}
socket = new java.net.Socket(printerIP, 9100);
@ -264,50 +273,122 @@ public class ReportLabelListServiceImpl extends ServiceImpl<ReportLabelListMappe
*/
private String readRfidTid(OutputStream outputStream, InputStream inputStream, String originalZplCode) throws Exception {
log.info("开始读取RFID标签TID...");
// 清空输入流缓冲区避免之前的数据干扰
clearInputStreamBuffer(inputStream);
String epc = "1234567890AB1234567890AB"; // 6字节 EPC必须是偶数位 Hex 字符
// 组装 ZPL
// 生成有效的EPC数据 - 确保格式正确避免写入失败
String epc = generateValidEpc();
// 处理原始ZPL代码移除可能的打印份数指令确保只打印1张
String cleanedZplCode = cleanZplForSinglePrint(originalZplCode.substring(3));
// 组装 ZPL - 优化RFID指令确保EPC写入成功
String readTidZpl = "^XA\n" +
"^RS8\n" +
"^PQ1\n" + // 首先设置打印份数为1
"^RS8\n" + // 设置RFID参数
"^RFR,H,2,12,1^FN1^FS\n" + // 读取 TID
"^RFW,H,2,6,1^FD" + epc + "^FS\n" + // 写入 EPC - 重新启用
"^HV1^FN1^FS\n" + // 打印 TID
"^RFW,H,2,6,1^FD" + epc + "^FS\n" + // 写入 EPC
originalZplCode.substring(3);
log.info("发送TID读取指令");
outputStream.write(readTidZpl.getBytes("UTF-8"));
outputStream.flush();
Thread.sleep(1000); // 等待1秒确保处理完成
// 读取响应数据
cleanedZplCode;
log.info("发送完整ZPL指令: {}", readTidZpl);
try {
outputStream.write(readTidZpl.getBytes("UTF-8"));
outputStream.flush();
log.info("ZPL指令发送成功,等待RFID操作完成...");
Thread.sleep(3000); // 增加等待时间确保RFID操作完成
} catch (Exception e) {
log.error("发送ZPL指令失败: {}", e.getMessage());
throw new RuntimeException("发送ZPL指令失败: " + e.getMessage());
}
// 读取响应数据 - 优化读取逻辑
StringBuilder response = new StringBuilder();
byte[] buffer = new byte[1024];
long startTime = System.currentTimeMillis();
while (System.currentTimeMillis() - startTime < 5000) {
boolean hasReceivedData = false;
// 增加超时时间给RFID操作更多时间
while (System.currentTimeMillis() - startTime < 8000) {
if (inputStream.available() > 0) {
int bytesRead = inputStream.read(buffer);
if (bytesRead > 0) {
String data = new String(buffer, 0, bytesRead, "UTF-8");
response.append(data);
log.info("收到TID数据: {}", data.trim());
hasReceivedData = true;
log.info("收到数据片段: {}", data.trim());
// 如果收到的数据看起来像TID数据可以提前结束等待
if (data.trim().length() >= 12 && data.trim().matches("[0-9A-Fa-f]+")) {
log.info("检测到TID格式数据,提前结束等待");
break;
}
}
} else {
Thread.sleep(100);
Thread.sleep(200); // 增加等待间隔
}
}
String responseStr = response.toString();
if (responseStr.trim().isEmpty()) {
String responseStr = response.toString().trim();
log.info("完整响应数据: {}", responseStr);
if (responseStr.isEmpty()) {
throw new RuntimeException("未收到TID响应数据,请检查RFID标签是否正确放置");
}
// 如果收到的是状态信息而不是TID数据
if (responseStr.length() > 200 || responseStr.contains("RFID READER") ||
responseStr.contains("FIRMWARE") || responseStr.contains("RESOLUTION")) {
throw new RuntimeException("收到打印机状态信息而非TID数据,请检查标签是否为RFID标签");
}
log.info("完整TID响应: {}", responseStr);
return responseStr;
}
/**
* 生成有效的EPC数据
* EPC必须是12个十六进制字符6字节
*/
private String generateValidEpc() {
// 生成基于时间戳的EPC确保唯一性和有效性
long timestamp = System.currentTimeMillis();
String epc = String.format("%012X", timestamp & 0xFFFFFFFFFFFFL);
// 确保EPC长度正确12个字符
if (epc.length() > 12) {
epc = epc.substring(epc.length() - 12);
} else if (epc.length() < 12) {
epc = String.format("%012s", epc).replace(' ', '0');
}
log.info("生成EPC: {}", epc);
return epc;
}
/**
* 清理ZPL代码移除可能导致多张打印的指令
*/
private String cleanZplForSinglePrint(String zplCode) {
if (zplCode == null) {
return "";
}
log.info("开始清理ZPL代码,原始内容: {}", zplCode);
// 移除所有可能导致多张打印的指令
String cleaned = zplCode
.replaceAll("\\^PQ\\d+", "") // 移除 ^PQ 指令打印份数
.replaceAll("\\^PQ\\d+,\\d+", "") // 移除带参数的 ^PQ 指令
.replaceAll("\\^PQ\\d+,\\d+,\\d+", "") // 移除完整参数的 ^PQ 指令
.replaceAll("\\^XA", "") // 移除额外的 ^XA 开始符
.replaceAll("\\^XZ", "") // 移除所有 ^XZ 结束符我们会在最后添加一个
.replaceAll("\\n\\s*\\n", "\n") // 清理多余的空行
.trim();
// 确保以 ^XZ 结束
if (!cleaned.endsWith("^XZ")) {
cleaned += "\n^XZ";
}
log.info("ZPL清理完成 - 原始长度: {}, 清理后长度: {}, 清理后内容: {}",
zplCode.length(), cleaned.length(), cleaned);
return cleaned;
}
/**
* 清空输入流缓冲区
*/

7
src/main/resources/mapper/base/BaseMapper.xml

@ -6,7 +6,7 @@
<select id="getLabelSettingList" parameterType="LabelSettingData" resultType="LabelSettingData">
SELECT ReportID labelNo, ReportFamily labelType, Reportfile labelName, ReportType labelClass, Remark remark,
PrintDirection printDirection, ZplCode zplCode, PaperSize paperSize, PaperOrientation paperOrientation,
Dpi dpi, CanvasWidth canvasWidth, CanvasHeight canvasHeight,
Dpi dpi, CanvasWidth canvasWidth, CanvasHeight canvasHeight,rfidFlag,
PhysicalWidthMm physicalWidthMm, PhysicalHeightMm physicalHeightMm
FROM ReportFileList
<where>
@ -37,10 +37,10 @@
<!--插入标签自定义的数据-->
<insert id="insertLabelSetting" parameterType="LabelSettingData">
INSERT INTO ReportFileList(ReportID, ReportFamily, Reportfile, ReportType, Remark, PrintDirection, ZplCode,
INSERT INTO ReportFileList(ReportID, ReportFamily, Reportfile, ReportType, Remark, PrintDirection, ZplCode,rfidFlag,
PaperSize, PaperOrientation, Dpi, CanvasWidth, CanvasHeight,
PhysicalWidthMm, PhysicalHeightMm, UpdatedTime)
VALUES (#{labelNo}, #{labelType}, #{labelName}, #{labelClass}, #{remark}, #{printDirection}, #{zplCode},
VALUES (#{labelNo}, #{labelType}, #{labelName}, #{labelClass}, #{remark}, #{printDirection}, #{zplCode},#{rfidFlag}
#{paperSize}, #{paperOrientation}, #{dpi}, #{canvasWidth}, #{canvasHeight},
#{physicalWidthMm}, #{physicalHeightMm}, GETDATE())
</insert>
@ -54,6 +54,7 @@
Remark = #{remark},
PrintDirection = #{printDirection},
ZplCode = #{zplCode},
rfidFlag= #{rfidFlag},
PaperSize = #{paperSize},
paper_id = #{paperSize},
PaperOrientation = #{paperOrientation},

Loading…
Cancel
Save