流程图:
第一步:
注:初始化蓝牙(并判断蓝牙是否已开启)
openBluetoothAdapter() {//可以做开始初始化蓝牙的触发按钮
//开始前建议先关闭蓝牙模块
this.closeBLEConnection();//断开与低功耗蓝牙设备的连接
this.stopBluetoothDevicesDiscovery();//停止搜寻附近的蓝牙外围设备
this.closeBluetoothAdapter();//关闭蓝牙模块
wx.openBluetoothAdapter({
success: (res) => {
//成功 =》开始搜寻附近的蓝牙外围设备
this.startBluetoothDevicesDiscovery()
},
fail: (res) => {
if (res.errCode === 10001) {
wx.showToast({
title: '请打开蓝牙定位',
icon: 'none',
duration: 2500//持续的时间
});
this.jshu();
//监听蓝牙适配器状态变化事件
wx.onBluetoothAdapterStateChange((res) => {
//蓝牙适配器可用时
if (res.available) {
//再次=》开始搜寻附近的蓝牙外围设备
this.startBluetoothDevicesDiscovery()
}
})
}
}
})
}
第二步:
注:监听蓝牙适配器
//获取本机蓝牙适配器状态
getBluetoothAdapterState() {
wx.getBluetoothAdapterState({
success: (res) => {
if(res.available=="not available"){
wx.showToast({
title: '请打开蓝牙定位',
icon: 'none',
duration: 2500//持续的时间
});
}
//成功=》正在搜索设备
if (res.discovering) {
//监听寻找到新设备
this.onBluetoothDeviceFound()
//蓝牙适配器可用
} else if (res.available) {
//再次=》开始搜寻附近的蓝牙外围设备
this.startBluetoothDevicesDiscovery()
}
}
})
},
第三步:
注:搜索附近的蓝牙外围设备
//开始搜寻附近的蓝牙外围设备
startBluetoothDevicesDiscovery() {
if (this._discoveryStarted) {
return
}
this._discoveryStarted = true
wx.startBluetoothDevicesDiscovery({
//是否允许重复上报同一设备
allowDuplicatesKey: false,
success: (res) => {
//监听寻找到新设备
this.onBluetoothDeviceFound()
},
})
},
第四步:
注:监听搜索到的设备
//监听寻找到新设备的事件 --
onBluetoothDeviceFound() {
var ths=this;
wx.onBluetoothDeviceFound((res) => {
//新搜索到的设备列表
res.devices.forEach(device => {
if (!device.name && !device.localName) {
return
}
//再次可以对设备进行筛选
//筛选后,调用链接设备方法链接
//链接
this.createBLEConnection(device.deviceId);
})
})
},
第五步:
注:链接低功耗蓝牙设备
//连接低功耗蓝牙设备
createBLEConnection(e) {
const deviceId = e
wx.createBLEConnection({
deviceId,
success: (res) => {
//获取蓝牙设备所有服务
this.getBLEDeviceServices(deviceId)
//已连接
}
})
//停止搜寻附近的蓝牙外围设备
this.stopBluetoothDevicesDiscovery()
},
第六步:
注:获取已连接的蓝牙所有服务
//获取蓝牙设备所有服务 --
getBLEDeviceServices(deviceId) {
wx.getBLEDeviceServices({
deviceId,
success: (res) => {
console.log('数组长度:'+res.services.length)
for (let i = 0; i < res.services.length; i++) {
//筛选是否有需要使用的服务
if (res.services[i].uuid.toUpperCase().indexOf("0000FFF0-0000-1000-8000-00805F9B34FB") != -1) {
//获取设备特征值
console.log("具有FFF0特性值-------")
if (res.services[i].isPrimary) {
//获取蓝牙设备某个服务中所有特征值
this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid)
}
}
}
}
})
},
第七步:
注:获取蓝牙设备某个服务中所有特征值
//获取蓝牙设备某个服务中所有特征值 --
getBLEDeviceCharacteristics(deviceId, serviceId) {
var ths=this;
wx.getBLEDeviceCharacteristics({
deviceId,
serviceId,
success: (res) => {
// //循环设备特征值列表
for (let i = 0; i < res.characteristics.length; i++) {
let item = res.characteristics[i];
//该特征值是否支持 read 操作
if (item.properties.read) {
//读取低功耗蓝牙设备的特征值的二进制数据值
wx.readBLECharacteristicValue({
deviceId,
serviceId,
characteristicId: item.uuid,
})
}
//该特征值是否支持 write 操作
if (item.properties.write) {
this._deviceId = deviceId
this._serviceId = serviceId
this._characteristicId = item.uuid
//向低功耗蓝牙设备特征值中写入二进制数据
//如果想链接上后立刻写入命令,直接在这里调用要写入的命令
ths.writeBLECharacteristicValue() //停止测量
console.log("支持write,执行了写入!!!")
}
//该特征值是否支持 notify || indicate 操作
if (item.properties.notify || item.properties.indicate) {
//启用低功耗蓝牙设备特征值变化时的 notify 功能
wx.notifyBLECharacteristicValueChange({
deviceId,
serviceId,
characteristicId: item.uuid,
state: true,
success (res) {
console.log('notify开启成功', res.errMsg)
}
})
}
}
console.log(deviceId)
console.log(this._serviceId )
console.log(this._characteristicId)
},
fail(res) {
}
})
// 操作之前先监听,保证第一时间获取数据
wx.onBLEConnectionStateChange(function(res) {
// 该方法回调中可以用于处理连接意外断开等异常情况
// console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`)
if(res.connected==false){
console.log('已断开');
ths.openBluetoothAdapter();//重新初始化蓝牙
}
})
//接收蓝牙返回的参数
wx.onBLECharacteristicValueChange((res) => {
var value = ab2hex(res.value);//ab2hex(值)方法 注:ArrayBuffer转16进度 字符串
if (value.length === 40){
//获取符合条件的返回的参数码
let sys = parseInt(value.slice(28, 30),16);
//获取到的返回值sys
//停止蓝牙
this.stopBluetoothDevicesDiscovery();
}
})
},
第八步:
注:写入命令
//触发按钮
openBluetoothAdapters(){//开始检测
//写入前先判断设备是否链接等,,
//写入
this.writeBLECharacteristicValuess();
},
//例 写入
writeBLECharacteristicValuess() {
console.log('进入了写入开始!!!');
let buffer = new ArrayBuffer(3)
let dataView = new DataView(buffer)
dataView.setUint8(0,0x60)
dataView.setUint8(1,0x00)
dataView.setUint8(2,0x01)
console.log(buffer,'buffer')
wx.writeBLECharacteristicValue({
deviceId: this._deviceId,
serviceId: this._serviceId,
characteristicId: this._characteristicId,
value: buffer,
success: (res) => {
console.log("写入成功"+res)
}
})
},
第九步
注:使用到的方法
- 关闭蓝牙模块
//关闭蓝牙模块
closeBluetoothAdapter() {
wx.closeBluetoothAdapter()
this._discoveryStarted = false
},
- 断开与低功耗蓝牙设备的连接
//断开与低功耗蓝牙设备的连接
closeBLEConnection() {
//如果设备还在执行就关闭设备
console.log('deviceId',this.data.deviceId);
wx.closeBLEConnection({
deviceId: this.data.deviceId
})
},
- 停止搜寻附近的蓝牙外围设备
//停止搜寻附近的蓝牙外围设备
stopBluetoothDevicesDiscovery() {
wx.stopBluetoothDevicesDiscovery()
},
- 断开连接并停止扫描设备
jshu(){
this.closeBLEConnection();//断开与低功耗蓝牙设备的连接
this.stopBluetoothDevicesDiscovery();//停止搜寻附近的蓝牙外围设备
// this.closeBluetoothAdapter();
},
- ArrayBuffer转16进度
//直接写在page(上方)外
// 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('');
}
总结
- Android需要开起定位和蓝牙,ios需要获取用户定位权限并开启蓝牙;
- ios版本如果链接不上蓝牙,需要增加获取用户定位权限;
- ios版本操控写入时,需要注意该设备服务的特征值不能写死、服务uuid必须大写等。