Vue H5项目,怎么引入uni.webview sdk,调用uni postMessage实现手机蓝牙连接打印功能(uniapp)

前言

目前公司Vue H5项目,用webview打包成APP,现产品提出这样打包出来的app运行较慢,需要用uniapp方式(即使用HBuilder编辑器来打包H5)来打包,那需要的基座就不是安卓的基座而是uniapp的基座,而H5项目实现手机扫描功能就需要调用uniapp的基座的方法。

需求&流程说明

Vue2 开发的移动端项目(H5项目及ipad端项目),需要连接蓝牙设备打印

需求说明:

1、点击打印按钮时,先判断当前设备是否已连接过蓝牙(即是否存在蓝牙设备ID)

a、若已连接过:直接调用打印配置(即:type:bluetoothPrint)
b、若未连接过:

1、先获取当前设备的所有蓝牙list(即:type:getBluetoothList)

在这里插入图片描述
2、选中设备后调用蓝牙连接(即:type:connBluetooth)
3、连接成功后存储已连接的设备ID(即选中的设备)

具体步骤

一、Uniapp Webview 源码

<template><view><web-view :src="src" @message="showMessage"></web-view></view>
</template><script>
export default {data() {return {src: 'http://******/', // H5项目地址qrCodeWv: null,devices: [],currDev: null,connId: '',}},onReady() {// #ifdef APP-PLUSlet currentWebview = this.$scope.$getAppWebview()setTimeout(() => {this.wv = currentWebview.children()[0]this.qrCodeWv = currentWebview.children()[0]this.wv.setStyle({ scalable: true })}, 1000)// #endif},methods: {showMessage(event) {if (event.detail.data && event.detail.data.length > 0) {let dataInfo = event.detail.data[0]console.log(dataInfo)let type = dataInfo.typeif (type === 'getBluetoothList') {this.getBluetoothList()}if (type === 'connBluetooth') {console.log(dataInfo.params)let args = dataInfo.params;let deviceId = args.deviceId;let device = this.devices.find((item) => {return item.deviceId == deviceId;})console.log(device)this.connBluetooth(device)}if (type === 'bluetoothPrint') {let args = dataInfo.params;let deviceId = args.deviceId;let command = args.command;let device = this.devices.find((item) => {return item.deviceId == deviceId;})//当设备没有连接时需要重新连接设备if (this.connId == '') {this.initBluetoothList();this.connBluetooth(device);}let serviceId = this.currDev.services[0].serviceId;let characteristicId = this.currDev.services[0].characteristicId;this.senBlData(deviceId, serviceId, characteristicId, command);}}},// 获取蓝牙设备listgetBluetoothList() {this.initBluetoothList();const data = JSON.stringify(this.devices)console.log('获取蓝牙设备list', data)this.qrCodeWv.evalJS(`appBluetoothListResult('${data}')`)},initBluetoothList() {this.searchBle();setTimeout(() => {this.stopFindBule();}, 10000)},// 查找蓝牙设备searchBle() {var self = thisconsole.log("initBule")uni.openBluetoothAdapter({success(res) {console.log("打开 蓝牙模块")console.log(res)self.onDevice()uni.getBluetoothAdapterState({success: function (res) {console.log(res)if (res.available) {if (res.discovering) {self.stopFindBule()}//搜索蓝牙//开始搜寻附近的蓝牙外围设备console.log("开始搜寻附近的蓝牙外围设备")uni.startBluetoothDevicesDiscovery({success(res) {console.log(res)}})} else {console.log('本机蓝牙不可用')}},})}})},onDevice() {console.log("监听寻找到新设备的事件---------------")var self = this//监听寻找到新设备的事件uni.onBluetoothDeviceFound(function (devices) {//获取在蓝牙模块生效期间所有已发现的蓝牙设备console.log('--------------new-----------------------' + JSON.stringify(devices))var re = JSON.parse(JSON.stringify(devices))let name = re.devices[0].nameif (name != "未知设备" && name.length != 0) {console.log(name.length)let deviceId = re.devices[0].deviceId//信号过滤。大于50//如果已经存在也不用加入if (re.devices[0].RSSI > self.filterRSSI) {if (!self.devices.some(v => v.deviceId == deviceId)) {self.devices.push({name: name,deviceId: deviceId,services: []})}}}})},stopFindBule() {console.log("停止搜寻附近的蓝牙外围设备---------------")uni.stopBluetoothDevicesDiscovery({success(res) {console.log(res)}})},// 连接蓝牙connBluetooth(device) {this.onConn(device);},// 连接蓝牙onConn(item) {var self = thisconsole.log(`连接蓝牙---------------${item.deviceId}`)let deviceId = item.deviceIduni.createBLEConnection({deviceId: deviceId,complete(res) {let result = false;if (res.errMsg == "createBLEConnection:ok") {plus.nativeUI.toast(`设备:${item.name} 已连接`, {verticalAlign: 'center'})self.connId = deviceId;self.currDev = item,setTimeout(function () {self.getBLEServices(deviceId)}, 2000)result = true;} else {plus.nativeUI.toast(`设备: ${item.name} 连接失败。请重试!`, {verticalAlign: 'center',})//切换异常时释放掉链接if (self.connId != '') {uni.closeBLEConnection({deviceId: self.connId,success(res) {console.log(res)}})}}//连接成功 关闭搜索self.stopFindBule()//发生是否成功结果var data = {};data.result = result;var data1 = JSON.stringify(data)self.wv.evalJS(`appConnBluetoothResult('${data1}')`)},})},getBLEServices(_deviceId) {var self = this;let deviceId = _deviceIdconsole.log("获取蓝牙设备所有服务(service)。---------------")uni.getBLEDeviceServices({// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接deviceId: deviceId,complete(res) {console.log(res)let serviceId = ""for (var s = 0; s < res.services.length; s++) {console.log(res.services[s].uuid)let serviceId = res.services[s].uuiduni.getBLEDeviceCharacteristics({// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接deviceId: deviceId,// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取serviceId: serviceId,success(res) {var re = JSON.parse(JSON.stringify(res))console.log(`deviceId =[${deviceId}] serviceId = [${serviceId}]`)for (var c = 0; c < re.characteristics.length; c++) {if (re.characteristics[c].properties.write == true) {let uuid = re.characteristics[c].uuidconsole.log(`deviceId =[${deviceId}] serviceId = [${serviceId}] characteristics=[${uuid}]`)for (var index in self.devices) {if (self.devices[index].deviceId == deviceId) {self.devices[index].services.push({serviceId: serviceId,characteristicId: uuid})break}}console.log(JSON.stringify(self.devices))}}}})}},fail(res) {console.log(res)},})},senBlData(deviceId, serviceId, characteristicId, uint8Array) {var uint8Buf = Array.from(uint8Array);function split_array(datas, size) {var result = {};var j = 0if (datas.length < size) {size = datas.length}for (var i = 0; i < datas.length; i += size) {result[j] = datas.slice(i, i + size)j++}//result[j] = datasconsole.log(result)return result}var sendloop = split_array(uint8Buf, 20);// console.log(sendloop.length)function realWriteData(sendloop, i) {var data = sendloop[i]if (typeof (data) == "undefined") {return}//console.log("第【" + i + "】次写数据"+data)var buffer = new ArrayBuffer(data.length)var dataView = new DataView(buffer)for (var j = 0; j < data.length; j++) {dataView.setUint8(j, data[j]);}uni.writeBLECharacteristicValue({deviceId,serviceId,characteristicId,value: buffer,success(res) {console.log('发送成功', i)setTimeout(() => {realWriteData(sendloop, i + 1);}, 100)},fail(e) {console.log('发送数据失败')console.log(e)}})}var i = 0;realWriteData(sendloop, i);},}
}
</script>

二、H5 Vue项目引入js

1、在public新建js文件夹uni.webview.1.5.4.js文件,其源码地址

https://gitee.com/dcloud/uni-app/raw/dev/dist/uni.webview.1.5.4.js

2、index.html 引入 public/js 下文件

<script src="<%= BASE_URL %>js/uni.webview.1.5.4.js"></script>

3、main.js 定义回调方法和对象

// 蓝牙设备列表
window.appBluetoothListResult = function (val) {window.appBluetoothListResultString = valwindow.dispatchEvent(new CustomEvent('bluetoothListResult'))
}// 蓝牙连接成功或失败
window.appConnBluetoothResult = function (val) {window.appConnBluetoothResultString = valwindow.dispatchEvent(new CustomEvent('connBluetoothResult'))
}

4、Vue扫码页面代码

1、在mixins文件夹下新建bluetoothMixins.js:代码如下
export default {data() {return {bluetoothShow: false, // 蓝牙设备弹窗deviceId: '', // 蓝牙设备IDlistArr: [] // 获取所有蓝牙设备}},created() {window.addEventListener('bluetoothListResult', this.handleBluetoothList, false)window.addEventListener('connBluetoothResult', this.handleConnBluetoothResult, false)},beforeDestroy() {window.removeEventListener('bluetoothListResult', this.handleBluetoothList)window.removeEventListener('connBluetoothResult', this.handleConnBluetoothResult)},methods: {handleConnBluetoothResult() {const result = window.appConnBluetoothResultStringconsole.log('返回蓝牙是否连接成功', result)if (JSON.parse(result).result) {console.log('连接成功')const deviceId = localStorage.getItem('bluetoothDeviceId')localStorage.setItem('bluetoothDeviceId', deviceId || this.deviceId)// alert(`${this.deviceId}---设置值选中的值`)// alert(`${deviceId}---设置值缓存的值`)this.bluetoothShow = false}},handleBluetoothList() {const result = window.appBluetoothListResultStringconsole.log('返回蓝牙list', result)if (result) {this.bluetoothShow = truethis.listArr = JSON.parse(result)}},// 选中设备selectBluetooth(item) {console.log('选中设备', item)this.deviceId = item.deviceIduni.postMessage({data: {action: 'connBluetooth',params: { deviceId: this.deviceId }}})}}
}
2、实际Vue页面:如下
import BluetoothMixins from '@/mixins/bluetoothMixins'
export default {mixins: [BluetoothMixins],methods: {// 点击打印按钮async print(deliveryNo) {console.log('配送单deliveryNo----', deliveryNo)// 获取蓝牙打印参数const res = await this.$api.getDeliveryPrintParam({ deliveryNo })if (res.success) {// 判断之前是否有连接过蓝牙const deviceId = localStorage.getItem('bluetoothDeviceId')// alert(`${deviceId}---配送单缓存值`)if (deviceId) {// 连接过直接打印uni.postMessage({data: {action: 'bluetoothPrint',params: { deviceId, command: JSON.parse(res.data) }}})} else {// 没有连接过,先去获取蓝牙设备数据(list)uni.postMessage({data: {action: 'getBluetoothList'}})}}}}}

相关文章

基于ElementUi再次封装基础组件文档


基于ant-design-vue再次封装基础组件文档


vue3+ts基于Element-plus再次封装基础组件文档

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

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

相关文章

扭矩法、屈服点法哪个比较高效?——SunTorque智能扭矩系统

在机械制造和维修领域&#xff0c;拧紧螺栓和螺母是一项重要的操作。拧紧方法的合理选择和使用&#xff0c;对于确保机械设备的稳定性和安全性具有至关重要的作用。本文SunTorque智能扭矩系统将介绍两种最常用的拧紧方法&#xff0c;并探讨它们的轴力范围计算方法。一、扭矩法 …

电信网关配置管理系统后台 upload.php 文件上传漏洞复现

0x01 产品简介 中国电信集团有限公司(英文名称“China Telecom”、简称“中国电信”)成立于2000年9月,是中国特大型国有通信企业、上海世博会全球合作伙伴。 0x02 漏洞概述 电信网关配置管理系统后台 /manager/teletext/material/upload.php 接口存在文件上传漏洞,攻击者…

【数电笔记】56-消抖开关

目录 说明&#xff1a; 1. 按键抖动形成的原因 2. 按键消抖的方法 3. 用与非RS触发器构成消抖开关&#xff08;硬件消抖&#xff09; 说明&#xff1a; 笔记配套视频来源&#xff1a;B站本系列笔记并未记录所有章节&#xff0c;只对个人认为重要章节做了笔记&#xff1b;标…

【稳定检索|投稿优惠】2024年艺术鉴赏与社会科学教育国际会议(ICAASSE 2024)

2024年艺术鉴赏与社会科学教育国际会议(ICAASSE 2024) 2024 International Conference on Art Appreciation and Social Science Education(ICAASSE) 一、【会议简介】 2024年艺术鉴赏与社会科学教育国际会议(ICAASSE 2024)&#xff0c;这场学术盛宴&#xff0c;将于2024年2月1…

郝斌C语言自学教程笔记

赫斌C语言——笔记目录 c语言编程预备知识流程控制函数变量指针结构体位运算符 前段时间康哥看我C语言基础不牢,推荐我学习郝斌老师的C语言课程&#xff0c;花2周看完之后发现确实是目前所看的C语言课程中最好的&#xff0c;不仅非常适合入门&#xff0c;而且对即使学了几年C语…

怒斥以色列后突发心脏病倒地,土耳其议员抢救无效身亡!

这两天互联网上热传一段视频&#xff0c;说的就是土耳其议员在议会演讲时突然倒地晕厥&#xff0c;两天后就去世了。这可真是让人震惊啊&#xff01; 据说这位议员是土耳其反对党幸福党的&#xff0c;名字叫比特梅兹。他在议会发表批评以色列的言论时&#xff0c;情绪过于激动…

安装2023最新版Java SE 21.0.1来开发Java应用程序

安装2023最新版Java SE 21.0.1来开发Java应用程序 Install the latest version of Java SE 21.01 to Develop Java Applications By JacksonML 本文简要介绍如何下载和安装2023年最新版Java Development Kit (简称JDK&#xff0c;即Java开发工具包标准版&#xff09;21.0.1&…

长尾问题之LDAM

做法&代码&公式 step1: 全连接层的权重W和特征向量X都归一化,相乘 W * X P (得到各个类别的概率) # 定义权重&#xff0c;初始化 weight nn.Parameter(torch.FloatTensor(num_classes, num_features)) weight.data.uniform_(-1, 1).renorm_(2, 1, 1e-5).mul_(1e5)#…

Java 线程的基本概念

创建和运行线程 方法一&#xff0c;直接使用 Thread // 创建线程对象 Thread t new Thread() {public void run() {// 要执行的任务}};// 启动线程 t.start();例如&#xff1a; // 构造方法的参数是给线程指定名字&#xff0c;推荐 Thread t1 new Thread("t1") …

网络安全——SQL注入实验

一、实验目的要求&#xff1a; 二、实验设备与环境&#xff1a; 三、实验原理&#xff1a; 四、实验步骤&#xff1a; 五、实验现象、结果记录及整理&#xff1a; 六、分析讨论与思考题解答&#xff1a; 七、实验截图&#xff1a; 一、实验目的要求&#xff1a; 1、…

《Cadence 16.6电路设计与仿真从入门到精通》——1.4 Cadence SPB 16.6的启动

《Cadence 16.6电路设计与仿真从入门到精通》——1.4 Cadence SPB 16.6的启动  2017-05-027334 版权 简介: 本节书摘来自异步社区《Cadence 16.6电路设计与仿真从入门到精通》一书中的第1章,第1.4节,作者: 王超 , 胡仁喜等 更多章节内容可以访问云栖社区“异步社区”公…

《PCL多线程加速处理》-滤波-统计滤波

《PCL多线程加速处理》-滤波-统计滤波 一、效果展示二、实现方式三、代码一、效果展示 提升速度随着点云越多效果越明显 二、实现方式 1、原始的统计滤波实现方式 #include <pcl/filters/statistical_outlier_removal.h>pcl::PointCloud<pcl::PointXYZ

使用 Python 使用贝叶斯神经网络从理论到实践

一、说明 在本文中&#xff0c;我们了解了如何构建一个机器学习模型&#xff0c;该模型结合了神经网络的强大功能&#xff0c;并且仍然保持概率方法进行预测。为了做到这一点&#xff0c;我们可以构建所谓的贝叶斯神经网络。 这个想法不是优化神经网络的损失&#xff0…

MySQL如何进行Sql优化

&#xff08;1&#xff09;客户端发送一条查询语句到服务器&#xff1b; &#xff08;2&#xff09;服务器先查询缓存&#xff0c;如果命中缓存&#xff0c;则立即返回存储在缓存中的数据&#xff1b; &#xff08;3&#xff09;未命中缓存后&#xff0c;MySQL通过关键字将SQ…

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(三)

系列文章目录 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xff08;一&#xff09; 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xf…

cytoscapejs获取被点击节点位置,并在该节点附近进行双击展示弹窗

获取节点位置 event.target.renderedPosition()其中event是cytoscapejs监听事件中自带的参数 实现 HTML <div id"cy" style"width: 100%; height: 550px; position: relative"><div id"pop-window">进入详情页</div></d…

day33-37-SpringBootV12(整合Spring,SpringMVC,Mybatis,日志,api测试等框架)

ssm spring --> applicationContext.xml配置文件 springmvc --> springmvc.xml配置文件 mybatis —> mybatis-config.xml配置文件 —> springboot优化了之前的框架配置,思想是约定大于配置 一、引言 1.1 初始化配置 为了使用SSM框架去开发&#xff0c;准备SSM…

UDP报文格式详解

✏️✏️✏️各位看官好&#xff0c;今天给大家分享的是 传输层的另外一个重点协议——UDP。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff0…

使用GPT开发食堂采购账单

原始系统中&#xff0c;只有采购量和消耗量&#xff0c;需要添加“余”列&#xff0c;并自动计算的余量 具体实现通过查询GPT获得&#xff1a; 提问&#xff1a; 使用antdesign vue的<a-table>组件做一个互动表&#xff0c;每行输入a和b两值&#xff0c;计算cab&#xf…

Gradio入门详细教程

常用的两款AI可视化交互应用比较&#xff1a; Gradio Gradio的优势在于易用性&#xff0c;代码结构相比Streamlit简单&#xff0c;只需简单定义输入和输出接口即可快速构建简单的交互页面&#xff0c;更轻松部署模型。适合场景相对简单&#xff0c;想要快速部署应用的开发者。便…