276 lines
7.1 KiB
JavaScript
276 lines
7.1 KiB
JavaScript
|
|
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: ""
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
});
|