uniapp:蓝牙模块

这篇具有很好参考价值的文章主要介绍了uniapp:蓝牙模块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

模拟的是蓝牙设备签到/签出:文章来源地址https://www.toymoban.com/news/detail-679106.html

  1. 获取指定蓝牙设备
  2. 蓝牙初始搜索次数限制,超过限制就停止搜索
  3. 蓝牙连接失败次数限制,超过限制标识蓝牙连接失败(离开蓝牙范围或其他原因)
  4. 自动重连指定蓝牙
const device = ref<any>(null); // 设备信息
const crpBlueList = ref<any[]>([]); // 扫描到的蓝牙信息列表
const linkStatus = ref(false); // 连接状态
const searchTimes = ref(0); // 搜索次数
const searchLimit = 5; // 搜索次数限制
const linkTimes = ref(0); // 扫描次数
const failTimes = ref(0); // 失败次数
const failLimit = 5; // 失败次数限制
const blueName = 'zo-crp'; // 指定蓝牙设备的名称前缀
let isSignIn = false; // 是否签到
// 签到
const signIn = () => {
  searchTimes.value = 0;
  uni.showLoading({
    title: '蓝牙搜索中...',
    mask: true
  });
  openBluetoothAdapter(() => {
    startBluetoothDeviceDiscovery();
  });
};
// 签出
const logout = () => {
  closeBlueTooth(device.value, () => {
    isSignIn = false;
    device.value = null;
    linkStatus.value = false;
    searchTimes.value = 0;
    linkTimes.value = 0;
    failTimes.value = 0;
    crpBlueList.value = [];

    uni.showToast({
      title: '已签出'
    });
  });
};
// 初始化蓝牙
const openBluetoothAdapter = (callback: Function) => {
  uni.openBluetoothAdapter({
    //打开蓝牙适配器接口
    success: (res) => {
      //已打开
      callback();
    },
    fail: (err) => {
      uni.hideLoading();
      uni.showModal({
        title: '',
        content: '该操作需要蓝牙支持!请打开蓝牙',
        showCancel: false,
        success: (res) => {
          if (res.confirm) {
            // #ifdef APP
            let main = plus.android.runtimeMainActivity();
            let Intent = plus.android.importClass('android.content.Intent');
            let mIntent = new Intent('android.settings.BLUETOOTH_SETTINGS');
            main.startActivity(mIntent);
            // #endif
          } else {
            navigateBack();
          }
        },
        complete: () => {}
      });
    }
  });
};
// 搜索蓝牙
const startBluetoothDeviceDiscovery = () => {
  if (searchTimes.value > searchLimit - 1) {
    uni.showModal({
      content:
        '没有找到指定的蓝牙设备,请确认所在位置周边有指定蓝牙设备,且手机已开启位置信息并授权',
      confirmText: '重试',
      success: (res) => {
        if (res.confirm) {
          signIn();
        } else {
          stopBluetoothDevicesDiscovery(() => {
            uni.closeBluetoothAdapter({
              complete: () => {
                navigateBack();
              }
            });
          });
        }
      }
    });
    return;
  }
  searchTimes.value += 1;
  uni.startBluetoothDevicesDiscovery({
    success: (res) => {
      // 发现外围设备
      onBluetoothDeviceFound();
    },
    fail: (err) => {
      console.log(err, '开始搜索蓝牙设备备错误信息');
    }
  });
};
// 发现设备
const onBluetoothDeviceFound = () => {
  let t: any = setTimeout(() => {
    clearTimeout(t);
    t = null;
    stopBluetoothDevicesDiscovery(() => {
      // 停止搜索蓝牙
      uni.getBluetoothDevices({
        success: (res) => {
          const blueList = res.devices
            .filter((item: any) => item.name.toLowerCase().startsWith(blueName))
            .sort((a: any, b: any) => b.RSSI - a.RSSI);
          crpBlueList.value = blueList;
          if (!blueList.length) {
            startBluetoothDeviceDiscovery();
            return;
          }
          const Device: any = blueList[0];
          isSignIn = true;
          // 获取电量
          const serviceData = Array.prototype.map
            .call(new Uint8Array(Device.serviceData[Object.keys(Device.serviceData)[0]]), (bit) =>
              bit.toString(16)
            )
            .join('');
          const Electric = parseInt(serviceData.slice(-2), 16);
          // 获取uuid
          const UUID = Array.prototype.map
            .call(new Uint8Array(Device.advertisData), (bit) => ('00' + bit.toString(16)).slice(-2))
            .join('')
            .substring(8, 40)
            .toUpperCase();
          device.value = {
            name: Device.name,
            deviceId: Device.deviceId,
            electric: Electric,
            RSSI: Device.RSSI,
            UUID: UUID
          };
          linkStatus.value = true;
          createBLEConnection(Device);
        }
      });
    });
  }, 2000);
};
// 连接设备
const createBLEConnection = (item: any) => {
  uni.showLoading({
    title: '连接中,请稍等',
    mask: true
  });
  linkTimes.value += 1;
  uni.createBLEConnection({
    deviceId: item.deviceId,
    success(res) {
      linkStatus.value = true;
      failTimes.value = 0;
      uni.showToast({
        title: '蓝牙已连接',
        mask: true
      });
      onBLEConnectionStateChange(item);
    },
    fail(res) {
      linkStatus.value = false;
      plus.device.vibrate(500);
      if (failTimes.value < failLimit) {
        failTimes.value += 1;
        uni.showToast({
          title: item.name + '蓝牙连接失败',
          icon: 'none'
        });
        reLink(item);
      } else {
        closeBlueTooth(item, () => {
          uni.showToast({
            title: item.name + '蓝牙连接失败,取消连接',
            icon: 'none'
          });
        });
      }
    }
  });
};
// 监听蓝牙状态
const onBLEConnectionStateChange = (item: any) => {
  uni.onBLEConnectionStateChange((res) => {
    m_Debounce(() => {
      if (!res.connected && isSignIn) {
        reLink(item);
      }
    }, 500);
  });
};
// 蓝牙重连
const reLink = (item: any) => {
  closeBlueTooth(item, () => {
    let t: any = setTimeout(() => {
      clearTimeout(t);
      t = null;
      openBluetoothAdapter(() => {
        createBLEConnection(item);
      });
    }, 1000);
  });
};

// 关闭连接+关闭蓝牙模块
const closeBlueTooth = (item: any, callback: Function) => {
  // 关闭连接
  uni.closeBLEConnection({
    deviceId: item.deviceId,
    complete: () => {
      // 关闭蓝牙模块
      uni.closeBluetoothAdapter({
        complete: () => {
          callback();
        }
      });
    }
  });
};

// 停止搜索
const stopBluetoothDevicesDiscovery = (callback: Function) => {
  uni.stopBluetoothDevicesDiscovery({
    complete: (e) => {
      callback();
    },
    fail: (e) => {
      console.log('停止搜索蓝牙设备失败,错误码:' + e.errCode);
    }
  });
};
// 后退
const navigateBack = () => {
  uni.navigateBack({
    delta: 1,
    fail: () => {
      uni.reLaunch({
        url: '/pages/home/home'
      });
    }
  });
};

到了这里,关于uniapp:蓝牙模块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uni-app微信小程序使用佳博蓝牙打印机

    1.佳博打印js copy到项目里 2.需要打印的vue页面引入js 3.打印数据初始化 4.打印按钮事件 蓝牙列表连接页面 已连接处打印方法

    2024年02月12日
    浏览(148)
  • 『UniApp』uni-app-打包成App

    大家好,我是 BNTang, 在上一节文章中,我给大家详细的介绍了如何将我开发好的项目打包为微信小程序并且发布到微信小程序商店 趁热打铁,在来一篇文章,给大家详细的介绍如何将项目打包成APP。 打包 App 也是一样的,首先需要配置关于 App 应用的基础信息,打开 manifest

    2024年02月04日
    浏览(108)
  • 【UniApp】-uni-app-网络请求

    经过上个章节的介绍,大家可以了解到 uni-app-pinia存储数据的基本使用方法 那本章节来给大家介绍一下 uni-app-网络请求 的基本使用方法 首先我们打开官方文档,我先带着大家看一下官方文档的介绍:https://uniapp.dcloud.net.cn/api/request/request.html 从官方文档中我们可以看到,可以

    2024年02月04日
    浏览(53)
  • uni-app(android、ios) 使用蓝牙便携式打印机(热敏打印机)

    HSPOS 点密度:576点/行(8dots/mm,203dpi) 接口类型: 蓝牙(Bluetooth2.0,4.0双模,支持Android,IOS) 打印方式:图形打印(位图) 打印指令集: ESC/POS 1、 实现蓝牙连接 **B12.js方法封装 *** vue文件中内容 2、获取位图信息 vue页面中拿到像素(位图)信息; 3、开始打印; b12s.js 1、安

    2024年02月15日
    浏览(179)
  • 【UniApp】-uni-app-打包成网页

    经过上一篇文章的介绍,已经将这个计算器的计算功能实现了,接下来就是我们项目当中的一个发包上线阶段,我模拟一下,目的就是为了给大家介绍一下,uni-app是如何打包成网页的。 除了可以打包成网页,uni-app还可以打包成小程序、App、H5、快应用等等,后面在单独开文

    2024年02月04日
    浏览(71)
  • Uniapp uni-app学习与快速上手

    个人开源uni-app开源项目地址:准备中 在线展示项目地址:准备中 什么是uni-app uni,读 you ni ,是统一的意思。 Dcloud即数字天堂(北京)网络技术有限公司是W3C成员及HTML5中国产业联盟发起单位,致力于推进HTML5发展构建,HTML5生态。 2012年,DCloud开始研发小程序技术,优化webvie

    2024年02月09日
    浏览(63)
  • 【UniApp】-uni-app-项目实战页面布局(苹果计算器)

    经过前面的文章介绍,基本上 UniApp 的内容就介绍完毕了 那么从本文开始,我们就开始进行一个项目的实战 这次做的项目是苹果计算器,这个项目的难度不是很大,但是也不是很简单,适合练手 打开 HBuilderX,点击左上角 文件 - 新建 - 项目 : 项目创建完毕之后,首先来分析

    2024年02月04日
    浏览(67)
  • 【uni-app教程】四、UniAPP 路由配置及页面跳转

    uni-app 页面路由为框架统一管理,开发者需要在pages.json里配置每个路由页面的路径及页面样式。类似小程序在 app.json 中配置页面路由一样。所以 uni-app 的路由用法与 Vue Router 不同,如仍希望采用 Vue Router 方式管理路由,可在插件市场搜索 Vue-Router。 uni-app 有两种页面路由跳转

    2024年01月16日
    浏览(75)
  • uni-app小程序实现音频播放,uniapp播放录音,uniapp简单实现播放录音

    复制到.vue文件即可预览效果 问题 :开发者工具中.onTimeUpdate方法可能会失效! 官方参考:https://uniapp.dcloud.net.cn/api/media/audio-context.html# 其他博客参考:https://blog.csdn.net/weixin_45328705/article/details/114091301 录音实现参考 :https://blog.csdn.net/weixin_43992507/article/details/129857780

    2024年02月12日
    浏览(82)
  • #Uniapp:uni-app中vue2生命周期--11个

    uni-app中vue2生命周期 生命周期钩子 描述 H5 App端 小程序 说明 beforeCreate 在实例初始化之后被调用 详情 √ √ √ created 在实例创建完成后被立即调用 详情 √ √ √ beforeMount 在挂载开始之前被调用 详情 √ √ √ mounted 挂载到实例上去之后调用 详情 注意:此处并不能确定子组件

    2024年02月02日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包