uni-app攻略:如何對接馳騰印表機

来源:https://www.cnblogs.com/smileZAZ/p/18087102
-Advertisement-
Play Games

一.引言 在當前的移動開發生態中,跨平臺框架如uni-app因其高效、靈活的特點受到了開發者們的青睞。同時,隨著物聯網技術的飛速發展,智能列印設備已成為許多業務場景中不可或缺的一環。今天,我們就來探討如何使用uni-app輕鬆對接馳騰品牌的智能印表機,實現無線列印功能。無論您是初學者還是有經驗的開發 ...


一.引言

在當前的移動開發生態中,跨平臺框架如uni-app因其高效、靈活的特點受到了開發者們的青睞。同時,隨著物聯網技術的飛速發展,智能列印設備已成為許多業務場景中不可或缺的一環。今天,我們就來探討如何使用uni-app輕鬆對接馳騰品牌的智能印表機,實現無線列印功能。無論您是初學者還是有經驗的開發者,本教程都將帶您一步步實現這一目標。

二.準備工作

首先確保您的開發環境已就緒。這包括安裝HBuilderX和uni-app框架。同時,您需要準備一臺馳騰印表機,並熟悉其用戶手冊和API文檔。瞭解印表機支持的通信協議(比如藍牙或Wi-Fi)也至關重要。

三.對接流程解析

在進行代碼編寫之前,我們需要理解整個介面調用的流程。這通常包括建立與印表機的連接、發送列印指令以及處理返回結果。此外,我們還需要關註數據格式、編碼要求以及安全機制。

四.詳細步驟與實施

1.設備連接與通訊建立

藍牙連接流程

  1. 使用uni-app提供的藍牙模塊初始化並搜索印表機設備。
  2. 配對並連接到馳騰印表機。

2.發送列印指令

  1. 數據封裝與傳輸
    • 依據馳騰印表機的API文檔,正確封裝列印數據。
    • 調用相關API發送列印任務。
  2. 錯誤處理與反饋
    • 監聽列印狀態變化,及時響應可能出現的錯誤。
    • 向用戶提供清晰的狀態反饋信息。

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.列印狀態顯示和真機調試,希望我的一點經驗能對你有用

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Redis語句總結 一、基本概念 Redis 全稱: Remote Dictionary Server(遠程字典伺服器)的縮寫,以字典結構存儲數據,並允許其他應用通過TCP協議讀寫字典中的內容。 使用C語言編寫,並以記憶體作為數據存儲介質,所以讀寫數據的效率極高 *redis的官方只提供了linux版 ...
  • 華為雲GeminiDB是一款相容Redis協議的彈性KV(Key-Value)資料庫,支持遠超記憶體的容量和極致的性能,可支撐用戶平滑遷移,在廣告、游戲、電商等行業有著廣泛的應用。 今年3月上線的新版本,GeminiDB已全面支持Redis 6.2,用戶可在華為雲GeminiDB產品官網購買使用。新版 ...
  • 作者本人使用的是vmware17Pro虛擬機,大家可以去網上找相關教程下載安裝,此總結後邊有多次安裝遇到的bug,要是有地方不妥,歡迎相互交流 在剛開始時,我們先部署的是Linux虛擬機,在設置Linux系統基礎環境時,系統就基本具有一些網路服務功能,差不多類似於現實中大型的伺服器,還有設置網路這一 ...
  • 近年來,新質生產力、數據要素及數據資產入表等新興概念猶如一股強勁的浪潮,持續衝擊並革新著企業數字化轉型的觀念視野,昭示著一個以數據為核心驅動力的新時代正穩步啟幕。 面對這些引領經濟轉型的新興概念,為了更好地服務於客戶並提供切實可行的實踐指導,自3月20日起,袋鼠雲將推出全新《袋鼠雲大數據實操指南》系 ...
  • 本文分享自華為雲社區《GaussDB(分散式)實例故障處理》,作者:subverter。 一、說明 GaussDB Kernel實例出現故障時,可以按照本節的辦法進行實例快速修複。 1、執行gs_om -t status --detail查看集群狀態,cluster_state為Normal,bal ...
  • 近日,以“行業更優數據底座,華為雲資料庫創新發展論壇”為主題的資料庫分論壇,通過對雲原生資料庫的發展與展望、技術實踐分享與研討,共同探索行業數字化轉型最優解。 ...
  • Android 逆向(四) - adb常用逆向命令 本篇文章繼續記錄下adb 的一些常用逆向命令. 1: adb shell ps 該命令可以查看進程信息. 用法: adb shell ps |grep [pname] zh@zh:~/workSpace$ adb shell ps USER PID ...
  • linux 入門(四) 1: 文件夾下所有文件的大小和詳細信息 du -h --max-depth=1 | sort -hr du命令可以查看文件夾(文件)占用的磁碟大小 ls命令可以查看文件的詳細信息,包括文件大小。 該命令可以按照文件夾(文件)大小的降序排列,並以易讀的方式顯示文件夾(文件)大小 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...