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: "" }) }, });