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的优…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
