事件背景

最近客户有要求,要把WIFI排插的MAC地址打印成二维码。公司使用的是一台TSC的打印机。而WIFI设备的MAC地址会由它自己通过UDP广播出来。而且还要求要做一个界面。这就很头疼了。用C做好像很麻烦的样子,所以我决定使用我第二熟悉的Java来做,刚好IDEA也有做GUI的功能。这里做一下记录。


安装驱动和接口静态库

  1. 在网上寻找驱动,这个很简单,就不用说了吧,先让自己的电脑的打印机列表里出现这个打印机,而且可以打印测试页。
  2. 去这里寻找DLL下载下来,这里我直接给个链接吧=====》Windows TSC DLL
  3. 打开压缩包,会发现有两个文件夹,一个是X86,另一个是X64;将X86里的东西拷贝到C:\Windows\System32下,将X64里的东西拷贝到C:\Windows\SysWOW64下;
  4. 安装JDK环境。

创建TSPL命令的类

的在读了TSPL指令集后,首创建我需要的类。

首先TSPL的用户指南在这里下载=====》这里
首先,我需要设定我的标签大小。

SIZE

这里我就不把内容贴上来了。
简单说说,最主要的就是标签的长宽,文档中是使用Label widthLabel length来表示的。那么就来吧。

package com.Aperture.TSPL;public class SIZE {private double mWidth, mHeight;public SIZE(double Width, double Height) {this.mWidth = Width;this.mHeight = Height;}
}

还可以注意到一个事情,文档中出现了两种单位,一种是mm,另一种是inch,这里新建一个枚举类,想了半天也想不到什么好名字,就用TSCSystem吧:

package com.Aperture.TSPL;/*** The TSC unit:* <dl>* <dt>English:</dt>* <dd>inch</dd>* <dt>Metric:</dt>* <dd>mm</dd>* </dl>*/
public enum TSCSystem {English, Metric
}

我手里的标签长宽很奇怪,不是整数值,把游标卡尺的单位转换到Inch后发现居然是个整数,那我就用Inch来做默认单位吧:

package com.Aperture.TSPL;public class SIZE {private double mWidth, mHeight;private TSCSystem mTscSystem = TSCSystem.English;/*** @param Width     Label width* @param Height    Label length* @param tscSystem Length unit. See {@link TSCSystem}.*/public SIZE(double Width, double Height, TSCSystem tscSystem) {this.mWidth = Width;this.mHeight = Height;this.mTscSystem = tscSystem;}/*** This command defines the label width and length.** @param Width  Label width (inch)* @param Height Label length (inch)*/public SIZE(double Width, double Height) {this.mWidth = Width;this.mHeight = Height;}
}

需要将其转换为TSPL指令,所以再来一个方法:

    /*** @return TSPL command.*/public String getCOMMAND() {switch (mTscSystem) {case English:return "SIZE " + String.valueOf(mWidth) + ',' + String.valueOf(mHeight);case Metric:return "SIZE " + String.valueOf(mWidth) + " mm" + ',' + String.valueOf(mHeight) + " mm";default:return null;}}

GAP

这个就是标签与标签之间的距离。
参照上一个很容易就能写出:

package com.Aperture.TSPL;public class GAP {private final double mGap;private final double mOffset;private TSCSystem mTscSystem = TSCSystem.English;/*** Defines the gap distance between two labels.** @param mGap      Label GAP* @param mOffset   Gap offset* @param tscSystem Length unit. See {@link TSCSystem}.*/public GAP(double mGap, double mOffset, TSCSystem tscSystem) {this.mGap = mGap;this.mOffset = mOffset;this.mTscSystem = tscSystem;}/*** Defines the gap distance between two labels.** @param mGap    Label GAP (inch)* @param mOffset Gap offset (inch)*/public GAP(double mGap, double mOffset) {this.mGap = mGap;this.mOffset = mOffset;}/*** Defines the gap distance between two labels.** @param mGap Label GAP (inch)*/public GAP(double mGap) {this.mGap = mGap;this.mOffset = 0;}/*** @return TSPL command.*/public String getCOMMAND() {switch (mTscSystem) {case English:return "SIZE " + String.valueOf(mGap) + ',' + String.valueOf(mOffset);case Metric:return "SIZE " + String.valueOf(mGap) + " mm" + ',' + String.valueOf(mOffset) + " mm";default:return null;}}
}

TEXT

这是比较复杂的一个,因为可变参数很多。

package com.Aperture.TSPL;public class TEXT {//TEXT x,y, " font ",rotation,x-multiplication,y-multiplication,[alignment,] " content "private Integer mX;private Integer mY;private String mFont;private Integer mRotation;private Integer mXMultiplication, mYMultiplication;private Integer mAlignment = null;private String mContent;public TEXT(int x, int y, String font, int rotation, int x_multiplication, int y_multiplication, String content) {mX = x;mY = y;mFont = font;this.mRotation = rotation;this.mXMultiplication = x_multiplication;this.mYMultiplication = y_multiplication;this.mContent = content;}public TEXT(int x, int y, String font, int rotation, int x_multiplication, int y_multiplication, int alignment, String content) {mX = x;mY = y;mFont = font;this.mRotation = rotation;this.mXMultiplication = x_multiplication;this.mYMultiplication = y_multiplication;this.mAlignment = alignment;this.mContent = content;}public String getCOMMAND() {if (mAlignment == null) {return "TEXT " +mX +mY +" \"" + mFont + "\"" +mRotation +mXMultiplication +mYMultiplication +"\"" + mContent + "\"";}return "TEXT " +mX + ',' +mY + ',' +" \"" + mFont + "\"" + ',' +mRotation + ',' +mXMultiplication + ',' +mYMultiplication + ',' +mAlignment + ',' +"\"" + mContent + "\"";}
}

QRCODE

这个居然比TEXT简单。

package com.Aperture.TSPL;public class QRCODE {private double mX;private double mY;private char mEccLevel;private double mCellWidth;private char mMode;private int mRotation;private String mModule;private String mMask;private String mData;public QRCODE(double x, double mY, char eccLevel, double cellWidth, char mode, int rotation, String module, String mask, String Data) {this.mX = x;this.mY = mY;this.mEccLevel = eccLevel;this.mCellWidth = cellWidth;this.mMode = mode;this.mRotation = rotation;this.mModule = module;this.mMask = mask;this.mData = Data;}public String getCOMMAND() {return "QRCODE " + mX + "," + mY + "," + mEccLevel + "," + mCellWidth + "," + mMode + "," + mRotation + "," + mModule + "," + mMask + ",\"" + mData + '\"';}
}

其他

剩下的东西都放在这里吧,GUI没什么好讲的。
客户还有提到需要一个SN码,SN码要和MAC对应,完了还要做在报表里。通过不断的+1即可解决这个问题。读取UDP广播的话,这种东西最好不要做在主线程中,以免卡住界面。本来想用Thread的,但是这个线程一直读取UDP的时候会让我的CPU风扇狂转不止。所以我查到了定时任务TimerTask

class UdpReceive extends TimerTask {@Overridepublic void run() {DatagramSocket socket;try {socket = new DatagramSocket(8080);} catch (SocketException e) {stateTextArea1.append("\tUdpReceive: 8080 已被占用!" + '\n');stateTextArea1.append(e.getMessage() + '\n');return;}DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);try {socket.receive(packet);} catch (IOException e) {stateTextArea1.append(e.getMessage() + '\n');return;}byte[] packetData = packet.getData();String data = new String(packetData, 0, packet.getLength()).replaceAll("\r\n", "");stateTextArea1.append("\tUdpReceive: 获得数据: " + '\"' + data + '\"' + '\n');macTextField.setText(data.split(",")[2]);socket.close();if (MAC_Records.contains(data)) {snTextField.setText(SN_Records.get(MAC_Records.indexOf(data)));stateTextArea1.append("\tUdpReceive: " + data + "已存在于记录中;SN :" +SN_Records.get(MAC_Records.indexOf(data)) + '\n');} else {snTextField.setText("000" + todayRecordName + String.valueOf(100000 + Number).substring(1));Number++;MAC_Records.add(data);SN_Records.add(snTextField.getText());if (SaveNewData()) {stateTextArea1.append("\tUdpReceive: 保存记录成功." + '\n');}
//                    PrintLabel("000" + todayRecordName + String.valueOf(100000 + MAC_Records.size())
//                                                               .substring(1), data);PrintLabel(SN_Records.get(MAC_Records.indexOf(data)), data);mTable.updateUI();}}}

通过调用

new Timer().schedule(new UdpReceive(), delay, period);

来启用这个定时线程。
避免UDP广播多次调用打印,所以,我使用暴力一点的方法,直接把所有的MAC全部存起来,每一个新的MAC都做一个判断,只有接收到的MAC是新的设备的时候才调用打印机。打印部分的的流程如下:

    private void PrintLabel(String snData, String macData) {stateTextArea1.append("\t\tPrintLabel: 打印 QRCODE " + macData + '\n');TscLibDll.INSTANCE.openport("TSC TTP-342M Pro");TscLibDll.INSTANCE.clearbuffer();TscLibDll.INSTANCE.setup("83.4", "29", "2", "8","0", "2.54", "0");TscLibDll.INSTANCE.sendcommand(new DIRECTION(1).getCOMMAND());TscLibDll.INSTANCE.sendcommand(new SHIFT(10, -20).getCOMMAND());TscLibDll.INSTANCE.sendcommand(new QRCODE(690, 40, 'L', 10, 'A',0, "M2", "S7", macData).getCOMMAND());TscLibDll.INSTANCE.sendcommand(new BARCODE(70, 135, "128", 50, 0,0, 3, 7, 0, snData).getCOMMAND());TscLibDll.INSTANCE.sendcommand(new TEXT(90, 185, "3", 0, 1,1, 0, "SN: " + snData).getCOMMAND());TscLibDll.INSTANCE.printlabel("1", "1");TscLibDll.INSTANCE.closeport();}

总结起来就是

TscLibDll.INSTANCE.openport();      // 打开端口
TscLibDll.INSTANCE.setup();         // 设置条码大小
TscLibDll.INSTANCE.sendcommand();   // 发送TSPL指令
TscLibDll.INSTANCE.printlabel();    // 打印
TscLibDll.INSTANCE.closeport();     // 关闭端口

而每打印的时候发去的指令它都会存下来,所以要打印新的东西就要清除缓存,再加上

TscLibDll.INSTANCE.clearbuffer();   // 清除缓存

就完美了。

两个项目的所有代码我都放在Github上====》Godenfreemans的GitHub


使用TSC打印机打印条码 (1)相关推荐

  1. TSC打印机使用教程终极版

    最近公司做一个资产采集的项目,之前做过此类项目,不过没有整理资料,借这次机会写一下,做个记录. 本教程使用的打印机型号:TSC TTP-244 Plus     官方文档 一.TSC打印机安装 1.机 ...

  2. C#调用TSC条码打印机打印条码

    #region 调用TSC打印机打印条码/// <summary>/// 调用TSC打印机打印条码/// </summary>/// <param name=" ...

  3. C#调用TSC条码打印机打印条码(转)

    #region 调用TSC打印机打印条码/// <summary>/// 调用TSC打印机打印条码/// </summary>/// <param name=" ...

  4. TSC打印机打印条形码和二维码,JS实现方式

    自上一篇TSC打印条形码和二维码的文章发布以来,有不 少网友咨询相关技术, 今天全部整理一下,实现的源码和文件也全部公开. -- 2019.03.28  整理最新的js打印的实现方式 说明: 1.以下 ...

  5. TSC打印机,利用javascript实现连续扫码自动打印,配置说明

    TSC打印机,利用javascript打印配置说明 页面预览: 页面代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitio ...

  6. Android 连接 TSC打印机, 打印标签(文字、图片)

    TSC选配模式有三 :以太网(WiFi).蓝牙.USB ,并提供了开发文档 1.先去官网下载,Android SDK SDK 中包含,三种模式 ,不必逐个下载了,文档中有对 接口很详细的解释 解压如下 ...

  7. JAVA调用TSC打印机打印标签(二维码,数据等)超详细!!

    本文打印机型号: TSC MA3400P 后端调用tsc打印机是通过DLL来进行调用的,首先你需要两个TSC文件直接复制到项目目录下边即可 可以直接去官网下载:https://www.chinatsc ...

  8. java 调用TSC打印机

    JNA 依赖 <dependency><groupId>com.sun.jna</groupId><artifactId>jna</artifac ...

  9. TSC打印机ttp-247(java)

    1.所需物品:java项目(jdk1.8),TTP-247打印机(1台),标签纸90*50(1卷) 本项目打印结果:不需要打印二维码,条形码.当前项目用到以标签的形式打印 2.连接打印机并调试打印机( ...

  10. 佳博 TSC打印机 TSPL指令开发

    如何在电脑上使用C# 调用佳博 TSC打印机指令控制打印 踩了不少坑 跟大家分享下开发需要注意的地方 1. 佳博和TSC的 BARCODE 指令有出入,TSC多了一个参数,直接用佳博的打印是扫码不出二 ...

最新文章

  1. 知识点讲解四:栈溢出(stack overflow)问题解决方案
  2. 计算机excel教程文字版,Excel函数教程:文本函数
  3. 如何异步提交表单 如何异步跨域提交表单
  4. Hadoop之资源调度器与任务推测执行
  5. 《剑指offer》第一次只出现一次的字符
  6. MFC状态栏编程(显示系统时间和进度条)
  7. springboot3.x 集成持久层框架
  8. 我的MVVM框架 v0.1发布
  9. oracle让数据库不产生redo,imp过程如何减少redo产生
  10. DS博客作业02--线性表
  11. 拓端tecdat|R语言参数检验 :需要多少样本?如何选择样本数量
  12. git 微盘_GitHub - 123ufo/VdiskSDK-Android: 微盘Android客户端SDK
  13. 新产品开发流程管理:以市场为驱动【笔记】(二)
  14. 流量高峰时期的性能瓶颈有哪些、以及如何来解决
  15. B/S系统界面设计与开发详解
  16. BAPose: Bottom-Up Pose Estimation with Disentangled Waterfall Representations阅读笔记
  17. Java逐行读取文件
  18. ERROR:C3848
  19. 关于如何调用苹果自带的地图APP
  20. 【音视频】浅学ISP数据处理流程

热门文章

  1. 有道词典词库_最好的免费词典和同义词库程序和网站
  2. CMM3学习笔记--常用专业术语
  3. 怎样使用计算机定时关机,如何设置电脑定时关机
  4. java servlet的包下载_javax.servlet jar包下载_javax.servlet jar包官方下载-太平洋下载中心...
  5. wps显示ntko签章服务器,ntko-系统内装有OFFICE和WPS,如何让IE加载NTKOOFFICE时以office打开文件而不是以WPS打...
  6. Opencv的使用教程,opencv比较全的基础教程
  7. VB编辑器之代码颜色修改
  8. JSP项目引入Vue.js进行项目开发(工程搭建)
  9. HTML5 web SQL 和indexedDB的使用
  10. 国产数据库激荡 40 年