BLE IOT开发之微信小程序扫描-连接-控制BLE设备

本文介绍了微信小程序调用蓝牙BLE接口的操作流程。包括检查设备蓝牙状态、打开蓝牙、扫描设备、获取设备列表、连接设备、获取服务列表、选择特性进入特性页面,以及在特性页面获取数据、控制下发数据、读取和写入状态值等操作,并给出了相应的接口调用代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微信小程序可以调用蓝牙BLE接口完成各种操作。

官方文档说明

https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/wx.onBLEPeripheralConnectionStateChanged.html

实际接口调用次序操作流程如下:

1. 检查设备是否开启蓝牙 ,调用接口wx.getBluetoothAdapterState

wx.getBluetoothAdapterState({

success: function(res) {

console.log(res)

},

fail: function(res) {

wx.showModal({

content: '请开启手机蓝牙后再试'

})

}

})

其中用到了提示框组件showModal

 

2. 打开设备,调用接口wx.openBluetoothAdapter

wx.openBluetoothAdapter({

success: function(res) {

console.log(res, "open device success"),

wx.showToast({

 

title: "蓝牙开启成功",

 

icon: 'success',

 

duration: 2000

 

}),

setTimeout(function() {

 

wx.hideToast()

 

}, 2000)

},

fail: function(res) {

console.log("open device failed"),

wx.showToast({

 

title: "蓝牙打开失败",

 

icon: 'none',

 

duration: 3000

 

}),

setTimeout(function() {

 

wx.hideToast()

 

}, 2000)

}

})

3. 启动扫描,并等待扫描完成,调用接口

wx.startBluetoothDevicesDiscovery({

services: [],

success: function(res) {

console.log("--device discovery success--");

console.log(res);

},

fail: function(res) {

console.log("--device discovery failed--");

return

},

complete: function(res) {

// complete

console.log(res);

console.log("--device discovery completed--");

 

}

})

这个只是完成扫描动作,但并没有列出设备列表,需要下一步扫描完成后的回调(注意这里是异步操作)

4. 获取设备列表,调用wx.getBluetoothDevices和wx.onBluetoothDeviceFound

wx.getBluetoothDevices({

success: function(res) {

console.log("getBluetoothDevices.....", res);

console.log("devices:...",res.devices);

/*that.setData({

devices:res.devices;

});*/

 

console.log("device list:....",that.devices);

 

},

fail: function(res) {

console.log("--device get failed--");

return

},

complete: function(res) {

console.log("--device get completed--");

}


 

})

wx.onBluetoothDeviceFound((res) => {

console.log("devices found----", 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)

})

})

 

}

获取的device信息见截图

 

5. 选取设备进行连接

获取按键位置

<scroll-view class="device_list" scroll-y scroll-with-animation>

  <view wx:for="{{devices}}" wx:key="index"

   data-device-id="{{item.deviceId}}"

   data-name="{{item.name || item.localName}}"

   bindtap="createBLEConnection" 

   class="device_item"

   hover-class="device_item_hover">

    <view style="font-size: 16px; color: #333;">{{item.name}}</view>

    <view style="font-size: 10px">信号强度: {{item.RSSI}}dBm ({{utils.max(0, item.RSSI + 100)}}%)</view>

    <view style="font-size: 10px">UUID: {{item.deviceId}}</view>

    <view style="font-size: 10px">Service数量: {{utils.len(item.advertisServiceUUIDs)}}</view>

  </view>

</scroll-view>

注意中间的bindtap绑定动作

点击列表中的设备,跳转到连接页面

createBLEConnection(e) {

    const ds = e.currentTarget.dataset;

    const deviceId = ds.deviceId;

    const name = ds.name;

    console.log("uuid:..."+name+",,diviceId:..."+deviceId);

    wx.redirectTo({

      url: "/pages/connected/connected?deviceId="+deviceId+"&name="+name,

      success: function (res) { 

 

       }, 

       fail: function (res) { 

         // fail 

         }, 

         complete: function (res) {

            // complete 

            }

  

    })

    },

 

调用创建连接的接口,并关闭发现,降低功耗

wx.createBLEConnection({

      deviceId: this.data.deviceId,

      success: (res) => {

        console.log("connected success...", res);

        console.log("ready to get services");

        this.setData({

          connected: true,

        });

 

        this.getBLEDeviceServices(this.data.deviceId); // 连接建立后获取服务列表

      }

    });

    wx.stopBluetoothDevicesDiscovery();

  },

6. 获取服务列表,并选择特性进入

 

getBLEDeviceServices(deviceId) {

    console.log("ready to get services from device:...", deviceId);

    wx.getBLEDeviceServices({

      deviceId: deviceId,

      success: (res) => {

        console.log("get services id:... ", res.services);

        this.setData({

          services: res.services

        })

        for (let i = 0; i < res.services.length; i++) {

          let item = res.services[i];

          

        }

      }

    })

  },

7. 根据选取的特性,进入到特性页面

listservices(event) {

    console.log("selected item:...",event);

    const ds = event.currentTarget.dataset;

    console.log("selected item is: ...", ds);

    const deviceId = this.data.deviceId;

    const serviceId = ds.id;

    

 

    console.log("enter deviceId:", deviceId);

    console.log("enter serviceId:..." + serviceId);

 

    wx.redirectTo({

      url: "/pages/services/services?deviceId=" + deviceId + "&serviceId=" + serviceId,

      success: function(res) {

 

      },

      fail: function(res) {

        // fail 

      },

      complete: function(res) {

        // complete 

      }

 

    })

  },

 

8. 在特性页面上

根据具体的操作获取数据,或控制下发数据

获取特性的异步操作处理

wx.onBLEConnectionStateChanged(function(res) {

      console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`)

    });

    this.getBLEDeviceCharacteristics(this.data.deviceId, this.data.serviceId);

    wx.onBLECharacteristicValueChange(function (characteristic) {

      console.log("read value:", characteristic);

      const hex = buf2hex(characteristic.value);

      console.log('characteristic value return:', hex);


 

      wx.showModal({

        title: '读取的值',

        content: '结果:' + hex,

        success: function (res) {

          if (res.confirm) {

            console.log('用户点击确定');

 

          }

        }

      })


 

    })

  },

启动状态获取

  getBLEDeviceCharacteristics(deviceId, serviceId) {

    wx.getBLEDeviceCharacteristics({

      deviceId, //: this.data.deviceId,

      serviceId, // : this.data.serviceId,

      success: (res) => {

        console.log('getBLEDeviceCharacteristics success', res.characteristics);

        this.setData({

          list: res.characteristics

        });

 

        

      },

      fail(res) {

        console.error('getBLEDeviceCharacteristics error', res)

      }

    })

 

 

  },

  9. 读取状态值和写入值

  readValue: function(event) {

    console.log("selected characteristic dataset:...",event);

    const ds = event.currentTarget.dataset;

    console.log("selected item is: ...",ds);

    const name=ds.id;

    console.log("selected characteristicID is: ...",name);

 

    wx.onBLECharacteristicValueChange(function(characteristic){

      console.log("read value:", characteristic);

      const hex = buf2hex(characteristic.value);

      console.log('characteristic value comed:', hex);

      

      

        wx.showModal({

          title: '读取的值',

          content: '结果:' + hex,

          success: function (res) {

            if (res.confirm) {

              console.log('用户点击确定');

             

            }

          }

        })

      

 

    });


 

    wx.readBLECharacteristicValue({

 

      deviceId: this.data.deviceId,

      serviceId: this.data.serviceId,

 

      characteristicId: name,

      success: function(res) {

        console.log('readBLECharacteristicValue:', res);

      

      }

    })

  },

获取文本框输入,并写值

bindKeyInput: function (e) {

    this.setData({

      /* inputValue: e.detail.value,*/

      inputValue: e.detail.value

      /*console.log("number input")*/

      /*parameter:inputValue*/


 

    })

  },

 

  writeValue: function (event) {

    console.log("selected characteristic dataset:...", event);

    const ds = event.currentTarget.dataset;

    console.log("selected item is: ...", ds);

    const name = ds.id;

    

    // 向蓝牙设备发送一个0x00的16进制数据

    let buffer = new ArrayBuffer(1);

    let dataView = new DataView(buffer);

    console.log("input value:...",this.data.inputValue);

    dataView.setUint8(0, parseInt(this.data.inputValue));

    

    console.log(buffer,dataView);

    console.log("data to be transferred:...",buf2hex(buffer))

    wx.writeBLECharacteristicValue({

      deviceId: this.data.deviceId,

      serviceId: this.data.serviceId,

 

      characteristicId: name,

      value: buffer

 

    })

  }



 

})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海里的鱼2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值