uniapp获取蓝牙设备services服务为空解决办法

前阵子做uniapp项目遇到一个bug

uniapp前端使用下面的代码获取蓝牙设备服务时候显示为空,如下图设备服务是个空数组

解决办法:刚连接设备后,延时一段时间获取蓝牙设备服务

1.连接蓝牙设备

调用 uni.createBLEConnection   接口

const connectDevice = (device) => {
  // 连接设备
  uni.createBLEConnection({
    deviceId: device.deviceId,
    success(res) {
      console.log("设备连接成功:", res);
      uni.showToast({
        title: `已连接 ${device.name}`,
        icon: "success",
      });

      uni.getConnectedBluetoothDevices({
        success(res) {
          // 获取设备的服务和特征值
          getDeviceServices(device.deviceId);
        },
        fail(err) {
          console.error("获取连接设备失败:", err);
        },
      });
    },
    fail(err) {
      console.error("设备连接失败:", err);
      uni.showModal({
        title: "连接失败",
        content: `无法连接到设备 ${device.name},请重试。`,
        showCancel: false,
      });
    },
  });
};

2.获取蓝牙设备服务

const getDeviceServices = (deviceId) => {
	uni.getBLEDeviceServices({
	    deviceId,
	    success(res) {
	      console.log("设备的服务:", res.services);
	  
	      // 获取每个服务的特征值
	      res.services.forEach((service) => {
	        getDeviceCharacteristics(deviceId, service.uuid);
	      });
	    },
	    fail(err) {
	      console.log("获取服务失败:", err);
	    },
	});
};

第二步调用 uni.getBLEDeviceServices 接口获取到res.services是个空数组,可能是在刚连接蓝牙设备的时候立即获取不到设备的服务。在连接成功后,我们可以尝试使用定时器延时获取蓝牙设备的服务,代码更改为:

加上定时器,设置延时10s(时长自己决定)

const getDeviceServices = (deviceId) => {
  setTimeout(()=>{
	  uni.getBLEDeviceServices({
	    deviceId,
	    success(res) {
	      console.log("设备的服务:", res.services);
	  
	      // 获取每个服务的特征值
	      res.services.forEach((service) => {
	        getDeviceCharacteristics(deviceId, service.uuid);
	      });
	    },
	    fail(err) {
	      console.log("获取服务失败:", err);
	    },
	  });
  }, 10000)
};

然后神奇地发现,设备服务输出正常了。

参考链接:uni.getBLEDeviceServices android 下无法获取不到services(急急急) - DCloud问答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值