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;
}

``
使用微信开发者工具编写蓝牙与MCU 8个字数组通讯的程序要求有发送及接收功能分别编写出indexjs、indexwxml、appjs、appwxml等文件

原文地址: http://www.cveoy.top/t/topic/iPeb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录