微信小程序蓝牙流程及代码

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

蓝牙小程序源码,微信小程序,小程序,前端文章来源地址https://www.toymoban.com/news/detail-530450.html

import {
	SERVICEID,
	NOTIFYID,
	WRITEID,
	BLUETOOTH_MESSAGE,
	OPERATE_PROCESS
} from "./config.js"
import {
	openBluetoothAdapterFailCallback,
	onBluetoothAdapterStateChangeCallback,
	onBluetoothDeviceFoundCallback,
	getBluetoothAdapterStateSuccessCallback,
	getBluetoothAdapterStateFailCallback,
	createBLEConnectioSuccessCallback,
	createBLEConnectioFailCallback,
	onBLEConnectionStateChangeCallback,
	onBLECharacteristicValueChangeCallback,
	initStoreState,
	notifyBLECharacteristicValueChangeFailCallback
} from "./tool.js"
import {
	hexStringToArrayBuffer,
	sleep,
	getBufferArrayBy20,
	arrayBufferToHexString,
	setCommunicationListUtil,
	getNowTime,
	getMac,
	filterDevices,
	filterDevicesByRe,
	unique,
	showModalByMethod

} from "./utils.js"

let util = require('@/static/utils/utils.js');

import vm from "@/main.js"

//正常蓝牙流程开始
export let bluetoothStart = () => {
	getBluetoothAdapterState();

}

export let onBluetoothAdapterStateChange = () => {
	//如果蓝牙打开-关闭-再打开-监听不到?
	uni.onBluetoothAdapterStateChange(async (res) => {
		bluetoothExecByAdapterStatus(res);
	})
}

//根据蓝牙适配器的状态、是否正在搜索设备执行不同的操作流程
export let bluetoothExecByAdapterStatus = (res) => {
	console.log("蓝牙适配器状态", res);
	if (!res.available) {
		util.showModal("蓝牙适配器不可用,请打开蓝牙");
	} else {
		if (!res.discovering && !vm.isNormalDiscoveryStatus) { // 防止正常停止搜索的时候会触发这个条件
			//如果前面已经搜索过蓝牙,则不需要再次搜索
			vm.$u.vuex("isImmediateWhitePackage", false); //防止打开手机蓝牙后并连接成功后,直接让蓝牙发送指令
			if (vm.isBluetoothDiscovery) {
				getBluetoothDevices();
			} else {
				startAndStopbluetoothDevicesDiscovery();
			}
		}

	}

}

//获取在蓝牙模块生效期间所有已发现的蓝牙设备。包括已经和本机处于连接状态的设备
export let getBluetoothDevices = () => {
	uni.getBluetoothDevices({
		success(res) {
			let devices = res.devices;
			let devicesList = filterDevices(res.devices, vm.currentBike);
			if (devicesList.length > 0) {
				vm.$u.vuex('bluetoothDevice', devicesList[0])
				vm.$u.vuex('connectCount', 0)
				createBLEConnection(devicesList[0])
			} else {
				startAndStopbluetoothDevicesDiscovery();
			}
		}
	})
}


//打开蓝牙设备并监听蓝牙设备
export let openAndOnBluetoothAdapter = () => {
	vm.$u.vuex("bluetoothContent", "正在初始化蓝牙");
	uni.openBluetoothAdapter({
		success(res) {
			console.log("打开蓝牙适配器成功");
			startAndStopbluetoothDevicesDiscovery();
		},
		fail(res) {
			console.log("打开蓝牙设备器失败", res)
			console.log(res.errMsg == "openBluetoothAdapter:fail already opened")
			//蓝牙适配器已经打开
			if (res.errMsg == "openBluetoothAdapter:fail already opened") {
				startAndStopbluetoothDevicesDiscovery();
			} else {
				console.log("打开蓝牙适配器失败:", BLUETOOTH_MESSAGE[res.errCode]);
				util.showModal("蓝牙适配器不可用,请打开蓝牙或微信APP开启蓝牙权限");
				openBluetoothAdapterFailCallback();
			}

		},
		complete() {
			onBluetoothAdapterStateChange();
		}

	})
}

//开始和停止蓝牙搜索
export let startAndStopbluetoothDevicesDiscovery = () => {
	//1、关闭蓝牙-杀掉进程,开启蓝牙不会重新连接,没有监听搜索到的设备
	onBluetoothDeviceFound();
	//2、接步骤1,再关闭,再开发蓝牙,连接成功,但是不会触发蓝牙连接
	onBLEConnectionStateChange();
	
	vm.$u.vuex('bluetoothContent', '正在搜索蓝牙设备');
	vm.$u.vuex("isBluetoothDiscovery", true);
	vm.$u.vuex("bluetoothDevice", {}); //清空
	//如果60s都还未搜索到蓝牙,提示未搜索到,提示蓝牙不在可搜索范围内,
	let timer = setTimeout(() => {
		clearTimeout(timer);
		//没有找到设备并且定时器还在
		if (vm.validatenull(vm.bluetoothDevice)) {
			util.showModal('蓝牙不在可搜索范围内');
			stopBluetoothDevicesDiscovery();
		}
	}, 10000);
	vm.$u.vuex('blueToothSearchTimer', timer);
	uni.startBluetoothDevicesDiscovery({
		services: [], //添加了SERVICEID搜索不到蓝牙
		allowDuplicatesKey: true,
		powerLevel: 'high',
		success() {
			console.log("开始蓝牙搜索成功");
		},
		fail(res) {
			console.log(res);
			util.showModal('开始蓝牙搜索失败');
			console.log("开始蓝牙搜索失败:", BLUETOOTH_MESSAGE[res.errCode]);
		}
	})
}


export let stopBluetoothDevicesDiscovery = () => {
	uni.stopBluetoothDevicesDiscovery({
		success() {
			console.log("停止蓝牙搜索成功");
		},
		fail(res) {
			console.log("停止蓝牙搜索失败:", BLUETOOTH_MESSAGE[res.errCode]);
		},
		complete() {
			vm.$u.vuex("isNormalDiscoveryStatus", true);
			setTimeout(()=>{
				vm.$u.vuex("isNormalDiscoveryStatus", false);
			},1000)
			
		}
	})
}
//监听寻找到新设备的事件
export let onBluetoothDeviceFound = () => {
	uni.onBluetoothDeviceFound((res) => {
		//搜索到的蓝牙设备并唯一
		let devices = filterDevices(res.devices, vm.currentBike);
		if (devices.length) {
			console.log("搜索到的目标设备", devices)
			vm.$u.vuex('bluetoothDevice', devices[0])
			clearTimeout(vm.blueToothSearchTimer);
			vm.$u.vuex('connectCount', 0)
			createBLEConnection(devices[0]);
			stopBluetoothDevicesDiscovery();
		}
	})
}

export let getBluetoothAdapterState = () => {
	uni.getBluetoothAdapterState({
		success(res) {
			bluetoothExecByAdapterStatus(res);
		},
		fail(res) {
			console.log("获取蓝牙适配器状态失败:", BLUETOOTH_MESSAGE[res.errCode]);
			openAndOnBluetoothAdapter();
			util.showModal('蓝牙适配器不可用,请打开蓝牙');
		}
	})
}

//ios必须要执行
let getBLEDeviceServices = (device) => {
	uni.getBLEDeviceServices({
		deviceId: device.deviceId,
		success(res) {
			console.log(`获取${device.deviceId}服务成功`, res);
			getBLEDeviceCharacteristics(device);
		},
		fail(res) {
			console.log(`获取${device.deviceId}服务失败:`, BLUETOOTH_MESSAGE[res.errCode]);
			getBLEDeviceCharacteristics(device);
		}
	})
}

export let createBLEConnection = (device) => {
	console.log("正在连接蓝牙")
	vm.$u.vuex('bluetoothContent', '正在连接蓝牙设备');
	//如果当前状态没有连接,只去连接蓝牙
	if (!vm.isConnected && !vm.validatenull(vm.bluetoothDevice)) {
		uni.createBLEConnection({
			deviceId: device.deviceId,
			success(res) {
				console.log(`与蓝牙设备${device.name}创建连接成功`, res);
				getBLEDeviceServices(device);
				createBLEConnectioSuccessCallback();
			},
			fail(res) {
				console.log(res)
				if(res.errCode == 10001) return;//如果是蓝牙设配器没有打开,则直接退出连接
				if (vm.connectCount < 4) {
					createBLEConnection(device);
					let connectCount = vm.connectCount;
					let newConnectCount = connectCount + 1;
					vm.$u.vuex('connectCount', newConnectCount);
				} else {
					util.showModal('蓝牙连接失败');
				}
			}
		})
	}

}

//ios必须要执行
let getBLEDeviceCharacteristics = (device) => {
	uni.getBLEDeviceCharacteristics({
		deviceId: device.deviceId,
		serviceId: SERVICEID,
		success: function(res) {
			console.log(`获取${device.deviceId}特征值成功`, res);
			notifyAndOnBLECharacteristicValueChange(device);
		},
		fail: function(res) {
			console.log(`获取${device.deviceId}特征值失败`, res);
		},
	})
}

export let onBLEConnectionStateChange = () => {
	uni.onBLEConnectionStateChange((res) => {
		console.log("监听蓝牙是否断开", res);
		if(vm.lastConnectionStatus == res.connected){
			let bluetoothDisconnectedCount = vm.bluetoothDisconnectedCount;
			let newBluetoothDisconnectedCount = bluetoothDisconnectedCount+1;
			vm.$u.vuex("bluetoothDisconnectedCount",newBluetoothDisconnectedCount);
		}else{
			vm.$u.vuex("bluetoothDisconnectedCount",0);
		}
		vm.$u.vuex("isConnected", res.connected);
		if (!res.connected && !vm.isNormalBluetoothDisconnect && vm.bluetoothDisconnectedCount < 2) { //当前检测到时异常断开状态,则进行重连操作,连接不上,还是会触发这个监听
			vm.$u.vuex('connectCount', 0);
			createBLEConnection(vm.bluetoothDevice);
		}
		vm.$u.vuex("lastConnectionStatus", res.connected);
		onBLEConnectionStateChangeCallback(res);
	})
}

//开始并且监听特征值的变化
export let notifyAndOnBLECharacteristicValueChange = (device) => {
	//防止没有更换状态
	uni.notifyBLECharacteristicValueChange({
		state: true,
		deviceId: device.deviceId,
		serviceId: SERVICEID,
		characteristicId: NOTIFYID,
		success(res) {
			console.log("开启notify通知模式成功", res);
			uni.onBLECharacteristicValueChange((res) => {
				console.log("监听特征值", res);
				clearTimeout(vm.notifyTimerId);
				//关闭蓝牙连接
				onBLECharacteristicValueChangeCallback(device, res);
			})
		},
		fail(res) {
			notifyBLECharacteristicValueChangeFailCallback(device, res);
			console.log("开启notify通知模式失败:", BLUETOOTH_MESSAGE[res.errCode]);
		}
	})
}


let writeBLECharacteristicValue = (device, value) => {
	console.log("写入数据", arrayBufferToHexString(value));

	uni.writeBLECharacteristicValue({
		deviceId: device.deviceId,
		serviceId: SERVICEID,
		characteristicId: WRITEID,
		value,
		success(res) {
			console.log("写入数据成功", res);
			//判断是否是最后一包,如果是最后一包,则开启通讯计时器
		},
		fail(res) {
			console.log("写入数据失败", BLUETOOTH_MESSAGE[res.errCode]);
			console.log("写入数据失败", res);
			util.showModal("写入数据失败");
		}

	})
}

export let closeBLEConnection = (device, callback = () => {}) => {
	vm.$u.vuex("isNormalBluetoothDisconnect", true);
	uni.closeBLEConnection({
		deviceId: device.deviceId,
		success() {
			console.log("关闭蓝牙连接成功");
		},
		fail(res) {
			console.log("关闭蓝牙连接失败", res);

			console.log("关闭蓝牙连接失败", BLUETOOTH_MESSAGE[res.errCode]);
		},
		complete() {
			setTimeout(() => {
				vm.$u.vuex("isNormalBluetoothDisconnect", false);
			}, 1000)
			callback();
		}
	})
}


export let closeBluetoothAdapter = (callback) => {
	return new Promise((resolve, reject) => {
		uni.closeBluetoothAdapter({
			success() {
				console.log("关闭蓝牙适配器成功");
			},
			fail(res) {
				console.log("关闭蓝牙适配器失败:", BLUETOOTH_MESSAGE[res.errCode]);
			},
			complete() {
				callback();
			}
		})
	})
}

//不分包写数据
export let writeDataToDevice = (device, data) => {
	console.log("发送数据", data);
	vm.$u.vuex("bluetoothContent", "正在发送指令");

	let allBuffer = hexStringToArrayBuffer(data);
	writeBLECharacteristicValue(device, allBuffer);
}

//分包写数据
export let writeDataToDeviceBySubPackage = (data) => {
	vm.$u.vuex("commandMessage", '');
	vm.$u.vuex("bluetoothContent", `正在发送${vm.commandName}指令`);

	let bufferArray = getBufferArrayBy20(data);
	console.log('bufferArray.length', bufferArray.length);
	for (let i = 0; i < bufferArray.length; i++) {
		//sleep(1); //同步延迟1ms
		writeBLECharacteristicValue(bufferArray[i], i == bufferArray.length - 1);
	}

	// let allBuffer = hexStringToArrayBuffer(data);
	// writeBLECharacteristicValue(allBuffer);
}


export let getConnectedBluetoothDevices = (callback) => {
	uni.getConnectedBluetoothDevices({
		services: [SERVICEID],
		success(res) {
			console.log("获取连接的蓝牙设备成功", res);
			callback(res.devices)
		},
		fail(res) {
			console.log("获取连接的蓝牙设备失败", res);
			callback([]);
		},
		complete() {

		}
	})

}

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

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

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

相关文章

  • (微信小程序毕业设计源码)基于微信小程序食堂订餐系统源码

    项目获取请看文章最底下官网 食堂订餐系统后台是基于java编程语言,mysql数据库,ssm框架,idea工具开发,用户端是采用微信小程序端开发,本系统主要分为用户,管理员,商家三个端,用户可以注册登陆微信小程序,查看菜品,购买菜品下订单,查看订单,查看订单配送,

    2024年02月16日
    浏览(69)
  • 微信小程序模版|健康菜谱微信小程序源码

     作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题

    2024年02月02日
    浏览(46)
  • 【微信小程序】实现微信小程序登录(附源码)

    通过 点击登录按钮 , 调用微信接口 wx.getUserProfile拿到微信的个人信息,先 检查是否之前已经登录 ,若没登录则将拿到的个人信息调用后台的接口,把个人信息传给后台, 登录成功之后 把相关信息存储在app.globalData中共享给全局使用 (这里使用微信云开发作为后台,提前建

    2024年02月11日
    浏览(49)
  • uniapp - 微信小程序接入腾讯视频播放器功能插件,uniapp开发微信小程序端调用引入并使用腾讯视频播放组件完整全流程(详细示例源码,一键复制开箱即用)

    在uniapp 微信小程序项目中,集成腾讯视频功能插件,实现播放腾讯视频效果,附带详细示例源码及注释, 你可以跟着步骤一步步来,保证几分钟就能快速在uniapp小程序项目中植入腾讯视频功能!

    2024年02月12日
    浏览(58)
  • (微信小程序毕业设计源码)基于微信小程序电影院订票系统源码

    项目获取请看文章最底下官网 电影院订票系统是基于微信小程序端和网页后端,系统采用java编程语言,mysql数据库,idea开发工具,ssm框架开发,本系统分为用户和管理员两个角色,用户微信小程序端主要功能是可以登陆注册系统,查看电影推荐,电影分类,会员手册,在线

    2024年02月16日
    浏览(67)
  • (微信小程序毕业设计源码)基于微信小程序商店管理系统源码成品

    项目获取请看文章最底下官网 商店管理系统是基于微信小程序,java编程语言和mysql数据库和idea开发工具作为后台,微信端采用微信开发工具开发。本系统分为用户和管理员两个角色,用户的主要功能有登陆微信小程序,查看促销资讯,商品分类,商品详情,加入购物车,生

    2024年02月14日
    浏览(52)
  • 微信小程序:检讨书生成微信小程序源码

    对于经常写检讨的小伙伴来说,福音来了 因为这是一款检讨书生成小程序 所以再也不用为了写检讨而烦恼了哦 支持自定义字数下线,主题自定义 支持多种类型检讨比如:学生党的,男朋友,领导演讲稿,共青团申请书等 该小程序安装搭建简单,特别适合新手上手 小程序源码下载地址

    2024年02月09日
    浏览(45)
  • 抓取微信小程序源码教程,扒微信小程序文件等

    想成为一名微信小程序的开发者,前端思路的学习和安全意识是非常有必要的,故务必掌握小程序反编译技能。这里用到了2个工具《包解密》与《反编译》(非原创,均来自网上的大佬),特别适合新手,而且都是免费的!第一次操作可能会慢一些,熟练了之后,3秒抓取一

    2024年02月08日
    浏览(50)
  • 网址打包微信小程序源码 wap转微信小程序 网站转小程序源码 网址转小程序开发

    我们都知道微信小程序是无法直接打开网址的。 这个小程序源码提供了一种将网址直接打包成微信小程序的方法, 使得用户可以在微信小程序中直接访问这些网址内容。 这个源码没有进行加密,可以直接查看和修改。 将下面代码中的网站改成你的就行了,简单易用 蓝奏云

    2024年04月10日
    浏览(50)
  • 最新影视视频微信小程序源码-带支付和采集功能/微信小程序影视源码PHP(更新)

    源码简介: 这个影视视频微信小程序源码,新更新的,它还带支付和采集功能,作为微信小程序影视源码,它可以为用户 提供丰富的影视资源,包括电影、电视剧、综艺节目等。 这个小程序影视源码,还带有变现模式,它的盈利方式挺直接了当的,就是卖会员的,只要无脑

    2024年02月08日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包