From 820b6ce1597ef31398e315f67252469f25828ae4 Mon Sep 17 00:00:00 2001 From: qiaocl <3189782663@qq.com> Date: Fri, 17 Jun 2022 17:32:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EH01pro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.json | 56 +-- pages/H01PRO/index.js | 275 +++++++++++++++ pages/H01PRO/index.json | 4 + pages/H01PRO/index.wxml | 37 ++ pages/index/index.js | 763 ++++++++++++++++++++-------------------- pages/index/index.wxml | 42 +-- project.config.json | 107 +++--- 7 files changed, 804 insertions(+), 480 deletions(-) create mode 100644 pages/H01PRO/index.js create mode 100644 pages/H01PRO/index.json create mode 100644 pages/H01PRO/index.wxml diff --git a/app.json b/app.json index 2c54782..0e776d4 100644 --- a/app.json +++ b/app.json @@ -1,30 +1,30 @@ { - "pages": [ - "pages/index/index", - "pages/PCD01PRO/index", - "pages/PCH0809/index", - "pages/PCF01B/index", - "pages/PCF01proFRK/index", - "pages/PCF08/index", - "pages/PCJ02/index", - "pages/G01/index", - "pages/FB03/index", - "pages/L08/index" - - ], - "window": { - "navigationBarBackgroundColor": "#0082FE", - "navigationBarTextStyle": "white", - "navigationBarTitleText": "蓝牙连接Demo", - "backgroundColor": "#eeeeee", - "backgroundTextStyle": "light" - }, - "plugins": { - "sdkPlugin": { - "version": "2.1.0", - "provider": "wx17e93aad47cdae1a" - } - }, - "style": "v2", - "sitemapLocation": "sitemap.json" + "pages": [ + "pages/index/index", + "pages/PCD01PRO/index", + "pages/H01PRO/index", + "pages/PCH0809/index", + "pages/PCF01B/index", + "pages/PCF01proFRK/index", + "pages/PCF08/index", + "pages/L08/index", + "pages/G01/index", + "pages/FB03/index", + "pages/PCJ02/index" + ], + "window": { + "navigationBarBackgroundColor": "#0082FE", + "navigationBarTextStyle": "white", + "navigationBarTitleText": "蓝牙连接Demo", + "backgroundColor": "#eeeeee", + "backgroundTextStyle": "light" + }, + "plugins": { + "sdkPlugin": { + "version": "2.1.0", + "provider": "wx17e93aad47cdae1a" + } + }, + "style": "v2", + "sitemapLocation": "sitemap.json" } diff --git a/pages/H01PRO/index.js b/pages/H01PRO/index.js new file mode 100644 index 0000000..fd3c3ed --- /dev/null +++ b/pages/H01PRO/index.js @@ -0,0 +1,275 @@ +const util = require("../../utils/util"); +const { + inArray, + ab2hex +} = util +Page({ + data: { + devices: [], + connected: false, + text: '', + name: '', + weight: "", + height: "", + imp: "", + readId: "", + writeId: "", + notifyId: "", + deviceId: null, + }, + onLoad: function() {}, + // 初始化蓝牙模块 + 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: 500, //上报设备的间隔 + success: (res) => { + console.log('startBluetoothDevicesDiscovery success', res) + this.onBluetoothDeviceFound() + }, + }) + }, + // 停止搜寻附近的蓝牙外围设备 + stopBluetoothDevicesDiscovery() { + wx.stopBluetoothDevicesDiscovery() + }, + + // 找到新设备的事件 + onBluetoothDeviceFound() { + wx.onBluetoothDeviceFound((res) => { + res.devices.forEach(device => { + if (!device.name && !device.localName) { + return + } + if (device.name.indexOf('My') != -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) + device.macAddr = ab2hex(tempMac, ':').toUpperCase() + if (idx === -1) { + data[`devices[${foundDevices.length}]`] = device + } else { + data[`devices[${idx}]`] = device + } + this.setData(data) + } + }) + }) + }, + // 连接低功耗蓝牙设备 + createBLEConnection(e) { + wx.showLoading({ + title: '连接中', + }) + 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 => { + wx.hideLoading() + wx.showToast({ + title: '连接失败', + icon: 'none' + }) + } + }) + }, + //监听蓝牙连接状态 + onBLEConnectionStateChange() { + wx.onBLEConnectionStateChange((res) => { + if (!res.connected) { + setTimeout(() => { + wx.showToast({ + title: '连接已断开', + icon: 'none' + }) + }, 500) + this.setData({ + connected: 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].uuid.indexOf('FFE0') > -1) { + wx.showLoading({ + title: '获取设备的UUID成功', + }) + this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid) + return + } + } + } + }) + }, + + // 获取蓝牙设备某个服务中所有特征值(characteristic) + /** + * read: true读,write: true写,notify: true广播 + */ + getBLEDeviceCharacteristics(deviceId, serviceId) { + let that = this + that._deviceId = deviceId + that._serviceId = serviceId + that._device.serviceId = serviceId + wx.hideLoading() + wx.getBLEDeviceCharacteristics({ + deviceId, + serviceId, + success: (res) => { + console.log('getBLEDeviceCharacteristics success', res.characteristics) + that.setData({ + text: "请站在秤上,开始测量" + }) + for (let i = 0; i < res.characteristics.length; i++) { + let item = res.characteristics[i]; + if (item.uuid.indexOf("FFE1") != -1) { + if (item.properties.notify == true) { + that.data.notifyId = item.uuid + } + if (item.properties.read) { + that.data.readId = item.uuid + } + if (item.properties.write == true) { + that.data.writeId = item.uuid + } + } + } + + // 打开监听 + wx.notifyBLECharacteristicValueChange({ + deviceId, + serviceId, + characteristicId: that.data.notifyId, + state: true, + }) + wx.notifyBLECharacteristicValueChange({ + deviceId, + serviceId, + characteristicId: that.data.writeId, + state: true, + }) + + wx.onBLECharacteristicValueChange((res) => { + let value = ab2hex(res.value, ''); + let weight = parseInt(value.substring(4, 8), 16) / 100 + let height = parseInt(value.substring(30, 34), 16) / 10 + let imp0 = value.substring(28, 30) + value.substring(34, 36) + that.setData({ + weight: "您的体重是:" + weight + 'kg' + }) + that.setData({ + height: "您的身高是:" + height + 'kg' + }) + that.setData({ + imp: "阻抗:" + parseInt(imp0, 16) + }) + that.setData({ + text: "测量结束" + }) + }) + }, + fail(res) { + console.error('getBLEDeviceCharacteristics', res) + } + }) + }, + + /** + * 断开蓝牙模块 + */ + closeBluetoothAdapter() { + wx.closeBluetoothAdapter() + this._discoveryStarted = false + wx.showToast({ + title: '断开蓝牙模块', + icon: 'none' + }) + this.setData({ + devices: [], + weight: "", + height: "", + imp: "" + }) + }, + // 断开与低功耗蓝牙设备的连接 + closeBLEConnection() { + wx.closeBLEConnection({ + deviceId: this._deviceId + }) + wx.showToast({ + title: '断开蓝牙连接', + icon: 'none' + }) + this.setData({ + connected: false, + devices: [], + height: "", + weight: "", + imp: "" + }) + }, + +}); diff --git a/pages/H01PRO/index.json b/pages/H01PRO/index.json new file mode 100644 index 0000000..b55b5a2 --- /dev/null +++ b/pages/H01PRO/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": { + } +} \ No newline at end of file diff --git a/pages/H01PRO/index.wxml b/pages/H01PRO/index.wxml new file mode 100644 index 0000000..105d823 --- /dev/null +++ b/pages/H01PRO/index.wxml @@ -0,0 +1,37 @@ + + module.exports.max = function(n1, n2) { + return Math.max(n1, n2) + } + module.exports.len = function(arr) { + arr = arr || [] + return arr.length + } + + + + + + + + + + {{weight}} + {{height}} + {{imp}} + {{text}} + + 已发现 {{devices.length}} 个外围设备: + + + + {{item.name}} + (信号强度: {{item.RSSI}}dBm) + + mac地址: {{item.macAddr || item.deviceId}} + + + + + diff --git a/pages/index/index.js b/pages/index/index.js index b47304b..fb1695a 100644 --- a/pages/index/index.js +++ b/pages/index/index.js @@ -1,392 +1,399 @@ const util = require("../../utils/util"); const { - inArray, - ab2hex + inArray, + ab2hex } = util Page({ - data: { - devices: [], - connected: false, - cmd: '', - name: '', - weight: "", - text: "", - imp: "", - deviceId: null, - }, - onLoad: function() {}, - // 初始化蓝牙模块 - editclick: function(e) { - let type = e.currentTarget.dataset.name - if (type == 'PCD01PRO') { - wx.navigateTo({ - url: `/pages/PCD01PRO/index` - }) - return - } - if (type == 'PCH0809') { - wx.navigateTo({ - url: `/pages/PCH0809/index` - }) - return - } - if (type == 'PCF01B') { - wx.navigateTo({ - url: `/pages/PCF01B/index` - }) - return - } - if (type == 'PCF01proFRK') { - wx.navigateTo({ - url: `/pages/PCF01proFRK/index` - }) - return - } - if (type == 'PCF08') { - wx.navigateTo({ - url: `/pages/PCF08/index` - }) - return - } - if (type == 'PCJ02') { - wx.navigateTo({ - url: `/pages/PCJ02/index` - }) - return - } - if (type == 'FB03') { - wx.navigateTo({ - url: `/pages/FB03/index` - }) - return - } - if (type == 'G01') { - wx.navigateTo({ - url: `/pages/G01/index` - }) - return - } - if (type == 'h018') { - wx.navigateTo({ - url: `/pages/h018/index` - }) - return - } - if (type == 'L08') { - wx.navigateTo({ - url: `/pages/L08/index` - }) - return + data: { + devices: [], + connected: false, + cmd: '', + name: '', + weight: "", + text: "", + imp: "", + deviceId: null, + }, + onLoad: function() {}, + // 初始化蓝牙模块 + editclick: function(e) { + let type = e.currentTarget.dataset.name + if (type == 'PCD01PRO') { + wx.navigateTo({ + url: `/pages/PCD01PRO/index` + }) + return + } + if (type == 'PCH0809') { + wx.navigateTo({ + url: `/pages/PCH0809/index` + }) + return + } + if (type == 'PCF01B') { + wx.navigateTo({ + url: `/pages/PCF01B/index` + }) + return + } + if (type == 'PCF01proFRK') { + wx.navigateTo({ + url: `/pages/PCF01proFRK/index` + }) + return + } + if (type == 'PCF08') { + wx.navigateTo({ + url: `/pages/PCF08/index` + }) + return + } + if (type == 'PCJ02') { + wx.navigateTo({ + url: `/pages/PCJ02/index` + }) + return + } + if (type == 'FB03') { + wx.navigateTo({ + url: `/pages/FB03/index` + }) + return + } + if (type == 'G01') { + wx.navigateTo({ + url: `/pages/G01/index` + }) + return + } + if (type == 'h018') { + wx.navigateTo({ + url: `/pages/h018/index` + }) + return + } + if (type == 'L08') { + wx.navigateTo({ + url: `/pages/L08/index` + }) + return + } + + if (type == 'H01PRO') { + wx.navigateTo({ + url: `/pages/H01PRO/index` + }) + return + } + + }, + 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() + } + }) } - - }, - 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, //是否允许重复上报同一设备 - services: [ //要搜索蓝牙设备主 service 的 uuid 列表 - "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, //是否允许重复上报同一设备 + services: [ //要搜索蓝牙设备主 service 的 uuid 列表 + "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.hideLoading() - wx.showToast({ - title: '连接失败', - icon: 'none' - }) - } - }) - }, - //监听蓝牙连接状态 - onBLEConnectionStateChange() { - wx.onBLEConnectionStateChange((res) => { - if (!res.connected) { - setTimeout(() => { - wx.showToast({ - title: '连接已断开', - icon: 'none' - }) - }, 500) - this.setData({ - connected: 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.hideLoading() + wx.showToast({ + title: '连接失败', + icon: 'none' + }) + } + }) + }, + //监听蓝牙连接状态 + onBLEConnectionStateChange() { + wx.onBLEConnectionStateChange((res) => { + if (!res.connected) { + setTimeout(() => { + wx.showToast({ + title: '连接已断开', + icon: 'none' + }) + }, 500) + this.setData({ + connected: false, + devices: [], + weight: "", + 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) { - wx.showLoading({ - title: '获取设备的UUID成功', - }) - this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid) - 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) { + wx.showLoading({ + title: '获取设备的UUID成功', + }) + this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid) + return + } + } + } + }) + }, - // 获取蓝牙设备某个服务中所有特征值(characteristic) - /** - * read: true读,write: true写,notify: true广播 - */ - getBLEDeviceCharacteristics(deviceId, serviceId) { - this._deviceId = deviceId - this._serviceId = serviceId - this._device.serviceId = serviceId - wx.getBLEDeviceCharacteristics({ - deviceId, - serviceId, - success: (res) => { - console.log('getBLEDeviceCharacteristics success', res.characteristics) - wx.showLoading({ - title: '获取特征值成功', - }) - //FFE1:write: true, FFE2:notify: true,FFE3:read: true, write: true, notify: true, - for (let i = 0; i < res.characteristics.length; i++) { - let characteristic = res.characteristics[i]; - if (characteristic.uuid.indexOf("FFE2") != -1) { - if (characteristic.properties.notify == true) { - this.notifyBLECharacteristicValue(deviceId, serviceId, characteristic - .uuid) - console.log("ffe2服务的notifyId获取成功") - } - if (characteristic.properties.read == true) { - that.readId = characteristic.uuid - } - if (characteristic.properties.write == true) { - that.writeId = characteristic.uuid - } - break; - } - } - }, - fail(res) { - console.error('getBLEDeviceCharacteristics', res) - } - }) - }, - //解析蓝牙返回数据 - notifyBLECharacteristicValue(deviceId, serviceId, notifyId) { - let that = this - wx.notifyBLECharacteristicValueChange({ - state: true, // 启用 notify 功能 - deviceId: deviceId, - serviceId: serviceId, - characteristicId: notifyId, - success(res) { - wx.onBLECharacteristicValueChange(function(res) { - let value = ab2hex(res.value); - let num = value.substring(18, 19) - let dw = value.substring(19, 20) - let typeInfo = value.substring(10, 12) - console.log("16进制转化:", value); - if (value.length == 26) { - 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 (value.length == 30) { - console.log("阻抗值:", value) - if (typeInfo == "03") { - let imp = parseInt(value.substring(17, 22), 16) - that.setData({ - imp: "阻抗值:" + imp - }) - } + // 获取蓝牙设备某个服务中所有特征值(characteristic) + /** + * read: true读,write: true写,notify: true广播 + */ + getBLEDeviceCharacteristics(deviceId, serviceId) { + this._deviceId = deviceId + this._serviceId = serviceId + this._device.serviceId = serviceId + wx.getBLEDeviceCharacteristics({ + deviceId, + serviceId, + success: (res) => { + console.log('getBLEDeviceCharacteristics success', res.characteristics) + wx.showLoading({ + title: '获取特征值成功', + }) + //FFE1:write: true, FFE2:notify: true,FFE3:read: true, write: true, notify: true, + for (let i = 0; i < res.characteristics.length; i++) { + let characteristic = res.characteristics[i]; + if (characteristic.uuid.indexOf("FFE2") != -1) { + if (characteristic.properties.notify == true) { + this.notifyBLECharacteristicValue(deviceId, serviceId, characteristic + .uuid) + console.log("ffe2服务的notifyId获取成功") + } + if (characteristic.properties.read == true) { + that.readId = characteristic.uuid + } + if (characteristic.properties.write == true) { + that.writeId = characteristic.uuid + } + break; + } + } + }, + fail(res) { + console.error('getBLEDeviceCharacteristics', res) + } + }) + }, + //解析蓝牙返回数据 + notifyBLECharacteristicValue(deviceId, serviceId, notifyId) { + let that = this + wx.notifyBLECharacteristicValueChange({ + state: true, // 启用 notify 功能 + deviceId: deviceId, + serviceId: serviceId, + characteristicId: notifyId, + success(res) { + wx.onBLECharacteristicValueChange(function(res) { + let value = ab2hex(res.value); + let num = value.substring(18, 19) + let dw = value.substring(19, 20) + let typeInfo = value.substring(10, 12) + console.log("16进制转化:", value); + if (value.length == 26) { + 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 (value.length == 30) { + console.log("阻抗值:", value) + if (typeInfo == "03") { + let imp = parseInt(value.substring(17, 22), 16) + that.setData({ + imp: "阻抗值:" + imp + }) + } - } - if (value.toUpperCase() == "A90026023000589A") { - console.log("测量完成") - that.setData({ - text: "测量完成" - }) - } - }); - }, - fail(res) { - console.log("测量失败", res.value); - } - }); - }, + } + if (value.toUpperCase() == "A90026023000589A") { + console.log("测量完成") + that.setData({ + text: "测量完成" + }) + } + }); + }, + fail(res) { + console.log("测量失败", res.value); + } + }); + }, - /** - * 断开蓝牙模块 - */ - closeBluetoothAdapter() { - wx.closeBluetoothAdapter() - this._discoveryStarted = false - wx.showToast({ - title: '断开蓝牙模块', - icon: 'none' - }) - this.setData({ - devices: [], - weight: "", - text: "", - imp: "" - }) - }, - // 断开与低功耗蓝牙设备的连接 - closeBLEConnection() { - wx.closeBLEConnection({ - deviceId: this._deviceId - }) - wx.showToast({ - title: '断开蓝牙连接', - icon: 'none' - }) - this.setData({ - connected: false, - devices: [], - text: "", - weight: "", - imp: "" - }) - }, + /** + * 断开蓝牙模块 + */ + closeBluetoothAdapter() { + wx.closeBluetoothAdapter() + this._discoveryStarted = false + wx.showToast({ + title: '断开蓝牙模块', + icon: 'none' + }) + this.setData({ + devices: [], + weight: "", + text: "", + imp: "" + }) + }, + // 断开与低功耗蓝牙设备的连接 + closeBLEConnection() { + wx.closeBLEConnection({ + deviceId: this._deviceId + }) + wx.showToast({ + title: '断开蓝牙连接', + icon: 'none' + }) + this.setData({ + connected: false, + devices: [], + text: "", + weight: "", + imp: "" + }) + }, }); diff --git a/pages/index/index.wxml b/pages/index/index.wxml index f69d2e8..7dd1b89 100644 --- a/pages/index/index.wxml +++ b/pages/index/index.wxml @@ -1,25 +1,27 @@ - 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 + } - - PCD01PRO - PCH08/09 - PCF01B - PCF01pro(旧) - PCF01pro(新) - PCF08 - PCJ02 - G01 - B03 - - L08 - + + PCD01PRO + H01PRO + PCH08/09 + PCF01B + PCF01pro(旧) + PCF01pro(新) + PCF08 + L08 + B03 + PCJ02 + G01 + + + diff --git a/project.config.json b/project.config.json index ae58e57..e252818 100644 --- a/project.config.json +++ b/project.config.json @@ -1,57 +1,56 @@ { - "description": "项目配置文件,详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", - "packOptions": { - "ignore": [], - "include": [] - }, - "setting": { - "urlCheck": true, - "es6": false, - "enhance": true, - "postcss": true, - "preloadBackgroundData": false, - "minified": true, - "newFeature": false, - "coverView": true, - "nodeModules": false, - "autoAudits": false, - "showShadowRootInWxmlPanel": true, - "scopeDataCheck": false, - "uglifyFileName": false, - "checkInvalidKey": true, - "checkSiteMap": true, - "uploadWithSourceMap": true, - "compileHotReLoad": false, - "lazyloadPlaceholderEnable": false, - "useMultiFrameRuntime": true, - "useApiHook": true, - "useApiHostProcess": false, - "babelSetting": { - "ignore": [], - "disablePlugins": [], - "outputPath": "" + "description": "项目配置文件,详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "packOptions": { + "ignore": [], + "include": [] }, - "useIsolateContext": true, - "userConfirmedBundleSwitch": false, - "packNpmManually": false, - "packNpmRelationList": [], - "minifyWXSS": true, - "showES6CompileOption": false, - "disableUseStrict": false, - "ignoreUploadUnusedFiles": true, - "useStaticServer": true, - "useCompilerPlugins": false, - "minifyWXML": true - }, - "compileType": "miniprogram", - "libVersion": "2.16.0", - "projectname": "bluetooth_demo", - "simulatorType": "wechat", - "simulatorPluginLibVersion": {}, - "appid": "wxcea3504a31518eb6", - "condition": {}, - "editorSetting": { - "tabIndent": "insertSpaces", - "tabSize": 2 - } + "setting": { + "urlCheck": true, + "es6": false, + "enhance": true, + "postcss": true, + "preloadBackgroundData": false, + "minified": true, + "newFeature": false, + "coverView": true, + "nodeModules": false, + "autoAudits": false, + "showShadowRootInWxmlPanel": true, + "scopeDataCheck": false, + "uglifyFileName": false, + "checkInvalidKey": true, + "checkSiteMap": true, + "uploadWithSourceMap": true, + "compileHotReLoad": false, + "lazyloadPlaceholderEnable": false, + "useMultiFrameRuntime": true, + "useApiHook": true, + "useApiHostProcess": true, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + }, + "useIsolateContext": true, + "userConfirmedBundleSwitch": false, + "packNpmManually": false, + "packNpmRelationList": [], + "minifyWXSS": true, + "disableUseStrict": false, + "minifyWXML": true, + "showES6CompileOption": false, + "useCompilerPlugins": false, + "ignoreUploadUnusedFiles": true + }, + "compileType": "miniprogram", + "libVersion": "2.16.0", + "projectname": "bluetooth_demo", + "simulatorType": "wechat", + "simulatorPluginLibVersion": {}, + "appid": "wxcea3504a31518eb6", + "editorSetting": { + "tabIndent": "insertSpaces", + "tabSize": 2 + }, + "condition": {} } \ No newline at end of file