From 9911418cf9bd562cca253d74f3e667c277dd6713 Mon Sep 17 00:00:00 2001 From: qiaocl <3189782663@qq.com> Date: Fri, 13 May 2022 09:21:09 +0800 Subject: [PATCH] =?UTF-8?q?5-13=20H09=E8=BA=AB=E9=AB=98=E4=BD=93=E9=87=8D?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/PCH0809/index.js | 853 ++++++++++++++++++++------------------- pages/PCH0809/index.wxml | 89 ++-- 2 files changed, 477 insertions(+), 465 deletions(-) diff --git a/pages/PCH0809/index.js b/pages/PCH0809/index.js index 832da5f..91baf22 100644 --- a/pages/PCH0809/index.js +++ b/pages/PCH0809/index.js @@ -1,432 +1,443 @@ const util = require("../../utils/util"); const { - inArray, - ab2hex + inArray, + ab2hex } = util Page({ - data: { - devices: [], - connected: false, - cmd: '', - name: '', - weight: "", - text: "", - imp: "", - height: '', - isType: false, - sendVal: true, - pwdModal: false, - uuid1: null, - uuid2: null, - uuid3: null, - deviceId: null, - serviceId: null - }, - onLoad: function() { - // let value = "A90026051401020001439A"; - // let num = value.substring(18, 19) - // let type = value.substring(8, 10) - // let imp = parseInt(value.substring(10, 14), 16) - // console.log("16进制转化:", value, num, type, imp); - }, - // 初始化蓝牙模块 - openBluetoothAdapter() { - wx.openBluetoothAdapter({ - success: (res) => { - console.log('openBluetoothAdapter success', res) - wx.showToast({ - title: '蓝牙连接中', - icon: "none" - }) - this.startBluetoothDevicesDiscovery() - }, - fail: (res) => { - if (res.errCode === 10001) { - wx.showToast({ - title: '请打开蓝牙', - icon: "none" - }) - // 监听本机蓝牙状态变化的事件 - wx.onBluetoothAdapterStateChange((res) => { - console.log('onBluetoothAdapterStateChange', res) - if (res.available) { - this.startBluetoothDevicesDiscovery() - } - }) - } - } - }) - }, + data: { + devices: [], + connected: false, + cmd: '', + name: '', + weight: "", + text: "", + imp: "", + height: '', + isType: false, + sendVal: true, + pwdModal: false, + uuid1: null, + uuid2: null, + uuid3: null, + deviceId: null, + serviceId: null + }, + onLoad: function() { + // let value = "A90026051401020001439A"; + // let num = value.substring(18, 19) + // let type = value.substring(8, 10) + // let imp = parseInt(value.substring(10, 14), 16) + // console.log("16进制转化:", value, num, type, imp); + }, + // 初始化蓝牙模块 + openBluetoothAdapter() { + wx.openBluetoothAdapter({ + success: (res) => { + console.log('openBluetoothAdapter success', res) + wx.showToast({ + title: '蓝牙连接中', + icon: "none" + }) + this.startBluetoothDevicesDiscovery() + }, + fail: (res) => { + if (res.errCode === 10001) { + wx.showToast({ + title: '请打开蓝牙', + icon: "none" + }) + // 监听本机蓝牙状态变化的事件 + wx.onBluetoothAdapterStateChange((res) => { + console.log('onBluetoothAdapterStateChange', res) + if (res.available) { + this.startBluetoothDevicesDiscovery() + } + }) + } + } + }) + }, - // 开始搜寻附近的蓝牙外围设备 - startBluetoothDevicesDiscovery() { - if (this._discoveryStarted) { - return - } - this._discoveryStarted = true - wx.startBluetoothDevicesDiscovery({ - allowDuplicatesKey: true, - interval: 1000, //上报设备的间隔 - services: [ - "FFE0", - ], - success: (res) => { - console.log('startBluetoothDevicesDiscovery success', res) - this.onBluetoothDeviceFound() - }, - }) - }, - // 停止搜寻附近的蓝牙外围设备 - stopBluetoothDevicesDiscovery() { - wx.stopBluetoothDevicesDiscovery() - }, + // 开始搜寻附近的蓝牙外围设备 + startBluetoothDevicesDiscovery() { + if (this._discoveryStarted) { + return + } + this._discoveryStarted = true + wx.startBluetoothDevicesDiscovery({ + allowDuplicatesKey: true, + interval: 1000, //上报设备的间隔 + services: [ + "FFE0", + ], + success: (res) => { + console.log('startBluetoothDevicesDiscovery success', res) + this.onBluetoothDeviceFound() + }, + }) + }, + // 停止搜寻附近的蓝牙外围设备 + stopBluetoothDevicesDiscovery() { + wx.stopBluetoothDevicesDiscovery() + }, - // 找到新设备的事件 - onBluetoothDeviceFound() { - wx.onBluetoothDeviceFound((res) => { - res.devices.forEach(device => { - if (device.name.indexOf('AiLink_') != -1) { - wx.stopBluetoothDevicesDiscovery() //搜索到名称为“AiLink_”的蓝牙后,停止搜寻附近的蓝牙 - const foundDevices = this.data.devices - const idx = inArray(foundDevices, 'deviceId', device.deviceId) - const data = {} - let buff = device.advertisData.slice(-6) - device.mac = new Uint8Array(buff) // 保存广播数据中的mac地址,这是由于iOS不直接返回mac地址 - let tempMac = Array.from(device.mac) - tempMac.reverse() - device.macAddr = ab2hex(tempMac, ':').toUpperCase() - if (idx === -1) { - data[`devices[${foundDevices.length}]`] = device - } else { - data[`devices[${idx}]`] = device - } - console.log("131", data) - this.setData(data) - } - }) - }) - }, - // 连接低功耗蓝牙设备 - createBLEConnection(e) { - this._connLoading = true - wx.showLoading({ - title: '连接中', - }) - setTimeout(() => { - if (this._connLoading) { - this._connLoading = false - wx.hideLoading() - } - }, 6000) - const ds = e.currentTarget.dataset - const index = ds.index - this._device = this.data.devices[index] - const deviceId = ds.deviceId - const name = ds.name - this.mac = ds.mac - wx.createBLEConnection({ - deviceId, - success: (res) => { - this.setData({ - connected: true, - name, - deviceId, - }) - console.log("createBLEConnection:success") - this.onBLEConnectionStateChange() - this.getBLEDeviceServices(deviceId) - }, - fail: res => { - this._connLoading = false - wx.showToast({ - title: '连接失败', - duration: 2000, - icon: 'none' - }) - } - }) - }, - //监听蓝牙连接状态 - onBLEConnectionStateChange() { - wx.onBLEConnectionStateChange((res) => { - if (!res.connected) { - setTimeout(() => { - wx.showToast({ - title: '连接已断开', - duration: 2000, - icon: 'none' - }) - }, 500) - this.setData({ - connected: false, - isType: false, - devices: [], - weight: "", - text: "", - imp: "" - }) - } - }) - }, + // 找到新设备的事件 + onBluetoothDeviceFound() { + wx.onBluetoothDeviceFound((res) => { + res.devices.forEach(device => { + if (device.name.indexOf('AiLink_') != -1) { + wx.stopBluetoothDevicesDiscovery() //搜索到名称为“AiLink_”的蓝牙后,停止搜寻附近的蓝牙 + const foundDevices = this.data.devices + const idx = inArray(foundDevices, 'deviceId', device.deviceId) + const data = {} + let buff = device.advertisData.slice(-6) + device.mac = new Uint8Array(buff) // 保存广播数据中的mac地址,这是由于iOS不直接返回mac地址 + let tempMac = Array.from(device.mac) + tempMac.reverse() + device.macAddr = ab2hex(tempMac, ':').toUpperCase() + if (idx === -1) { + data[`devices[${foundDevices.length}]`] = device + } else { + data[`devices[${idx}]`] = device + } + console.log("131", data) + this.setData(data) + } + }) + }) + }, + // 连接低功耗蓝牙设备 + createBLEConnection(e) { + this._connLoading = true + wx.showLoading({ + title: '连接中', + }) + setTimeout(() => { + if (this._connLoading) { + this._connLoading = false + wx.hideLoading() + } + }, 6000) + const ds = e.currentTarget.dataset + const index = ds.index + this._device = this.data.devices[index] + const deviceId = ds.deviceId + const name = ds.name + this.mac = ds.mac + wx.createBLEConnection({ + deviceId, + success: (res) => { + this.setData({ + connected: true, + name, + deviceId, + }) + console.log("createBLEConnection:success") + this.onBLEConnectionStateChange() + this.getBLEDeviceServices(deviceId) + }, + fail: res => { + this._connLoading = false + wx.showToast({ + title: '连接失败', + duration: 2000, + icon: 'none' + }) + } + }) + }, + //监听蓝牙连接状态 + onBLEConnectionStateChange() { + wx.onBLEConnectionStateChange((res) => { + if (!res.connected) { + setTimeout(() => { + wx.showToast({ + title: '连接已断开', + duration: 2000, + icon: 'none' + }) + }, 500) + this.setData({ + connected: false, + isType: false, + devices: [], + weight: "", + height: "", + text: "", + imp: "" + }) + } + }) + }, - // 获取蓝牙设备的 serviceId - getBLEDeviceServices(deviceId) { - wx.getBLEDeviceServices({ - deviceId, - success: (res) => { - for (let i = 0; i < res.services.length; i++) { - if (res.services[i].isPrimary && res.services[i].uuid.indexOf('FFE0') > -1) { - this.data.serviceId = res.services[i].uuid - this.data.deviceId = deviceId - this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid) - wx.showToast({ - title: '获取设备的UUID成功', - duration: 2000, - icon: 'none' - }) - return - } - } - } - }) - }, + // 获取蓝牙设备的 serviceId + getBLEDeviceServices(deviceId) { + wx.getBLEDeviceServices({ + deviceId, + success: (res) => { + for (let i = 0; i < res.services.length; i++) { + if (res.services[i].isPrimary && res.services[i].uuid.indexOf('FFE0') > -1) { + this.data.serviceId = res.services[i].uuid + this.data.deviceId = deviceId + this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid) + wx.showToast({ + title: '获取设备的UUID成功', + duration: 2000, + icon: 'none' + }) + return + } + } + } + }) + }, - // 获取蓝牙设备某个服务中所有特征值(characteristic) - /** - * read: true读,write: true写,notify: true广播 - */ - getBLEDeviceCharacteristics(deviceId, serviceId) { - this._deviceId = deviceId - this._serviceId = serviceId - this._device.serviceId = serviceId - let that = this - wx.getBLEDeviceCharacteristics({ - deviceId, - serviceId, - success: (res) => { - console.log('getBLEDeviceCharacteristics success', res.characteristics) - for (let i = 0; i < res.characteristics.length; i++) { - let item = res.characteristics[i]; - if (item.uuid.indexOf('FFE1') != -1) { - that.data.uuid1 = item.uuid //主服务 UUID - } else if (item.uuid.indexOf('FFE2') != -1) { - that.data.uuid2 = item.uuid //写入设置 - } else if (item.uuid.indexOf('FFE3') != -1) { - that.data.uuid3 = item.uuid //监听数据 - } - } - that.setData({ - isType: true, - }) - wx.notifyBLECharacteristicValueChange({ - deviceId, - serviceId, - characteristicId: that.data.uuid2, - state: true, - }) - wx.notifyBLECharacteristicValueChange({ - deviceId, - serviceId, - characteristicId: that.data.uuid3, - state: true, - }) - wx.onBLECharacteristicValueChange((res) => { - let value = ab2hex(res.value, ""); - console.log("16进制转化:", value); - let num = value.substring(18, 19) - let dw = value.substring(19, 20) - let type = value.substring(8, 10) - let typeInfo = value.substring(10, 12) - console.log("16进制转化:", value); - if (type == '10') { - let data = parseInt(value.substring(13, 18), 16) - let dw1 = "kg" - if (dw == "1") { - dw1 = "斤" - console.log("体重单位:斤") - } - if (dw == "4") { - dw1 = "st:lb" - console.log("体重单位:st:lb,计算方法:1 * data + 5") - } - if (dw == "6") { - dw1 = "lb" - console.log("体重单位:lb") - } - if (num == "1") { - data = parseInt(value.substring(13, 18), 16) / 10 - console.log("体重小数点后1位") - } - if (num == "2") { - data = parseInt(value.substring(13, 18), 16) / 100 - console.log("体重小数点后2位") - } - if (num == "3") { - data = parseInt(value.substring(13, 18), 16) / 1000 - console.log("体重小数点后3位") - } - if (typeInfo == "01") { - console.log("实时体重:", data) - that.setData({ - weight: "实时体重是:" + data + dw1 - }) - } - if (typeInfo == "02") { - console.log("稳定体重:", data) - that.setData({ - weight: "稳定体重是:" + data + dw1 - }) - } - } - if (type == "14") { //身高模式 - let height = parseInt(value.substring(10, 14), 16) - that.setData({ - height: "您的身高是:" + height - }) - console.log("身高模式:", height) - } - if (type == "11") { - console.log("阻抗值:", value) - if (typeInfo == "03" || typeInfo == "04") { - let imp = parseInt(value.substring(17, 22), 16) - that.setData({ - imp: "阻抗值:" + imp - }) - } - } - if (value.toUpperCase() == "A90026023000589A") { - that.setData({ - text: "测量完成" - }) - } - }); - }, - fail(res) { - console.error('getBLEDeviceCharacteristics', res) - } - }) - }, - handleHeight(e) { - let that = this - let type = e.currentTarget.dataset.name - if (type == '1') { - let j = Number(26 + 3 + 6 + 1).toString(16) - let str = "A9002603060100" + j.substr(j.length - 2, 2) + "9A" - let buf = new Uint8Array(str.match(/[\da-f]{2}/gi).map(function(h) { - return parseInt(h, 16) - })) - that.sendData(buf.buffer) - } - if (type == '3') { - that.setData({ - pwdModal: true, - }) - } - }, - confirmPwd() { - let that = this - if (!that.data.pwdInput) { - wx.showToast({ - title: '请输入重量', - duration: 2000, - icon: 'none' - }) - return - } else { - let w = Number(that.data.pwdInput.replace(/[&\|\\\*^%$#@\.-]/g, "")) - let j = Number(26 + 7 + 40 + w + 3 + 2).toString(16) //校验和 - let atr = w.toString(16) //16进制后的标定数据 - let num = 0 //小数位数 - let str = null - if (that.data.pwdInput.indexOf('.') != -1) { - num = Number(that.data.pwdInput.toString().split(".")[1].length) - } - // 根据atr的位数判断下发的体重填充几个0 - let n = [] - for (var i = 1; i <= (6 - atr.length); i++) { - n.push(0); - } - str = "A90026074003" + n.join("") + atr + "0" + num + "00" + j.substr(j.length - 2, 2) + "9A" - let buf = new Uint8Array(str.match(/[\da-f]{2}/gi).map(function(h) { - return parseInt(h, 16) - })) - that.sendData(buf.buffer) - } - }, - sendData(buffer) { - let that = this - wx.writeBLECharacteristicValue({ - deviceId: that.data.deviceId, - serviceId: that.data.serviceId, - characteristicId: that.data.uuid1, - value: buffer, - success: res => { - console.log('下发指令', res.errMsg) - wx.showToast({ - title: '下发指令成功', - duration: 2000, - icon: 'none' - }) - this.setData({ - pwdModal: false, - }) - }, - fail: res => { - wx.showToast({ - title: '下发指令失败', - duration: 2000, - icon: 'none' - }) - this.setData({ - pwdModal: false, - }) - console.log("失败", res); - }, - }) - }, - closeModal() { - this.setData({ - pwdModal: false, - }) - }, - /** - * 断开蓝牙模块 - */ - closeBluetoothAdapter() { - wx.closeBluetoothAdapter() - this._discoveryStarted = false - wx.showToast({ - title: '断开蓝牙模块', - duration: 2000, - icon: 'none' - }) - this.setData({ - devices: [], - weight: "", - text: "", - imp: "", - isType: false - }) - }, - // 断开与低功耗蓝牙设备的连接 - closeBLEConnection() { - wx.closeBLEConnection({ - deviceId: this._deviceId - }) - wx.showToast({ - title: '断开蓝牙连接', - duration: 2000, - icon: 'none' - }) - this.setData({ - connected: false, - isType: false, - devices: [], - text: "", - weight: "", - imp: "" - }) - }, + // 获取蓝牙设备某个服务中所有特征值(characteristic) + /** + * read: true读,write: true写,notify: true广播 + */ + getBLEDeviceCharacteristics(deviceId, serviceId) { + this._deviceId = deviceId + this._serviceId = serviceId + this._device.serviceId = serviceId + let that = this + wx.getBLEDeviceCharacteristics({ + deviceId, + serviceId, + success: (res) => { + console.log('getBLEDeviceCharacteristics success', res.characteristics) + for (let i = 0; i < res.characteristics.length; i++) { + let item = res.characteristics[i]; + if (item.uuid.indexOf('FFE1') != -1) { + that.data.uuid1 = item.uuid //主服务 UUID + } else if (item.uuid.indexOf('FFE2') != -1) { + that.data.uuid2 = item.uuid //写入设置 + } else if (item.uuid.indexOf('FFE3') != -1) { + that.data.uuid3 = item.uuid //监听数据 + } + } + that.setData({ + isType: true, + }) + wx.notifyBLECharacteristicValueChange({ + deviceId, + serviceId, + characteristicId: that.data.uuid2, + state: true, + }) + wx.notifyBLECharacteristicValueChange({ + deviceId, + serviceId, + characteristicId: that.data.uuid3, + state: true, + }) + wx.onBLECharacteristicValueChange((res) => { + let value = ab2hex(res.value, ""); + console.log("16进制转化:", value); + let num = value.substring(18, 19) + let dw = value.substring(19, 20) + let type = value.substring(8, 10) + let typeInfo = value.substring(10, 12) + console.log("16进制转化:", value); + if (type == '10') { + let data = parseInt(value.substring(13, 18), 16) + let dw1 = "kg" + if (dw == "1") { + dw1 = "斤" + console.log("体重单位:斤") + } + if (dw == "4") { + dw1 = "st:lb" + console.log("体重单位:st:lb,计算方法:1 * data + 5") + } + if (dw == "6") { + dw1 = "lb" + console.log("体重单位:lb") + } + if (num == "1") { + data = parseInt(value.substring(13, 18), 16) / 10 + console.log("体重小数点后1位") + } + if (num == "2") { + data = parseInt(value.substring(13, 18), 16) / 100 + console.log("体重小数点后2位") + } + if (num == "3") { + data = parseInt(value.substring(13, 18), 16) / 1000 + console.log("体重小数点后3位") + } + if (typeInfo == "01") { + console.log("实时体重:", data) + that.setData({ + weight: "实时体重是:" + data + dw1 + }) + } + if (typeInfo == "02") { + console.log("稳定体重:", data) + that.setData({ + weight: "稳定体重是:" + data + dw1 + }) + } + } + if (type == "14") { //身高模式 + let height = parseInt(value.substring(10, 14), 16) + that.setData({ + height: "您的身高是:" + height + }) + console.log("身高模式:", height) + } + if (type == "11") { + console.log("阻抗值:", value) + if (typeInfo == "03" || typeInfo == "04") { + let imp = parseInt(value.substring(17, 22), 16) + that.setData({ + imp: "阻抗值:" + imp + }) + } + } + if (value.toUpperCase() == "A90026023000589A") { + that.setData({ + text: "测量完成" + }) + } + }); + }, + fail(res) { + console.error('getBLEDeviceCharacteristics', res) + } + }) + }, + handleHeight(e) { + let that = this + let type = e.currentTarget.dataset.name + if (type == '1') { + let j = Number(26 + 3 + 6 + 1).toString(16) + let str = "A9002603060100" + j.substr(j.length - 2, 2) + "9A" + let buf = new Uint8Array(str.match(/[\da-f]{2}/gi).map(function(h) { + return parseInt(h, 16) + })) + that.sendData(buf.buffer) + } + if (type == '2') { + let j = Number(26 + 3 + 6 + 2).toString(16) + let str = "A9002603060200" + j.substr(j.length - 2, 2) + "9A" + let buf = new Uint8Array(str.match(/[\da-f]{2}/gi).map(function(h) { + return parseInt(h, 16) + })) + that.sendData(buf.buffer) + } + if (type == '3') { + that.setData({ + pwdModal: true, + }) + } + }, + confirmPwd() { + let that = this + if (!that.data.pwdInput) { + wx.showToast({ + title: '请输入重量', + duration: 2000, + icon: 'none' + }) + return + } else { + let w = Number(that.data.pwdInput.replace(/[&\|\\\*^%$#@\.-]/g, "")) + let j = Number(26 + 7 + 40 + w + 3 + 2).toString(16) //校验和 + let atr = w.toString(16) //16进制后的标定数据 + let num = 0 //小数位数 + let str = null + if (that.data.pwdInput.indexOf('.') != -1) { + num = Number(that.data.pwdInput.toString().split(".")[1].length) + } + // 根据atr的位数判断下发的体重填充几个0 + let n = [] + for (var i = 1; i <= (6 - atr.length); i++) { + n.push(0); + } + str = "A90026074003" + n.join("") + atr + "0" + num + "00" + j.substr(j.length - 2, 2) + "9A" + let buf = new Uint8Array(str.match(/[\da-f]{2}/gi).map(function(h) { + return parseInt(h, 16) + })) + that.sendData(buf.buffer) + } + }, + sendData(buffer) { + let that = this + wx.writeBLECharacteristicValue({ + deviceId: that.data.deviceId, + serviceId: that.data.serviceId, + characteristicId: that.data.uuid1, + value: buffer, + success: res => { + console.log('下发指令', res.errMsg) + wx.showToast({ + title: '下发指令成功', + duration: 2000, + icon: 'none' + }) + this.setData({ + pwdModal: false, + }) + }, + fail: res => { + wx.showToast({ + title: '下发指令失败', + duration: 2000, + icon: 'none' + }) + this.setData({ + pwdModal: false, + }) + console.log("失败", res); + }, + }) + }, + closeModal() { + this.setData({ + pwdModal: false, + }) + }, + /** + * 断开蓝牙模块 + */ + closeBluetoothAdapter() { + wx.closeBluetoothAdapter() + this._discoveryStarted = false + wx.showToast({ + title: '断开蓝牙模块', + duration: 2000, + icon: 'none' + }) + this.setData({ + devices: [], + weight: "", + height: "", + text: "", + imp: "", + isType: false + }) + }, + // 断开与低功耗蓝牙设备的连接 + closeBLEConnection() { + wx.closeBLEConnection({ + deviceId: this._deviceId + }) + wx.showToast({ + title: '断开蓝牙连接', + duration: 2000, + icon: 'none' + }) + this.setData({ + connected: false, + isType: false, + devices: [], + text: "", + weight: "", + height: "", + imp: "" + }) + }, }); diff --git a/pages/PCH0809/index.wxml b/pages/PCH0809/index.wxml index 1998a86..04d3df2 100644 --- a/pages/PCH0809/index.wxml +++ b/pages/PCH0809/index.wxml @@ -1,51 +1,52 @@ - module.exports.max = function(n1, n2) { - return Math.max(n1, n2) - } - module.exports.len = function(arr) { - arr = arr || [] - return arr.length - } + module.exports.max = function(n1, n2) { + return Math.max(n1, n2) + } + module.exports.len = function(arr) { + arr = arr || [] + return arr.length + } - - - - - - - - - {{weight}} - {{imp}} - {{height}} - {{text}} - - 已发现 {{devices.length}} 个外围设备: - - - - {{item.name}} - (信号强度: {{item.RSSI}}dBm) - - mac地址: {{item.macAddr || item.deviceId}} - - - + + + + + + + + + + {{weight}} + {{imp}} + {{height}} + {{text}} + + 已发现 {{devices.length}} 个外围设备: + + + + {{item.name}} + (信号强度: {{item.RSSI}}dBm) + + mac地址: {{item.macAddr || item.deviceId}} + + + - - 标定重量 - - - - - 取消 - 确定 - - + + 标定重量 + + + + + 取消 + 确定 + +