BluetoothDemo/pages/PCH0809/index.js

444 lines
15 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,
cmd: '',
name: '',
weight: "",
text: "",
imp: "",
height: '',
isType: false,
sendVal: true,
pwdModal: false,
uuid1: null,
uuid2: null,
uuid3: null,
deviceId: null,
serviceId: null
},
onLoad: function() {
// let value = "A90026051401020001439A";
// let num = value.substring(18, 19)
// let type = value.substring(8, 10)
// let imp = parseInt(value.substring(10, 14), 16)
// console.log("16进制转化:", value, num, type, imp);
},
// 初始化蓝牙模块
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.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
}
console.log("131", data)
this.setData(data)
}
})
})
},
// 连接低功耗蓝牙设备
createBLEConnection(e) {
this._connLoading = true
wx.showLoading({
title: '连接中',
})
setTimeout(() => {
if (this._connLoading) {
this._connLoading = false
wx.hideLoading()
}
}, 6000)
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 => {
this._connLoading = false
wx.showToast({
title: '连接失败',
duration: 2000,
icon: 'none'
})
}
})
},
//监听蓝牙连接状态
onBLEConnectionStateChange() {
wx.onBLEConnectionStateChange((res) => {
if (!res.connected) {
setTimeout(() => {
wx.showToast({
title: '连接已断开',
duration: 2000,
icon: 'none'
})
}, 500)
this.setData({
connected: false,
isType: 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) {
this.data.serviceId = res.services[i].uuid
this.data.deviceId = deviceId
this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid)
wx.showToast({
title: '获取设备的UUID成功',
duration: 2000,
icon: 'none'
})
return
}
}
}
})
},
// 获取蓝牙设备某个服务中所有特征值(characteristic)
/**
* read: true读,write: true写,notify: true广播
*/
getBLEDeviceCharacteristics(deviceId, serviceId) {
this._deviceId = deviceId
this._serviceId = serviceId
this._device.serviceId = serviceId
let that = this
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('FFE1') != -1) {
that.data.uuid1 = item.uuid //主服务 UUID
} else if (item.uuid.indexOf('FFE2') != -1) {
that.data.uuid2 = item.uuid //写入设置
} else if (item.uuid.indexOf('FFE3') != -1) {
that.data.uuid3 = item.uuid //监听数据
}
}
that.setData({
isType: true,
})
wx.notifyBLECharacteristicValueChange({
deviceId,
serviceId,
characteristicId: that.data.uuid2,
state: true,
})
wx.notifyBLECharacteristicValueChange({
deviceId,
serviceId,
characteristicId: that.data.uuid3,
state: true,
})
wx.onBLECharacteristicValueChange((res) => {
let value = ab2hex(res.value, "");
console.log("16进制转化:", value);
let num = value.substring(18, 19)
let dw = value.substring(19, 20)
let type = value.substring(8, 10)
let typeInfo = value.substring(10, 12)
console.log("16进制转化:", value);
if (type == '10') {
let data = parseInt(value.substring(13, 18), 16)
let dw1 = "kg"
if (dw == "1") {
dw1 = "斤"
console.log("体重单位:斤")
}
if (dw == "4") {
dw1 = "st:lb"
console.log("体重单位st:lb,计算方法1 * data + 5")
}
if (dw == "6") {
dw1 = "lb"
console.log("体重单位lb")
}
if (num == "1") {
data = parseInt(value.substring(13, 18), 16) / 10
console.log("体重小数点后1位")
}
if (num == "2") {
data = parseInt(value.substring(13, 18), 16) / 100
console.log("体重小数点后2位")
}
if (num == "3") {
data = parseInt(value.substring(13, 18), 16) / 1000
console.log("体重小数点后3位")
}
if (typeInfo == "01") {
console.log("实时体重:", data)
that.setData({
weight: "实时体重是:" + data + dw1
})
}
if (typeInfo == "02") {
console.log("稳定体重:", data)
that.setData({
weight: "稳定体重是:" + data + dw1
})
}
}
if (type == "14") { //身高模式
let height = parseInt(value.substring(10, 14), 16)
that.setData({
height: "您的身高是:" + height
})
console.log("身高模式:", height)
}
if (type == "11") {
console.log("阻抗值:", value)
if (typeInfo == "03" || typeInfo == "04") {
let imp = parseInt(value.substring(17, 22), 16)
that.setData({
imp: "阻抗值:" + imp
})
}
}
if (value.toUpperCase() == "A90026023000589A") {
that.setData({
text: "测量完成"
})
}
});
},
fail(res) {
console.error('getBLEDeviceCharacteristics', res)
}
})
},
handleHeight(e) {
let that = this
let type = e.currentTarget.dataset.name
if (type == '1') {
let j = Number(26 + 3 + 6 + 1).toString(16)
let str = "A9002603060100" + j.substr(j.length - 2, 2) + "9A"
let buf = new Uint8Array(str.match(/[\da-f]{2}/gi).map(function(h) {
return parseInt(h, 16)
}))
that.sendData(buf.buffer)
}
if (type == '2') {
let j = Number(26 + 3 + 6 + 2).toString(16)
let str = "A9002603060200" + j.substr(j.length - 2, 2) + "9A"
let buf = new Uint8Array(str.match(/[\da-f]{2}/gi).map(function(h) {
return parseInt(h, 16)
}))
that.sendData(buf.buffer)
}
if (type == '3') {
that.setData({
pwdModal: true,
})
}
},
confirmPwd() {
let that = this
if (!that.data.pwdInput) {
wx.showToast({
title: '请输入重量',
duration: 2000,
icon: 'none'
})
return
} else {
let w = Number(that.data.pwdInput.replace(/[&\|\\\*^%$#@\.-]/g, ""))
let j = Number(26 + 7 + 40 + w + 3 + 2).toString(16) //校验和
let atr = w.toString(16) //16进制后的标定数据
let num = 0 //小数位数
let str = null
if (that.data.pwdInput.indexOf('.') != -1) {
num = Number(that.data.pwdInput.toString().split(".")[1].length)
}
// 根据atr的位数判断下发的体重填充几个0
let n = []
for (var i = 1; i <= (6 - atr.length); i++) {
n.push(0);
}
str = "A90026074003" + n.join("") + atr + "0" + num + "00" + j.substr(j.length - 2, 2) + "9A"
let buf = new Uint8Array(str.match(/[\da-f]{2}/gi).map(function(h) {
return parseInt(h, 16)
}))
that.sendData(buf.buffer)
}
},
sendData(buffer) {
let that = this
wx.writeBLECharacteristicValue({
deviceId: that.data.deviceId,
serviceId: that.data.serviceId,
characteristicId: that.data.uuid1,
value: buffer,
success: res => {
console.log('下发指令', res.errMsg)
wx.showToast({
title: '下发指令成功',
duration: 2000,
icon: 'none'
})
this.setData({
pwdModal: false,
})
},
fail: res => {
wx.showToast({
title: '下发指令失败',
duration: 2000,
icon: 'none'
})
this.setData({
pwdModal: false,
})
console.log("失败", res);
},
})
},
closeModal() {
this.setData({
pwdModal: false,
})
},
/**
* 断开蓝牙模块
*/
closeBluetoothAdapter() {
wx.closeBluetoothAdapter()
this._discoveryStarted = false
wx.showToast({
title: '断开蓝牙模块',
duration: 2000,
icon: 'none'
})
this.setData({
devices: [],
weight: "",
height: "",
text: "",
imp: "",
isType: false
})
},
// 断开与低功耗蓝牙设备的连接
closeBLEConnection() {
wx.closeBLEConnection({
deviceId: this._deviceId
})
wx.showToast({
title: '断开蓝牙连接',
duration: 2000,
icon: 'none'
})
this.setData({
connected: false,
isType: false,
devices: [],
text: "",
weight: "",
height: "",
imp: ""
})
},
});