uni-app开发经验分享十五: uni-app 蓝牙打印功能
最近在做uni-app项目时,遇到了需要蓝牙打印文件的功能需要制作,在网上找到了一个教程,这里分享给大家。
引入tsc.js
简单得引入到自己所需要得页面中去,本次我们只要到了标签模式,他同时还有账单模式可以选择。
// 蓝牙打印 指令和转码
var tsc = require('@components/gprint/tsc.js')
蓝牙适配前期工作
首先我们需要先初始化蓝牙模块,在进行搜索蓝牙。在监听到附近蓝牙设备时,记录他的名称和deviceId。
onBlue(e) {
uni.openBluetoothAdapter({
success(res) {
//监听寻找到新设备的事件
that.findDevice()
//监听本机蓝牙适配器状态变化事件
that.onStatus()
}
})
findDevice(){
console.log("监听寻找到新设备的事件---------------")
//监听寻找到新设备的事件
uni.onBluetoothDeviceFound(function(devices) {
const {name,deviceId} = devices[0];
if(name == "未知设备")return;
if(!name || !name.length){
that.devices.push({
name: name,
deviceId: deviceId,
services: []
})
}
that.devices.forEach(e=>{
if(that.devicesList){
let b = true;
that.devicesList.forEach(e1=>{
if(e.name == e1.name){
b = false;
}
});
if(b)that.devicesList.push(e);
}else{
that.devicesList.push(e);
}
});
}
}
onStatus(){
uni.getBluetoothAdapterState({
success: function(res) {
//本机蓝牙开启时
if (res.available) {
//如在正在搜索设备,则停止搜索
if (res.discovering) {
uni.stopBluetoothDevicesDiscovery()
}
//搜索蓝牙
//开始搜寻附近的蓝牙外围设备
uni.startBluetoothDevicesDiscovery()
} else {
console.log('本机蓝牙不可用')
}
},
})
}
连接蓝牙
搜索出附近蓝牙设备后,获取蓝牙设备的deviceId传入createBLEConnection方法中。在连接蓝牙设备时,我们需要注意的是保证尽量成对的调用 createBLEConnection 和 closeBLEConnection 接口。安卓如果多次调用 createBLEConnection 创建连接,有可能导致系统持有同一设备多个连接的实例,导致调用 closeBLEConnection 的时候并不能真正的断开与设备的连接。
我们将连接成功的蓝牙信息存到currDev中,以便直接连接,无需进行搜索操作。
onLink(item){
const {deviceId} = item;
console.log("连接蓝牙---------------" + deviceId);
//连接低功耗蓝牙设备。
uni.createBLEConnection({
deviceId: deviceId,
complete(res) {
if (res.errMsg != "createBLEConnection:ok") return
//连接设备时,需断开本机连接设备
uni.closeBLEConnection({
deviceId
})
that.connId = deviceId;
that.currDev = item
setTimeout(()=> {
//获取蓝牙设备所有服务(service)
that.getBLEServices(deviceId)
}, 2000)
}
//连接成功 关闭搜索
uni.stopBluetoothDevicesDiscovery()
})
}
getBLEServices(deviceId) {
uni.getBLEDeviceServices({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId: deviceId,
complete(res) {
const {services} = res;
services.forEach(item=>{
const {uuid} = item;
uni.getBLEDeviceCharacteristics({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId: deviceId,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId: uuid,
success(res) {
const {characteristics} = res;
for(let block of characteristics){
if(!block.properties.write)return
for (let index in that.devices) {
if (that.devices[index].deviceId == deviceId) {
that.devices[index].services.push({
serviceId: uuid,
characteristicId: block.uuid,
})
break
}
}
}
uni.setStorage({
key: 'currDev',
data: that.devices,
});
}
})
})
}
})
}
打印
打印格式需要自己根据当前设备的格式来进行设置打印。本章用到的是tsc.js中的form格式。
onPrint(){
if(this.currDev.length == 0){
uni.showToast({
title: '请先连接蓝牙打印机',
duration: 2000
});
return
}
//标签模式
const {deviceId} = this.currDev;
const {serviceId,characteristicId} = this.currDev.services[0];
var command = tsc.jpPrinter.createNew();
//DaYin这个字段存放我们需要打印的数据
let DaYin = JSON.parse(JSON.stringify(this.rowsList));
let Customer = JSON.stringify(this.Customer);
//打印格式需要根据打印机的特定格式来。在tsc文件中修改格式。
DaYin.forEach(e=>{
command.form(e.ReceSheetNo,`客 户:${Customer}`,`匹 数:${e.Rolls}`,`坯布品名:${e.GrayID}`,`进仓编号:${e.LotNo}`,`坯布类型:${e.GrayTypeName}`)
command.setPagePrint()
})
//转码处理
this.senBlData(deviceId, serviceId, characteristicId,command.getData())
}
senBlData(deviceId, serviceId, characteristicId,uint8Array) {
let uint8Buf = Array.from(uint8Array);
function split_array(datas,size){
let result = {};
let j = 0
for (var i = 0; i < datas.length; i += size) {
result[j] = datas.slice(i, i + size)
j++
}
return result
}
let sendloop = split_array(uint8Buf, 20);
function realWriteData(sendloop, i) {
let data = sendloop[i]
if(typeof(data) == "undefined"){
return
}
let buffer = new ArrayBuffer(data.length)
let dataView = new DataView(buffer)
uni.writeBLECharacteristicValue({
deviceId,
serviceId,
characteristicId,
value: buffer,
success(res) {
realWriteData(sendloop, i + 1);
}
})
}
let i = 0;
realWriteData(sendloop, i);
},
form条码格式
// 条形码和文字合成打印
jpPrinter.form = function (content,text1,text2,text3,text4) {
data = header + "LEFT" + "\r\n" + "GAR-SENSE" + "\r\n" + barcodeText +
"BARCODE " + 128 + " " + 1 + " " + 1 + " " + 125 + " " + 125 + " " + 0 + " " +
content + "\r\n" +
"TEXT " + " " + 12 + " " + 0 + " " + 125 + " " + 180 + " " + text1 + "\r\n" +
"TEXT " + " " + 12 + " " + 2 + " " + 125 + " " + 210 + " " + text2 + "\r\n" +
"TEXT " + " " + 12 + " " + 2 + " " + 125 + " " + 240 + " " + text3 + "\r\n" +
"TEXT " + " " + 12 + " " + 2 + " " + 125 + " " + 270 + " " + text4 + "\r\n" +
"FORM" + "\r\n" ;
jpPrinter.addCommand(data)
};
转载于:https://blog.csdn.net/zhanleibo/article/details/103035645
uni-app开发经验分享十五: uni-app 蓝牙打印功能的更多相关文章
- 如何给自己的app添加分享到有道云笔记这样的功能
文章同步自http://javaexception.com/archives/34 如何给自己的app添加分享到有道云笔记这样的功能 问题: 在之前的一个开源笔记类项目Leanote中,有个用户反馈想 ...
- uni-app开发经验分享十: 封装request请求
http.js //封装requset,uploadFile和downloadFile请求,新增get和post请求方法 let http = { 'setBaseUrl': (url) => ...
- uni-app开发经验分享十六:发布android版App的详细过程
开发环境 1. Android Studio下载地址:Android Studio官网 OR Android Studio中文社区 2. HBuilderX(开发工具) 3. App离线SDK下载:最 ...
- uni-app开发经验分享十八:对接第三方h5
1.uni-app中对接第三方为了防止跳出app使用了webview <template> <view> <web-view :src="url" @ ...
- uni-app开发经验分享十四:小程序超过2M限制的方法——分包加载
起初小程序上线时,微信限制了代码包不能超过1MB,后来功能变大变成了2M了,限制大小是出于对小程序启动速度的考虑,希望用户在使用任何一款小程序时,都能获得一种"秒开"体验.但是 ...
- uni-app开发经验分享十二: Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略及提示信息
Android平台从6.0(API23)开始系统对权限的管理更加严格,所有涉及敏感权限都需要用户授权允许才能获取.因此一些应用基础业务逻辑需要的权限会在应用启动时申请,并引导用户允许. 读写手机存储权 ...
- uni-app开发经验分享十九: uni-app对接微信小程序直播
uni-app对接微信小程序直播 1.登录微信小程序后台-点击>设置->第三方设置->添加直播插件 2.添加直播组件后->点击<详情> 记录这两个参数直播 ...
- php分享十五:php的命令行操作
一:像命令行传参数方法: 1: 使用$argc $argv 用法: /usr/local/php/bin/php ./getopt.php 123 456 2:使用getopt函数() http:/ ...
- php分享十五:php的数据库操作
一:术语解释: What is an Extension? API和扩展不能理解为一个东西,因为扩展不一定暴露一个api给用户 The PDO MySQL driver extension, for ...
随机推荐
- openstack高可用集群17-openstack集成Ceph准备
Openstack集成Ceph准备 Openstack环境中,数据存储可分为临时性存储与永久性存储. 临时性存储:主要由本地文件系统提供,并主要用于nova虚拟机的本地系统与临时数据盘,以及存储gla ...
- Excel 冻结窗口
1.冻结前五行 鼠标选中第六行,点击视图----> 冻结窗口 ----> 冻结拆分窗口 2.冻结第一列窗口 鼠标选中第1列,点击视图----> 冻结窗口 ----> 冻结首列窗 ...
- 如何在iOS设备中配置S/MIME邮件签名证书
本篇将介绍如何在iOS设备(如iPhone或iPad)上导入.配置并使用S/MIME邮件证书. 前置条件: iOS设备上已完成邮箱账号配置: 您的S/MIME邮件证书PFX/P12文件已导出备用. 步 ...
- 实验2 C语言表达式编程应用及输入输出函数( 后附炫彩小人:) )
实验任务一 #include <stdio.h> int main (){ int a=5,b=7,c=100,d,e,f; d=a/b*c; e=a*c/b; f=c/b*a; prin ...
- k8s重器之Service
Service是k8s的核心,通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并将请求进行负载分发到各个容器应用上. 目录: Service定义详解 Service基本 ...
- 算法(Java实现)—— 贪心算法
贪心算法 应用场景-集合覆盖问题 假设在下面需要付费的广播台,以及广播台新型号可以覆盖的地区,如何选择最少的广播台,让所有地区都可以接收到信号 广播台 覆盖地区 k1 北京.上海.天津 k2 广州.北 ...
- java面试 题
分布式消息队列 1,为什么使用消息队列啊消息队列有什么优点和缺点啊 2,如何保证消息队列的高可用啊如何保证消息不被重复消费啊 3,kafka,activemq,rabbitmq,rocketmq都有什 ...
- 多线程写法,消除同步bug
public class Demo01 implements Runnable { private int ticket = 10; @Override public void run() { for ...
- MongoDb学习三(spring-data-mongodb)
本文采用2个种配置方式.xml配置 代码配置方式进行数据库的连接.实现简单的增删该查等一些操作.代码都有注释官方文档如下https://docs.spring.io/spring-data/mongo ...
- 初始MQTT
初识 MQTT 物联网 (IoT) 设备必须连接互联网.通过连接到互联网,设备就能相互协作,以及与后端服务协同工作.互联网的基础网络协议是 TCP/IP.MQTT(消息队列遥测传输) 是基于 TC ...