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

相关文章

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana

uniapp H5打开地图

manifest.json文件,源码视图找到H5添加下面内容 "h5" : {"sdkConfigs" : {"maps" : {"amap" : {"key" : "**********************","securityJsCode" : "****************************","serviceHost" : ""}}}} 高德开放平台 申请时选择(W

蓝牙ble数传芯片推荐,TD5327A芯片蓝牙5.1—拓达半导体

蓝牙数传芯片TD5327A芯片是一款支持蓝牙BLE的纯数传芯片,蓝牙5.1版本。芯片的亮点在于性能强,除了支持APP端直接对芯片做设置与查询操作,包括直接操作蓝牙芯片自身的IO与PWM口以外,还支持RTC日历功能,可以做各类定时类操作,极大丰富了蓝牙在IOT产品中的应用。此外,在数传应用方面,此芯片支持串口流控功能,提大提高了数据传输的稳定与可靠性。 拓达蓝牙芯片特点: 支持RTC日历功能,超

美容美发店营销版微信小程序源码

打造线上生意新篇章 一、引言:微信小程序,开启美容美发行业新纪元 在数字化时代,微信小程序以其便捷、高效的特点,成为了美容美发行业营销的新宠。本文将带您深入了解美容美发营销微信小程序,探讨其独特优势及如何助力商家实现业务增长。 二、微信小程序:美容美发行业的得力助手 拓宽客源渠道:微信小程序基于微信社交平台,轻松实现线上线下融合,帮助商家快速吸引潜在客户,拓宽客源渠道。 提升用户体验:

程序人生--拔丝地瓜

一个会享受生活的人,难免会执迷于探索“三餐茶饭,四季衣裳”的朴素涵义。如今在这繁杂喧闹、竞争激烈的社会环境里,如何才能从周而复始的生活中挖掘出一点儿期待!这是一个仁者见仁智者见智的开放性话题。对于大部分的人来说,看电影、运动、旅游、美食、加班....是假日的备选安排。 春节临走之前,再次尝试“拔丝地瓜”,为何要强调“再次”二字?因为这道甜菜我已经尝试过很多次,失败与成功都经历过。十几年的烧饭经历

uniapp 低功耗蓝牙BLE分包

ble.js // 分包写入蓝牙async sendWriteBLECharacteristicValue(deviceId,serviceId,writeCharacteristicId,readCharacteristicId,buffer,success, // 成功回调failure, // 失败回调) {const offset = 500; // 偏移量let pos = 0;

vscode python pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

在vscode中控制台运行python文件出现:无法将"pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 使用vscode开发python,需要安装python开发扩展: 本文已经安装,我们需要找的是python安装所在目录,本文实际路径如下: 如果在本文路径中没有此目录,请尝试在C盘中搜索 python,搜索到相关python目录后,点击Python 3.9进入目录,