uni-app 蓝牙打印, CPCL指令集使用
先上代码:
GitHub - byc233518/uniapp-bluetooth-printer-demo: 使用uniApp 连接蓝牙打印机 Demo, CPCL 指令简单实用示例
(内含 芝珂,佳博,精臣 多个厂家指令集使用文档)
文件结构:
├── App.vue
├── CPCL 指令手册.pdf // 指令集参考手册
├── LICENSE
├── README.md
├── libs
│ └── print.js // uni-app打印插件
├── main.js // Demo 入口文件
├── manifest.json // uni-app
├── node_modules // 依赖
├── pages
│ ├── index
│ │ └── index.vue // Demo 页面, 业务上使用可参考此文件
│ └── setting
│ └── index.vue // 打印机连接, 可以集成到应用的系统设置功能
├── pages.json // 页面配置文件
├── uni.scss // uni-app 样式文件
└── yarn.lock
运行方法:
- 将代码解压缩, 导入到HBuilderX中;
- 连接手机;
- 运行到手机或模拟器--运行到Android App 基座;
- 待运行完毕, 在 蓝牙设置 界面点击“搜索设备”并进行连接;
- 点击”Demo界面”按钮跳转到Demo, 填写表单信息后点击”打印测试”按钮进行测试;
集成步骤:
- 将Demo 中 libs/print.js 复制到项目目录下;
- 参考Demo 中 pages/setting/index.vue 在项目合适位置集成打印机连接配置功能, 一般在系统设置;
- 在需要的文件中引用 libs/print.js 的 print 方法;
- 拼接指令集, 见demo, 更多使用方法参见 《CPCL 指令集变成文档.pdf》 ;
- 调用 打印插件的 print 方法进行打印,入参为 打印机ID 和 拼接好的指令集字符串;
代码解析:
*************************************************libs/print.js***********************************************
/*** 打印* @param mac_address 打印机ID* @param data 指令集字符串, 为了灵活起见, 指令集在业务代码中进行转换然后传递进来*/export const print = (mac_address, data) => {var that = thisif (!mac_address) {uni.showModal({title: "提示",content: "请选择蓝牙打印机",showCancel: false,})return}if (!data) {uni.showModal({title: "提示",content: "请提供打印数据.",showCancel: false,})return}main = plus.android.runtimeMainActivity()BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter")var UUID = plus.android.importClass("java.util.UUID")uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")BAdapter = BluetoothAdapter.getDefaultAdapter()if (!BAdapter.isEnabled()) {uni.showModal({title: "提示",content: "蓝牙处于关闭状态,是否打开?",success: (_) => {if (_.confirm) {BAdapter.enable()}},})console.log("蓝牙处于关闭状态,正在打开...")return}device = BAdapter.getRemoteDevice(mac_address)plus.android.importClass(device)bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid)plus.android.importClass(bluetoothSocket)if (!bluetoothSocket.isConnected()) {console.log("检测到设备未连接,尝试连接....")bluetoothSocket.connect()}console.log("设备已连接")if (bluetoothSocket.isConnected()) {var outputStream = bluetoothSocket.getOutputStream()plus.android.importClass(outputStream)outputStream.write([0x1b, 0x40]) //打印复位outputStream.flush()var bytes = plus.android.invoke(data, "getBytes", "gbk") /*utf-8*/outputStream.write(bytes)outputStream.flush()device = null //这里关键bluetoothSocket.close()}}
******************************************pages/index/index.vue******************************************
<template><view><view><view><input v-model="formData.name" class="uni-input" placeholder="公司名称" /><input v-model="formData.model" class="uni-input" placeholder="车型" /><input v-model="formData.code" class="uni-input" placeholder="条码" /><input v-model="formData.line" class="uni-input" placeholder="产线" /><input v-model="formData.box" class="uni-input" placeholder="箱号" /><input v-model="formData.date" class="uni-input" placeholder="日期" /><input v-model="formData.operator" class="uni-input" placeholder="装箱人" /><input v-model="formData.auditor" class="uni-input" placeholder="确认人" /></view><view class="buttos-bar"><button class="plain-button plain-button--blue" @click="printTest">打印测试</button><navigator url="/pages/setting/index" hover-class="navigator-hover"><button type="default">跳转到设置界面</button></navigator></view></view></view></view>
</template><script>// 引入打印插件的打印方法import {print} from '@/libs/print.js'export default {name: 'PrintDemo',data() {return {// 业务数据formData: {name: "xxx配件有限公司",model: "型号123456789",code: "编码123456789",line: "产线1",box: "序号1",date: "2023/11/15",operator: "操作人",auditor: "审核人",}}},methods: {printTest() {// 从缓存中获取已经连接的打印机信息var printerid = uni.getStorageSync('ble_printerId')if (printerid) {if (printerid != null && printerid.length > 0) {const data = this.formData// 标签开始, 固定开头, 详见 指令集文档var str = " ! 0 200 200 350 1 " + '\r\n';// 设置打印纸张宽度str += "PAGE-WIDTH 600" + '\r\n';// 标签内容// 文本 {command} {font} {size} {x} {y} {data}str += "TEXT 24 0 30 50 " + data.name +"\r\n";// 二维码 {command} {type} {x} {y} [M n] [U n] {data}str += "B QR 380 20 M 2 U 5" + '\r\n';str += "MA," + data.code +"\r\n";str += "ENDQR" + '\r\n';str += "TEXT 24 0 30 100 车型: " + data.model +"\r\n";str += "TEXT 24 0 30 150 条码编号:" + data.code +"\r\n";str += "TEXT 24 0 320 150 生产线号:" + data.line +"\r\n";str += "TEXT 24 0 30 200 装箱序号:" + data.box +"\r\n";str += "TEXT 24 0 320 200 日期:" + data.date +"\r\n";str += "TEXT 24 0 30 250 装箱人:" + data.operator +"\r\n";str += "TEXT 24 0 320 250 确认人:" + data.auditor +"\r\n";// 标签结束str += "GAP-SENSE" + '\r\n';str += "FORM " + '\r\n';str += "PRINT " + '\r\n';// 指令集拼接完成, 调用打印插件打印方法进行打印print(printerid, str);}} else {uni.showModal({title: '提示',content: '请先选择已配对的蓝牙打印机, 再进行测试.',showCancel: false})}},},}
</script><style scoped lang="scss">.uni-input {margin-top: 10px;height: 30px;border: 1px solid #eee;}
</style>
****************************************pages/setting/index.vue******************************************
方法解释:
searchDevices //开始搜寻附近的蓝牙外围设备onConn // 连接打印机
相关文章:

uni-app 蓝牙打印, CPCL指令集使用
先上代码: GitHub - byc233518/uniapp-bluetooth-printer-demo: 使用uniApp 连接蓝牙打印机 Demo, CPCL 指令简单实用示例 (内含 芝珂,佳博,精臣 多个厂家指令集使用文档) 文件结构: ├── App.vue ├── CPCL 指令手册.pdf // 指令集参考手册 ├── LICENSE ├── R…...

vue-组件通信(二)
🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue-组件通信(二) 目录 组件通信(二) (1) props / $emit 1. 父组件向子组…...

2023年【危险化学品经营单位安全管理人员】考试题及危险化学品经营单位安全管理人员模拟试题
题库来源:安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试题是安全生产模拟考试一点通总题库中生成的一套危险化学品经营单位安全管理人员模拟试题,安全生产模拟考试一点通上危险化学品经营单位安全管理人员作业手机同步练习。…...
Uni-App常用事件
Uni-App是一个跨平台的前端开发框架,支持多个平台的应用开发,包括H5、小程序、App等。在Uni-App中,有许多常用的事件可以用来处理用户交互、页面生命周期等方面的逻辑。以下是一些Uni-App中常用的事件: 点击事件(click…...
【笔记 Pytorch】稀疏矩阵、scipy.sparse模块的使用
安装:pip install scipy 描述:就是专门为了解决稀疏矩阵而生。导入模块:from scipy import sparse 优缺点总结 七种矩阵类型描述coo_matrix ★【名称】coordinate format 【优点】 ① 不同稀疏格式间转换效率高(特别是CSR和CSC) …...

C#学习相关系列之Linq常用方法---排序(一)
一、构建数据 public class Student_1{public int ID { get; set; }public string Name { get; set; }public int Chinese { get; set; }public int Math { get; set; }public int English { get; set; }public override string ToString(){return string.Format("ID:{0},…...

Android Proguard混淆
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、语法规则3.1 输入/输出选项3.2 保留选项3.3 缩…...

MySQL 1、初识数据库
一、什么是数据库? 以特定的格式保存好的文件,我们就叫做数据库。 提供较为便捷的数据的存取服务的软件集合、解决方案,我们就叫它数据库。 存储数据用文件就可以了,为什么还要弄个数据库。 文件或数据库都可以存储数据&#…...

H5ke11--3介绍本地,会话存储
代码顺序: 1.设置input,捕获input如果有多个用属性选择符例如 input[typefile]点击事件.向我们的本地存储设置键值对 2.在点击事件外面设置本地存储表示初始化的值.点击上面的事件才能修改我们想修改的值 会话(session)浏览a数据可以写到本地硬盘,关闭页面数据就没了 本地(…...

技术分享 | 如何写好测试用例?
对于软件测试工程师来说,设计测试用例和提交缺陷报告是最基本的职业技能。是非常重要的部分。一个好的测试用例能够指示测试人员如何对软件进行测试。在这篇文章中,我们将介绍测试用例设计常用的几种方法,以及如何编写高效的测试用例。 ## 一…...
quarkus的一些注解1
path 用于指定一个类或者方法的URL路径前缀。 Inject 将一个依赖注入到一个类或方法中 Get 用于指定一个处理HTTP GET请求 Produce 注解用于指定一个方法返回的内容类型。例如,Produces(MediaType.TEXT_PLAIN) 表示该方法返回一个纯文本类型的内容 QuarkusIn…...

初学Redis(Redis的启动以及字符串String)
首先使用在Windows PowerShell中输入指令来启动Redis: redis-server.exe 然后通过指令连接Redis: redis-cli 上图的127.0.0.1是计算机的回送地址 ,6379是默认端口 上述代码中创建了两个键,注意Redis中严格区分大小写࿰…...

C++ opencv基本用法【学习笔记(九)】
这篇博客为修改过后的转载,因为没有转载链接,所以选了原创 文章目录 一、vs code 结合Cmake debug1.1 配置tasks.json1.2 配置launch.json 二、图片、视频、摄像头读取显示2.1 读取图片并显示2.2 读取视频文件并显示2.3 读取摄像头并写入文件 三、图片基…...
理财和银保区别
理财和银保在以下六个方面存在区别: 产品性质:银行理财是银行发行的理财产品,属于金融投资,主要投向债券、票据等固定收益类资产。银保产品是保险公司发行的保险产品,属于保障投资,除了固定收益类资产外&am…...

一文浅入Springboot+mybatis-plus+actuator+Prometheus+Grafana+Swagger2.9.2开发运维一体化
Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTFUL风格的Web服务,是非常流行的API表达工具。 Swagger能够自动生成完善的 RESTFUL AP文档,,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API。 Prometheus 是一个开源的服务监控系统和时…...

【日常】爬虫技巧进阶:textarea的value修改与提交问题(以智谱清言为例)
序言 记录一个近期困扰了一些时间的问题。 我很喜欢在爬虫中遇到问题,因为这意味着在这个看似简单的事情里还是有很多值得去探索的新东西。其实本身爬虫也是随着前后端技术的不断更新在进步的。 文章目录 序言Preliminary1 问题缘起1.1 Selenium长文本输入阻塞1.2…...
C++知识点总结(6):高精度乘法真题代码
一、高精度数 低精度数 #include <iostream> #include <cstring> using namespace std;int main() {// 存储并输入两个数字 char a_str[1005] {};long long b;cin >> a_str >> b;// 特例先行:结果是0的情况if (a 0 || b 0){cout <&…...
Polygon zkEVM的Dragon Fruit和Inca Berry升级
1. Polygon zkEVM的Dragon Fruit升级 2023年8月31日,Polygon zkEVM团队宣称启动了其Mainnet Beta的Dragon Fruit升级的10天timelock,预计将于2023年9月11日激活。 Dragon Fruit升级点有: 改进了网络支持了最新的以太坊opcode——PUSH0 1.…...

【计算机网络学习之路】网络基础1
文章目录 前言一. 计算机网络发展局域网和广域网 二. 网络协议三. OSI七层模型四. TCP/IP四层(五层)模型五. 计算机体系结构与网络协议栈六. 协议形式及局域网通信数据包封装与分用 七. 跨网络通信八. MAC地址与网络通信的理解结束语 前言 本系列文章是…...

HTTP/2.0协议详解
前言 HTTP/2.0:互联网通信的革新标准 随着互联网技术的飞速发展,HTTP协议作为互联网应用最广泛的通信协议,也在不断演进和优化。HTTP/2.0是HTTP协议的最新版本,它旨在提供更高效、更安全、更快速的互联网连接。 一、HTTP/2.0的优…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...