调用BLEPeripheralServer.addService报错
建立本地作为外围设备的服务端之后,调用BLEPeripheralServer.addService
报错{errMsg: “addBLEPeripheralService:fail addBLEPeripheralService valueBase64String is empty.”}
2 回复
可以参考这份示例代码
const uuid1 = '000018F0-0000-1000-8000-00805F9BAAFB'
const uuid2 = '00002AF0-0000-1000-8000-00805F9BBBFB'
const uuid3 = '00002AF1-0000-1000-8000-00805F9BCCFB'
// ArrayBuffer转16进制字符串示例
function ab2hex(buffer) {
let hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function (bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('');
}
function inArray(arr, key, val) {
for (let i = 0; i < arr.length; i++) {
if (arr[i][key] === val) {
return i;
}
}
return -1;
}
// slave/slave.js
Page({
/**
* 页面的初始数据
*/
data: {
connects: [],
servers: []
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
wx.onBLEPeripheralConnectionStateChanged(res => {
console.log('ConnectionStateChanged', res)
const connects = this.data.connects
const idx = inArray(connects, 'deviceId', res.deviceId)
if (idx >= 0) {
connects[idx] = res
} else {
connects.push(res)
}
this.setData({ connects })
})
},
openBluetoothAdapter() {
wx.openBluetoothAdapter({
success: (res) => {
console.log('openBluetoothAdapter success', res)
this.createBLEPeripheralServer()
wx.onBluetoothAdapterStateChange(function (res) {
console.log('onBluetoothAdapterStateChange', res.available)
})
},
fail: (res) => {
if (res.errCode === 10001) {
console.log("ble unavailable!")
}
}
})
},
createBLEPeripheralServer() {
wx.createBLEPeripheralServer().then(res => {
console.log('createBLEPeripheralServer', res)
this.data.servers.push(res.server)
this.server = res.server
this.setData({ serverId: this.server.serverId })
this.server.onCharacteristicReadRequest(res => {
const { serviceId, characteristicId, callbackId } = res
const buffer = new ArrayBuffer(1)
const dataView = new DataView(buffer)
const newValue = Math.ceil(Math.random() * 10)
dataView.setUint8(0, newValue)
console.log('onCharacteristicReadRequest', res, newValue)
this.server.writeCharacteristicValue({
serviceId,
characteristicId,
value: buffer,
needNotify: true,
callbackId
})
})
this.server.onCharacteristicWriteRequest(res => {
console.log('onCharacteristicWriteRequest', res)
const { serviceId, characteristicId, value, callbackId } = res
this.server.writeCharacteristicValue({
serviceId,
characteristicId,
value,
needNotify: true,
callbackId
})
})
})
},
closeServer() {
this.server.close()
},
onConfirm(e) {
const n = e.detail.value * 1
const buffer = new ArrayBuffer(1)
const dataView = new DataView(buffer)
dataView.setUint8(0, n)
this.server.writeCharacteristicValue({
serviceId: uuid1,
characteristicId: uuid2,
value: buffer,
needNotify: true
})
},
showInput() {
this.setData({
input: !this.data.input
})
},
addService() {
const buffer = new ArrayBuffer(2)
const dataView = new DataView(buffer)
dataView.setUint8(0, 9)
dataView.setUint8(1, 11)
const descriptorBuffer = new ArrayBuffer(2)
const dataView2 = new DataView(descriptorBuffer)
dataView2.setInt8(0, 1)
dataView2.setInt8(1, 0)
const service = {
uuid: uuid1,
characteristics: [{
uuid: uuid2,
properties: {
write: false,
read: true,
notify: true,
indicate: false
},
permission: {
readable: true,
writeable: false,
readEncryptionRequired: false,
writeEncryptionRequired: false
},
value: buffer,
descriptors: [{
uuid: uuid2,
permission: {
write: false,
read: true
},
value: descriptorBuffer
}]
},
{
uuid: uuid3,
properties: {
write: true,
read: false,
notify: false,
indicate: false
},
permission: {
readable: false,
writeable: true,
readEncryptionRequired: false,
writeEncryptionRequired: false
},
value: buffer,
descriptors: [{
uuid: uuid3,
permission: {
write: true,
read: false
},
value: descriptorBuffer
}]
}]
}
this.server.addService({
service
}).then(res => {
console.log('add Service', res)
})
},
removeService() {
this.server.removeService({
serviceId: uuid1
}).then(res => {
console.log('removeService', res)
})
},
startAdvertising() {
const buffer = new ArrayBuffer(1)
const dataView = new DataView(buffer)
var hex = "7E9"
var typedArray = new Uint8Array(hex.match(/[\da-f]{2}/gi).map(function (h) {
return parseInt(h, 16)
}))
this.server.startAdvertising({
advertiseRequest: {
connectable: true,
deviceName: '',
serviceUuids: [uuid1],
manufacturerData: [{
manufacturerId: '0x004c',
manufacturerSpecificData: typedArray.buffer
}]
},
powerLevel: 'higt'
}).then(res => {
console.log('startAdvertising', res)
}, res => {
console.log("fail: ", res)
})
},
stopAdvertising() {
this.server.stopAdvertising()
},
closeBluetoothAdapter() {
wx.closeBluetoothAdapter()
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
this.data.servers.forEach(server => {
// server.close()
})
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})