修复八电极蓝牙对接流程
This commit is contained in:
parent
a161319690
commit
4ff1bb8e67
|
|
@ -1,321 +1,325 @@
|
|||
const util = require("../../utils/util");
|
||||
const {
|
||||
inArray,
|
||||
ab2hex
|
||||
inArray,
|
||||
ab2hex
|
||||
} = util
|
||||
const plugin = requirePlugin("sdkPlugin").AiLink;
|
||||
Page({
|
||||
data: {
|
||||
devices: [],
|
||||
connected: false,
|
||||
cmd: '',
|
||||
name: '',
|
||||
weight: "",
|
||||
height: "",
|
||||
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()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
data: {
|
||||
devices: [],
|
||||
connected: false,
|
||||
cmd: '',
|
||||
name: '',
|
||||
weight: "",
|
||||
height: "",
|
||||
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()
|
||||
},
|
||||
// 开始搜寻附近的蓝牙外围设备
|
||||
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: ""
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
// 找到新设备的事件
|
||||
onBluetoothDeviceFound() {
|
||||
wx.onBluetoothDeviceFound((res) => {
|
||||
res.devices.forEach(device => {
|
||||
if (!device.name && !device.localName) {
|
||||
return
|
||||
}
|
||||
console.log("name", device.name)
|
||||
if (device.name.indexOf('AiLink_') != -1 || device.name.toLowerCase().indexOf(
|
||||
'pcf01') != -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
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
// 获取蓝牙设备的 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 //写入设置
|
||||
}
|
||||
}
|
||||
// 获取蓝牙设备某个服务中所有特征值(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 //写入设置
|
||||
}
|
||||
}
|
||||
|
||||
// 打开监听
|
||||
wx.notifyBLECharacteristicValueChange({
|
||||
deviceId,
|
||||
serviceId,
|
||||
characteristicId: that.data.uuid2,
|
||||
state: true,
|
||||
})
|
||||
wx.notifyBLECharacteristicValueChange({
|
||||
deviceId,
|
||||
serviceId,
|
||||
characteristicId: that.data.uuid3,
|
||||
state: true,
|
||||
})
|
||||
// 初始化插件
|
||||
plugin.initPlugin(res.characteristics, that._device)
|
||||
wx.onBLECharacteristicValueChange((characteristic) => {
|
||||
let bleData = plugin.parseBleData(characteristic.value)
|
||||
let dw1 = "kg"
|
||||
if (bleData.status == 0) {
|
||||
// 发送 男,22岁,185
|
||||
let A = 22
|
||||
let H = 185
|
||||
let sex = "0x01"
|
||||
let age = "0x" + A.toString(16)
|
||||
let height = "0x" + H.toString(16)
|
||||
let arr = [0x01, parseInt(sex), parseInt(age), parseInt(height),0x00]
|
||||
plugin.sendDataOfA7(arr)
|
||||
console.log("握手成功", arr)
|
||||
} 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)
|
||||
}
|
||||
})
|
||||
},
|
||||
// 打开监听
|
||||
wx.notifyBLECharacteristicValueChange({
|
||||
deviceId,
|
||||
serviceId,
|
||||
characteristicId: that.data.uuid2,
|
||||
state: true,
|
||||
})
|
||||
wx.notifyBLECharacteristicValueChange({
|
||||
deviceId,
|
||||
serviceId,
|
||||
characteristicId: that.data.uuid3,
|
||||
state: true,
|
||||
})
|
||||
// 初始化插件
|
||||
plugin.initPlugin(res.characteristics, that._device)
|
||||
wx.onBLECharacteristicValueChange((characteristic) => {
|
||||
let bleData = plugin.parseBleData(characteristic.value)
|
||||
let dw1 = "kg"
|
||||
if (bleData.status == 0) {
|
||||
// 发送 男,22岁,185
|
||||
let A = 22
|
||||
let H = 185
|
||||
let sex = "0x01"
|
||||
let age = "0x" + A.toString(16)
|
||||
let height = "0x" + H.toString(16)
|
||||
let arr = [0x01, parseInt(sex), parseInt(age), parseInt(height),
|
||||
0x00
|
||||
]
|
||||
plugin.sendDataOfA7(arr)
|
||||
console.log("握手成功", arr)
|
||||
} 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: ""
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 断开蓝牙模块
|
||||
*/
|
||||
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: ""
|
||||
})
|
||||
},
|
||||
|
||||
});
|
||||
});
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -291,11 +291,11 @@ Page({
|
|||
})
|
||||
}
|
||||
}
|
||||
if (typeInfo == "05") {
|
||||
let mcu = payload.substring(4, 6)
|
||||
let imp = parseInt(payload.substring(6, 14), 16)
|
||||
console.log("阻抗类型:", payload, type, typeInfo, mcu,imp) //阻抗模式
|
||||
}
|
||||
// if (typeInfo == "05") {
|
||||
// let mcu = payload.substring(4, 6)
|
||||
// let imp = parseInt(payload.substring(6, 14), 16)
|
||||
// console.log("阻抗类型:", payload, type, typeInfo, mcu,imp) //阻抗模式
|
||||
// }
|
||||
}
|
||||
if (type == "0f") {
|
||||
that.setData({
|
||||
|
|
|
|||
Binary file not shown.
Loading…
Reference in New Issue