uni-app攻略:如何对接驰腾打印机

在这里插入图片描述

一.引言

在当前的移动开发生态中,跨平台框架如uni-app因其高效、灵活的特点受到了开发者们的青睐。同时,随着物联网技术的飞速发展,智能打印设备已成为许多业务场景中不可或缺的一环。今天,我们就来探讨如何使用uni-app轻松对接驰腾品牌的智能打印机,实现无线打印功能。无论您是初学者还是有经验的开发者,本教程都将带您一步步实现这一目标。

二.准备工作

首先确保您的开发环境已就绪。这包括安装HBuilderX和uni-app框架。同时,您需要准备一台驰腾打印机,并熟悉其用户手册和API文档。了解打印机支持的通信协议(比如蓝牙或Wi-Fi)也至关重要。

三.对接流程解析

在进行代码编写之前,我们需要理解整个接口调用的流程。这通常包括建立与打印机的连接、发送打印指令以及处理返回结果。此外,我们还需要关注数据格式、编码要求以及安全机制。

四.详细步骤与实施

- 1.设备连接与通讯建立

  • 蓝牙连接流程
    使用uni-app提供的蓝牙模块初始化并搜索打印机设备。 配对并连接到驰腾打印机。

- 2.发送打印指令

  • 数据封装与传输 依据驰腾打印机的API文档,正确封装打印数据。
  • 调用相关API发送打印任务。
  • 错误处理与反馈 监听打印状态变化,及时响应可能出现的错误。
  • 向用户提供清晰的状态反馈信息。

- 3.打印状态展示

  • 实时显示当前打印任务的状态,包括成功、等待和失败等。

五.代码实例与详解

前期准备:
需要下载一个js文件支持包,请先点击下载
点击下载js支持包
点击下载开发指南
开发说明中有详细的指令文档,需要的大家可以自行翻阅

在这里插入图片描述
以下提供一个使用打印机进行二维码打印的经典案例

1.先将js包解压,并在项目中创建文件夹保存
在这里插入图片描述
2.现在需要两个页面,一个负责蓝牙搜索和连接,一个复制连接后的打印工作

测试蓝牙连接页面代码:

<template>
  <view class="container">
      <view class="top-box">
          <view class="name">打印机搜索</view>
          <view class="value" @click="onLoadFun" v-if="submitMain">
              点击搜索
          </view>
         <!-- <view class="value" @click="rescan" v-else>
              重新搜索
          </view> -->
      </view>
    <scroll-view scroll-y class="box">
      <view
        class="item"
        v-for="(item, index) in blueDeviceList"
        :key="index"
        @click="connect(item, index)"
        :class="{ active: blueIndex === index }"
      >
        <view>
          <text>{{ item.name }}</text>
        </view>
        <view>
          <text>{{ item.deviceId }}</text>
        </view>
      </view>
     <!-- <view class="item">{{code}}</view> -->
    </scroll-view>
  </view>
</template>
 
<script>
import CTPL from "@/web-CTPL-SDK/ctpl.js";
export default {
  data() {
    return {
      blueDeviceList: [], //蓝牙设备列表
      blueName: "", //蓝牙设备名称
      blueDeviceId: "", //蓝牙设备特征值
      blueIndex: -1,
      submitMain:true
    };
  },
  onUnload() {
    if(this.blueDeviceId){
        CTPL.disconnect();
    }
  },
  methods: {
    async onLoadFun(){
        await CTPL.init();
        this.submitMain = false;
        await this.discoveryList()
    },
    clickLeft() {
      uni.navigateBack();
    },
    async discoveryList() {
         
      uni.showLoading({
          title:'搜索设备中'
      });
       CTPL.discovery().then((res)=>{
            uni.hideLoading();
            this.blueDeviceList = res;
       }).catch((err)=>{
            uni.hideLoading();
            uni.$u.toast(err)
       })
    },
    //重新扫描
    rescan() {
      this.blueDeviceList = [];
      this.discoveryList();
    },
    //开始连接蓝牙
    connect(data, index) {
        const that = this;
        uni.showModal({
            title:'温馨提示',
            content:'是否使用选中设备进行打印',
            success(res) {
                if(res.confirm){
                    CTPL.connect(data.deviceId);
                    that.blueIndex = index;
                    that.blueDeviceId = data.deviceId;
                    that.blueName = data.name;
                    setTimeout(() => {
                         
                        uni.showLoading({
                            title:'配置设备中'
                        })
                       that.setCodeFun()
                    }, 1000);
                }
            }
        })
    },
    setCodeFun(){
        const that = this;
        CTPL.setPaperType(0);
        setTimeout(()=>{
            CTPL.setMemoryPrint(0);
            uni.hideLoading()
            setTimeout(()=>{
                uni.navigateTo({
                  url: `要进行打印的页面?id=${that.orderId}&deviceId=${that.blueDeviceId}`,
                });
            },500)
        },500)
    },
 
  },
};
</script>
 
<style lang="scss" scoped>
.container {
  width: 100%;
  overflow: hidden;
  min-height: 100vh;
}
.top-box{
    width: 100%;
    padding: 30rpx;
    background-color: white;
    color: #000000;
    line-height: 70rpx;
    font-size: 32rpx;
    overflow: hidden;
    .name{
        width: 50%;
        display: inline-block;
        vertical-align: top;
    }
    .value{
        width: 30%;
        float: right;
        display: inline-block;
        vertical-align: top;
        background:#009180;
        color: white;
        text-align: center;
        border-radius: 10rpx;
    }
}
 
$nav-height: 30px;
 
.box-bg {
  background-color: #f5f5f5;
  .nav {
    text {
      font-size: 28rpx !important;
    }
    .uni-nav-bar-right-text {
      color: #1aad19 !important;
    }
  }
}
 
.city {
  /* #ifndef APP-PLUS-NVUE */
  display: flex;
  /* #endif */
  flex-direction: row;
  align-items: center;
  justify-content: flex-start;
  // width: 160rpx;
  margin-left: 4px;
}
 
.input-view {
  /* #ifndef APP-PLUS-NVUE */
  display: flex;
  /* #endif */
  flex-direction: row;
  // width: 500rpx;
  flex: 1;
  background-color: #f8f8f8;
  height: $nav-height;
  border-radius: 15px;
  padding: 0 15px;
  flex-wrap: nowrap;
  margin: 7px 0;
  line-height: $nav-height;
}
 
.input-uni-icon {
  line-height: $nav-height;
}
 
.nav-bar-input {
  height: $nav-height;
  line-height: $nav-height;
  /* #ifdef APP-PLUS-NVUE */
  width: 370rpx;
  /* #endif */
  padding: 0 5px;
  font-size: 14px;
  background-color: #f8f8f8;
}
 
.box {
  height: calc(100vh - 100px);
  overflow: hidden;
}
 
.item {
  height: 120rpx;
  border-bottom: 1px solid #e5e5e5;
  background-color: white;
  width: 700rpx;
  margin: 26rpx auto 0 auto;
  overflow: hidden;
  font-size: 28rpx;
  line-height: 120rpx;
  padding: 0 20rpx;
  border-radius: 10rpx;
}
 
.active {
  background-color: #1aad19;
  color: white;
}
</style>

注意点:连接了设备后,除非断开并关闭小程序,不然不要重新连接,会直接卡死

测试打印页面代码(核心打印代码):

数据:

mainCodeArr:[],
qrcodeObj: {
    x: 100,
    y: 70,
    eccLevel: "H",
    cellWidth: 6,
    encodeMode: "A",
    rotation: 0,
    codeMode: "M1",
    mask: "S7",
    content: 1234567890,
},
textObj: {
    x: "80",
    y: "20",
    rotation: "0",
    xRatio: "1",
    yRatio: "1",
    textAlignment: "0",
    text: "我的测试商品(1)"
},
code:''

调用方法:

async setCodeIndex(index){
       uni.showLoading({
           title:'打印中'
       })
       const item = this.mainCodeArr[index]
       CTPL.queryPrintMode(0);
       CTPL.setSize(4,3);
       CTPL.clearCache();
       let code =  item.code;
       this.code = code;
       setTimeout(()=>{
           CTPL.drawQRCode(
               this.qrcodeObj.x,
               this.qrcodeObj.y,
               this.qrcodeObj.eccLevel,
               this.qrcodeObj.cellWidth,
               this.qrcodeObj.encodeMode,
               this.qrcodeObj.rotation,
               this.qrcodeObj.codeMode,
               this.qrcodeObj.mask,
               code
           );
           setTimeout(()=>{
               let left = 40;
               if(item.product_title.length < 9){
                   left += ((10 - item.product_title.length) * 10)
               }else{
                   item.product_title = item.product_title.slice(0,9) +'...'
               }
               // 绘制条码
               CTPL.drawText(
                   left,
                   this.textObj.y,
                   this.textObj.rotation,
                   this.textObj.xRatio,
                   this.textObj.yRatio,
                   this.textObj.textAlignment,
                   (item.product_title+'('+item.index+')')
               );
               setTimeout(()=>{
                   CTPL.setPrintCopies(1, 1);
                   CTPL.execute();
                   uni.hideLoading()
                   if(this.mainCodeArr.length != index +1){
                       setTimeout(()=>{
                           this.setCodeIndex(index +1)
                       },500)
                        
                   }else{
                       uni.showModal({
                           title:'温馨提示',
                           content:'打印完成',
                           showCancel:false
                       })
                   }
               },1000)
           },500)
       },1000)
     },

调用代码:

this.setCodeIndex(0)

总结
以上的一些步骤和代码案例,就是我对接驰腾打印机的全流程,核心主要在:1.设备连接与通讯建立,2.发送打印指令,3.打印状态显示和真机调试

希望我的一点经验能对你有用

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/478371.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

异步爬虫实践攻略:利用Python Aiohttp框架实现高效数据抓取

在当今信息爆炸的时代&#xff0c;数据是无处不在且变化迅速的。为了从海量数据中获取有用的信息&#xff0c;异步爬虫技术应运而生&#xff0c;成为许多数据挖掘和分析工作的利器。本文将介绍如何利用Python Aiohttp框架实现高效数据抓取&#xff0c;让我们在信息的海洋中快速…

怎么才可以实现自定义异常?

在回答怎么才可以自定义异常这个问题之前&#xff0c;我们先看异常处理对象是怎么实现的&#xff1f;下图为运行时异常需要继承 RuntimeException异常类。 而RuntimeException异常类又继承Exception异常类。 所以&#xff0c;要实现自定义异常类&#xff0c;就需要去继承Runtim…

matlab矩形薄板小挠度弯曲有限元编程 |【Matlab源码+理论文本】|板单元| Kirchoff薄板 | 板壳单元

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

2024年三大主食冻干品牌测评,希喂、SC、K9自费实测综合PK

在现今注重科学养宠的时代背景下&#xff0c;主食冻干已经成为猫咪日常饮食的重要组成部分。主食冻干的高肉含量特性使其易于被猫咪吸收和消化&#xff0c;同时&#xff0c;它还能提供其他猫粮所无法提供的微量物质&#xff0c;满足猫咪的全面营养需求。然而&#xff0c;在众多…

力扣题目训练(23)

2024年2月16日力扣题目训练 2024年2月16日力扣题目训练645. 错误的集合653. 两数之和 IV - 输入二叉搜索树657. 机器人能否返回原点307. 区域和检索 - 数组可修改309. 买卖股票的最佳时机含冷冻期174. 地下城游戏 2024年2月16日力扣题目训练 2024年2月16日第二十三天编程训练&…

【开发环境搭建篇】Redis客户端安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

AST学习入门

AST学习入门 1.AST在线解析网站 https://astexplorer.net/ 1.type: 表示当前节点的类型&#xff0c;我们常用的类型判断方法t.is********(node)**,就是判断当前的节点是否为某个类型。 2**.start**:表示当前节点的开始位置 3.end:当前节点结束 4.loc : 表示当前节点所在的行…

Qt利用反射机制实现函数调用

QT本身就带有强大的反射功能&#xff0c;如果想通过函数名称字符串调用函数&#xff0c;需要在被调用的函数前添加宏&#xff1a;Q_INVOKABLE 父类 QtInvoke.h 头文件&#xff1a; #pragma once #include <QMainWindow> #include "ui_QtInvoke.h" class Qt…

麒麟系统中使用nginx发布项目

1. 安装Nginx sudo apt-get update #进行所有安装操作前都要执行这一句 sudo apt install nginx #出现询问就Yes参考具体 Nginx—在linux的ubuntu系统上的安装使用 2. 修改发布文件 将打包好的dist文件夹中的所有文件覆盖下面这个文件夹中的所有文件 如果出现没有权限替…

UnityShader(十九) AlphaBlend

上代码&#xff1a; Shader "Shader入门/透明度效果/AlphaBlendShader" {Properties{_MainTex ("Texture", 2D) "white" {}_AlphaScale("AlphaScale",Range(0,1))1.0}SubShader{Tags { "RenderType""Transparent&quo…

java数字城管APP系统源码,智慧执法平台,现代信息技术手段的综合管理平台

智慧城管源码&#xff0c;智慧执法&#xff0c;城管智慧综合执法系统源码 智慧城管系统充分利用物联网、云计算、信息融合、网络通讯、数据分析与挖掘等技术&#xff0c;对城市管理进行全方位覆盖。它通过建立城市综合管理平台&#xff0c;将城市的信息和管理资源有机结合起来&…

蓝桥杯day7刷题日记

P8697 [蓝桥杯 2019 国 C] 最长子序列 思路&#xff1a;直接遍历&#xff0c;和子序列相同就记录&#xff0c;不然就下一位 #include <iostream> #include <string> using namespace std; int res;int main() {string s,t;cin>>s>>t;int i0,j0;while…

文生图的基石CLIP模型的发展综述

CLIP的英文全称是Contrastive Language-Image Pre-training&#xff0c;即一种基于对比文本-图像对的预训练方法或者模型。CLIP是一种基于对比学习的多模态模型&#xff0c;CLIP的训练数据是文本-图像对&#xff1a;一张图像和它对应的文本描述&#xff0c;这里希望通过对比学习…

大数据-基础架构设施演进的过程

一、第一阶段-Hadoop 以Hadoop为代表的离线数据处理基础设施 1.1、围绕HDFS和MR&#xff0c;产生了一系列的组件 面向在线KV操作的HBase面向SQL的Hive面向工作流的PIG 1.2、随着对批处理性能要求越来越高&#xff0c;产生了Tez、Spark、Flink等计算引擎。RM模型也逐步进化成…

注册省市要选择你的驾驶证的发证省市

1、首先在手机应用商店&#xff08;任何可以下载软件的&#xff0c;比如360、360&#xff09;搜索流量管理12123&#xff0c;然后下载。 2.然后打开手机上的APP&#xff0c;你会看到下面的页面&#xff0c;然后选择注册&#xff01; 3、在注册页面&#xff0c;根据您的实际情况…

【智能算法】多元宇宙优化算法(MVO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2016年&#xff0c;Mirjalili 等人受到宇宙膨胀理论启发&#xff0c;提出了多元宇宙优化算法(Multi-verse Optimization, MVO)。 2.算法原理 2.1算法思想 MVO基于宇宙膨胀的原理&#xff0c;利用…

3新 IT 技术深刻变革,驱动实体经济进入智能化时代

技术进步和创新是实体经济转型升级的内生 源动力&#xff0c;是企业数字化转型的核心工具&#xff0c;有 助于“降本增效提质”目标的达成。自 20 世 纪 90 年代至今&#xff0c;我国快速完成信息化的大规 模建设&#xff0c;典型数字化技术已发展成熟并充分 融合进企业日…

Linux——du, df命令查看磁盘空间使用情况

一、实现原理&#xff1a; df 命令的全称是Disk Free &#xff0c;显而易见它是统计磁盘中空闲的空间&#xff0c;也即空闲的磁盘块数。它是通过文件系统磁盘块分配图进行计算出的。 du 命令的全称是 Disk Used &#xff0c;统计磁盘有已经使用的空间。它是直接统计各文件各目…

2024年人工智能顶级会议投稿信息汇总(数据挖掘领域)

数据挖掘是信息科学领域的重要分支&#xff0c;致力于挖掘和分析庞大数据集中的有价值模式与规律。它融合了统计学、机器学习和数据库技术&#xff0c;目的是从海量数据中抽取有用的知识&#xff0c;辅助决策制定过程。本文首先精选介绍数据挖掘领域内的重要会议&#xff0c;包…

Go语言学习Day1:什么是Go?

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、走近Go①Go语言的Logo②Go语言的创始人③Go语…