uniapp 小程序低功耗蓝牙配网 blefi配网 物联网

2024-05-09 06:44

本文主要是介绍uniapp 小程序低功耗蓝牙配网 blefi配网 物联网,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.获取蓝牙列表  bleList.vue

<template><view><button @touchstart="startSearch">获取蓝牙列表</button><scroll-view :scroll-top="scrollTop" scroll-y class="content-pop"><viewclass="bluetoothItem"v-for="(item, index) in bluetoohList":key="index"@click="openControl(item)"><view class="textItem">蓝牙:{{ item.name }}</view><view>{{ item.deviceId }}</view></view></scroll-view></view>
</template><script>
export default {data() {return {bluetoohList: [],};},onLoad: function (options) {this.startSearch();},methods: {// 连接蓝牙startSearch() {var that = this;uni.openBluetoothAdapter({success: (res) => {uni.getBluetoothAdapterState({success: (res) => {if (res.available) {if (res.discovering) {uni.stopBluetoothDevicesDiscovery({success: (res) => {},});} else {that.getBluetoothDevices();}that.checkPemission();} else {uni.showToast({title: "本机蓝牙不可用",mask: true,});}},});},fail: (err) => {that.openSetting();},});},openSetting() {uni.showModal({title: "检测到您没打开蓝牙权限,是否去设置打开?",confirmText: "确认",cancelText: "取消",cancelColor: "#999999", //取消按钮颜色confirmColor: "#00A0E9", //确定按钮颜色success: (res) => {if (res.confirm) {uni.openSetting({//opensetting是调起设置页面的success: (res) => {if (res.authSetting == true) {//判断res.authsetting的值是true还是falseuni.openBluetoothAdapter({success: (res) => {this.startSearch();},});}},});} else {// 取消return false;}},});},checkPemission() {//android 6.0以上需授权地理位置权限var that = this;const sys = uni.getSystemInfoSync();if (sys.platform == "ios") {that.getBluetoothDevices();} else if (sys.platform == "android") {console.log(app.getSystem().substring(app.getSystem().length - (app.getSystem().length - 8),app.getSystem().length - (app.getSystem().length - 8) + 1));if (app.globalData.getSystem().substring(app.globalData.getSystem().length -(app.globalData.getSystem().length - 8),app.globalData.getSystem().length -(app.globalData.getSystem().length - 8) +1) > 5) {uni.getSetting({success: (res) => {console.log(res);if (!res.authSetting["scope.userLocation"]) {uni.authorize({scope: "scope.userLocation",complete: (res) => {that.getBluetoothDevices();},});} else {that.getBluetoothDevices();}},});}}},//获取蓝牙设备信息getBluetoothDevices() {var that = this;uni.showLoading({title: "蓝牙搜索中",mask: true,});// 开始搜寻附近的蓝牙外围设备uni.startBluetoothDevicesDiscovery({success: (res) => {setTimeout(() => {// 获取搜索到的设备信息uni.getBluetoothDevices({success: (res) => {that.bluetoohList = [];var num = 0;for (var i = 0; i < res.devices.length; ++i) {if (res.devices[i].name != "未知设备") {that.bluetoohList[num] = res.devices[i];num++;}}uni.stopPullDownRefresh(); // 停止当前页面下拉刷新uni.stopBluetoothDevicesDiscovery({// 停止搜索蓝牙设备success: (res) => {uni.hideLoading();},});},});}, 5000);},});},// 连接蓝牙 跳转到连接页面openControl(item) {let params = {list: this.bluetoohList,info: item,};uni.redirectTo({url:"/pages/blefi/blefi?info=" +encodeURIComponent(JSON.stringify(params)),});},},
};
</script><style scoped>
.content-pop {width: 100vw;max-height: 55vh;padding: 0 30rpx;
}
.bluetoothItem {padding: 20rpx 0;font-weight: 400;font-size: 28rpx;border-bottom: 1rpx solid #f4f4f4;text-align: left;
}
.textItem {display: block;margin-bottom: 10rpx;
}
</style>

2.选择蓝牙进行连接  blefi.vue

<template><text>打印机正在连接中...</text>
</template><script>
export default {data() {return {bluInfo: {},services: [],serviceId: 0,writeCharacter: false,readCharacter: false,notifyCharacter: false,deviceId: "",notifyCharaterId: "",notifyServiceId: "",writeCharaterId: "",writeServiceId: "",readCharaterId: "",readServiceId: "",};},onLoad(option) {// 接收页面传递的数据this.bluInfo = JSON.parse(decodeURIComponent(option.info));this.bluetooh(this.bluInfo.info.deviceId);this.deviceId = this.bluInfo.info.deviceId;},methods: {bluetooh(deviceId) {var that = this;uni.stopBluetoothDevicesDiscovery({success: (res) => {},});uni.createBLEConnection({deviceId: deviceId,success: (res) => {that.getSeviceId();},fail: (e) => {that.bluetoothFail();},complete: (e) => {},});},// 连接成功后保存连接状态getSeviceId() {var that = this;uni.getBLEDeviceServices({deviceId: this.deviceId,success: (res) => {that.services = res.services;that.getCharacteristics();},fail: (e) => {that.bluetoothFail();},complete: (e) => {},});},getCharacteristics() {var that = this;var list = that.services;var num = that.serviceId;var write = that.writeCharacter;var read = that.readCharacter;var notify = that.notifyCharacter;uni.getBLEDeviceCharacteristics({deviceId: this.deviceId,serviceId: list[num].uuid,success: (res) => {for (var i = 0; i < res.characteristics.length; ++i) {var properties = res.characteristics[i].properties;var item = res.characteristics[i].uuid;if (!notify) {if (properties.notify) {this.notifyCharaterId = item;this.notifyServiceId = list[num].uuid;notify = true;}}if (!write) {if (properties.write) {this.writeCharaterId = item;this.writeServiceId = list[num].uuid;write = true;}}if (!read) {if (properties.read) {readServiceId.readCharaterId = item;readServiceId.readServiceId = list[num].uuid;read = true;}}}if (!write || !notify || !read) {num++;(that.writeCharacter = write),(that.readCharacter = read),(that.notifyCharacter = notify),(that.serviceId = num);if (num == list.length) {// console.log("找不到该读写的特征值")that.bluetoothFail();} else {that.getCharacteristics();}} else {that.bluetoothSuccess(res);}},fail: (e) => {that.bluetoothFail();},});},// 蓝牙连接打印机bluetoothSuccess(res) {let info = {deviceId: this.deviceId,notifyCharaterId: thid.notifyCharaterId,notifyServiceId: thid.notifyServiceId,writeCharaterId: thid.writeCharaterId,writeServiceId: thid.writeServiceId,readCharaterId: thid.readCharaterId,readServiceId: thid.readServiceId,};uni.setStorageSync("blefiInfo", info);uni.showModal({title: "连接成功",confirmText: "继续",confirmColor: "#00A0E9", //确定按钮颜色showCancel: false, //没有取消按钮的弹框success: (res) => {if (res.confirm) {// 蓝牙连接成功,跳转到下一页面uni.redirectTo({url: "/pages/blefi/blefiWifi",});}},});},bluetoothFail() {// 蓝牙连接失败,跳转到失败页面uni.redirectTo({url: "/pages/blefi/blefiFail",});},},
};
</script>

3. 低功耗蓝牙连接WiFi  blefiWifi.vue

<template><view><text>{{ wifiSSID }}</text><input type="text" placeholder="请输入WLAN密码" v-model="password" /><button @click="settiing">连接</button></view>
</template><script>
export default {data() {return {bleInfo: {},wifiSSID: "your SSID",password: "",bleSendSequence: 0,connected: true,wifiCountDown: 0,wifiCountInterval: null, // 定时器dataEnum: {PACKAGE_VALUE: 0x01,SUBTYPE_NEG: 0x00,SUBTYPE_STA_WIFI_BSSID: 0x01,SUBTYPE_STA_WIFI_SSID: 0x02,SUBTYPE_STA_WIFI_PASSWORD: 0x03,SUBTYPE_SOFTAP_WIFI_SSID: 0x04,SUBTYPE_SOFTAP_WIFI_PASSWORD: 0x05,SUBTYPE_SOFTAP_MAX_CONNECTION_COUNT: 0x06,SUBTYPE_SOFTAP_AUTH_MODE: 0x07,SUBTYPE_SOFTAP_CHANNEL: 0x08,SUBTYPE_USERNAME: 0x09,SUBTYPE_CA_CERTIFICATION: 0x0a,SUBTYPE_CLIENT_CERTIFICATION: 0x0b,SUBTYPE_SERVER_CERTIFICATION: 0x0c,SUBTYPE_CLIENT_PRIVATE_KEY: 0x0d,SUBTYPE_SERVER_PRIVATE_KEY: 0x0e,SUBTYPE_WIFI_CONNECTION_STATE: 0x0f,SUBTYPE_VERSION: 0x10,SUBTYPE_WIFI_LIST: 0x11,SUBTYPE_ERROR: 0x12,SUBTYPE_CUSTOM_DATA: 0x13,},controllEnum: {PACKAGE_VALUE: 0x00,SUBTYPE_ACK: 0x00,SUBTYPE_SET_SEC_MODE: 0x01,SUBTYPE_SET_OP_MODE: 0x02,SUBTYPE_CONNECT_WIFI: 0x03,SUBTYPE_DISCONNECT_WIFI: 0x04,SUBTYPE_GET_WIFI_STATUS: 0x05,SUBTYPE_DEAUTHENTICATE: 0x06,SUBTYPE_GET_VERSION: 0x07,SUBTYPE_CLOSE_CONNECTION: 0x08,SUBTYPE_GET_WIFI_LIST: 0x09,},};},// 二级页面清除onUnload() {wx.offBLEConnectionStateChange();if (this.wifiCountInterval) {clearInterval(this.wifiCountInterval);this.wifiCountInterval = null;}},onLoad(options) {this.bleInfo = uni.getStorageSync("blefiInfo");var that = this;wx.getBLEDeviceServices({deviceId: this.bleInfo.deviceId,success: function (res) {wx.getBLEDeviceCharacteristics({deviceId: this.bleInfo.deviceId,serviceId: this.bleInfo.notifyServiceId,success: function (res) {wx.notifyBLECharacteristicValueChange({state: true,deviceId: this.bleInfo.deviceId,serviceId: this.bleInfo.notifyServiceId,characteristicId: this.bleInfo.notifyCharaterId,success: function (res) {console.log("启用notify成功");},});},});},});wx.onBLEConnectionStateChange((res) => {that.connected = res.connected;if (!res.connected) {uni.hideLoading();// 蓝牙连接失败,跳转到失败页面uni.redirectTo({url: "/pages/blefi/blefiFail",});}});// 接收配网打印机回传的数据wx.onBLECharacteristicValueChange(function (res) {uni.hideLoading();var receive = that.ab2strt(res.value);console.log("接收到数据 receive : " + receive);// 处理接收的数据........});},methods: {// 将 ArrayBuffer 转换为16进度字符串ab2strt(buff) {var hexArr = Array.prototype.map.call(new Uint8Array(buff),function (bit) {return ("00" + bit.toString(16)).slice(-2);});return hexArr.join(" ");},settiing() {// 取消wifi连接成功/失败页面this.wifiCountDown = 30;this.startSMSTimer();uni.showLoading({title: "连接中",mask: true,});if (this.connected) {this.sendSSID();this.sendPASSWORD();this.notifyConnect();} else {uni.hideLoading();// 蓝牙连接失败,跳转到失败页面uni.redirectTo({url: "/pages/blefi/blefiFail",});}},startSMSTimer() {this.wifiCountInterval = setInterval(() => {this.wifiCountDown--;if (this.wifiCountDown <= 0) {clearInterval(this.wifiCountInterval);this.wifiCountInterval = null;uni.hideLoading();// 蓝牙连接wifi失败uni.redirectTo({url: "/pages/blefi/wifiFile",});}}, 1000);},sendSSID() {// SSID转UTF-8let password = this.utf16to8(this.wifiSSID);let u8buffer = new Uint8Array(password.length);for (var i = 0; i < password.length; i++) {u8buffer[i] = password.charCodeAt(i);}this.bleSendCMD(this.dataEnum.PACKAGE_VALUE,this.dataEnum.SUBTYPE_STA_WIFI_SSID,0,u8buffer);},utf16to8(str) {var out, i, len, c;out = "";len = str.length;for (i = 0; i < len; i++) {c = str.charCodeAt(i);if (c >= 0x0001 && c <= 0x007f) {out += str.charAt(i);} else if (c > 0x07ff) {out += String.fromCharCode(0xe0 | ((c >> 12) & 0x0f));out += String.fromCharCode(0x80 | ((c >> 6) & 0x3f));out += String.fromCharCode(0x80 | ((c >> 0) & 0x3f));} else {out += String.fromCharCode(0xc0 | ((c >> 6) & 0x1f));out += String.fromCharCode(0x80 | ((c >> 0) & 0x3f));}}return out;},sendPASSWORD() {let password = this.password;let u8buffer = new Uint8Array(password.length);for (var i = 0; i < password.length; i++) {u8buffer[i] = password.charCodeAt(i);}this.bleSendCMD(this.dataEnum.PACKAGE_VALUE,this.dataEnum.SUBTYPE_STA_WIFI_PASSWORD,0,u8buffer);},notifyConnect() {let password = this.password;let u8buffer = new Uint8Array(password.length);for (var i = 0; i < password.length; i++) {u8buffer[i] = password.charCodeAt(i);}this.bleSendCMD(this.controllEnum.PACKAGE_VALUE,this.controllEnum.SUBTYPE_CONNECT_WIFI,0,u8buffer);},//ESP32的蓝牙配网命令接口bleSendCMD(CMD, subCMD, frameControl, payload) {var newValue = new ArrayBuffer(payload.length + 6);var u8array = new Uint8Array(newValue);var LSB_Type = ((subCMD & 0x3f) << 2) | (CMD & 0x03);u8array[0] = LSB_Type;u8array[1] = frameControl;u8array[2] = this.bleSendSequence;u8array[3] = payload.length;for (let i = 0; i < payload.length; i++) {u8array[4 + i] = payload[i];}this.bleSendSequence++;if (this.connected) {wx.writeBLECharacteristicValue({deviceId: this.bleInfo.deviceId,serviceId: this.bleInfo.writeServiceId,characteristicId: this.bleInfo.writeCharaterId,value: newValue,});}},},
};
</script>

4. 手机连接蓝牙失败、蓝牙连接WiFi成功/失败(关闭蓝牙连接)

<script>
export default {onLoad() {let deviceId = uni.getStorageSync("blefiInfo").deviceIduni.closeBLEConnection({deviceId: deviceId,});},
};
</script>

这篇关于uniapp 小程序低功耗蓝牙配网 blefi配网 物联网的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/972671

相关文章

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

防止SpringBoot程序崩溃的几种方式汇总

《防止SpringBoot程序崩溃的几种方式汇总》本文总结了8种防止SpringBoot程序崩溃的方法,包括全局异常处理、try-catch、断路器、资源限制、监控、优雅停机、健康检查和数据库连接池配... 目录1. 全局异常处理2. 使用 try-catch 捕获异常3. 使用断路器4. 设置最大内存和线