更新记录

3.3.3(2024-07-05) 下载此版本

  1. 低版本兼容处理;
  2. 更新 lpapi-uniplugin.js文件,解决了IOS环境下获取不到打印机的问题;

3.3.2(2024-06-05) 下载此版本

  1. 解决了版本 3.3.1 中因动态权限申请失败导致的 无法获取打印机列表以及无法搜索BLE设备的问题;
  2. 备注:在上个版本中底层数据传输协议发生了变化,所以在使用最新版本插件的时候,需要同步的更新demo中所提供的 lpapi-uniplugin.js 文件。在最新版本中原生插件返回的数据格式为:{ statusCode: number, resultInfo: JSONArray},其中statusCode 表示返回的状态码,0表示成功,其他值一般情况下表示失败,在ble搜索的时候,1表示检测到ble设备,2表示搜索完毕。resultInfo表示具体每个接口所需要的数据。

3.3.1(2024-05-31) 下载此版本

  1. 新增BLE搜索功能;
  2. 增加在预览模式下,提交任务的时候返回BASE64预览图片的功能;
查看更多

平台兼容性

Android Android CPU类型 iOS
适用版本区间:5.0 - 14.0 armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 适用版本区间:9 - 14

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择


UniPlugin-LPAPI 插件说明文档

德佟电子

联系方式

  1. 官网:德佟电子科技(上海)有限公司

  2. 电话:021-65111580

  3. 邮箱:support@dothantech.com

  4. 全国服务热线:400-823-6599

使用方式

在需要的地方引入插件配套的 js 接口,根据实际需求,调用对应的接口函数,完成相关操作;

  1. 导入插件; 在插件市场中搜索LPAPI,进入之后,点击右侧的“购买for云打包”,选择目标项目,按照提示操作即可;

  2. 配置插件; 用HBuilderX打开目标项目,选择manifest.json,打开配置视图,在右侧选择“App原生插件配置”,找到“云端插件”,点击“选择云端插件”,勾选目标插件即可;

  3. 配置蓝牙权限; 标签打印机主要是用蓝牙进行数据传输的,所以在使用前需要配置先蓝牙操作权限;

    <uses-permission android:name=\"android.permission.BLUETOOTH\"/>
    <uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\"/>
    <!-- BLE 搜索需要权限 -->
    <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />
    <uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />
    <!-- Android 12新增权限 -->
    <uses-permission android:name=\"android.permission.BLUETOOTH_CONNECT\" />
    <uses-permission android:name=\"android.permission.BLUETOOTH_SCAN\" />
  4. 再页面中导入封装的js接口;

    import api from './lpapi-uniplugin';
  5. 调用接口函数,进行相关打印操作;

    async printQrcode() {
        // 获取打印机列表
        const printerList = await api.getPrinters();
        // 获取打印机列表中的任意一台打印机;
        const printerName = printerList?.name;
        // 连接打印机
        if (printerName) {
            await api.openPrinter(printerName);
        }
        // 开始打印任务
        await api.startJob({
            width: 45,
            height: 45,
            orientation: 0
        });
        // 打印二维码
        await api.draw2DQRCode({
            text: '德佟电子科技有限公司',
            x: 5,
            y: 5,
            width: 35
        });
        // 提交打印任务,开始打印
        await api.commitJob();
        // 再不需要继续打印的话可以关闭打印机,也可以关闭打印机;
        await api.closePrinter();
    }
  6. 编译自定义基座; 调试模式下需要编译一个自定义基座才可以使用,打印机插件是原生插件,标准的基座是不加载原生插件的,所以要进行测试必须编译一个自定义基座才可以操作打印机; 自定义基座编译方法: 打开HBuilderX,选择菜单:运行-->运行到手机或模拟器-->制作自定义调试基座,根据实际情况选择相关选项,然后点击“打包”即可;

原生插件数据传输协议

在原生插件中回调参数数据类型为:

interface Response {
    /**
     * 请求状态码,0表示成功,其他表示失败,或者其他的有效状态。
     * 在 BLE 搜索的时候,0表示请求成功,1表示检测到蓝牙设备,2表示本次蓝牙搜索完毕,其他表示失败。
     */
    statusCode: number;
    /**
     * 具体的返回数据。
     */
    resultInfo: any;
}

接口函数介绍

public interface LPAPI {
    /**
     * 插件初始化。
     * 在插件初始化的时候,用户可以做一些全局配置,以及动态申请蓝牙权限等操作;
     */
    init(options);
    /**
     * 动态申请蓝牙权限;
     */
    requestBluetoothAuth();
    /**
     * 开始蓝牙搜索操作;
     * @param {number} options.timeout 蓝牙搜索超时时间;
     * @param {number} options.interval 蓝牙搜索设备上报间隔,单位毫秒;
     */
    startDiscovery(options);
    /**
     * 停止蓝牙设备搜索操作;
     */
    stopDiscovery(options);
    /**
     * 停止正在进行的蓝牙设备搜索操作;
     */
    getBleDevices(options);
    /**
     * 获取指定型号的所有打印机;
     * @param { string | {name?: string} } data 参数;
     * @returns { {name: string}[] } 返回打印机信息列表;
     */
    getPrinters(data);
    /**
     * 获取指定型号的一台打印机;
     * @param { string | {name?: string} } data 参数;
     * @returns { {name: string} } 返回检测到的第一台打印机;
     */
    getFirstPrinter(data);
    /**
     * 打开目标打印机;
     * @param { string | {name?: string}} data 参数;
     */
    openPrinter(data);
    /**
     * 获取当前已连接打印机名称;
     */
    getPrinterName();
    /**
     * 获取当前已连接打印机信息;
     * 调用该接口前要确保打印机已连接;
     */
    getPrinterInfo();
    /**
     * 当前打印机是否已经打开;
     */
    isPrinterOpened();
    /**
     * 关闭打印机;
     */
    closePrinter();
    /**
     * 打印BASE64图片;
     * @param { {
     *      image: string,
     *      PRINT_DENSITY?: number,
     *      PRINT_SPEED?: number,
     *      PRINT_COPIES?: number
     * } } data
     */
    printImage(data);
    /**
     * 开始打印任务;
     * @param { {
     *      width: number,
     *      height: number,
     *      orientation?: number
     * } } data 参数;
     */
    startJob(data);
    /**
     * 提交打印任务;
     * @param {{
     *      GAP_TYPE: number,           // 纸张类型,0:连续纸,1:定位孔,2:间隙纸,3,黑标纸,其他值无效
     *      PRINT_DARKNESS: number,     // 打印浓度,值:0 - 14 之间;
     *      PRINT_SPEED: number,        // 打印速度,值:0 - 4 之间;
     * }} data 参数;
     */
    commitJob(param);
    printParamName: {
        gapType: "GAP_TYPE",
        printDarkness: "PRINT_DARKNESS",
        printSpeed: "PRINT_SPEED",
    },
    printParamValue: {
        gapType: {
            /** 纸张类型:连续纸,value: 0 */
            none: 0,
            /** 纸张类型:定位孔,value: 1 */
            hole: 1,
            /** 纸张类型:间隙纸,value: 2 */
            gap: 2,
            /** 纸张类型:黑标纸,value: 3 */
            black: 3,
        },
        printDarkness: {
            /** 打印浓度:最低 */
            min: 0,
            /** 打印浓度:正常 */
            normal: 5,
            /** 打印浓度:最大 */
            max: 14,
        },
        printSpeed: {
            /** 打印速度:最慢 */
            min: 0,
            /** 打印熟读:正常 */
            normal: 2,
            /** 打印速度:最快 */
            max: 4,
        },
    },
    /**
     * 结束打印任务;
     */
    endJob();
    /**
     * 获取当前的打印任务;
     */
    getJobPages();
    //
    /**
     * 设置后续绘制参数,譬如字体名称,二维码纠错级别等等;
     * @param { {
     *      name: string,
     *      value: *
     * } } data 参数
     */
    setDrawParam(data);
    /**
     * 设置后续内容的旋转方向;
     * @param { number | { orientation: [0, 90, 180, 270]}} data 参数;
     */
    setItemOrientation(data);
    /**
     * 设置水平对齐方式;
     * @param { number | { alignment: [0, 1, 2]}} data 参数;
     */
    setItemHorizontalAlignment(data);
    /**
     * 设置垂直对齐方式;
     * @param { number | { alignment: [0, 1, 2]}} data 参数;
     */
    setItemVerticalAlignment(data);

    // ***************************************************
    // * 打印相关图形对象。
    // ***************************************************

    /**
     * 绘制字符串;
     *
     * @param {{}} data                         字符串绘制参数;
     * @param {string} data.text                待打印的字符串名称;
     * @param {number} data.x                   字符串显示的X轴坐标位置(单位毫米);
     * @param {number} data.y                   字符串显示的Y轴坐标位置(单位毫米);
     * @param {number} data.width               字符串显示区域宽度(单位毫米);
     * @param {number} data.height              字符串显示区域高度(单位毫米);
     * @param {number} data.fontHeight          字体大小(单位毫米);
     * @param {number} data.fontStyle           字体样式,默认位0;(0:常规,1:黑体,2:斜体,3:粗斜体)
     * @param {string} data.fontName            字体名称,默认位"黑体";
     * @param {boolean} data.autoReturn         字符串长度超过width之后,是否自动换行?默认位true;
     * @param {0|90|180|270} data.orientation   字符串旋转方向?默认以setItemOrientation为准;如果未调用该函数,则为0;
     * @param {0|1|2} data.horizontalAlignment  字符串在指定的宽高范围内的水平对齐方式,默认以setItemHorizontalAlignment为准,未设置则为0,表示居上对齐,值可为:0、1、2,分别表示左、中、右对齐;
     * @param {0|1|2} data.verticalAlignment    字符串在指定的宽高范围内的垂直对齐方式,默认以setItemVerticalAlignment为准,未设置则为0,表示居上对齐,值可为:0、1、2,分别表示上、中、下对齐;
     * 
     */
    drawText(data);
    /**
     * 绘制一维码;
     * @param {{}} data 一维码绘制参数;
     * @param {string} data.text,               一维码内容
     * @param {number} data.x,                  一维码在坐标系X轴上的位置;
     * @param {number} data.y,                  一维码在坐标系中Y轴上的位置;
     * @param {number} data.width,              一维码在坐标系中的宽度;
     * @param {number} data.height,             一维码高度;
     * @param {number} data.textHeight,         一维码下面显示的字符串高度,不需要的话可以设置位0;
     * @param {number} data.type                一维码类型:{@link BarcodeType}
     * @param {0|90|180|270} data.orientation   字符串旋转方向?默认以setItemOrientation为准;如果未调用该函数,则为0;
     * @param {0|1|2} data.horizontalAlignment  字符串在指定的宽高范围内的水平对齐方式,默认以setItemHorizontalAlignment为准,未设置则为0,表示居上对齐,值可为:0、1、2,分别表示左、中、右对齐;
     * @param {0|1|2} data.verticalAlignment    字符串在指定的宽高范围内的垂直对齐方式,默认以setItemVerticalAlignment为准,未设置则为0,表示居上对齐,值可为:0、1、2,分别表示上、中、下对齐;
     * 
     * @typedef{{
     *  UPC_A: 20,
     *  UPC_E: 21,
     *  EAN13: 22,
     *  EAN8: 23,
     *  CODE39: 24,
     *  ITF25: 25,
     *  CODABAR: 26,
     *  CODE93: 27,
     *  CODE128: 28,
     *  ISBN: 29,
     *  ECODE39: 30,
     *  AUTO: 60,
     * }} BarcodeType 一维码类型
     */
    draw1DBarcode(data);
    /**
     * 绘制二维码;
     * @param {{}} data
     * @param {string} data.text                二维码内容
     * @param {number} data.x                   X轴坐标位置(单位毫米)
     * @param {number} data.y                   Y轴坐标位置
     * @param {number} data.width               二维码大小(单位毫米)
     * @param {0|1|2|3} data.eccLevel           二维码纠错级别,0|1|2|3分别表示: L(低)|M(中)|Q(强)|H(高),默认为0,表示最低纠错级别
     * @param {0|90|180|270} data.orientation   字符串旋转方向?默认以setItemOrientation为准;如果未调用该函数,则为0,表示不进行任何旋转;
     * @param {0|1|2} data.horizontalAlignment  字符串在指定的宽高范围内的水平对齐方式,默认以setItemHorizontalAlignment为准,未设置则为0,表示居上对齐,值可为:0、1、2,分别表示左、中、右对齐;
     * @param {0|1|2} data.verticalAlignment    字符串在指定的宽高范围内的垂直对齐方式,默认以setItemVerticalAlignment为准,未设置则为0,表示居上对齐,值可为:0、1、2,分别表示上、中、下对齐;
     */
    draw2DQRCode(data);
    /**
     * 绘制矩形框;
     * @param {{}} data
     * @param {number} data.x                   X轴坐标位置(单位毫米)
     * @param {number} data.y                   Y轴坐标位置(单位毫米)
     * @param {number} data.width               绘制数据内容的宽度(单位毫米)
     * @param {number} data.height              绘制数据内容的高度(单位毫米)
     * @param {number} data.lineWidth           边框宽度(单位毫米),默认为0.4mm
     * @param {0|90|180|270} data.orientation   字符串旋转方向?默认以setItemOrientation为准;如果未调用该函数,则为0,表示不进行任何旋转;
     */
    drawRectangle(data);
    /**
     * 绘制填充矩形;
     * @param {{}} data
     * @param {number} data.x                   X轴坐标位置(单位毫米)
     * @param {number} data.y                   Y轴坐标位置(单位毫米)
     * @param {number} data.width               绘制数据内容的宽度(单位毫米)
     * @param {number} data.height              绘制数据内容的高度(单位毫米)
     * @param {0|90|180|270} data.orientation   字符串旋转方向?默认以setItemOrientation为准;如果未调用该函数,则为0,表示不进行任何旋转;
     */
    fillRectangle(data);
    /**
     * 绘制圆角矩形框;
     * @param {{}} data
     * @param {number} data.x                   X轴坐标位置(单位毫米)
     * @param {number} data.y                   Y轴坐标位置(单位毫米)
     * @param {number} data.width               绘制数据内容的宽度(单位毫米)
     * @param {number} data.height              绘制数据内容的高度(单位毫米)
     * @param {number} data.cornerWidth         圆角半径(单位毫米)
     * @param {number} data.cornerHeight        圆角半径(单位毫米)
     * @param {number} data.lineWidth           边框宽度(单位毫米)
     * @param {0|90|180|270} data.orientation   字符串旋转方向?默认以setItemOrientation为准;如果未调用该函数,则为0,表示不进行任何旋转;
     */
    drawRoundRectangle(data);
    /**
     * 填充圆角矩形;
     * @param {{}} data
     * @param {number} data.x                   X轴坐标位置(单位毫米)
     * @param {number} data.y                   Y轴坐标位置(单位毫米)
     * @param {number} data.width               绘制数据内容的宽度(单位毫米)
     * @param {number} data.height              绘制数据内容的高度(单位毫米)
     * @param {number} data.cornerWidth         圆角半径(单位毫米)
     * @param {number} data.cornerHeight        圆角半径(单位毫米)
     * @param {0|90|180|270} data.orientation   字符串旋转方向?默认以setItemOrientation为准;如果未调用该函数,则为0,表示不进行任何旋转;
     */
    fillRoundRectangle(data);
    /**
     * 绘制椭圆;
     * @param {{}} data
     * @param {number} data.x                   X轴坐标位置(单位毫米)
     * @param {number} data.y                   Y轴坐标位置(单位毫米)
     * @param {number} data.width               绘制数据内容的宽度(单位毫米)
     * @param {number} data.height              绘制数据内容的高度(单位毫米)
     * @param {number} data.lineWidth           边框宽度(单位毫米)
     * @param {0|90|180|270} data.orientation   字符串旋转方向?默认以setItemOrientation为准;如果未调用该函数,则为0,表示不进行任何旋转;
     */
    drawEllipse(data);
    /**
     * 填充椭圆;
     * @param {{}} data
     * @param {number} data.x                   X轴坐标位置(单位毫米)
     * @param {number} data.y                   Y轴坐标位置(单位毫米)
     * @param {number} data.width               绘制数据内容的宽度(单位毫米)
     * @param {number} data.height              绘制数据内容的高度(单位毫米)
     * @param {0|90|180|270} data.orientation   字符串旋转方向?默认以setItemOrientation为准;如果未调用该函数,则为0,表示不进行任何旋转;
     */
    fillEllipse(data);
    /**
     * 绘制圆形;
     * @param {{}} data
     * @param {number} data.x               圆心X轴坐标位置(单位毫米)
     * @param {number} data.y               圆心Y轴坐标位置(单位毫米)
     * @param {number} data.radius          圆半径(单位毫米)
     * @param {number} data.lineWidth       边框宽度(单位毫米)
     */
    drawCircle(data);
    /**
     * 填充圆;
     * @param {{}} data
     * @param {number} data.x               圆心X轴坐标位置(单位毫米)
     * @param {number} data.y               圆心Y轴坐标位置(单位毫米)
     * @param {number} data.radius          圆半径(单位毫米)
     */
    fillCircle(data);
    /**
     * 绘制直线;
     * @param {{}} data
     * @param {number} data.x1                  起点X轴坐标位置(单位毫米)
     * @param {number} data.y1                  起点Y轴坐标位置(单位毫米)
     * @param {number} data.x2                  终点X轴坐标位置(单位毫米)
     * @param {number} data.y2                  终点Y轴坐标位置(单位毫米)
     * @param {number} data.lineWidth           线条宽度(单位毫米)
     * @param {0|90|180|270} data.orientation   字符串旋转方向?默认以setItemOrientation为准;如果未调用该函数,则为0,表示不进行任何旋转;
     */
    drawLine(data);
    /**
     * 绘制虚线;
     * @param {{}} data
     * @param {number} data.x1                  起点X轴坐标位置(单位毫米)
     * @param {number} data.y1                  起点Y轴坐标位置(单位毫米)
     * @param {number} data.x2                  终点X轴坐标位置(单位毫米)
     * @param {number} data.y2                  终点Y轴坐标位置(单位毫米)
     * @param {number} data.dashLen[],          电话线线段长度数组(单位毫米)
     * @param {number} data.lineWidth           线条宽度(单位毫米)
     * @param {0|90|180|270} data.orientation   字符串旋转方向?默认以setItemOrientation为准;如果未调用该函数,则为0,表示不进行任何旋转;
     */
    drawDashLine(data);
    /**
     * 绘制图片;
     * @param {{}} data
     * @param {string} data.image
     * @param {number} data.x                   X轴坐标位置(单位毫米)
     * @param {number} data.y                   Y轴坐标位置(单位毫米)
     * @param {number} data.width               绘制数据内容的宽度(单位毫米)
     * @param {number} data.height              绘制数据内容的高度(单位毫米)
     * @param {number} data.threshold           黑白转换阈值,默认是192
     * @param {0|90|180|270} data.orientation   字符串旋转方向?默认以setItemOrientation为准;如果未调用该函数,则为0,表示不进行任何旋转;
     */
    drawImage(data);

隐私、权限声明

1. 本插件需要申请的系统权限列表:

<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

接口通过蓝牙连接打印机,进行打印相关操作

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

The MIT License (MIT)

Copyright (c) 2015 Loopline Systems

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问