uniapp使用plus调取蓝牙/usb打印

 安卓使用usb调取打印机

/*** 安卓usb调取打印机*@param { string | bytes[] } html 传入的打印内容*传入一段文本或一个bytes数组* @returns*/
export const printUsb = (html) => {return new Promise((resolve, reject) => {if (!window.plus) return reject(new Error("请在安卓环境中使用!"));//如果参数不是字符串或bytes数组直接报错if (!Array.isArray(html) && typeof html !== "string")return reject(new Error("参数不正确!"));try {const context = plus.android.runtimeMainActivity();const usbManager = context.getSystemService("usb");//引入usb类plus.android.importClass(usbManager);//获取到设备列表const devices = usbManager.getDeviceList();const values = plus.android.invoke(devices, "values");//调用values方法获取usb设备列表const deviceList = plus.android.invoke(values, "toArray");const printerList = deviceList.filter((item) => {const usbInterface = plus.android.invoke(item, "getInterface", 0);const usbType = plus.android.invoke(usbInterface, "getInterfaceClass");//usb类型为7的时候是打印机if (usbType === 7) return item;});//如果打印机不存在,直接阻断if (!printerList.length) return reject(new Error("请连接打印机设备!"));//usb设备(我这里选择打印机的第一台连接,如果要连多台打印机可以用上面获取的pinterList打印机列表进行操作)const device = printerList[0];const PendingIntent = plus.android.importClass("android.app.PendingIntent",);const Intent = plus.android.importClass("android.content.Intent");//申请usb传输权限const pendingIntent = PendingIntent.getBroadcast(context,0,new Intent("ACTION_USB_PERMISSION"),PendingIntent.FLAG_UPDATE_CURRENT,);//判断是否具有权限const isExist = plus.android.invoke(usbManager, "hasPermission", device);//如果权限不存在申请权限if (!isExist) {//请求读写权限usbManager.requestPermission(device, pendingIntent);return resolve('已获取usb权限!');}//建立连接const socket = usbManager.openDevice(device);if (!socket) return reject(new Error("usb连接失败!"));const iface = plus.android.invoke(device, "getInterface", 0);plus.android.invoke(socket, "claimInterface", iface, true);//批量传输示例const endpoint = plus.android.invoke(iface, "getEndpoint", 0);//根据传入的内容类型做处理const buffer =typeof html === "string"? plus.android.invoke(html, "getBytes", "gbk"): html;plus.android.invoke(socket,"bulkTransfer",endpoint,buffer,buffer.length,5000,);//释放usb端口资源plus.android.invoke(socket, "releaseInterface", iface);//关闭usb连接plus.android.invoke(socket, "close");resolve("打印成功!");} catch (error) {reject(error);}});
};

安卓使用蓝牙调取打印机设备

/**
*安卓使用蓝牙调取打印机
*@param { string } deviceId 蓝牙的mac地址(即设备id)
*@param { string } html 需要打印的文本 
*/
export const printBluetooth(deviceId, html) {return new Promise((resolve, reject) => {try {plus.android.runtimeMainActivity();const BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter",);const UUID = plus.android.importClass("java.util.UUID");const uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");const Adapter = BluetoothAdapter.getDefaultAdapter();Adapter.cancelDiscovery(); //停止扫描const device = Adapter.getRemoteDevice(deviceId);plus.android.importClass(device);const bluetoothSocket =device.createInsecureRfcommSocketToServiceRecord(uuid);plus.android.importClass(bluetoothSocket);if (!bluetoothSocket.isConnected()) {bluetoothSocket.connect();}const outputStream = bluetoothSocket.getOutputStream();plus.android.importClass(outputStream);const bytes = plus.android.invoke(html, "getBytes", "gbk");outputStream.write(bytes);outputStream.flush();outputStream.close();resolve();} catch (error) {reject(error);}});
}

热敏打印机配置参数及简单模板

(部分命令可能不一致,需要查找对应品牌的打印机指令)

const printer = {//初始化打印机start: "\x1B\x40",//左边距leftPadding: "\x1D\x4C\x02\x00",//右边距rightPadding: "\x1D\x57\x02\x00",//首行缩进两字符textIndent:'\x1B\x5C\x18\x00',//文本左对齐alignLeft: "\x1B\x61\x00",//文本居中alignCenter: "\x1B\x61\x01",//文本右对齐alignRight: "\x1B\x61\x02",//字体缩小textSmall: "\x1B\x21\x00",//字体放大textLarge: "\x1D\x21\x11",//恢复默认字体textRecover: "\x1D\x21\x00",//字体加粗bold: "\x1B\x45\x01",//取消字体加粗boldOff: "\x1B\x45\x00",//字体双倍高度doubleHeight: "\x1B\x33\x30",//恢复行高lineHeightRecover: "\x1B\x32",//设置行间距lineSpacing: `\x1B\x33\x24`,//换行lineBreak: "\x0A",//禁止自动换行tabOff: "\x1B\x57\x00",//恢复自动换行tab: "\x1B\x31\x01",//切纸 (全切)end: "\x1B\x69",//切纸 (半切)endHalf: "\x1B\x6D",//分割线devide: `\x1B\x61\x01${"-".repeat(48)}\x0A\x1B\x61\x00`,//二维码qrcode: () => {return;},
};//计算中间空白间隔
function letterSpace(str) {const length = [...str].reduce((acc, char) => //中文unicode编码大于255(中文一个字占2个字符,英文一个字一字符)acc + (char.charCodeAt(0) > 255 ? 2 : 1), 0)//80mm热敏打印机减去左右边距宽度为48字符return ' '.repeat(48 - length);
}const createTemplate = () => {
let escpos = `${printer.start}
${printer.alignCenter}${printer.bold}哆啦A梦餐厅
${printer.lineBreak}
${printer.alignCenter}${printer.bold}【收银凭证】${printer.lineBreak}
${printer.alignLeft}${printer.bold}贵宾客户${printer.lineBreak}
${printer.alignLeft}${printer.boldOff}2025/06/27 09:18${letterSpace('2025/06/27 09:18票号:0007')}${printer.bold}票号:0007${printer.lineBreak}
${printer.devide}
${printer.bold}1.麻婆豆腐${letterSpace('1.麻婆豆腐72元')}${printer.bold}72元${printer.lineBreak}
${printer.textSmall}${printer.textIndent}8件x9${printer.lineBreak}
${printer.devide}
${printer.textSmall}应付${letterSpace('应付72元')}${printer.bold}72元${printer.lineBreak}
${printer.textSmall}实付${letterSpace('实付(现金)72元')}${printer.bold}(现金)72元${printer.lineBreak}
${printer.devide}
${printer.textSmall}收银员:哆啦美${printer.lineBreak}
${printer.end}
`;// 行4 (空行)return escpos;
};export default createTemplate;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区块链数据结构:区块与链式结构编码

目录 区块链数据结构:区块与链式结构编码引言:区块链的骨架1. 区块链数据结构解析1.1 区块结构组成1.2 区块链可视化结构2. 区块核心组件详解2.1 区块头字段说明2.2 Merkle树结构2.3 工作量证明机制3. Python实现区块链数据结构3.1 区块类实现3.2 区块链类实现3.3 区块链演示…

阿里推出 R1-Omni:将强化学习与可验证奖励(RLVR)应用于全模态大语言模型

从视频中识别情感涉及许多细微的挑战。仅依赖视觉或音频信号的模型,往往无法准确捕捉这两种模态之间的复杂相互作用,从而导致对情感内容的误解。一个关键难题在于可靠地结合视觉线索(如面部表情或肢体语言)与听觉信号(…

【江科大】STM32F103C8T6 + TB6612 + N20编码器减速电机《03-增量式PID定速控制》(增量式PID,定时器输入捕获,定时器编码器)

STM32F103C8T6单片机+N20减速电机带霍尔编码器版PID闭环控制实验演示 STM32F103C8T6 实现的电机转速控制系统,基于 PWM 输出驱动、编码器采样反馈、以及增量式 PID 算法进行控制。 /*** @file Encoder.c* @brief 增量式编码器驱动程序* @details 使用TIM3定时器的编码器…

【论文阅读35】-PINN review(2021)

这篇综述全面回顾了物理信息机器学习 的原理、应用、软件实现、理论进展与未来发展趋势,这样即使数据稀疏、带噪,也能保证预测结果符合物理规律,适合解决偏微分方程正问题、反问题、非线性动力学和多物理耦合系统等科学计算场景。 作者信息&…

深度学习初探:聚焦 Transformer 与 LLM 的核心世界

文章目录 前言一、神经网络基础:智能的基石二、Transformer 架构:AI 新纪元的基石Transformer 的核心特性Transformer 的关键组件 三、 大语言模型概览总结 前言 人工智能的浪潮正以前所未有的力量重塑世界,而这场变革的核心引擎之一&#x…

【开发杂谈】Auto Caption:使用 Electron 和 Python 开发实时字幕显示软件

项目已开源到 GitHub,项目地址:HiMeditator/auto-captionhttps://github.com/HiMeditator/auto-caption 软件下载(Windows平台):Releases HiMeditator/auto-captionhttps://github.com/HiMeditator/auto-caption/releases 你是否遇到过看外…

临床项目范围管理:确保项目聚焦与成功交付

一、核心目标 1.1 清晰定义项目边界 1.1.1 明确项目目标 明确项目具体目标、可交付成果、研究活动、纳入/排除标准、数据收集范围等,为项目规划、执行、监控和控制奠定基础。 1.1.2 防止范围蔓延 严格控制未经批准的变更,避免项目目标、活动或可交付成果超出最初约定,导致…

opi是什么

是的,当然可以!您提出了一个非常好的问题。 opi 远不止是一个 NVIDIA 驱动安装器,它是一个非常强大的、专为 openSUSE 设计的**“超级安装助手”**或“智能搜索工具”。 它的主要目的就是为了解决一个常见问题:“我想安装一个软…

【Go语言-Day 9】指针基础:深入理解内存地址与值传递

Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

如何使用 vue vxe-table 来实现一个产品对比表表格

如何使用 vue vxe-table 来实现一个产品对比表表格 查看官网&#xff1a;https://vxetable.cn 效果 代码 <template><div class"demo-page-wrapper"><vxe-grid v-bind"gridOptions"><template #img11><vxe-image src"h…

【CF】Day85——CF 1033 (Div. 2) B (物理?) + CF 860 (Div. 2) C (数学思维 + lcm + gcd)

忙于期末&#xff0c;久久未写&#xff0c;今日一写&#xff0c;全都忘了 C. Candy Store 题目&#xff1a; 思路&#xff1a; 数学思维 我们假设一个标签 cost 可以覆盖一个连续的区间&#xff0c;那么这个 cost 就满足 cost bl * dl bl1 * dl1 ... br-1 * dr-1 br * d…

16.2 Docker多阶段构建实战:LanguageMentor镜像瘦身40%,支持500+并发1.2秒响应!

LanguageMentor Agent 容器化部署与发布:Docker 镜像创建与测试 关键词:Docker 容器化部署, 多阶段构建, 镜像分层优化, 环境一致性, 私有化模型集成 1. Dockerfile 最佳实践架构设计 通过多阶段构建策略实现开发与生产环境分离: #mermaid-svg-CKUsKERUN6nqM0bI {font-fam…

高可用与低成本兼得:全面解析 TDengine 时序数据库双活与双副本

在现代数据管理中&#xff0c;企业对于可靠性、可用性和成本的平衡有着多样化的需求。为此&#xff0c;TDengine 在 3.3.0.0 版本中推出了两种不同的企业级解决方案&#xff1a;双活方案和基于仲裁者的双副本方案&#xff0c;以满足不同应用场景下的特殊需求。本文将详细探讨这…

Github项目:Python编写的录屏工具 TTvideo(已打包)

打包好能立即用的github项目&#xff1a;TTvideo 用的github上的项目&#xff1a;https://github.com/jumppppp/ttvideo 朴实无华&#xff0c;功能强大的录屏工具 原作者如有认为侵权&#xff0c;评论区联系立删 1.效果图 2.下载链接 录屏工具

LE AUDIO---Chapter 2. The Bluetooth® LE Audio architecture

目录 2.1 The use cases 2.1.1 Hearing aid requirements - the use cases 2.1.1.1 Basic telephony 2.1.1.2 Low latency audio from a TV 2.1.1.3 Adding more users 2.1.1.4 Adding more listeners to support larger areas 2.1.1.5 Coordinating left and right hearin…

算法第54天| 并查集

107. 寻找存在的路径 题目 思路与解法 #include <iostream> #include <vector> using namespace std;int n; // 节点数量 vector<int> father vector<int> (101, 0); // 按照节点大小定义数组大小// 并查集初始化 void init() {for (int i 1; i &l…

守护API可用性:全面对抗DDoS与CC洪水攻击策略

API的可用性直接关系到用户体验和业务收入。分布式拒绝服务&#xff08;DDoS&#xff09;和针对应用层的CC&#xff08;Challenge Collapsar&#xff09;攻击&#xff0c;旨在耗尽服务器资源&#xff08;带宽、连接数、CPU&#xff09;&#xff0c;使合法用户无法访问。这类攻击…

第 4 章:第一个神经网络实战——使用 PyTorch

第 4 章&#xff1a;第一个神经网络实战——使用 PyTorch 经过前三章的学习&#xff0c;我们已经对神经网络的理论基础有了扎实的理解。我们知道数据如何前向传播&#xff0c;如何用损失函数评估预测&#xff0c;以及如何通过梯度下降和反向传播来更新网络参数。 理论是根基&a…

MST56XXB/MST5650B/MST5033B 是一款耐高压的LDO芯片,针对中控设备,给MCU供电,60V的耐压,150mA

MST56XXB系列是一款高输入电压(60V)低静态电流、高PSRR线性稳压器(LDO)&#xff0c;能够提供150mA负载电流。LDO针对线电压瞬变和负载电流瞬变具有非常快速的响应特性&#xff0c;并确保LDO启动期间和短路恢复过程中不会出现过冲电压。该设备具有集成的短路和热关断保护。该设备…

Java基础(五):流程控制全解析——分支(if/switch)和循环(for/while)的深度指南

Java基础系列文章 Java基础(一)&#xff1a;发展史、技术体系与JDK环境配置详解 Java基础(二)&#xff1a;八种基本数据类型详解 Java基础(三)&#xff1a;逻辑运算符详解 Java基础(四)&#xff1a;位运算符详解 Java基础(五)&#xff1a;if/switch与for/while - 深入理解…