const app = getApp()
|
|
|
|
function inArray(arr, key, val) {
|
|
for (let i = 0; i < arr.length; i++) {
|
|
if (arr[i][key] === val) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
// ArrayBuffer转16进度字符串示例
|
|
function ab2hex(buffer) {
|
|
var hexArr = Array.prototype.map.call(
|
|
new Uint8Array(buffer),
|
|
function (bit) {
|
|
return ('00' + bit.toString(16)).slice(-2)
|
|
}
|
|
)
|
|
return hexArr.join('');
|
|
}
|
|
|
|
Page({
|
|
data: {
|
|
devices: [],
|
|
connected: false,
|
|
chs: [],
|
|
},
|
|
|
|
openBluetoothAdapter() {
|
|
wx.openBluetoothAdapter({
|
|
success: (res) => {
|
|
console.log('openBluetoothAdapter success', res)
|
|
this.startBluetoothDevicesDiscovery()
|
|
},
|
|
fail: (res) => {
|
|
if (res.errCode === 10001) {
|
|
wx.onBluetoothAdapterStateChange(function (res) {
|
|
console.log('onBluetoothAdapterStateChange', res)
|
|
if (res.available) {
|
|
this.startBluetoothDevicesDiscovery()
|
|
}
|
|
})
|
|
}
|
|
}
|
|
})
|
|
},
|
|
getBluetoothAdapterState() {
|
|
wx.getBluetoothAdapterState({
|
|
success: (res) => {
|
|
console.log('getBluetoothAdapterState', res)
|
|
if (res.discovering) {
|
|
this.onBluetoothDeviceFound()
|
|
} else if (res.available) {
|
|
this.startBluetoothDevicesDiscovery()
|
|
}
|
|
}
|
|
})
|
|
},
|
|
startBluetoothDevicesDiscovery() {
|
|
if (this._discoveryStarted) {
|
|
return
|
|
}
|
|
this._discoveryStarted = true
|
|
wx.startBluetoothDevicesDiscovery({
|
|
allowDuplicatesKey: true,
|
|
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
|
|
}
|
|
const foundDevices = this.data.devices
|
|
const idx = inArray(foundDevices, 'deviceId', device.deviceId)
|
|
const data = {}
|
|
if (idx === -1) {
|
|
data[`devices[${foundDevices.length}]`] = device
|
|
} else {
|
|
data[`devices[${idx}]`] = device
|
|
}
|
|
this.setData(data)
|
|
})
|
|
})
|
|
},
|
|
createBLEConnection(e) {
|
|
const ds = e.currentTarget.dataset
|
|
const deviceId = ds.deviceId
|
|
const name = ds.name
|
|
wx.createBLEConnection({
|
|
deviceId,
|
|
success: (res) => {
|
|
this.setData({
|
|
connected: true,
|
|
name,
|
|
deviceId,
|
|
})
|
|
this.getBLEDeviceServices(deviceId)
|
|
}
|
|
})
|
|
this.stopBluetoothDevicesDiscovery()
|
|
},
|
|
closeBLEConnection() {
|
|
wx.closeBLEConnection({
|
|
deviceId: this.data.deviceId
|
|
})
|
|
this.setData({
|
|
connected: false,
|
|
chs: [],
|
|
canWrite: false,
|
|
})
|
|
},
|
|
getBLEDeviceServices(deviceId) {
|
|
wx.getBLEDeviceServices({
|
|
deviceId,
|
|
success: (res) => {
|
|
for (let i = 0; i < res.services.length; i++) {
|
|
if (res.services[i].isPrimary) {
|
|
this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
})
|
|
},
|
|
getBLEDeviceCharacteristics(deviceId, serviceId) {
|
|
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.properties.read) {
|
|
wx.readBLECharacteristicValue({
|
|
deviceId,
|
|
serviceId,
|
|
characteristicId: item.uuid,
|
|
})
|
|
}
|
|
if (item.properties.write) {
|
|
this.setData({
|
|
canWrite: true
|
|
})
|
|
this._deviceId = deviceId
|
|
this._serviceId = serviceId
|
|
this._characteristicId = item.uuid
|
|
this.writeBLECharacteristicValue()
|
|
}
|
|
if (item.properties.notify || item.properties.indicate) {
|
|
wx.notifyBLECharacteristicValueChange({
|
|
deviceId,
|
|
serviceId,
|
|
characteristicId: item.uuid,
|
|
state: true,
|
|
})
|
|
}
|
|
}
|
|
},
|
|
fail(res) {
|
|
console.error('getBLEDeviceCharacteristics', res)
|
|
}
|
|
})
|
|
// 操作之前先监听,保证第一时间获取数据
|
|
wx.onBLECharacteristicValueChange((characteristic) => {
|
|
const idx = inArray(this.data.chs, 'uuid', characteristic.characteristicId)
|
|
const data = {}
|
|
if (idx === -1) {
|
|
data[`chs[${this.data.chs.length}]`] = {
|
|
uuid: characteristic.characteristicId,
|
|
value: ab2hex(characteristic.value)
|
|
}
|
|
} else {
|
|
data[`chs[${idx}]`] = {
|
|
uuid: characteristic.characteristicId,
|
|
value: ab2hex(characteristic.value)
|
|
}
|
|
}
|
|
// data[`chs[${this.data.chs.length}]`] = {
|
|
// uuid: characteristic.characteristicId,
|
|
// value: ab2hex(characteristic.value)
|
|
// }
|
|
this.setData(data)
|
|
})
|
|
},
|
|
|
|
|
|
writeBLECharacteristicValue() {
|
|
// 向蓝牙设备发送一个0x00的16进制数据
|
|
let buffer = new ArrayBuffer(1)
|
|
let dataView = new DataView(buffer)
|
|
dataView.setUint8(0, Math.random() * 255 | 0)
|
|
wx.writeBLECharacteristicValue({
|
|
deviceId: this._deviceId,
|
|
serviceId: this._deviceId,
|
|
characteristicId: this._characteristicId,
|
|
value: buffer,
|
|
})
|
|
},
|
|
closeBluetoothAdapter() {
|
|
wx.closeBluetoothAdapter()
|
|
this._discoveryStarted = false
|
|
},
|
|
})
|