BluetoothDemo/bluetooth_demo_L08_NSDK/pages/index/index.js

390 lines
9.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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