最近在开发的系统中,有一个接入外接设备制卡机更换,之前用的制卡机要重新采购,所以导致之前的调用接口方法无效,要用新的设备接口来进行调用。可是这个设备是外国进口过来的,资料很少。想要百度的话,网上资料都没有,中间经过了几天的摸索,最终还是弄了出来,所以把详细的分析及解决方法记录下来。
这个制卡机是打印磁卡/智能卡的,像我们常用的银行卡、饭卡、购物卡都可以用这个机器来进行设计并制卡,并最终发放给消费者使用。简要说下解决的思路吧,最开始拿到这个机器的时候,我是一头的雾水,也不知道从何下手,我当时最最简单的想法就是先把这个机器怎么使用,怎么操作,什么用途了解清楚,然后再谈接口代码啥的。但是找了半天,网上的资料也很少,也不知道怎么使用,最后看到机器上有一个二维码帮助的,扫了下,进入到了它们的官网,找到了相应的机器型号,然后的话看到了相应的使用说明和相应的视频教程,了解了一番,这才知道了产品正确的使用方法,所以拿到一个新玩意,想要快速了解它,最好的还是先去看他的说明书和官方教程。
知道了相应的使用方法,下面的操作也就很简单了。其实具体的原理方法也就是先使用软件设计出两张BMP的图片,一面是磁卡/智能卡的正面,一般的话都是张设计的好看的图片,另一张的话就是磁卡/智能卡的反面,然后图片的给相应的代码解析,读取,把信息写入到卡的磁条上,最后调用机器进行打印,用其中机器的墨纸写入到空白的卡片上就可以了。
但是一般人工都是机器自带的软件提前设计好图片,如果换做用代码驱动机器的话,那就要用代码要生成图片了。当然了,在JAVA中有相应的类来生成BMP格式的图片,然后调用相应的代码就可以了。
package com.wonders.yksx.ylbk.web.action;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.ImageIcon;
import net.sf.json.JSONObject;
import org.apache.commons.io.IOUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.wonders.yksx.jdlk.web.util.ResponseUtil;
import com.wonders.yksx.salvation.web.action.SalvationActionParent;
import com.wonders.yksx.ylbk.web.form.MagEncodeContainer;
import com.wonders.yksx.ylbk.web.form.MagEncodeModel;
import com.wonders.yksx.ylbk.web.form.PrinterModel;
import com.zebra.sdk.comm.Connection;
import com.zebra.sdk.comm.ConnectionException;
import com.zebra.sdk.common.card.containers.GraphicsInfo;
import com.zebra.sdk.common.card.containers.JobStatusInfo;
import com.zebra.sdk.common.card.enumerations.CardSide;
import com.zebra.sdk.common.card.enumerations.GraphicType;
import com.zebra.sdk.common.card.enumerations.OrientationType;
import com.zebra.sdk.common.card.enumerations.PrintType;
import com.zebra.sdk.common.card.exceptions.ZebraCardException;
import com.zebra.sdk.common.card.graphics.ZebraCardGraphics;
import com.zebra.sdk.common.card.graphics.ZebraGraphics;
import com.zebra.sdk.common.card.graphics.enumerations.RotationType;
import com.zebra.sdk.common.card.printer.ZebraCardPrinter;
import com.zebra.sdk.common.card.printer.ZebraCardPrinterFactory;
import com.zebra.sdk.device.ZebraIllegalArgumentException;
import com.zebra.sdk.printer.discovery.DiscoveredPrinter;
import com.zebra.sdk.printer.discovery.UsbDiscoverer;
public class MakeCardVolumnAction extends SalvationActionParent {
DiscoveredPrinter[] printers = null;
Connection connection = null;
ZebraCardPrinter zebraCardPrinter = null;
ZebraCardGraphics graphics = null;
ByteArrayOutputStream baos = null;
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
String personName = String.valueOf(new String(request.getParameter("name").toString().getBytes("ISO-8859-1"),"UTF-8"));
String cardNo = String.valueOf(request.getParameter("cardNo"));
String cardData = String.valueOf(request.getP