美文网首页
Android小白进阶之路--项目需求3

Android小白进阶之路--项目需求3

作者: 胖大海_e30c | 来源:发表于2017-05-10 09:56 被阅读82次

     吧项目需求3:UVC协议摄像头扫描二维码,将扫码结果发送给后台。

    今天经大神指点对于打印机打印小票这一块提供了一些方向,首先有几个问题要想1、是连接被扫的还是连接扫码的;2、然后怎么连接,蓝牙还是Wifi?;3、连接打印机的是什么系统,安卓还是Win?;这些都弄明白了你就知道怎样调用了,然后去找相关的api就完了,还有一点是打印这个东西应该找系统的api,例如Win怎样调用打印机?

    APK是AndroidPackage的缩写,即Android安装包(apk)。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。

    root权限,系统权限的一种,与SYSTEM权限可以理解成一个概念,但高于Administrator权限,root是Linux和unix系统中的超级管理员用户帐户,该帐户拥有整个系统至高无上的权力,所有对象他都可以操作,所以很多黑客在入侵系统的时候,都要把权限提升到root权限,用windows的方法理解也就是将自己的非法帐户添加到Administrators用户组。

    UVC协议称为:USB video class 或USB video device class。是Microsoft与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标准,目前已成为USB org标准之一。

    Android工具---Git,Git是免费的开源的分布式的版本控制系统,Git是一款分布式的源代码管理工具。

    根据打印流程可以得出的是:本打印小票的打印机是可以主动扫描、也可以调出二维码被扫描两种方式并存的;连接方式是Wifi连接;连接打印机系统是Windows系统;小票打印就是向打印设备发送控制打印格式的指令集,而这些打印格式需要去查询对应打印机的API文档。有大神把常用的api进行了封装:1、文字对齐方式 2、打印字体大小 3、字体是否加粗4、打印二维码 5、打印条形码 6、切纸  7、打开钱箱   8、字符串转字节数组  9、字符拼接

    /**

    * 打印格式

    * Created by john on 17-3-23.

    */

    public class PrintFormatUtils {

    // 对齐方式

    public static final int ALIGN_LEFT = 0;     // 靠左

    public static final int ALIGN_CENTER = 1;   // 居中

    public static final int ALIGN_RIGHT = 2;    // 靠右

    //字体大小

    public static final int FONT_NORMAL = 0;    // 正常

    public static final int FONT_MIDDLE = 1;    // 中等

    public static final int FONT_BIG = 2;       // 大

    //加粗模式

    public static final int FONT_BOLD = 0;              // 字体加粗

    public static final int FONT_BOLD_CANCEL = 1;       // 取消加粗

    /**

    * 打印二维码

    * @param qrCode

    * @return

    */

    public static String getQrCodeCmd(String qrCode) {

    byte[] data;

    int store_len = qrCode.length() + 3;

    byte store_pL = (byte) (store_len % 256);

    byte store_pH = (byte) (store_len / 256);

    // QR Code: Select the model

    //              Hex     1D      28      6B      04      00      31      41      n1(x32)     n2(x00) - size of model

    // set n1 [49 x31, model 1] [50 x32, model 2] [51 x33, micro qr code]

    // https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=140

    byte[] modelQR = {(byte)0x1d, (byte)0x28, (byte)0x6b, (byte)0x04, (byte)0x00, (byte)0x31, (byte)0x41, (byte)0x32, (byte)0x00};

    // QR Code: Set the size of module

    // Hex      1D      28      6B      03      00      31      43      n

    // n depends on the printer

    // https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=141

    byte[] sizeQR = {(byte)0x1d, (byte)0x28, (byte)0x6b, (byte)0x03, (byte)0x00, (byte)0x31, (byte)0x43, (byte)0x08};

    //          Hex     1D      28      6B      03      00      31      45      n

    // Set n for error correction [48 x30 -> 7%] [49 x31-> 15%] [50 x32 -> 25%] [51 x33 -> 30%]

    // https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=142

    byte[] errorQR = {(byte)0x1d, (byte)0x28, (byte)0x6b, (byte)0x03, (byte)0x00, (byte)0x31, (byte)0x45, (byte)0x31};

    // QR Code: Store the data in the symbol storage area

    // Hex      1D      28      6B      pL      pH      31      50      30      d1...dk

    // https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=143

    //                        1D          28          6B         pL          pH  cn(49->x31) fn(80->x50) m(48->x30) d1…dk

    byte[] storeQR = {(byte)0x1d, (byte)0x28, (byte)0x6b, store_pL, store_pH, (byte)0x31, (byte)0x50, (byte)0x30};

    // QR Code: Print the symbol data in the symbol storage area

    // Hex      1D      28      6B      03      00      31      51      m

    // https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=144

    byte[] printQR = {(byte)0x1d, (byte)0x28, (byte)0x6b, (byte)0x03, (byte)0x00, (byte)0x31, (byte)0x51, (byte)0x30};

    data = byteMerger(modelQR, sizeQR);

    data = byteMerger(data, errorQR);

    data = byteMerger(data, storeQR);

    data = byteMerger(data, qrCode.getBytes());

    data = byteMerger(data, printQR);

    return new String(data);

    }

    /**

    * 打印条码

    * @param barcode

    * @return

    */

    public static String getBarcodeCmd(String barcode) {

    // 打印 Code-128 条码时需要使用字符集前缀

    // "{A" 表示大写字母

    // "{B" 表示所有字母,数字,符号

    // "{C" 表示数字,可以表示 00 - 99 的范围

    byte[] data;

    String btEncode;

    if (barcode.length() < 18) {

    // 字符长度小于15的时候直接输出字符串

    btEncode = "{B" + barcode;

    } else {

    // 否则做一点优化

    int startPos = 0;

    btEncode = "{B";

    for (int i = 0; i < barcode.length(); i++) {

    char curChar = barcode.charAt(i);

    if (curChar < 48 || curChar > 57 || i == (barcode.length() - 1)) {

    // 如果是非数字或者是最后一个字符

    if (i - startPos >= 10) {

    if (startPos == 0) {

    btEncode = "";

    }

    btEncode += "{C";

    boolean isFirst = true;

    int numCode = 0;

    for (int j = startPos; j < i; j++) {

    if (isFirst) { // 处理第一位

    numCode = (barcode.charAt(j) - 48) * 10;

    isFirst = false;

    } else { // 处理第二位

    numCode += (barcode.charAt(j) - 48);

    btEncode += (char) numCode;

    isFirst = true;

    }

    }

    btEncode += "{B";

    if (!isFirst) {

    startPos = i - 1;

    } else {

    startPos = i;

    }

    }

    for (int k = startPos; k <= i; k++) {

    btEncode += barcode.charAt(k);

    }

    startPos = i + 1;

    }

    }

    }

    // 设置 HRI 的位置,02 表示下方

    byte[] hriPosition = {(byte) 0x1d, (byte) 0x48, (byte) 0x02};

    // 最后一个参数表示宽度 取值范围 1-6 如果条码超长则无法打印

    byte[] width = {(byte) 0x1d, (byte) 0x77, (byte) 0x02};

    byte[] height = {(byte) 0x1d, (byte) 0x68, (byte) 0xfe};

    // 最后两个参数 73 : CODE 128 || 编码的长度

    byte[] barcodeType = {(byte) 0x1d, (byte) 0x6b, (byte) 73, (byte) btEncode.length()};

    byte[] print = {(byte) 10, (byte) 0};

    data = PrintFormatUtils.byteMerger(hriPosition, width);

    data = PrintFormatUtils.byteMerger(data, height);

    data = PrintFormatUtils.byteMerger(data, barcodeType);

    data = PrintFormatUtils.byteMerger(data, btEncode.getBytes());

    data = PrintFormatUtils.byteMerger(data, print);

    return new String(data);

    }

    /**

    * 切纸

    * @return

    */

    public static String getCutPaperCmd() {

    // 走纸并切纸,最后一个参数控制走纸的长度

    byte[] data = {(byte) 0x1d, (byte) 0x56, (byte) 0x42, (byte) 0x15};

    return new String(data);

    }

    /**

    * 对齐方式

    * @param alignMode

    * @return

    */

    public static String getAlignCmd(int alignMode) {

    byte[] data = {(byte) 0x1b, (byte) 0x61, (byte) 0x0};

    if (alignMode == ALIGN_LEFT) {

    data[2] = (byte) 0x00;

    } else if (alignMode == ALIGN_CENTER) {

    data[2] = (byte) 0x01;

    } else if (alignMode == ALIGN_RIGHT) {

    data[2] = (byte) 0x02;

    }

    return new String(data);

    }

    /**

    * 字体大小

    * @param fontSize

    * @return

    */

    public static String getFontSizeCmd(int fontSize) {

    byte[] data = {(byte) 0x1d, (byte) 0x21, (byte) 0x0};

    if (fontSize == FONT_NORMAL) {

    data[2] = (byte) 0x00;

    } else if (fontSize == FONT_MIDDLE) {

    data[2] = (byte) 0x01;

    } else if (fontSize == FONT_BIG) {

    data[2] = (byte) 0x11;

    }

    return new String(data);

    }

    /**

    * 加粗模式

    * @param fontBold

    * @return

    */

    public static String getFontBoldCmd(int fontBold) {

    byte[] data = {(byte) 0x1b, (byte) 0x45, (byte) 0x0};

    if (fontBold == FONT_BOLD) {

    data[2] = (byte) 0x01;

    } else if (fontBold == FONT_BOLD_CANCEL) {

    data[2] = (byte) 0x00;

    }

    return new String(data);

    }

    /**

    * 打开钱箱

    * @return

    */

    public static String getOpenDrawerCmd() {

    byte[] data = new byte[4];

    data[0] = 0x10;

    data[1] = 0x14;

    data[2] = 0x00;

    data[3] = 0x00;

    return new String(data);

    }

    /**

    * 字符串转字节数组

    * @param str

    * @return

    */

    public static byte[] stringToBytes(String str) {

    byte[] data = null;

    try {

    byte[] strBytes = str.getBytes("utf-8");

    data = (new String(strBytes, "utf-8")).getBytes("gbk");

    } catch (UnsupportedEncodingException exception) {

    exception.printStackTrace();

    }

    return data;

    }

    /**

    * 字节数组合并

    * @param bytesA

    * @param bytesB

    * @return

    */

    public static byte[] byteMerger(byte[] bytesA, byte[] bytesB) {

    byte[] bytes = new byte[bytesA.length + bytesB.length];

    System.arraycopy(bytesA, 0, bytes, 0, bytesA.length);

    System.arraycopy(bytesB, 0, bytes, bytesA.length, bytesB.length);

    return bytes;

    }

    }

    相关文章

      网友评论

          本文标题:Android小白进阶之路--项目需求3

          本文链接:https://www.haomeiwen.com/subject/kxlmtxtx.html