<template>
<view class='u-form'>
<u-no-network></u-no-network>
<u-button :ripple="true" @click="openBluetoothAdapter">开启蓝牙并检索设备</u-button>
<u-button :ripple="true" @click="stopBluetoothDevicesDiscovery">关闭检索蓝牙设备</u-button>
<u-button :ripple="true" @click="dklj">断开当前连接</u-button>
<u-button :ripple="true" @click="sd">关闭蓝牙模块断开所有已建立的连接</u-button>
<view>
<u-input v-model="fa" border="border" />
<u-button :ripple="true" @click="writesss">发送数据</u-button>
</view>
<view>接收数据{{shou}}</view>
<view>{{serviceId}}</view>
<view v-for=" itemid in deviceIdlsit" style="background-color: #C0C0C0;margin: 10rpx;padding: 10rpx;">
<u-row gutter="16">
<u-col span="8">
设备ID{{itemid.deviceId}}<br />
设备名<span style="color: red;">{{itemid.name?itemid.name:itemid.localName}}</span></u-col>
<u-col span="4">
<u-button :ripple="true" @click="createBLEConnection(itemid.deviceId)">连接</u-button>
</u-col>
</u-row>
</view>
</view>
</template>
<script>
export default {
data() {
return {
fa: '',
shou: '',
serviceId: '', //蓝牙服务 uuid
connectionid: '', //设备的 id
characteristicid: '', //特征
sheb: "",
deviceIdlsit: []
};
},
mounted() {
uni.onBluetoothAdapterStateChange(function(res) {
console.log('adapterState changed, now is', res)
})
uni.onBluetoothDeviceFound(devices => {
var rssi = (devices.devices[0].RSSI + 100) / 10
console.log(devices.devices[0])
if (rssi > 0 && this.deviceIdlsit.indexOf(devices.devices[0].deviceId) == -1) {
this.deviceIdlsit.push(devices.devices[0])
}
})
this.onBLEConnectionStateChange()
this.onBLECharacteristicValueChange()
},
methods: {
onBLECharacteristicValueChange() {
uni.onBLECharacteristicValueChange(function(res) {
console.log(`监听低功耗蓝牙设备的特征值变化事件 ${res.characteristicId} has changed, now is ${res.value}`)
})
},
onBLEConnectionStateChange() {
uni.onBLEConnectionStateChange(res => {
// 该方法回调中可以用于处理连接意外断开等异常情况
console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`)
if (res.connected == false) {
// this.dklj();
// this.createBLEConnection()
}
})
},
dklj() {
uni.closeBLEConnection({
deviceId: this.connectionid,
success(res) {
console.log("关闭当前连接", res)
}
})
},
sd() {
uni.closeBluetoothAdapter({
success(res) {
console.log(res)
}
})
},
writesss() {
// 向蓝牙设备发送一个0x00的16进制数据
const buffer = new ArrayBuffer(1)
const dataView = new DataView(buffer)
dataView.setUint8(0, 0)
uni.writeBLECharacteristicValue({
// 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
deviceId: this.connectionid,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId: this.serviceId,
// 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
characteristicId: this.characteristicid,
// 这里的value是ArrayBuffer类型
value: buffer,
success(res) {
console.log('writeBLECharacteristicValue success', res.errMsg)
}
})
},
// 两字母:AB,AC,AD;BC,BD,CD
// 三字母:ABC,ABD,ACD;BCD
getBLEDeviceCharacteristics(did, sid) {
uni.getBLEDeviceCharacteristics({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId: did,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId: sid,
success: res => {
console.log('传入服务id:', sid)
console.log('device getBLEDeviceCharacteristics:', res.characteristics)
for (let i = 0; i < res.characteristics.length; i++) {
if (res.characteristics[i].properties.read) {
console.log('可读')
}
if (res.characteristics[i].properties.write) {
this.connectionid = did
this.serviceId = sid
this.characteristicid = res.characteristics[i].uuid
}
if (res.characteristics[i].properties.notify || res.characteristics[i].properties.indicate) {
uni.notifyBLECharacteristicValueChange({
state: true, // 启用 notify 功能
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId: did,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId: sid,
// 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
characteristicId: res.characteristics[i].uuid,
success(res) {
console.log('notifyBLECharacteristicValueChange success', res.errMsg)
}
})
}
}
},
fail: err => {
console.log('获取特征失败')
}
})
},
getBLEDeviceServices(id) {
uni.getBLEDeviceServices({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId: id,
success: (res) => {
// console.log("成功",res)
console.log('device services:', res)
//这里会获取到好多个services uuid 我们只存储我们需要用到的就行,这个uuid一般硬件厂家会给我们提供
this.serviceId = res
for (let i = 0; i < res.services.length; i++) {
if (res.services[i].isPrimary) {
this.getBLEDeviceCharacteristics(id, res.services[i + 2].uuid)
return
}
}
// res.services.forEach((item) => {
// if (item.uuid.indexOf("AE00") != -1) {
// this.serviceId = item.uuid;
// //进入特征
// // this.getBLEDeviceCharacteristics()
// }
// })
}
})
},
createBLEConnection(id) {
this.connectionid = id
uni.createBLEConnection({
deviceId: id,
success: res => {
console.log(id, this.connectionid)
console.log("创建蓝牙连接", res)
uni.stopBluetoothDevicesDiscovery({
success(resds) {
console.log("创建蓝牙连接关闭蓝牙搜素", resds)
}
})
setTimeout(() => {
this.getBLEDeviceServices(id)
}, 1000)
},
fail: err => {
console.log(err)
}
})
},
startBluetoothDeviceDiscovery() {
uni.startBluetoothDevicesDiscovery({
// services: ['FEE7'],
// allowDuplicatesKey:true,
success: resd => {
console.log(resd)
},
fail: errd => {
console.log(errd)
}
})
},
dddd() {
},
// 10000 not init 未初始化蓝牙适配器
// 10001 not available 当前蓝牙适配器不可用
// 10002 no device 没有找到指定设备
// 10003 connection fail 连接失败
// 10004 no service 没有找到指定服务
// 10005 no characteristic 没有找到指定特征值
// 10006 no connection 当前连接已断开
// 10007 property not support 当前特征值不支持此操作
// 10008 system error 其余所有系统上报的异常
// 10009 system not support Android 系统特有,系统版本低于 4.3 不支持 BLE
stopBluetoothDevicesDiscovery() {
uni.stopBluetoothDevicesDiscovery({
success(resds) {
console.log("关闭蓝牙搜素", resds)
}
})
},
openBluetoothAdapter() {
this.deviceIdlsit.length = 0
uni.openBluetoothAdapter({
success: res => {
setTimeout(() => {
this.startBluetoothDeviceDiscovery()
}, 1000)
},
fail: err => {
if (err.code == 10001) {
console.log('请检查蓝牙是否开启,是否支持蓝牙模式')
}
}
})
}
}
};
</script>
uniapp蓝牙使用读写数据
最新推荐文章于 2024-03-22 16:52:17 发布