以下是一个示例的微信小程序蓝牙与MCU通讯的程序,包括发送和接收功能,并且有连接蓝牙按钮及连接状态的手机界面。

index.js:

const app = getApp();

Page({
  data: {
    connected: false, // 蓝牙连接状态
    devices: [], // 可连接的蓝牙设备列表
    deviceId: "", // 已连接的蓝牙设备ID
    serviceId: "", // 蓝牙设备的服务ID
    characteristicId: "", // 蓝牙设备的特征值ID
    receiveData: "", // 接收到的数据
    sendText: "" // 要发送的文本
  },

  // 初始化蓝牙适配器
  initBluetooth: function() {
    wx.openBluetoothAdapter({
      success: (res) => {
        console.log("初始化蓝牙适配器成功", res);
        this.startBluetoothDevicesDiscovery();
      },
      fail: (err) => {
        console.error("初始化蓝牙适配器失败", err);
      }
    });
  },

  // 开始搜索蓝牙设备
  startBluetoothDevicesDiscovery: function() {
    wx.startBluetoothDevicesDiscovery({
      success: (res) => {
        console.log("开始搜索蓝牙设备成功", res);
        this.onBluetoothDeviceFound();
      },
      fail: (err) => {
        console.error("开始搜索蓝牙设备失败", err);
      }
    });
  },

  // 监听搜索到的蓝牙设备
  onBluetoothDeviceFound: function() {
    wx.onBluetoothDeviceFound((res) => {
      res.devices.forEach(device => {
        if (!device.name && !device.localName) {
          return;
        }
        const devices = this.data.devices;
        const idx = devices.findIndex(item => item.deviceId === device.deviceId);
        if (idx === -1) {
          devices.push(device);
          this.setData({
            devices: devices
          });
        } else {
          devices[idx] = device;
          this.setData({
            devices: devices
          });
        }
      });
    });
  },

  // 连接蓝牙设备
  connectBluetoothDevice: function(e) {
    const deviceId = e.currentTarget.dataset.deviceid;
    wx.createBLEConnection({
      deviceId: deviceId,
      success: (res) => {
        console.log("连接蓝牙设备成功", res);
        this.setData({
          connected: true,
          deviceId: deviceId
        });
        this.getBLEDeviceServices(deviceId);
      },
      fail: (err) => {
        console.error("连接蓝牙设备失败", err);
      }
    });
  },

  // 获取蓝牙设备的服务
  getBLEDeviceServices: function(deviceId) {
    wx.getBLEDeviceServices({
      deviceId: deviceId,
      success: (res) => {
        console.log("获取蓝牙设备服务成功", res);
        res.services.forEach(service => {
          if (service.uuid === app.globalData.serviceUUID) {
            this.setData({
              serviceId: service.uuid
            });
            this.getBLEDeviceCharacteristics(deviceId, service.uuid);
          }
        });
      },
      fail: (err) => {
        console.error("获取蓝牙设备服务失败", err);
      }
    });
  },

  // 获取蓝牙设备的特征值
  getBLEDeviceCharacteristics: function(deviceId, serviceId) {
    wx.getBLEDeviceCharacteristics({
      deviceId: deviceId,
      serviceId: serviceId,
      success: (res) => {
        console.log("获取蓝牙设备特征值成功", res);
        res.characteristics.forEach(characteristic => {
          if (characteristic.uuid === app.globalData.characteristicUUID) {
            this.setData({
              characteristicId: characteristic.uuid
            });
            this.startBLENotifications(deviceId, serviceId, characteristic.uuid);
          }
        });
      },
      fail: (err) => {
        console.error("获取蓝牙设备特征值失败", err);
      }
    });
  },

  // 开启特征值变化监听
  startBLENotifications: function(deviceId, serviceId, characteristicId) {
    wx.notifyBLECharacteristicValueChange({
      deviceId: deviceId,
      serviceId: serviceId,
      characteristicId: characteristicId,
      state: true,
      success: (res) => {
        console.log("开启特征值变化监听成功", res);
        this.onBLECharacteristicValueChange();
      },
      fail: (err) => {
        console.error("开启特征值变化监听失败", err);
      }
    });
  },

  // 监听特征值变化
  onBLECharacteristicValueChange: function() {
    wx.onBLECharacteristicValueChange((res) => {
      const receiveData = this.data.receiveData + this.ab2str(res.value);
      this.setData({
        receiveData: receiveData
      });
    });
  },

  // 发送数据
  sendBLEData: function() {
    const sendText = this.data.sendText;
    const buffer = this.str2ab(sendText);
    const deviceId = this.data.deviceId;
    const serviceId = this.data.serviceId;
    const characteristicId = this.data.characteristicId;
    wx.writeBLECharacteristicValue({
      deviceId: deviceId,
      serviceId: serviceId,
      characteristicId: characteristicId,
      value: buffer,
      success: (res) => {
        console.log("发送数据成功", res);
      },
      fail: (err) => {
        console.error("发送数据失败", err);
      }
    });
  },

  // ArrayBuffer转字符串
  ab2str: function(buffer) {
    return String.fromCharCode.apply(null, new Uint8Array(buffer));
  },

  // 字符串转ArrayBuffer
  str2ab: function(str) {
    const buf = new ArrayBuffer(str.length);
    const bufView = new Uint8Array(buf);
    for (let i = 0, strLen = str.length; i < strLen; i++) {
      bufView[i] = str.charCodeAt(i);
    }
    return buf;
  },

  // 断开蓝牙连接
  closeBluetoothConnection: function() {
    const deviceId = this.data.deviceId;
    wx.closeBLEConnection({
      deviceId: deviceId,
      success: (res) => {
        console.log("断开蓝牙连接成功", res);
        this.setData({
          connected: false,
          deviceId: "",
          serviceId: "",
          characteristicId: "",
          receiveData: ""
        });
      },
      fail: (err) => {
        console.error("断开蓝牙连接失败", err);
      }
    });
  },

  // 清空接收到的数据
  clearReceiveData: function() {
    this.setData({
      receiveData: ""
    });
  },

  // 监听页面加载
  onLoad: function() {
    this.initBluetooth();
  }
});

index.wxml:

<view class="container">
  <view class="devices">
    <view wx:for="{{devices}}" wx:key="deviceId">
      <button class="device" wx:if="{{!connected}}" bindtap="connectBluetoothDevice" data-deviceid="{{item.deviceId}}">{{item.name || item.localName}}</button>
      <text class="device" wx:if="{{connected}} && deviceId === item.deviceId">{{item.name || item.localName}}</text>
    </view>
  </view>
  <view class="status">
    <text class="status-text" wx:if="{{!connected}}">未连接</text>
    <text class="status-text" wx:if="{{connected}}">已连接</text>
    <button class="disconnect-button" wx:if="{{connected}}" bindtap="closeBluetoothConnection">断开连接</button>
  </view>
  <view class="receive">
    <text class="receive-title">接收到的数据:</text>
    <text class="receive-data">{{receiveData}}</text>
    <button class="clear-button" bindtap="clearReceiveData">清空</button>
  </view>
  <view class="send">
    <input class="send-input" bindinput="inputSendText" placeholder="输入要发送的文本"/>
    <button class="send-button" bindtap="sendBLEData">发送</button>
  </view>
</view>

app.js:

App({
  onLaunch: function () {
    // ...
  },

  globalData: {
    serviceUUID: "0000XXXX-0000-1000-8000-00805F9B34FB", // 替换为MCU的服务UUID
    characteristicUUID: "0000XXXX-0000-1000-8000-00805F9B34FB" // 替换为MCU的特征值UUID
  }
});

app.json:

{
  "pages": [
    "pages/index/index"
  ],
  "window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "蓝牙与MCU通讯",
    "navigationBarTextStyle": "black"
  },
  "debug": true
}

app.wxss:

.container {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 100vh;
  font-size: 16px;
}

.devices {
  margin-bottom: 20px;
}

.device {
  display: block;
  width: 200px;
  height: 40px;
  margin: 10px;
  background-color: #4CAF50;
  color: white;
  font-size: 16px;
  text-align: center;
  line-height: 40px;
  border-radius: 4px;
}

.status {
  margin-bottom: 20px;
}

.status-text {
  font-size: 20px;
}

.disconnect-button {
  display: block;
  width: 100px;
  height: 40px;
  margin-top: 10px;
  background-color: #f44336;
  color: white;
  font-size: 16px;
  text-align: center;
  line-height: 40px;
  border-radius: 4px;
}

.receive {
  margin-bottom: 20px;
}

.receive-title {
  font-size: 20px;
}

.receive-data {
  display: block;
  width: 300px;
  height: 200px;
  margin-top: 10px;
  background-color: #f2f2f2;
  font-size: 16px;
  padding: 10px;
  overflow: auto;
  word-break: break-all;
}

.clear-button {
  display: block;
  width: 100px;
  height: 40px;
  margin-top: 10px;
  background-color: #f44336;
  color: white;
  font-size: 16px;
  text-align: center;
  line-height: 40px;
  border-radius: 4px;
}

.send {
  margin-bottom: 20px;
}

.send-input {
  width: 300px;
  height: 40px;
  font-size: 16px;
  border: 1px solid #ccc;
  border-radius: 4px;
  padding: 5px;
}

.send-button {
  display: block;
  width: 100px;
  height: 40px;
  margin-top: 10px;
  background-color: #4CAF50;
  color: white;
  font-size: 16px;
  text-align: center;
  line-height: 40px;
  border-radius: 4px;
}

请注意替换app.js中的serviceUUID和characteristicUUID为实际的MCU服务UUID和特征值UUID。

这个示例程序中,通过微信开发者工具可以在手机上运行,并且显示可连接的蓝牙设备列表,点击连接按钮可以连接蓝牙设备,连接成功后可以发送文本数据给MCU,接收到的MCU返回的数据也会显示在界面上

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

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

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