微信小程序开发低功耗蓝牙例子

828 阅读2分钟

BLE蓝牙测试工具是学习和理解蓝牙通信的小程序。

gh_e86a0a7e723c_258.jpg QQ截图20230622170136.png

连接蓝牙成功之后,会返回蓝牙设备ID,根据蓝牙设备ID可以选择蓝牙服务ID,一个蓝牙设备对应N个蓝牙服务,一个蓝牙服务对应N个蓝牙特征ID,一个蓝牙特征ID对应N个蓝牙特征值,一个蓝牙特征值对应N个蓝牙描述符,一个蓝牙描述符对应N个蓝牙描述符值,蓝牙描述符值是蓝牙设备和手机之间的通信数据。


// 初始化蓝牙模块

wx.openBluetoothAdapter({
 success: function(res) {
   // 开始扫描附近的设备
   wx.startBluetoothDevicesDiscovery({
     services: [],
     allowDuplicatesKey: false,
     success: function(res) {
       // 扫描到新设备时触发方法
       wx.onBluetoothDeviceFound(function(device) {
         if (device.name == 'myDevice') {
           // 停止扫描
           wx.stopBluetoothDevicesDiscovery();
           // 连接设备
           wx.createBLEConnection({
             deviceId: device.deviceId,
             success: function(res) {
               // 获取设备的服务列表
               wx.getBLEDeviceServices({
                 deviceId: device.deviceId,
                 success: function(res){
                   for(var i = 0; i < res.services.length; i++){
                     if(res.services[i].uuid == "1234"){
                       // 获取设备的指定服务
                       wx.getBLEDeviceCharacteristics({
                         deviceId: device.deviceId,
                         serviceId: res.services[i].uuid,
                         success: function(res){
                           for(var j = 0; j < res.characteristics.length; j++){
                             if(res.characteristics[j].uuid == "4567"){
                               // 监听从设备传输过来的数据
                               wx.onBLECharacteristicValueChange(function(res){
                                 var dataView = new DataView(res.value.buffer);
                                 var value = dataView.getUint8(0);
                                 console.log(value);
                               });
                               // 向设备发送数据
                               var buffer = new ArrayBuffer(1);
                               var dataView = new DataView(buffer);
                               dataView.setUint8(0, 1);

                               wx.writeBLECharacteristicValue({
                                 deviceId: device.deviceId,
                                 serviceId: res.services[i].uuid,
                                 characteristicId: res.characteristics[j].uuid,
                                 value: buffer,
                                 success: function(res){
                                   console.log(res.errMsg);
                                 }
                               });
                             }
                           }
                         }
                       });
                       break;
                     }
                   }
                 }
               });
             }
           });
         }
       })
     }
   })
 }
});


低功耗蓝牙的每个数据包大小最大为20个字节,如果需要传输的数据大小超过了20个字节,那么需要进行分包传输。

分包传输的基本思路是将需要传输的数据按照一定规则进行分割,分割成多个20字节大小的数据包进行传输,接收方再将这些数据包按照序列号进行组装,得到完整的数据。以下是一个简单的代码示例,演示如何在微信小程序中实现低功耗蓝牙的数据分包传输:

```javascript
// 数据分包传输
function sendData(data, deviceId) {
 let len = data.length;
 let dataView = new DataView(data.buffer);
 let packetSize = 20;
 let packetCount = Math.ceil(len / packetSize);
 let index = 0;

 // 循环发送每个数据包
 for (let i = 0; i < packetCount; i++) {
   let packetData = data.slice(index, index + packetSize);
   let packetLength = packetData.length;

   // 将包头信息和包内容合并成一个buffer
   let buffer = new ArrayBuffer(packetLength + 3);
   let header = new DataView(buffer, 0);
   header.setUint8(0, i);
   header.setUint16(1, len);
   let packetContent = new Uint8Array(buffer, 3);
   packetContent.set(packetData);

   // 调用蓝牙发送数据API
   wx.writeBLECharacteristicValue({
     deviceId: deviceId,
     serviceId: serviceId,
     characteristicId: characteristicId,
     value: buffer,
     success: function (res) {},
     fail: function (res) {}
   });

   // 更新数据包索引
   index += packetSize;
 }
}

以上代码中,我们首先获取传入数据的长度和内容,根据20字节大小进行数据分割,将每个分割后的数据包加上包头信息后进行发送。在每个数据包的包头信息中,包含了该包的序列号和完整数据长度。接收方将收到的数据包根据包头信息中的序列号进行组装,并判断是否已经组装完成完整的数据。