一、前言
微信小程序蓝牙开发官方文档地址
二、小程序BLE开发步骤
1、初始化蓝牙适配器及开始搜索目标设备
wx.openBluetoothAdapter({
success: function(res) {
console.log("初始化蓝牙适配器成功:" + res)
wx.getBluetoothAdapterState({
success: function(res) {
console.log("蓝牙适配器状态: " + res.adapterState +" msg: "+res.errMsg);
/*开始搜索目标设备*/
wx.startBluetoothDevicesDiscovery({
success: function(res) {
},
})
},
})
},
fail:function(res){
console.log("初始化蓝牙适配器失败 ERROR:" + res.adapterState + " msg: " + res.errMsg)
},
complete:function(res){
console.log("初始化蓝牙适配器完成 COMPLETE:" + res.adapterState + " msg: " + res.errMsg)
}
}),
2、监听发现设备的回调
wx.onBluetoothDeviceFound(function (devices) {
console.log("找到了新的蓝牙设备")
console.dir(devices)
for(var i = 0 ; i < devices.devices.length;i++){
var device = devices.devices[i]
console.log("------------=======---------------")
console.dir(device)
console.log("------------=======--------------")
for (var j = 0 ; j < device.length ; j ++){
console.log("找到了新的蓝牙设备***--》devices:"+j + device[j])
console.log("---------------------------------")
console.log("device.name:" + device[j].name)
console.log("---------------------------------")
if (device[j].name.indexOf("XXX(目标设备)") != -1){
console.log("找到了血压设备")
wx.stopBluetoothDevicesDiscovery({
success: function (res) {
// console.log("找到了血压设备 停止搜索:" + res)
that.setData({
deviceId: device[j].deviceId,
connectStateStr: "连接中"
});
/**
* 连接设备
*/
wx.createBLEConnection({
deviceId: that.data.deviceId,
success: function (res) {
// success
console.log("血压计连接成功:" + res);
/**
* 连接成功,后开始获取设备的服务列表
*/
wx.getBLEDeviceServices({
// 这里的 deviceId 需要在上面的 getBluetoothDevices中获取
deviceId: that.data.deviceId,
success: function (res) {
console.log('device services:', res.services)
that.setData({ services: res.services });
console.log('device services:', that.data.services[1].uuid);
for (var i = 0; i < res.services.length; i++) {
if (res.services[i].uuid.indexOf("1808") != -1) {//1808 为你需要的服务UUID
that.setData({ serviceId: that.data.services[i].uuid });
break;
}
}
/**
* 延迟1.5秒,根据服务获取特征
*/
setTimeout(function () {
wx.getBLEDeviceCharacteristics({
// 这里的 deviceId 需要在上面的 getBluetoothDevices
deviceId: that.data.deviceId,
// 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
serviceId: that.data.serviceId,
success: function (res) {
console.log('device getBLEDeviceCharacteristics:', res.characteristics)
for (var i = 0; i < res.characteristics.length; i++) {
var uuidStr = "" + res.characteristics[i].uuid;
if (uuidStr.indexOf("fff4") != -1) {//fff4为有notify属性的特征值 UUID
that.setData({
uuid4: res.characteristics[i].uuid,
characteristics04: res.characteristics[i]
});
}
}
/**
* 回调获取 设备发过来的数据
*/
wx.onBLECharacteristicValueChange(function (characteristic) {
console.log('characteristic value comed:', characteristic.value)
/**
* 监听fff4中的结果
*/
if (characteristic.characteristicId.indexOf("fff4") != -1) {
const result = characteristic.value;
const hex = that.buf2hex(result);
console.log("onBLECharacteristicValueChange fff4:"+hex);
}
}
})
/**
* 顺序开发设备特征notifiy
*/
wx.notifyBLECharacteristicValueChanged({
// 启用 notify 功能
// 这里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
deviceId: that.data.deviceId,
serviceId: that.data.serviceId,
characteristicId: that.data.uuid4,
state: true,
success: function (res) {
console.log('notifyBLECharacteristicValueChanged success', res)
},
fail: function (fail) {
console.log("notifyBLECharacteristicValueChanged fail:" + fail.errMsg)
},
complete: function (complete) {
console.log("notifyBLECharacteristicValueChanged complete:" + complete.errMsg)
}
})
}, fail: function (res) {
console.log(res);
}
})
}
, 1500);
}
})
},
fail: function (res) {
console.log("血压计连接失败:" + res)
console.dir(res)
}
})
},
})
}
}
}
}
buf2hex方法
buf2hex: function (buffer) { // buffer is an ArrayBuffer
return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
},
Page中的data
data: {
services: [],
deviceId:'',
serviceId: '',
uuid4: '',
characteristics04:'',
},
三、以下为所有BLE相关的代码
onLoad: function () {
var that = this
wx.openBluetoothAdapter({
success: function(res) {
console.log("初始化蓝牙适配器成功:" + res)
wx.startBluetoothDevicesDiscovery({
success: function (res) {
// console.log("搜索蓝牙:" + res)
},
})
},
fail:function(res){
console.log("初始化蓝牙适配器失败 ERROR:" + res.adapterState + " msg: " + res.errMsg)
},
complete:function(res){
console.log("初始化蓝牙适配器完成 COMPLETE:" + res.adapterState + " msg: " + res.errMsg)
}
}),
/**
* 监听设备的连接状态
*/
wx.onBLEConnectionStateChanged(function (res) {
console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`)
that.setData({
connectStateStr: res.connected ? "已连接" : "未连接"
});
}),
wx.onBluetoothDeviceFound(function (devices) {
console.log("找到了新的蓝牙设备")
console.dir(devices)
console.log("找到了新的蓝牙设备***--》devices:" + devices.devices)
for(var i = 0 ; i < devices.devices.length;i++){
var device = devices.devices[i]
console.log("------------=======---------------")
console.dir(device)
console.log("------------=======--------------")
for (var j = 0 ; j < device.length ; j ++){
console.log("找到了新的蓝牙设备***--》devices:"+j + device[j])
console.log("---------------------------------")
console.log("device.name:" + device[j].name)
console.log("---------------------------------")
if (device[j].name.indexOf("XXX") != -1){
console.log("找到了目标设备")
wx.stopBluetoothDevicesDiscovery({
success: function (res) {
console.log("找到了目标设备 停止搜索:" + res)
},
})
that.setData({
deviceId: device[j].deviceId,
connectStateStr: "连接中"
});
/**
* 连接设备
*/
wx.createBLEConnection({
deviceId: that.data.deviceId,
success: function (res) {
// success
console.log("目标设备连接成功:" + res);
/**
* 连接成功,后开始获取设备的服务列表
*/
wx.getBLEDeviceServices({
// 这里的 deviceId 需要在上面的 getBluetoothDevices中获取
deviceId: that.data.deviceId,
success: function (res) {
console.log('device services:', res.services)
that.setData({ services: res.services });
console.log('device services:', that.data.services[1].uuid);
for (var i = 0; i < res.services.length; i++) {
if (res.services[i].uuid.indexOf("1808") != -1) {//1808 为你需要的服务UUID
that.setData({ serviceId: that.data.services[i].uuid });
break;
}
}
/**
* 延迟1.5秒,根据服务获取特征
*/
setTimeout(function () {
wx.getBLEDeviceCharacteristics({
// 这里的 deviceId 需要在上面的 getBluetoothDevices
deviceId: that.data.deviceId,
// 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
serviceId: that.data.serviceId,
success: function (res) {
console.log('device getBLEDeviceCharacteristics:', res.characteristics)
for (var i = 0; i < res.characteristics.length; i++) {
var uuidStr = "" + res.characteristics[i].uuid;
if (uuidStr.indexOf("fff4") != -1) {
that.setData({
uuid4: res.characteristics[i].uuid,
characteristics04: res.characteristics[i]
});
}
}
/**
* 回调获取 设备发过来的数据
*/
wx.onBLECharacteristicValueChange(function (characteristic) {
console.log('characteristic value comed:', characteristic.value)
/**
* 监听fff4中的结果
*/
if (characteristic.characteristicId.indexOf("fff4") != -1) {//fff4为有notify属性的特征值 UUID
const result = characteristic.value;
const hex = that.buf2hex(result);
// console.log("onBLECharacteristicValueChange fff4:"+hex);
}
})
/**
* 顺序开发设备特征notifiy
*/
wx.notifyBLECharacteristicValueChanged({
// 启用 notify 功能
// 这里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
deviceId: that.data.deviceId,
serviceId: that.data.serviceId,
characteristicId: that.data.uuid4,
state: true,
success: function (res) {
console.log('notifyBLECharacteristicValueChanged success', res)
},
fail: function (fail) {
console.log("notifyBLECharacteristicValueChanged fail:" + fail.errMsg)
},
complete: function (complete) {
console.log("notifyBLECharacteristicValueChanged complete:" + complete.errMsg)
}
})
}, fail: function (res) {
console.log(res);
}
})
}
, 1500);
}
})
},
fail: function (res) {
console.log("目标设备连接失败:" + res)
console.dir(res)
}
})
}else{
console.log("不是目标设备")
}
}
}
})
},
buf2hex: function (buffer) { // buffer is an ArrayBuffer
return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
},
关于开发工具中调试的时候能搜到并连接蓝牙,但是iPhone真机中连接不了的问题