微信小程序蓝牙通讯:MCU 8 字节数组发送与接收示例
微信小程序蓝牙通讯:MCU 8 字节数组发送与接收示例
本文提供了一个使用微信开发者工具编写蓝牙与 MCU 8 字节数组通讯的程序示例,包括发送和接收功能,并展示了 index.js、index.wxml、app.js、app.wxml 等文件内容。
index.js
const app = getApp()
Page({
data: {
devices: [],
connected: false,
chs: []
},
openBluetoothAdapter() {
wx.openBluetoothAdapter({
success: (res) => {
this.startBluetoothDevicesDiscovery()
},
fail: (res) => {
console.error(res)
}
})
},
startBluetoothDevicesDiscovery() {
if (this._discoveryStarted) {
return
}
this._discoveryStarted = true
wx.startBluetoothDevicesDiscovery({
success: (res) => {
this.onBluetoothDeviceFound()
},
fail: (res) => {
console.error(res)
}
})
},
onBluetoothDeviceFound() {
wx.onBluetoothDeviceFound((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)
})
})
},
createBLEConnection(e) {
const ds = e.currentTarget.dataset
const deviceId = ds.deviceId
const name = ds.name
wx.createBLEConnection({
deviceId,
success: (res) => {
this.setData({
connected: true,
name,
deviceId,
})
this.getBLEDeviceServices(deviceId)
},
fail: (res) => {
console.error(res)
}
})
this.stopBluetoothDevicesDiscovery()
},
getBLEDeviceServices(deviceId) {
wx.getBLEDeviceServices({
deviceId,
success: (res) => {
this.getBLEDeviceCharacteristics(deviceId, res.services)
},
fail: (res) => {
console.error(res)
}
})
},
getBLEDeviceCharacteristics(deviceId, services) {
services.forEach(service => {
if (service.isPrimary) {
wx.getBLEDeviceCharacteristics({
deviceId,
serviceId: service.uuid,
success: (res) => {
res.characteristics.forEach(characteristic => {
if (characteristic.properties.write) {
this.setData({
canWrite: true
})
this._deviceId = deviceId
this._serviceId = service.uuid
this._characteristicId = characteristic.uuid
}
if (characteristic.properties.read) {
wx.readBLECharacteristicValue({
deviceId,
serviceId: service.uuid,
characteristicId: characteristic.uuid,
})
}
wx.notifyBLECharacteristicValueChange({
deviceId,
serviceId: service.uuid,
characteristicId: characteristic.uuid,
state: true,
})
})
},
fail: (res) => {
console.error(res)
}
})
}
})
},
closeBLEConnection() {
wx.closeBLEConnection({
deviceId: this.data.deviceId
})
this.setData({
connected: false,
chs: [],
canWrite: false
})
},
stopBluetoothDevicesDiscovery() {
wx.stopBluetoothDevicesDiscovery()
},
onUnload() {
this.stopBluetoothDevicesDiscovery()
},
sendCommand() {
const buffer = new ArrayBuffer(8)
const dataView = new DataView(buffer)
dataView.setInt8(0, 1)
dataView.setInt8(1, 2)
dataView.setInt8(2, 3)
dataView.setInt8(3, 4)
dataView.setInt8(4, 5)
dataView.setInt8(5, 6)
dataView.setInt8(6, 7)
dataView.setInt8(7, 8)
wx.writeBLECharacteristicValue({
deviceId: this._deviceId,
serviceId: this._serviceId,
characteristicId: this._characteristicId,
value: buffer,
success: (res) => {
console.log(res)
},
fail: (res) => {
console.error(res)
}
})
},
bindReceiveEvent() {
wx.onBLECharacteristicValueChange((res) => {
const value = new Uint8Array(res.value)
console.log(value)
})
}
})
function inArray(arr, key, val) {
for (let i = 0, len = arr.length; i < len; i++) {
if (arr[i][key] === val) {
return i
}
}
return -1
}
index.wxml
<view class='container'>
<view class='devices'>
<view class='device' wx:for='{{devices}}' wx:key='deviceId'>
<view class='device-info'>
<text class='device-name'>{{item.name || item.localName}}</text>
<text class='device-id'>{{item.deviceId}}</text>
</view>
<button class='connect-btn' wx:if='{{!connected}}' bindtap='createBLEConnection' data-device-id='{{item.deviceId}}' data-name='{{item.name || item.localName}}'>连接</button>
<button class='disconnect-btn' wx:if='{{connected}}' bindtap='closeBLEConnection'>断开</button>
</view>
</view>
<view class='send'>
<button class='send-btn' wx:if='{{canWrite}}' bindtap='sendCommand'>发送数据</button>
</view>
</view>
app.js
App({
onLaunch: function () {
wx.openBluetoothAdapter({
success: (res) => {
console.log(res)
},
fail: (res) => {
console.error(res)
}
})
}
})
app.json
{
"pages": [
"pages/index/index"
],
"window": {
"backgroundTextStyle": "light",
"navigationBarBackgroundColor": "#fff",
"navigationBarTitleText": "WeChat",
"navigationBarTextStyle": "black"
}
}
app.wxss
.container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
}
.device {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
padding: 10px;
margin-bottom: 10px;
border: 1px solid #ccc;
}
.device-info {
display: flex;
flex-direction: column;
}
.device-name {
font-size: 16px;
font-weight: bold;
}
.device-id {
font-size: 12px;
color: #999;
}
.connect-btn,
.disconnect-btn {
padding: 5px 10px;
background-color: #009688;
color: #fff;
border: none;
border-radius: 4px;
}
.send {
margin-top: 20px;
}
.send-btn {
padding: 5px 10px;
background-color: #009688;
color: #fff;
border: none;
border-radius: 4px;
}
原文地址: https://www.cveoy.top/t/topic/qvk2 著作权归作者所有。请勿转载和采集!