diff --git a/app.json b/app.json index 9994e3b..2c54782 100644 --- a/app.json +++ b/app.json @@ -2,7 +2,15 @@ "pages": [ "pages/index/index", "pages/PCD01PRO/index", - "pages/PCH0809/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", @@ -11,6 +19,12 @@ "backgroundColor": "#eeeeee", "backgroundTextStyle": "light" }, + "plugins": { + "sdkPlugin": { + "version": "2.1.0", + "provider": "wx17e93aad47cdae1a" + } + }, "style": "v2", "sitemapLocation": "sitemap.json" } diff --git a/app.wxss b/app.wxss index e18f0d0..2354342 100644 --- a/app.wxss +++ b/app.wxss @@ -57,7 +57,7 @@ page { width: 100%; height: auto; display: flex; - justify-content: space-around; + justify-content: space-between; flex-wrap: wrap; } .item{ diff --git a/pages/FB03/index.js b/pages/FB03/index.js new file mode 100644 index 0000000..08f0469 --- /dev/null +++ b/pages/FB03/index.js @@ -0,0 +1,319 @@ +const util = require("../../utils/util"); +const { + inArray, + ab2hex +} = util +const plugin = requirePlugin("sdkPlugin").AiLink; +Page({ + data: { + devices: [], + connected: false, + name: '', + weight: "", + text: "", + uuid1: "", + uuid2: "", + uuid3: "", + 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: 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 + } + 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: "", + }) + } + }) + }, + + // 获取蓝牙设备的 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) { + let that = this + this._deviceId = deviceId + this._serviceId = serviceId + this._device.serviceId = serviceId + wx.getBLEDeviceCharacteristics({ + deviceId, + serviceId, + success: (res) => { + console.log("特征值:", res) + for (let i = 0; i < res.characteristics.length; i++) { + let item = res.characteristics[i]; + if (item.uuid.indexOf('0000FFE1') != -1) { + that.data.uuid1 = item.uuid //主服务 UUID + } else if (item.uuid.indexOf('0000FE2') != -1) { + that.data.uuid2 = item.uuid //写入设置 + } else if (item.uuid.indexOf('0000FFE3') != -1) { + that.data.uuid3 = item.uuid //监听数据 + } + } + wx.notifyBLECharacteristicValueChange({ + deviceId, + serviceId, + characteristicId: that.data.uuid2, + state: true, + }) + wx.notifyBLECharacteristicValueChange({ + deviceId, + serviceId, + characteristicId: that.data.uuid3, + state: true, + }) + plugin.initPlugin(res.characteristics, this._device) + wx.onBLECharacteristicValueChange((characteristic) => { + let bleData = plugin.parseBleData(characteristic.value) + let dw1 = "kg" + if (bleData.status == 0) { + console.log("握手成功") + } else if (bleData.status == 1) { + let payload = ab2hex(bleData.data, '') + let typeInfo = payload.substring(0, 2) + let unit = payload.substring(6, 8) // 单位 + let num = payload.substring(8, 9) //正负数 + let dot = payload.substring(9, 10) //小数点 + let data = parseInt(payload.substring(2, 6), 16) + if (unit == "01") { + dw1 = "斤" + } + if (unit == "04") { + dw1 = "lb" + } + if (unit == "05") { + dw1 = "g" + } + if (unit == "06") { + dw1 = 'lb' + } + // + if (num == "0") { + that.setData({ + text: "重量为正数" + }) + } + if (num == "1") { + that.setData({ + text: "重量为负数" + }) + } + // + if (dot == "1") { + data = data / 10 + } + if (dot == "2") { + data = data / 100 + } + if (dot == "3") { + data = data / 1000 + } + if (typeInfo == "01") { + that.setData({ + weight: "稳定体重是" + data + dw1 + }) + } + if (typeInfo == "02") { + that.setData({ + weight: "实时体重是:" + data + dw1 + }) + } + } + }) + + }, + fail(res) { + console.error('getBLEDeviceCharacteristics', res) + } + }) + }, + handleIsNum() { + let that = this + let str = [0x83, 0x01] + plugin.sendDataOfA7(str) + }, + // 归零 + handleIsLing() { + let str = [0x83, 0x00] + console.log("归零指令", str) + plugin.sendDataOfA7(str) + }, + /** + * 断开蓝牙模块 + */ + closeBluetoothAdapter() { + wx.closeBluetoothAdapter() + this._discoveryStarted = false + wx.showToast({ + title: '断开蓝牙模块', + icon: 'none' + }) + this.setData({ + devices: [], + weight: "", + text: "", + }) + }, + // 断开与低功耗蓝牙设备的连接 + closeBLEConnection() { + wx.closeBLEConnection({ + deviceId: this._deviceId + }) + wx.showToast({ + title: '断开蓝牙连接', + icon: 'none' + }) + this.setData({ + connected: false, + devices: [], + text: "", + weight: "", + }) + }, + +}); diff --git a/pages/FB03/index.json b/pages/FB03/index.json new file mode 100644 index 0000000..b55b5a2 --- /dev/null +++ b/pages/FB03/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": { + } +} \ No newline at end of file diff --git a/pages/FB03/index.wxml b/pages/FB03/index.wxml new file mode 100644 index 0000000..994ce38 --- /dev/null +++ b/pages/FB03/index.wxml @@ -0,0 +1,42 @@ + +module.exports.max = function(n1, n2) { + return Math.max(n1, n2) +} +module.exports.len = function(arr) { + arr = arr || [] + return arr.length +} + + + + + + + + + + + {{weight}} + {{text}} + + 已发现 {{devices.length}} 个外围设备: + + + + {{item.name}} + (信号强度: {{item.RSSI}}dBm) + + mac地址: {{item.macAddr || item.deviceId}} + + + + + + diff --git a/pages/FB03/index.wxss b/pages/FB03/index.wxss new file mode 100644 index 0000000..23ef694 --- /dev/null +++ b/pages/FB03/index.wxss @@ -0,0 +1 @@ +/* pages/PCD01PRO/index.wxss */ \ No newline at end of file diff --git a/pages/G01/index.js b/pages/G01/index.js new file mode 100644 index 0000000..4e06d3a --- /dev/null +++ b/pages/G01/index.js @@ -0,0 +1,154 @@ +const util = require("../../utils/util"); +const { + inArray, + ab2hex +} = util +Page({ + data: { + connected: false, + height: "", + devices: [], + 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: 1000, //上报设备的间隔 + services: [ + "FFF0", + ], + success: (res) => { + this.onBluetoothDeviceFound() + }, + }) + }, + // 停止搜寻附近的蓝牙外围设备 + stopBluetoothDevicesDiscovery() { + wx.stopBluetoothDevicesDiscovery() + }, + + // 找到新设备的事件 + onBluetoothDeviceFound() { + let that = this + wx.onBluetoothDeviceFound((res) => { + res.devices.forEach(device => { + if (!device.name && !device.localName) { + return + } + if (device.name.indexOf("WSD") !== -1) { + let value = ab2hex(device.advertisData, "") + let type = value.substring(22, 24) + let num = value.substring(28, 29) + let dw = value.substring(29, 30) + let data = parseInt(value.substring(24, 28), 16) + let unit = "cm" + const foundDevices = this.data.devices + const idx = inArray(foundDevices, 'deviceId', device.deviceId) + const dataT = {} + let buffer = device.advertisData.slice(3, 9) + device.mac = new Uint8Array(buffer) // 保存广播数据中的mac地址,这是由于iOS不直接返回mac地址 + let tempMac = Array.from(device.mac) + tempMac.reverse() + device.macAddr = ab2hex(tempMac, ':').toUpperCase() + if (idx === -1) { + dataT[`devices[${foundDevices.length}]`] = device + } else { + dataT[`devices[${idx}]`] = device + } + this.setData(dataT) + if (dw == "1") { + unit = "FT" + data = data * 2.54 + } + if (num == "1") { + data = data / 10 + } + if (num == "2") { + data = data / 100 + } + if (num == "3") { + data = data / 1000 + } + if (type == "01") { + that.setData({ + height: data + unit + }) + return + } + } + + }) + }) + }, + //监听蓝牙连接状态 + onBLEConnectionStateChange() { + wx.onBLEConnectionStateChange((res) => { + if (!res.connected) { + wx.stopBluetoothDevicesDiscovery(); + setTimeout(() => { + wx.showToast({ + title: '连接已断开', + icon: 'none' + }) + }, 500) + this.setData({ + connected: false, + devices: [], + height: "", + }) + } + }) + }, + + /** + * 断开蓝牙模块 + */ + closeBluetoothAdapter() { + wx.stopBluetoothDevicesDiscovery(); + wx.closeBluetoothAdapter() + this._discoveryStarted = false + wx.showToast({ + title: '结束流程', + icon: 'none' + }) + this.setData({ + devices: [], + height: "", + }) + }, +}); diff --git a/pages/G01/index.json b/pages/G01/index.json new file mode 100644 index 0000000..b55b5a2 --- /dev/null +++ b/pages/G01/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": { + } +} \ No newline at end of file diff --git a/pages/G01/index.wxml b/pages/G01/index.wxml new file mode 100644 index 0000000..312df1d --- /dev/null +++ b/pages/G01/index.wxml @@ -0,0 +1,38 @@ + +module.exports.max = function(n1, n2) { + return Math.max(n1, n2) +} +module.exports.len = function(arr) { + arr = arr || [] + return arr.length +} + + + + + + + + + {{height}} + + 已发现 {{devices.length}} 个外围设备: + + + + {{item.name}} + (信号强度: {{item.RSSI}}dBm) + + mac地址: {{item.macAddr || item.deviceId}} + + + + + + diff --git a/pages/G01/index.wxss b/pages/G01/index.wxss new file mode 100644 index 0000000..23ef694 --- /dev/null +++ b/pages/G01/index.wxss @@ -0,0 +1 @@ +/* pages/PCD01PRO/index.wxss */ \ No newline at end of file diff --git a/pages/L08/index.js b/pages/L08/index.js new file mode 100644 index 0000000..23022f2 --- /dev/null +++ b/pages/L08/index.js @@ -0,0 +1,353 @@ +const util = require("../../utils/util"); +const { + inArray, + ab2hex +} = util +const plugin = requirePlugin("sdkPlugin").AiLink; +Page({ + data: { + devices: [], + connected: false, + name: '', + weight: "", + text: "", + imp2: '', + imp3: '', + imp4: '', + imp5: '', + imp7: '', + uuid1: null, + uuid2: null, + uuid3: null, + 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: 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 && !device.localName) { + return + } + 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 + } + 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: "", + text: "", + imp2: '', + imp3: '', + imp4: '', + imp5: '', + imp7: '', + }) + } + }) + }, + + // 获取蓝牙设备的 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) { + 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) + for (let i = 0; i < res.characteristics.length; i++) { + let item = res.characteristics[i]; + if (item.uuid.indexOf('0000FFE1') != -1) { + that.data.uuid1 = item.uuid //主服务 UUID + } else if (item.uuid.indexOf('0000FFE2') != -1) { + that.data.uuid2 = item.uuid //写入设置 + } else if (item.uuid.indexOf('0000FFE3') != -1) { + that.data.uuid3 = item.uuid //监听数据 + } + } + wx.notifyBLECharacteristicValueChange({ + deviceId, + serviceId, + characteristicId: that.data.uuid2, + state: true, + }) + wx.notifyBLECharacteristicValueChange({ + deviceId, + serviceId, + characteristicId: that.data.uuid3, + state: true, + }) + plugin.initPlugin(res.characteristics, this._device) + wx.onBLECharacteristicValueChange((characteristic) => { + let bleData = plugin.parseBleData(characteristic.value) + if (bleData.status == 0) { + console.log("握手成功") + } else if (bleData.status == 1) { + let payload = ab2hex(bleData.data, '') + let dw1 = "kg" + let type = payload.substring(0, 2) + let typeInfo = payload.substring(2, 4) + if (type == "01") { //体脂模式 + let data = parseInt(payload.substring(4, 10), 16) + let num = payload.substring(10, 11) + let dw = payload.substring(11, 12) + if (dw == "1") { + dw1 = "斤" + } + if (num == "1") { + data = data / 10 + } + if (num == "2") { + data = data / 100 + } + if (num == "3") { + data = data / 1000 + } + if (typeInfo == "01") { + that.setData({ + weight: "实时体重是:" + data + dw1 + }) + } + if (typeInfo == "02") { + that.setData({ + weight: "稳定体重是:" + data + dw1 + }) + } + } + if (type == "02") { + console.log("阻抗类型:", payload, type, typeInfo, parseInt(payload + .substring(6, 14), 16)) //阻抗模式 + if (typeInfo == "02") { + that.setData({ + imp7: "阻抗测量失败" + }) + } + if (typeInfo == "03") { + let mcu = payload.substring(4, 6) + if (mcu == "02") { + that.setData({ + imp2: "左手阻抗:" + parseInt(payload.substring( + 6, 14), 16) + }) + } + if (mcu == "03") { + that.setData({ + imp3: "右手阻抗:" + parseInt(payload.substring( + 6, 14), 16) + }) + } + if (mcu == "04") { + that.setData({ + imp4: "左脚阻抗:" + parseInt(payload.substring( + 6, 14), 16) + }) + } + if (mcu == "05") { + that.setData({ + imp5: "右脚阻抗:" + parseInt(payload.substring( + 6, 14), 16) + }) + } + + if (mcu == "07") { + that.setData({ + imp7: "躯干阻抗:" + parseInt(payload.substring( + 6, 14), 16) + }) + } + } + } + if (type == "0f") { + that.setData({ + text: "测量完成" + }) + } + } + }) + }, + fail(res) { + console.error('getBLEDeviceCharacteristics', res) + } + }) + }, + + /** + * 断开蓝牙模块 + */ + closeBluetoothAdapter() { + wx.closeBluetoothAdapter() + this._discoveryStarted = false + wx.showToast({ + title: '断开蓝牙模块', + icon: 'none' + }) + this.setData({ + devices: [], + weight: "", + text: "", + imp2: '', + imp3: '', + imp4: '', + imp5: '', + imp7: '', + }) + }, + // 断开与低功耗蓝牙设备的连接 + closeBLEConnection() { + wx.closeBLEConnection({ + deviceId: this._deviceId + }) + wx.showToast({ + title: '断开蓝牙连接', + icon: 'none' + }) + this.setData({ + connected: false, + devices: [], + weight: "", + text: "", + imp2: '', + imp3: '', + imp4: '', + imp5: '', + imp7: '', + }) + }, + +}); diff --git a/pages/L08/index.json b/pages/L08/index.json new file mode 100644 index 0000000..b55b5a2 --- /dev/null +++ b/pages/L08/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": { + } +} \ No newline at end of file diff --git a/pages/L08/index.wxml b/pages/L08/index.wxml new file mode 100644 index 0000000..b847b4f --- /dev/null +++ b/pages/L08/index.wxml @@ -0,0 +1,46 @@ + +module.exports.max = function(n1, n2) { + return Math.max(n1, n2) +} +module.exports.len = function(arr) { + arr = arr || [] + return arr.length +} + + + + + + + + + + {{weight}} + {{text}} + {{imp2}} + {{imp3}} + {{imp4}} + {{imp5}} + {{imp7}} + + 已发现 {{devices.length}} 个外围设备: + + + + {{item.name}} + (信号强度: {{item.RSSI}}dBm) + + mac地址: {{item.macAddr || item.deviceId}} + + + + + + diff --git a/pages/L08/index.wxss b/pages/L08/index.wxss new file mode 100644 index 0000000..23ef694 --- /dev/null +++ b/pages/L08/index.wxss @@ -0,0 +1 @@ +/* pages/PCD01PRO/index.wxss */ \ No newline at end of file diff --git a/pages/PCD01PRO/index.js b/pages/PCD01PRO/index.js index 5020739..f076b62 100644 --- a/pages/PCD01PRO/index.js +++ b/pages/PCD01PRO/index.js @@ -52,8 +52,9 @@ Page({ } this._discoveryStarted = true wx.startBluetoothDevicesDiscovery({ - allowDuplicatesKey: true, //是否允许重复上报同一设备 - services: [ //要搜索蓝牙设备主 service 的 uuid 列表 + allowDuplicatesKey: true, + interval: 1000, //上报设备的间隔 + services: [ "FFE0", ], success: (res) => { @@ -221,7 +222,7 @@ Page({ characteristicId: notifyId, success(res) { wx.onBLECharacteristicValueChange(function(res) { - let value = ab2hex(res.value); + let value = ab2hex(res.value,""); let num = value.substring(18, 19) let dw = value.substring(19, 20) let typeInfo = value.substring(10, 12) diff --git a/pages/PCF01B/index.js b/pages/PCF01B/index.js new file mode 100644 index 0000000..1319dd6 --- /dev/null +++ b/pages/PCF01B/index.js @@ -0,0 +1,339 @@ +const util = require("../../utils/util"); +const { + inArray, + ab2hex +} = util + +Page({ + data: { + devices: [], + connected: false, + cmd: '', + name: '', + weight: "", + height:"", + text: "", + imp: "", + 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: 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.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].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 type = value.substring(8, 10) + let typeInfo = value.substring(10, 12) + 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) / 10 + that.setData({ + height: "身高是:" + 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") { + 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: "", + height:"", + text: "", + imp: "" + }) + }, + // 断开与低功耗蓝牙设备的连接 + closeBLEConnection() { + wx.closeBLEConnection({ + deviceId: this._deviceId + }) + wx.showToast({ + title: '断开蓝牙连接', + icon: 'none' + }) + this.setData({ + connected: false, + devices: [], + text: "", + height:"", + weight: "", + imp: "" + }) + }, + +}); diff --git a/pages/PCF01B/index.json b/pages/PCF01B/index.json new file mode 100644 index 0000000..b55b5a2 --- /dev/null +++ b/pages/PCF01B/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": { + } +} \ No newline at end of file diff --git a/pages/PCF01B/index.wxml b/pages/PCF01B/index.wxml new file mode 100644 index 0000000..230e658 --- /dev/null +++ b/pages/PCF01B/index.wxml @@ -0,0 +1,43 @@ + +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/PCF01B/index.wxss b/pages/PCF01B/index.wxss new file mode 100644 index 0000000..23ef694 --- /dev/null +++ b/pages/PCF01B/index.wxss @@ -0,0 +1 @@ +/* pages/PCD01PRO/index.wxss */ \ No newline at end of file diff --git a/pages/PCF01proFRK/index.js b/pages/PCF01proFRK/index.js new file mode 100644 index 0000000..933670f --- /dev/null +++ b/pages/PCF01proFRK/index.js @@ -0,0 +1,287 @@ +const util = require("../../utils/util"); +const { + inArray, + ab2hex +} = util +const plugin = requirePlugin("sdkPlugin").AiLink; +Page({ + data: { + devices: [], + connected: false, + cmd: '', + name: '', + weight: "", + height: "", + text: "", + imp: "", + 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: 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 && !device.localName) { + return + } + 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 + } + 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].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) { + 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) + // 初始化插件 + plugin.initPlugin(res.characteristics, that._device) + + wx.onBLECharacteristicValueChange((characteristic) => { + let bleData = plugin.parseBleData(characteristic.value) + let dw1 = "kg" + if (bleData.status == 0) { + console.log("握手成功") + } else if (bleData.status == 1) { + let payload = ab2hex(bleData.data, '') + let type = payload.substring(0, 2) + let typeInfo = payload.substring(4, 6) + console.log("payload", payload) + if (type == "10" || type == "40") { //体脂模式 + let data = parseInt(payload.substring(6, 12), 16) + let num = payload.substring(12, 13) + let dw = payload.substring(13, 14) + if (dw == "1") { + dw1 = "斤" + } + if (num == "1") { + data = data / 10 + } + if (num == "2") { + data = data / 100 + } + if (num == "3") { + data = data / 1000 + } + if (typeInfo == "01") { + that.setData({ + weight: "实时体重是:" + data + dw1 + }) + } + if (typeInfo == "02") { + that.setData({ + weight: "稳定体重是:" + data + dw1 + }) + } + } + if (type == "14" || type == "41") { //身高模式 + let height = parseInt(payload.substring(4, 8), 16) + that.setData({ + height: "身高是:" + height + }) + } + if (type == "11") { //阻抗模式 + if (typeInfo == "03" || typeInfo == "04") { + let imp = parseInt(payload.substring(8, 12), 16) + console.log("imp", payload, imp) + that.setData({ + imp: "阻抗值:" + imp + }) + } + } + } + }) + }, + fail(res) { + console.error('getBLEDeviceCharacteristics', res) + } + }) + }, + + /** + * 断开蓝牙模块 + */ + closeBluetoothAdapter() { + wx.closeBluetoothAdapter() + this._discoveryStarted = false + wx.showToast({ + title: '断开蓝牙模块', + icon: 'none' + }) + this.setData({ + devices: [], + weight: "", + height: "", + text: "", + imp: "" + }) + }, + // 断开与低功耗蓝牙设备的连接 + closeBLEConnection() { + wx.closeBLEConnection({ + deviceId: this._deviceId + }) + wx.showToast({ + title: '断开蓝牙连接', + icon: 'none' + }) + this.setData({ + connected: false, + devices: [], + text: "", + height: "", + weight: "", + imp: "" + }) + }, + +}); diff --git a/pages/PCF01proFRK/index.json b/pages/PCF01proFRK/index.json new file mode 100644 index 0000000..b55b5a2 --- /dev/null +++ b/pages/PCF01proFRK/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": { + } +} \ No newline at end of file diff --git a/pages/PCF01proFRK/index.wxml b/pages/PCF01proFRK/index.wxml new file mode 100644 index 0000000..230e658 --- /dev/null +++ b/pages/PCF01proFRK/index.wxml @@ -0,0 +1,43 @@ + +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/PCF01proFRK/index.wxss b/pages/PCF01proFRK/index.wxss new file mode 100644 index 0000000..23ef694 --- /dev/null +++ b/pages/PCF01proFRK/index.wxss @@ -0,0 +1 @@ +/* pages/PCD01PRO/index.wxss */ \ No newline at end of file diff --git a/pages/PCF08/index.js b/pages/PCF08/index.js new file mode 100644 index 0000000..5af8062 --- /dev/null +++ b/pages/PCF08/index.js @@ -0,0 +1,406 @@ +const util = require("../../utils/util"); +const { + inArray, + ab2hex +} = util +Page({ + data: { + devices: [], + connected: false, + cmd: '', + name: '', + weight: "", + height: "", + text: "", + imp0: '', + imp1: '', + imp2: '', + imp3: '', + imp4: '', + imp5: '', + imp7: '', + uuid1: null, + uuid2: null, + uuid3: null, + 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: 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 && !device.localName) { + return + } + 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 + } + 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: "", + imp0: '', + imp1: '', + imp2: '', + imp3: '', + imp4: '', + imp5: '', + imp7: '', + }) + } + }) + }, + + // 获取蓝牙设备的 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) { + 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) + wx.showLoading({ + title: '获取特征值成功', + }) + 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 //写入设置 + that.notifyBLECharacteristicValue(deviceId, serviceId, item.uuid) + } else if (item.uuid.indexOf('FFE3') != -1) { + that.data.uuid3 = item.uuid //监听数据 + } + } + wx.hideLoading() + }, + 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((characteristic) => { + let value = ab2hex(characteristic.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("type", type) + if (type == "01") { // 称重模式 + let data = parseInt(value.substring(13, 18), 16) + let dw1 = "kg" + if (dw == "1") { + dw1 = "斤" + } + if (dw == "4") { + dw1 = "st:lb" + } + if (dw == "6") { + dw1 = "lb" + } + if (num == "1") { + data = parseInt(value.substring(13, 18), 16) / 10 + } + if (num == "2") { + data = parseInt(value.substring(13, 18), 16) / 100 + } + if (num == "3") { + data = parseInt(value.substring(13, 18), 16) / 1000 + } + if (typeInfo == "01") { + that.setData({ + weight: "实时体重是:" + data + dw1 + }) + } + if (typeInfo == "02") { + that.setData({ + weight: "稳定体重是:" + data + dw1 + }) + } + } + if (type == "02") { //阻抗 + let mcu = value.substring(12, 14) + console.log("typeInfo", typeInfo) + if (typeInfo == "02") { + that.setData({ + imp0: "阻抗值测量失败" + }) + } else if (typeInfo == "03") { + if (mcu == "00") { + let imp0 = parseInt(value.substring(14, 22), 16) + that.setData({ + imp0: "双脚阻抗:" + imp0 + }) + } + if (mcu == "01") { + let imp1 = parseInt(value.substring(14, 22), 16) + that.setData({ + imp1: "双手阻抗:" + imp1 + }) + console.log("双手", imp1) + } + if (mcu == "02") { + let imp2 = parseInt(value.substring(14, 22), 16) + that.setData({ + imp2: "左手阻抗:" + imp2 + }) + console.log("左手阻抗", imp2) + } + if (mcu == "03") { + let imp3 = parseInt(value.substring(14, 22), 16) + that.setData({ + imp3: "右手阻抗:" + imp3 + }) + console.log("右手阻抗", imp3) + } + if (mcu == "04") { + let imp4 = parseInt(value.substring(14, 22), 16) + that.setData({ + imp4: "左脚阻抗:" + imp4 + }) + console.log("左脚阻抗", imp4) + } + if (mcu == "05") { + let imp5 = parseInt(value.substring(14, 22), 16) + that.setData({ + imp5: "右脚阻抗:" + imp5 + }) + console.log("右脚阻抗", imp5) + } + if (mcu == "07") { + let imp7 = parseInt(value.substring(14, 22), 16) + that.setData({ + imp7: "右全身阻抗:" + imp7 + }) + } + } + } + if (type == "05") { //身高 + let height = parseInt(value.substring(14, 18), 16) / 10 + let dw1 = "cm" + if (dw == "01") { + dw1 = "inch" + } + if (dw == "02") { + dw1 = "ft-in" + } + if (typeInfo == "02") { + that.setData({ + height: "身高:" + height + "单位:" + dw1 + }) + } else if (typeInfo == "03" || typeInfo == "04") { + that.setData({ + height: "身高测量失败" + }) + } + + } + }) + }, + fail(res) { + console.error('getBLEDeviceCharacteristics', res) + } + }) + }, + + /** + * 断开蓝牙模块 + */ + closeBluetoothAdapter() { + wx.closeBluetoothAdapter() + this._discoveryStarted = false + wx.showToast({ + title: '断开蓝牙模块', + icon: 'none' + }) + this.setData({ + devices: [], + weight: "", + height: "", + text: "", + imp: "", + imp0: '', + imp1: '', + imp2: '', + imp3: '', + imp4: '', + imp5: '', + imp7: '', + }) + }, + // 断开与低功耗蓝牙设备的连接 + closeBLEConnection() { + wx.closeBLEConnection({ + deviceId: this._deviceId + }) + wx.showToast({ + title: '断开蓝牙连接', + icon: 'none' + }) + this.setData({ + connected: false, + devices: [], + text: "", + height: "", + weight: "", + imp: "", + imp0: '', + imp1: '', + imp2: '', + imp3: '', + imp4: '', + imp5: '', + imp7: '', + }) + }, + +}); diff --git a/pages/PCF08/index.json b/pages/PCF08/index.json new file mode 100644 index 0000000..b55b5a2 --- /dev/null +++ b/pages/PCF08/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": { + } +} \ No newline at end of file diff --git a/pages/PCF08/index.wxml b/pages/PCF08/index.wxml new file mode 100644 index 0000000..47ca9b9 --- /dev/null +++ b/pages/PCF08/index.wxml @@ -0,0 +1,48 @@ + +module.exports.max = function(n1, n2) { + return Math.max(n1, n2) +} +module.exports.len = function(arr) { + arr = arr || [] + return arr.length +} + + + + + + + + + + {{weight}} + {{height}} + {{imp0}} + {{imp1}} + {{imp2}} + {{imp3}} + {{imp4}} + {{imp5}} + {{imp7}} + + 已发现 {{devices.length}} 个外围设备: + + + + {{item.name}} + (信号强度: {{item.RSSI}}dBm) + + mac地址: {{item.macAddr || item.deviceId}} + + + + + + diff --git a/pages/PCF08/index.wxss b/pages/PCF08/index.wxss new file mode 100644 index 0000000..23ef694 --- /dev/null +++ b/pages/PCF08/index.wxss @@ -0,0 +1 @@ +/* pages/PCD01PRO/index.wxss */ \ No newline at end of file diff --git a/pages/PCH0809/index - 副本.js b/pages/PCH0809/index - 副本.js new file mode 100644 index 0000000..0e89c2d --- /dev/null +++ b/pages/PCH0809/index - 副本.js @@ -0,0 +1,430 @@ +const util = require("../../utils/util"); +const { + 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() + } + }) + } + } + }) + }, + + // 开始搜寻附近的蓝牙外围设备 + 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: "" + }) + } + }) + }, + + // 获取蓝牙设备的 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: '断开蓝牙模块', + icon: 'none' + }) + this.setData({ + devices: [], + weight: "", + text: "", + imp: "", + isType: false + }) + }, + // 断开与低功耗蓝牙设备的连接 + closeBLEConnection() { + wx.closeBLEConnection({ + deviceId: this._deviceId + }) + wx.showToast({ + title: '断开蓝牙连接', + icon: 'none' + }) + this.setData({ + connected: false, + isType: false, + devices: [], + text: "", + weight: "", + imp: "" + }) + }, + +}); diff --git a/pages/PCH0809/index.js b/pages/PCH0809/index.js index 0639308..832da5f 100644 --- a/pages/PCH0809/index.js +++ b/pages/PCH0809/index.js @@ -66,8 +66,9 @@ Page({ } this._discoveryStarted = true wx.startBluetoothDevicesDiscovery({ - allowDuplicatesKey: true, //是否允许重复上报同一设备 - services: [ //要搜索蓝牙设备主 service 的 uuid 列表 + allowDuplicatesKey: true, + interval: 1000, //上报设备的间隔 + services: [ "FFE0", ], success: (res) => { @@ -138,9 +139,9 @@ Page({ }, fail: res => { this._connLoading = false - wx.hideLoading() wx.showToast({ title: '连接失败', + duration: 2000, icon: 'none' }) } @@ -153,6 +154,7 @@ Page({ setTimeout(() => { wx.showToast({ title: '连接已断开', + duration: 2000, icon: 'none' }) }, 500) @@ -175,12 +177,14 @@ Page({ 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.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 } } @@ -201,7 +205,6 @@ Page({ deviceId, serviceId, success: (res) => { - wx.hideLoading() console.log('getBLEDeviceCharacteristics success', res.characteristics) for (let i = 0; i < res.characteristics.length; i++) { let item = res.characteristics[i]; @@ -229,7 +232,7 @@ Page({ state: true, }) wx.onBLECharacteristicValueChange((res) => { - let value = ab2hex(res.value); + let value = ab2hex(res.value, ""); console.log("16进制转化:", value); let num = value.substring(18, 19) let dw = value.substring(19, 20) @@ -276,7 +279,7 @@ Page({ }) } } - if (type == "14" ) { //身高模式 + if (type == "14") { //身高模式 let height = parseInt(value.substring(10, 14), 16) that.setData({ height: "您的身高是:" + height @@ -293,7 +296,6 @@ Page({ } } if (value.toUpperCase() == "A90026023000589A") { - console.log("测量完成") that.setData({ text: "测量完成" }) @@ -324,23 +326,28 @@ Page({ }, confirmPwd() { let that = this - console.log(that.data.pwdInput) 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) - let num = 2 - if (that.data.pwdInput.toString().split(".")[1].length) { + 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) } - let str = "A90026074003" + atr + num + "000" + j.substr(j.length - 2, 2) + "9a" - console.log("协议:", j, j.substr(j.length - 2, 2), w, atr, num, str) + // 根据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) })) @@ -349,16 +356,16 @@ Page({ }, sendData(buffer) { let that = this - console.log("指令信息", that.data.deviceId, that.data.serviceId, ab2hex(buffer)) wx.writeBLECharacteristicValue({ deviceId: that.data.deviceId, serviceId: that.data.serviceId, - characteristicId: that.data.uuid2, + characteristicId: that.data.uuid1, value: buffer, success: res => { console.log('下发指令', res.errMsg) wx.showToast({ title: '下发指令成功', + duration: 2000, icon: 'none' }) this.setData({ @@ -368,6 +375,7 @@ Page({ fail: res => { wx.showToast({ title: '下发指令失败', + duration: 2000, icon: 'none' }) this.setData({ @@ -390,6 +398,7 @@ Page({ this._discoveryStarted = false wx.showToast({ title: '断开蓝牙模块', + duration: 2000, icon: 'none' }) this.setData({ @@ -407,6 +416,7 @@ Page({ }) wx.showToast({ title: '断开蓝牙连接', + duration: 2000, icon: 'none' }) this.setData({ diff --git a/pages/PCJ02/index.js b/pages/PCJ02/index.js new file mode 100644 index 0000000..d449d69 --- /dev/null +++ b/pages/PCJ02/index.js @@ -0,0 +1,184 @@ +const util = require("../../utils/util"); +const { + inArray, + ab2hex +} = util +const plugin = requirePlugin("sdkPlugin").AiLink; +Page({ + data: { + connected: false, + name: '', + weight: "", + height: "", + imp: "", + devices: [], + 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: 1000, //上报设备的间隔 + services: [ + "F0A0", + ], + success: (res) => { + this.onBluetoothDeviceFound() + }, + }) + }, + // 停止搜寻附近的蓝牙外围设备 + stopBluetoothDevicesDiscovery() { + wx.stopBluetoothDevicesDiscovery() + }, + + // 找到新设备的事件 + onBluetoothDeviceFound() { + let that = this + wx.onBluetoothDeviceFound((res) => { + res.devices.forEach(device => { + if (!device.name && !device.localName) { + return + } + if (device.advertisServiceUUIDs[0].indexOf("F0A0") !== -1) { + let parseDataRes = plugin.parseBroadcastData(device.advertisData) + let analyzeData = plugin.analyzeBroadcastScaleData(parseDataRes) + let analyzeDataText = analyzeData.text + let data = analyzeData.data + const foundDevices = this.data.devices + const idx = inArray(foundDevices, 'deviceId', device.deviceId) + const dataT = {} + let buffer = device.advertisData.slice(0, 8) + device.mac = new Uint8Array(buffer) // 保存广播数据中的mac地址,这是由于iOS不直接返回mac地址 + let tempMac = Array.from(device.mac) + tempMac.reverse() + device.macAddr = ab2hex(tempMac, ':').toUpperCase() + that.imp = dataT.adc + if (idx === -1) { + dataT[`devices[${foundDevices.length}]`] = device + } else { + dataT[`devices[${idx}]`] = device + } + this.setData(dataT) + console.log("analyzeData", analyzeData) + if (parseDataRes.status == 1) { + let dw1 = "kg" + let dwH = "CM" + // 体重单位 + if (data.weightUnit == "1") { + dw1 = "斤" + } + if (data.weightUnit == "4") { + dw1 = "st:lb" + data.weight = 1 * data.weight + 5 + } + if (data.weightUnit == "6") { + dw1 = "lb" + } + if (data.weightDecimal == "1") { + data.weight = data.weight / 10 + } + if (data.weightDecimal == "2") { + data.weight = data.weight / 100 + } + if (data.weightDecimal == "3") { + data.weight = data.weight / 1000 + } + that.setData({ + weight: analyzeData.text + }) + // that.setData({ + // weight: "您的体重是:" + data.weight + dw1 + // }) + //身高单位 + // if (data.tempUnit == "1") { + // dwH = "FT" + // data.tempNegative = data.tempNegative * 2.54 + // } + // that.setData({ + // height: "您的身高是:" + data.tempNegative / 10 + dwH + // }) + return + } + } + + }) + }) + }, + //监听蓝牙连接状态 + onBLEConnectionStateChange() { + wx.onBLEConnectionStateChange((res) => { + if (!res.connected) { + wx.stopBluetoothDevicesDiscovery(); + setTimeout(() => { + wx.showToast({ + title: '连接已断开', + icon: 'none' + }) + }, 500) + this.setData({ + connected: false, + devices: [], + weight: "", + height: "", + text: "", + imp: "" + }) + } + }) + }, + + /** + * 断开蓝牙模块 + */ + closeBluetoothAdapter() { + wx.stopBluetoothDevicesDiscovery(); + wx.closeBluetoothAdapter() + this._discoveryStarted = false + wx.showToast({ + title: '结束流程', + icon: 'none' + }) + this.setData({ + devices: [], + weight: "", + height: "", + text: "", + imp: "" + }) + }, +}); diff --git a/pages/PCJ02/index.json b/pages/PCJ02/index.json new file mode 100644 index 0000000..b55b5a2 --- /dev/null +++ b/pages/PCJ02/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": { + } +} \ No newline at end of file diff --git a/pages/PCJ02/index.wxml b/pages/PCJ02/index.wxml new file mode 100644 index 0000000..5efeb59 --- /dev/null +++ b/pages/PCJ02/index.wxml @@ -0,0 +1,41 @@ + +module.exports.max = function(n1, n2) { + return Math.max(n1, n2) +} +module.exports.len = function(arr) { + arr = arr || [] + return arr.length +} + + + + + + + + + + {{weight}} + {{height}} + {{imp}} + + 已发现 {{devices.length}} 个外围设备: + + + + {{item.name}} + (信号强度: {{item.RSSI}}dBm) + + mac地址: {{item.macAddr || item.deviceId}} + + + + + + diff --git a/pages/PCJ02/index.wxss b/pages/PCJ02/index.wxss new file mode 100644 index 0000000..23ef694 --- /dev/null +++ b/pages/PCJ02/index.wxss @@ -0,0 +1 @@ +/* pages/PCD01PRO/index.wxss */ \ No newline at end of file diff --git a/pages/h018/index.js b/pages/h018/index.js new file mode 100644 index 0000000..2772a83 --- /dev/null +++ b/pages/h018/index.js @@ -0,0 +1,280 @@ +const util = require("../../utils/util"); +const { + inArray, + ab2hex +} = util +const plugin = requirePlugin("sdkPlugin").AiLink; +Page({ + data: { + devices: [], + connected: false, + cmd: '', + name: '', + weight: "", + text: "", + imp: "", + uuid1: "", + uuid2: "", + uuid3: "", + 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: 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.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 + } + } + } + }) + }, + + // 获取蓝牙设备某个服务中所有特征值(characteristic) + /** + * read: true读,write: true写,notify: true广播 + */ + getBLEDeviceCharacteristics(deviceId, serviceId) { + let that = this + this._deviceId = deviceId + this._serviceId = serviceId + this._device.serviceId = serviceId + wx.getBLEDeviceCharacteristics({ + deviceId, + serviceId, + success: (res) => { + console.log("特征值:", res) + 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('FE2') != -1) { + that.data.uuid2 = item.uuid //写入设置 + } else if (item.uuid.indexOf('FFE3') != -1) { + that.data.uuid3 = item.uuid //监听数据 + } + } + wx.notifyBLECharacteristicValueChange({ + deviceId, + serviceId, + characteristicId: that.data.uuid2, + state: true, + }) + wx.notifyBLECharacteristicValueChange({ + deviceId, + serviceId, + characteristicId: that.data.uuid3, + state: true, + }) + plugin.initPlugin(res.characteristics, this._device) + wx.onBLECharacteristicValueChange((characteristic) => { + let bleData = plugin.parseBleData(characteristic.value) + console.log("bleData", bleData) + if (bleData.status == 0) { + console.log("握手成功") + } else if (bleData.status == 1) { + let payload = ab2hex(bleData.data, '') + let type = payload.substring(0, 2) + let typeInfo = payload.substring(4, 6) + console.log("A7-----^", payload) + } else if (bleData.status == 2) { + let payload = ab2hex(bleData.completeData, '') + let type = payload.substring(0, 2) + let typeInfo = payload.substring(4, 6) + console.log('A6-----^', payload) + } + }) + + }, + fail(res) { + console.error('getBLEDeviceCharacteristics', res) + } + }) + }, + submitCmd() { + let str = [0xA6, 0x02, 0x1A, 0x01, 0x1D, 0x6A] + // let str = [0xA6, 0x01, 0x26, 0x27, 0x6A] + console.log("唤醒指令", str) + plugin.sendDataOfA6(str) + }, + /** + * 断开蓝牙模块 + */ + 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/h018/index.json b/pages/h018/index.json new file mode 100644 index 0000000..b55b5a2 --- /dev/null +++ b/pages/h018/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": { + } +} \ No newline at end of file diff --git a/pages/h018/index.wxml b/pages/h018/index.wxml new file mode 100644 index 0000000..cbe4525 --- /dev/null +++ b/pages/h018/index.wxml @@ -0,0 +1,42 @@ + +module.exports.max = function(n1, n2) { + return Math.max(n1, n2) +} +module.exports.len = function(arr) { + arr = arr || [] + return arr.length +} + + + + + + + + + + {{weight}} + {{imp}} + {{text}} + + 已发现 {{devices.length}} 个外围设备: + + + + {{item.name}} + (信号强度: {{item.RSSI}}dBm) + + mac地址: {{item.macAddr || item.deviceId}} + + + + + + diff --git a/pages/h018/index.wxss b/pages/h018/index.wxss new file mode 100644 index 0000000..23ef694 --- /dev/null +++ b/pages/h018/index.wxss @@ -0,0 +1 @@ +/* pages/PCD01PRO/index.wxss */ \ No newline at end of file diff --git a/pages/index/index.js b/pages/index/index.js index 3a44a08..b47304b 100644 --- a/pages/index/index.js +++ b/pages/index/index.js @@ -15,8 +15,7 @@ Page({ imp: "", deviceId: null, }, - onLoad: function() { - }, + onLoad: function() {}, // 初始化蓝牙模块 editclick: function(e) { let type = e.currentTarget.dataset.name @@ -32,6 +31,55 @@ Page({ }) 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 + } + }, openBluetoothAdapter() { wx.openBluetoothAdapter({ diff --git a/pages/index/index.wxml b/pages/index/index.wxml index fd90807..f69d2e8 100644 --- a/pages/index/index.wxml +++ b/pages/index/index.wxml @@ -12,5 +12,14 @@ PCD01PRO PCH08/09 + PCF01B + PCF01pro(旧) + PCF01pro(新) + PCF08 + PCJ02 + G01 + B03 + + L08 diff --git a/project.config.json b/project.config.json index 327660f..ae58e57 100644 --- a/project.config.json +++ b/project.config.json @@ -1,7 +1,8 @@ { - "description": "项目配置文件", + "description": "项目配置文件,详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", "packOptions": { - "ignore": [] + "ignore": [], + "include": [] }, "setting": { "urlCheck": true, @@ -35,37 +36,22 @@ "packNpmManually": false, "packNpmRelationList": [], "minifyWXSS": true, - "showES6CompileOption": false + "showES6CompileOption": false, + "disableUseStrict": false, + "ignoreUploadUnusedFiles": true, + "useStaticServer": true, + "useCompilerPlugins": false, + "minifyWXML": true }, "compileType": "miniprogram", "libVersion": "2.16.0", "projectname": "bluetooth_demo", - "debugOptions": { - "hidedInDevtools": [] - }, - "scripts": {}, - "isGameTourist": false, "simulatorType": "wechat", "simulatorPluginLibVersion": {}, "appid": "wxcea3504a31518eb6", - "condition": { - "search": { - "list": [] - }, - "conversation": { - "list": [] - }, - "game": { - "list": [] - }, - "plugin": { - "list": [] - }, - "gamePlugin": { - "list": [] - }, - "miniprogram": { - "list": [] - } + "condition": {}, + "editorSetting": { + "tabIndent": "insertSpaces", + "tabSize": 2 } } \ No newline at end of file diff --git a/utils/util.js b/utils/util.js index b00f2de..7aafdf3 100644 --- a/utils/util.js +++ b/utils/util.js @@ -15,14 +15,14 @@ function inArray(arr, key, val) { } // ArrayBuffer转16进度字符串示例 -function ab2hex(buffer) { +function ab2hex(buffer, split) { var hexArr = Array.prototype.map.call( new Uint8Array(buffer), function(bit) { return ('00' + bit.toString(16)).slice(-2) } ) - return hexArr.join(""); + return hexArr.join(split); } module.exports = { inArray,