390 lines
9.0 KiB
JavaScript
390 lines
9.0 KiB
JavaScript
const util = require("../../utils/util");
|
||
const {
|
||
inArray,
|
||
ab2hex
|
||
} = util
|
||
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
|
||
} else if (item.uuid.indexOf('0000FFE2') != -1) {
|
||
that.data.uuid2 = item.uuid
|
||
} else if (item.uuid.indexOf('0000FFE3') != -1) {
|
||
that.data.uuid3 = item.uuid
|
||
// 取消加密和握手
|
||
let str = "A603420100466A"
|
||
let buf = new Uint8Array(str.match(/[\da-f]{2}/gi).map(function(h) {
|
||
return parseInt(h, 16)
|
||
}))
|
||
wx.writeBLECharacteristicValue({
|
||
deviceId: deviceId,
|
||
serviceId: serviceId,
|
||
characteristicId: item.uuid,
|
||
value: buf.buffer,
|
||
success: res => {
|
||
console.log('下发指令成功', res.errMsg)
|
||
},
|
||
fail: res => {
|
||
console.log("下发指令失败", res);
|
||
},
|
||
})
|
||
}
|
||
}
|
||
wx.notifyBLECharacteristicValueChange({
|
||
deviceId,
|
||
serviceId,
|
||
characteristicId: that.data.uuid2,
|
||
state: true,
|
||
})
|
||
wx.notifyBLECharacteristicValueChange({
|
||
deviceId,
|
||
serviceId,
|
||
characteristicId: that.data.uuid3,
|
||
state: true,
|
||
})
|
||
|
||
wx.onBLECharacteristicValueChange((characteristic) => {
|
||
console.log("characteristic", ab2hex(characteristic.value, ""))
|
||
let dw1 = "kg"
|
||
let payload = ab2hex(characteristic.value, '')
|
||
let type = payload.substring(8, 10)
|
||
let typeInfo = payload.substring(10, 12)
|
||
console.log("测量开始:", payload, type)
|
||
if (type == "01") { //体脂模式
|
||
let data = parseInt(payload.substring(12, 18), 16)
|
||
let num = payload.substring(18, 19)
|
||
let dw = payload.substring(19, 20)
|
||
if (dw == "1") {
|
||
dw1 = "斤"
|
||
}
|
||
if (dw == "4") {
|
||
dw1 = "st"
|
||
}
|
||
if (dw == "6") {
|
||
dw1 = "lb"
|
||
}
|
||
if (num == "1") {
|
||
data = data / 10
|
||
}
|
||
if (num == "2") {
|
||
data = data / 100
|
||
}
|
||
if (num == "3") {
|
||
data = data / 1000
|
||
}
|
||
if (typeInfo == "01") {
|
||
if (dw1 == "st") {
|
||
let s = data / 14
|
||
let y = data - Math.trunc(s) * 14
|
||
let y0 = y >= 10 ? Math.trunc(y) : y.toFixed(1)
|
||
let data0 = Math.trunc(s) + ':' + y0
|
||
console.log("st:lb", s, y, data, data0)
|
||
that.setData({
|
||
weight: "实时体重是:" + data0 + dw1
|
||
})
|
||
} else {
|
||
that.setData({
|
||
weight: "实时体重是:" + data + dw1
|
||
})
|
||
}
|
||
|
||
}
|
||
if (typeInfo == "02") {
|
||
if (dw1 == "st") {
|
||
let s = data / 14
|
||
let y = data - Math.trunc(s) * 14
|
||
let y0 = y >= 10 ? Math.trunc(y) : y.toFixed(1)
|
||
let data0 = Math.trunc(s) + ':' + y0
|
||
that.setData({
|
||
weight: "稳定体重是:" + data0 + dw1
|
||
})
|
||
} else {
|
||
that.setData({
|
||
weight: "稳定体重是:" + data + dw1
|
||
})
|
||
}
|
||
}
|
||
}
|
||
if (type == "02") { //阻抗
|
||
if (typeInfo == "02") {
|
||
that.setData({
|
||
imp7: "阻抗测量失败"
|
||
})
|
||
}
|
||
if (typeInfo == "03") {
|
||
let mcu = payload.substring(12, 14)
|
||
let imp = parseInt(payload.substring(14, 22), 16)
|
||
if (mcu == "02") {
|
||
that.setData({
|
||
imp2: "左手阻抗:" + imp
|
||
})
|
||
}
|
||
if (mcu == "03") {
|
||
that.setData({
|
||
imp3: "右手阻抗:" + imp
|
||
})
|
||
}
|
||
if (mcu == "04") {
|
||
that.setData({
|
||
imp4: "左脚阻抗:" + imp
|
||
})
|
||
}
|
||
if (mcu == "05") {
|
||
that.setData({
|
||
imp5: "右脚阻抗:" + imp
|
||
})
|
||
}
|
||
|
||
if (mcu == "07") {
|
||
that.setData({
|
||
imp7: "躯干阻抗:" + imp
|
||
})
|
||
}
|
||
}
|
||
}
|
||
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: '',
|
||
})
|
||
},
|
||
|
||
}); |