微信小程序可以调用蓝牙BLE接口完成各种操作。
官方文档说明
实际接口调用次序操作流程如下:
1. 检查设备是否开启蓝牙 ,调用接口wx.getBluetoothAdapterState
wx.getBluetoothAdapterState({
success: function(res) {
console.log(res)
},
fail: function(res) {
wx.showModal({
content: '请开启手机蓝牙后再试'
})
}
})
其中用到了提示框组件showModal
2. 打开设备,调用接口wx.openBluetoothAdapter
wx.openBluetoothAdapter({
success: function(res) {
console.log(res, "open device success"),
wx.showToast({
title: "蓝牙开启成功",
icon: 'success',
duration: 2000
}),
setTimeout(function() {
wx.hideToast()
}, 2000)
},
fail: function(res) {
console.log("open device failed"),
wx.showToast({
title: "蓝牙打开失败",
icon: 'none',
duration: 3000
}),
setTimeout(function() {
wx.hideToast()
}, 2000)
}
})
3. 启动扫描,并等待扫描完成,调用接口
wx.startBluetoothDevicesDiscovery({
services: [],
success: function(res) {
console.log("--device discovery success--");
console.log(res);
},
fail: function(res) {
console.log("--device discovery failed--");
return
},
complete: function(res) {
// complete
console.log(res);
console.log("--device discovery completed--");
}
})
这个只是完成扫描动作,但并没有列出设备列表,需要下一步扫描完成后的回调(注意这里是异步操作)
4. 获取设备列表,调用wx.getBluetoothDevices和wx.onBluetoothDeviceFound
wx.getBluetoothDevices({
success: function(res) {
console.log("getBluetoothDevices.....", res);
console.log("devices:...",res.devices);
/*that.setData({
devices:res.devices;
});*/
console.log("device list:....",that.devices);
},
fail: function(res) {
console.log("--device get failed--");
return
},
complete: function(res) {
console.log("--device get completed--");
}
})
wx.onBluetoothDeviceFound((res) => {
console.log("devices found----", 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)
})
})
}
获取的device信息见截图
5. 选取设备进行连接
获取按键位置
<scroll-view class="device_list" scroll-y scroll-with-animation>
<view wx:for="{{devices}}" wx:key="index"
data-device-id="{{item.deviceId}}"
data-name="{{item.name || item.localName}}"
bindtap="createBLEConnection"
class="device_item"
hover-class="device_item_hover">
<view style="font-size: 16px; color: #333;">{{item.name}}</view>
<view style="font-size: 10px">信号强度: {{item.RSSI}}dBm ({{utils.max(0, item.RSSI + 100)}}%)</view>
<view style="font-size: 10px">UUID: {{item.deviceId}}</view>
<view style="font-size: 10px">Service数量: {{utils.len(item.advertisServiceUUIDs)}}</view>
</view>
</scroll-view>
注意中间的bindtap绑定动作
点击列表中的设备,跳转到连接页面
createBLEConnection(e) {
const ds = e.currentTarget.dataset;
const deviceId = ds.deviceId;
const name = ds.name;
console.log("uuid:..."+name+",,diviceId:..."+deviceId);
wx.redirectTo({
url: "/pages/connected/connected?deviceId="+deviceId+"&name="+name,
success: function (res) {
},
fail: function (res) {
// fail
},
complete: function (res) {
// complete
}
})
},
调用创建连接的接口,并关闭发现,降低功耗
wx.createBLEConnection({
deviceId: this.data.deviceId,
success: (res) => {
console.log("connected success...", res);
console.log("ready to get services");
this.setData({
connected: true,
});
this.getBLEDeviceServices(this.data.deviceId); // 连接建立后获取服务列表
}
});
wx.stopBluetoothDevicesDiscovery();
},
6. 获取服务列表,并选择特性进入
getBLEDeviceServices(deviceId) {
console.log("ready to get services from device:...", deviceId);
wx.getBLEDeviceServices({
deviceId: deviceId,
success: (res) => {
console.log("get services id:... ", res.services);
this.setData({
services: res.services
})
for (let i = 0; i < res.services.length; i++) {
let item = res.services[i];
}
}
})
},
7. 根据选取的特性,进入到特性页面
listservices(event) {
console.log("selected item:...",event);
const ds = event.currentTarget.dataset;
console.log("selected item is: ...", ds);
const deviceId = this.data.deviceId;
const serviceId = ds.id;
console.log("enter deviceId:", deviceId);
console.log("enter serviceId:..." + serviceId);
wx.redirectTo({
url: "/pages/services/services?deviceId=" + deviceId + "&serviceId=" + serviceId,
success: function(res) {
},
fail: function(res) {
// fail
},
complete: function(res) {
// complete
}
})
},
8. 在特性页面上
根据具体的操作获取数据,或控制下发数据
获取特性的异步操作处理
wx.onBLEConnectionStateChanged(function(res) {
console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`)
});
this.getBLEDeviceCharacteristics(this.data.deviceId, this.data.serviceId);
wx.onBLECharacteristicValueChange(function (characteristic) {
console.log("read value:", characteristic);
const hex = buf2hex(characteristic.value);
console.log('characteristic value return:', hex);
wx.showModal({
title: '读取的值',
content: '结果:' + hex,
success: function (res) {
if (res.confirm) {
console.log('用户点击确定');
}
}
})
})
},
启动状态获取
getBLEDeviceCharacteristics(deviceId, serviceId) {
wx.getBLEDeviceCharacteristics({
deviceId, //: this.data.deviceId,
serviceId, // : this.data.serviceId,
success: (res) => {
console.log('getBLEDeviceCharacteristics success', res.characteristics);
this.setData({
list: res.characteristics
});
},
fail(res) {
console.error('getBLEDeviceCharacteristics error', res)
}
})
},
9. 读取状态值和写入值
readValue: function(event) {
console.log("selected characteristic dataset:...",event);
const ds = event.currentTarget.dataset;
console.log("selected item is: ...",ds);
const name=ds.id;
console.log("selected characteristicID is: ...",name);
wx.onBLECharacteristicValueChange(function(characteristic){
console.log("read value:", characteristic);
const hex = buf2hex(characteristic.value);
console.log('characteristic value comed:', hex);
wx.showModal({
title: '读取的值',
content: '结果:' + hex,
success: function (res) {
if (res.confirm) {
console.log('用户点击确定');
}
}
})
});
wx.readBLECharacteristicValue({
deviceId: this.data.deviceId,
serviceId: this.data.serviceId,
characteristicId: name,
success: function(res) {
console.log('readBLECharacteristicValue:', res);
}
})
},
获取文本框输入,并写值
bindKeyInput: function (e) {
this.setData({
/* inputValue: e.detail.value,*/
inputValue: e.detail.value
/*console.log("number input")*/
/*parameter:inputValue*/
})
},
writeValue: function (event) {
console.log("selected characteristic dataset:...", event);
const ds = event.currentTarget.dataset;
console.log("selected item is: ...", ds);
const name = ds.id;
// 向蓝牙设备发送一个0x00的16进制数据
let buffer = new ArrayBuffer(1);
let dataView = new DataView(buffer);
console.log("input value:...",this.data.inputValue);
dataView.setUint8(0, parseInt(this.data.inputValue));
console.log(buffer,dataView);
console.log("data to be transferred:...",buf2hex(buffer))
wx.writeBLECharacteristicValue({
deviceId: this.data.deviceId,
serviceId: this.data.serviceId,
characteristicId: name,
value: buffer
})
}
})