"use strict"; const common_vendor = require("../../common/vendor.js"); const _sfc_main = { data() { return { config: { color: "#333", backgroundColor: [1, "#fff"], title: "多设备蓝牙连接", back: false }, title: "Hello", bleDevs: [], status: -2, //-2未连接 -1已连接 0连接成功 deviceId: "", serviceId: "", characteristicId: "", sendData: "", getData: [], deviceIds: [], totalList: [], // 全部已连接的设备 timeIndex: 0, // 默认是列表的第一个 timeout: null, shows: false, testItems: [ { index: 1, typeNums: 1, min: 0, max: 150, name: "设定频率", value: "F" }, { index: 2, typeNums: 250, min: 50, max: 250, name: "设定脉宽", value: "W" }, { index: 3, typeNums: 3, min: 0, max: 3, name: "设定类型", value: "C" }, { index: 4, typeNums: 0, min: 0, max: 120, name: "设定电流", value: "I" }, { index: 5, typeNums: 0, min: 1, max: 100, name: "设定方案", value: "M" } ], titleTime: "00:00:00", timer: "", hour: 0, minutes: 0, seconds: 0, input1: "B", input2: "" }; }, destroyed() { clearInterval(this.timer); }, onLoad() { }, mounted() { this.onBLEConnectionStateChange(); }, methods: { // 开始计时 begin() { if (this.start) { return; } this.sendData = "BS1\r"; this.start = true; this.timer = setInterval(this.startTimer, 1e3); this.send(); }, startTimer() { this.seconds += 1; if (this.seconds >= 60) { this.seconds = 0; this.minute = this.minute + 1; } if (this.minute >= 60) { this.minute = 0; this.hour = this.hour + 1; } this.titleTime = (this.hour < 10 ? "0" + this.hour : this.hour) + ":" + (this.minutes < 10 ? "0" + this.minutes : this.minutes) + ":" + (this.seconds < 10 ? "0" + this.seconds : this.seconds); }, // 暂停倒计时 pause() { if (this.timer) { clearInterval(this.timer); this.start = false; this.sendData = "BS2\r"; this.send(); } }, stop() { if (this.timer) { clearInterval(this.timer); this.sendData = "BS3\r"; this.send(); this.titleTime = "00:00:00"; this.timer = ""; this.hour = 0; this.minutes = 0; this.seconds = 0; this.start = false; } }, changNums(index, item) { if (index == 1) { if (item.typeNums <= item.min) { common_vendor.index.showToast({ title: "已经不能再减少了", icon: "none" }); return; } item.typeNums--; } else if (index == 2) { if (item.typeNums >= item.max) { common_vendor.index.showToast({ title: "已经不能再增加了", icon: "none" }); return; } item.typeNums++; } this.changeBar(item); }, changeBar(item) { if (this.timeout) { clearTimeout(this.timeout); } this.timeout = setTimeout(() => { if (item.typeNums < item.min) { common_vendor.index.showToast({ title: "低于最小值,已变更为最小值发送", icon: "none" }); item.typeNums = item.min; } else if (item.typeNums > item.max) { common_vendor.index.showToast({ title: "超过最大值,已变更为最大值发送", icon: "none" }); item.typeNums = item.max; } this.sendData = "B" + item.value + item.typeNums + "\r"; for (let i = 0; i < this.deviceIds.length; i++) { this.getBLEDeviceServices(1, this.deviceIds[i]); } }, 500); }, checkboxChange(e) { if (e.target.value[0] && e.target.dataset.name) { let item = { deviceId: e.target.value[0], name: e.target.dataset.name }; this.deviceIds.push(item); } else { for (let index = 0; index < this.deviceIds.length; index++) { let item = this.deviceIds[index]; if (item.deviceId == e.target.dataset.deviceid) { this.deviceIds.splice(index, 1); } } } }, hextoString(hex) { var arr = hex.split(""); var out = ""; for (var i = 0; i < arr.length / 2; i++) { var tmp = "0x" + arr[i * 2] + arr[i * 2 + 1]; var charValue = String.fromCharCode(tmp); out += charValue; } return out; }, send(index) { let that = this; if (index == 1) { that.sendData = that.input1 + that.input2 + "\r"; } if (!that.sendData) { return common_vendor.index.showToast({ title: "发送数据不可为空", icon: "none" }); } common_vendor.index.showLoading({ title: "发送中,请稍等", mask: true }); for (let i = 0; i < that.deviceIds.length; i++) { that.getBLEDeviceServices(1, that.deviceIds[i]); } }, // ArrayBuffer转16进度字符串示例 ab2hex(buffer) { const hexArr = Array.prototype.map.call( new Uint8Array(buffer), function(bit) { return ("00" + bit.toString(16)).slice(-2); } ); return hexArr.join(""); }, onBLEConnectionStateChange() { common_vendor.index.onBLEConnectionStateChange((res) => { if (res.connected == false) { common_vendor.index.hideLoading(); for (let i = 0; i < this.deviceIds.length; i++) { if (res.deviceId == this.deviceIds[i].deviceId) { common_vendor.index.showToast({ title: this.deviceIds[i].name + " 蓝牙设备断开连接", icon: "none" }); } } } }); }, //初始化蓝牙 initBle() { this.bleDevs = []; this.deviceIds = []; common_vendor.index.openBluetoothAdapter({ success: (res) => { common_vendor.index.getBluetoothAdapterState({ //蓝牙的匹配状态 success: (res1) => { this.startBluetoothDeviceDiscovery(); }, fail(error) { common_vendor.index.showToast({ icon: "none", title: "查看手机蓝牙是否打开" }); } }); }, fail: (err) => { common_vendor.index.showToast({ icon: "none", title: "查看手机蓝牙是否打开" }); } }); }, // 开始搜索蓝牙设备 startBluetoothDeviceDiscovery() { common_vendor.index.startBluetoothDevicesDiscovery({ success: (res) => { this.onBluetoothDeviceFound(); }, fail: (err) => { } }); }, // 发现外围设备 onBluetoothDeviceFound() { common_vendor.index.onBluetoothDeviceFound((res) => { if (this.bleDevs.indexOf(res.devices[0]) == -1) { this.bleDevs.push(res.devices[0]); } }); }, // 多选然后连接 connectBle() { if (this.deviceIds.length == 0) { common_vendor.index.showToast({ title: "请选择连接的设备", icon: "none" }); return; } this.getData = []; this.deviceIds.forEach((item) => { this.nowLinkLis(item); }); }, //选择设备连接吧deviceId传进来 createBLEConnection(item) { common_vendor.index.showLoading({ title: "连接中,请稍等", mask: true }); let that = this; common_vendor.index.createBLEConnection({ deviceId: item.deviceId, success(res) { that.shows = true; that.stopBluetoothDevicesDiscovery(); that.getBLEDeviceServices(2, item); }, fail(res) { console.log("蓝牙连接失败", res); common_vendor.index.showToast({ title: items.name + "蓝牙连接失败", icon: "none" }); } }); }, // 停止搜寻蓝牙设备 stopBluetoothDevicesDiscovery() { common_vendor.index.stopBluetoothDevicesDiscovery({ success: (e) => { this.loading = false; }, fail: (e) => { console.log("停止搜索蓝牙设备失败,错误码:" + e.errCode); } }); }, //获取蓝牙的所有服务 getBLEDeviceServices(index, items2) { setTimeout(() => { common_vendor.index.getBLEDeviceServices({ // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 deviceId: items2.deviceId, success: (res) => { console.log("services", res.services); res.services.forEach((item) => { if (item.uuid.indexOf("0000FFE0-0000-1000-8000-00805F9B34FB") != -1) { items2["serviceId"] = item.uuid; this.getBLEDeviceCharacteristics(index, items2); } }); } }); }, 1e3); }, //获取蓝牙特征 getBLEDeviceCharacteristics(index, items2) { setTimeout(() => { common_vendor.index.getBLEDeviceCharacteristics({ // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 deviceId: items2.deviceId, // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取 serviceId: items2.serviceId, success: (res) => { console.log("characteristics", res); res.characteristics.forEach((item) => { if ( // 2 支持监听 1 支持写入 item.uuid.indexOf( index == 1 ? "0000FFE1-0000-1000-8000-00805F9B34FB" : "0000FFE2-0000-1000-8000-00805F9B34FB" ) != -1 ) { items2["characteristicId"] = item.uuid; if (index == 2) { this.notifyBLECharacteristicValueChange(items2); } } }); if (index == 1) { this.writeString(this.sendData, items2); } }, fail: (res) => { console.log(res); } }); }, 0); }, // 启用 notify 功能 notifyBLECharacteristicValueChange(items2) { let that = this; common_vendor.index.notifyBLECharacteristicValueChange({ state: true, // 启用 notify 功能 // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 deviceId: items2.deviceId, // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取 serviceId: items2.serviceId, // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取 characteristicId: items2.characteristicId, success: (res) => { console.log("启用 notify 功能成功", res); common_vendor.index.hideLoading(); items2["status"] = true; items2["text"] = ""; that.totalList.push(items2); common_vendor.index.onBLECharacteristicValueChange((res2) => { for (let i = 0; i < that.deviceIds.length; i++) { if (res2.deviceId == that.deviceIds[i].deviceId) { let item = { name: that.deviceIds[i].name, txt: "接收到:" + that.hextoString(that.ab2hex(res2.value)) }; that.getData.unshift(item); } } for (let i = 0; i < that.totalList.length; i++) { if (res2.deviceId == that.totalList[i].deviceId) { that.totalList[i].text = that.hextoString( that.ab2hex(res2.value) ); } } that.totalList = JSON.stringify(that.totalList); that.totalList = JSON.parse(that.totalList); }); }, fail: (res) => { console.log("启用 notify 功能失败", res); } }); }, close() { let that = this; common_vendor.index.showModal({ title: "提示", content: "将断开全部蓝牙连接", success: function(res) { if (res.confirm) { for (let index = 0; index < that.deviceIds.length; index++) { let item = that.deviceIds[index]; common_vendor.index.closeBLEConnection({ deviceId: item.deviceId, success(res2) { console.log("断开蓝牙成功", res2); that.shows = false; that.totalList = []; common_vendor.index.showToast({ title: "断开蓝牙成功" }); }, fail(res2) { console.log("断开蓝牙失败", res2); } }); } } } }); }, // 向蓝牙设备发送字符串数据 writeBLECharacteristicValueString writeString(str, items2) { let that = this; let buffer = new ArrayBuffer(str.length); let dataView = new DataView(buffer); for (let i in str) { dataView.setUint8(i, str[i].charCodeAt() | 0); } setTimeout(() => { common_vendor.index.writeBLECharacteristicValue({ deviceId: items2.deviceId, serviceId: items2.serviceId, characteristicId: items2.characteristicId, value: buffer, writeType: "write", success: function(res) { common_vendor.index.hideLoading(); let item = { name: items2.name, txt: "已发送:" + str }; that.getData.unshift(item); }, fail: function(res) { common_vendor.index.hideLoading(); common_vendor.index.showToast({ title: "发送失败,可能蓝牙目前不支持写入", icon: "none" }); } }); }, 0); }, // 直接启用监听功能 nowLinkLis(items2) { let that = this; console.log("items", items2); common_vendor.index.showLoading({ title: "连接中,请稍等", mask: true }); common_vendor.index.createBLEConnection({ deviceId: items2.deviceId, success(res) { that.stopBluetoothDevicesDiscovery(); setTimeout(() => { common_vendor.index.notifyBLECharacteristicValueChange({ state: true, // 启用 notify 功能 deviceId: items2.deviceId, serviceId: "0000FFE0-0000-1000-8000-00805F9B34FB", characteristicId: "0000FFE2-0000-1000-8000-00805F9B34FB", success: (res2) => { console.log("启用监听了", res2); that.shows = true; common_vendor.index.hideLoading(); items2["status"] = true; items2["text"] = ""; that.totalList.push(items2); common_vendor.index.onBLECharacteristicValueChange((res3) => { for (let i = 0; i < that.deviceIds.length; i++) { if (res3.deviceId == that.deviceIds[i].deviceId) { let item = { name: that.deviceIds[i].name, txt: "接收到:" + that.hextoString(that.ab2hex(res3.value)) }; that.getData.unshift(item); } } for (let i = 0; i < that.totalList.length; i++) { if (res3.deviceId == that.totalList[i].deviceId) { that.totalList[i].text = that.hextoString( that.ab2hex(res3.value) ); } } that.totalList = JSON.stringify(that.totalList); that.totalList = JSON.parse(that.totalList); }); }, fail: (res2) => { console.log("启用 notify 功能失败", res2); common_vendor.index.hideLoading(); common_vendor.index.showToast({ title: "连接失败", icon: "none" }); } }); }, 800); }, fail(res) { console.log("蓝牙连接失败", res); common_vendor.index.showToast({ title: items2.name + "连接失败", icon: "none" }); } }); } } }; if (!Array) { const _component_viwe = common_vendor.resolveComponent("viwe"); _component_viwe(); } function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { return common_vendor.e({ a: !$data.shows, b: common_vendor.o((...args) => $options.initBle && $options.initBle(...args)), c: Math.max(100 + _ctx.item.RSSI, 0) >= 30 }, Math.max(100 + _ctx.item.RSSI, 0) >= 30 ? { d: common_vendor.f($data.bleDevs, (item, index, i0) => { return { a: common_vendor.t(item.name), b: item.deviceId, c: common_vendor.o((...args) => $options.checkboxChange && $options.checkboxChange(...args), index), d: item.name, e: item.deviceId, f: common_vendor.t(item.deviceId), g: common_vendor.t(item.RSSI), h: common_vendor.t(Math.max(100 + item.RSSI, 0)), i: index, j: item.name.length > 0 && !$data.shows }; }) } : {}, { e: !$data.shows }, !$data.shows ? { f: common_vendor.o((...args) => $options.connectBle && $options.connectBle(...args)) } : {}, { g: $data.shows }, $data.shows ? { h: common_vendor.o((...args) => $options.close && $options.close(...args)) } : {}, { i: $data.shows }, $data.shows ? { j: common_vendor.f($data.testItems, (item, index, i0) => { return { a: common_vendor.t(item.name), b: common_vendor.o(($event) => $options.changNums(1, item), index), c: common_vendor.o([($event) => item.typeNums = $event.detail.value, index, ($event) => $options.changeBar(item), index], index), d: item.typeNums, e: common_vendor.o(($event) => $options.changNums(2, item), index), f: index }; }) } : {}, { k: $data.shows }, $data.shows ? { l: common_vendor.t($data.titleTime), m: common_vendor.o((...args) => $options.begin && $options.begin(...args)), n: common_vendor.o((...args) => $options.pause && $options.pause(...args)), o: common_vendor.o((...args) => $options.stop && $options.stop(...args)) } : {}, { p: $data.shows }, $data.shows ? { q: $data.input1, r: common_vendor.o(($event) => $data.input1 = $event.detail.value), s: $data.input2, t: common_vendor.o(($event) => $data.input2 = $event.detail.value), v: common_vendor.o(($event) => $options.send(1)) } : {}, { w: common_vendor.f($data.totalList, (item, index, i0) => { return { a: common_vendor.t(item.text), b: common_vendor.t(item.name), c: common_vendor.n(item.status ? "item bakBlue" : "item"), d: index, e: "cb7d404f-0-" + i0 }; }), x: $data.shows }, $data.shows ? { y: common_vendor.f($data.getData, (item, index, i0) => { return { a: common_vendor.t(item.name), b: common_vendor.t(item.txt), c: index }; }) } : {}); } const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-cb7d404f"]]); wx.createPage(MiniProgramPage);