6***@qq.com
6***@qq.com
  • 发布:2025-11-06 18:17
  • 更新:2025-11-06 18:17
  • 阅读:13

uni.writeBLECharacteristicValue在app里无法写入

分类:uni-app

uni.writeBLECharacteristicValue在小程序里可以正常写入,蓝牙设备能收到数据,但是在app里,写入提示成功,但蓝牙设备没有收到数据。

writeData(data: any, serviceId?: string, characteristicId?: string): Promise<void> {  
    return new Promise(async (resolve, reject) => {  
      if (!this.isConnected) {  
        reject(new Error("蓝牙未连接"));  
        return;  
      }  

      try {  
        let targetServiceId = serviceId;  
        let targetCharacteristicId = characteristicId;  
        let writeType: "write" | "writeNoResponse" = "writeNoResponse";  

        // 如果没有提供serviceId和characteristicId,则动态获取  
        if (!serviceId || !characteristicId) {  
          const serviceChar = await this.discoverWriteCharacteristic();  
          targetServiceId = serviceChar.serviceId;  
          targetCharacteristicId = serviceChar.characteristicId;  
          writeType = serviceChar.writeType;  
        }  

        let bufferVal: ArrayBuffer;  
        console.log("写入数据", data);  
        if (typeof data === "string") {  
          const uint8Array = stringToUint8Array(data);  
          bufferVal = uint8Array.buffer;  

          // 确保我们使用的是正确的buffer(有些情况下可能需要slice)  
          if (  
            uint8Array.byteOffset !== 0 ||  
            uint8Array.byteLength !== uint8Array.buffer.byteLength  
          ) {  
            bufferVal = uint8Array.buffer.slice(  
              uint8Array.byteOffset,  
              uint8Array.byteOffset + uint8Array.byteLength  
            );  
          }  
        } else if (data instanceof ArrayBuffer) {  
          bufferVal = data;  
        } else {  
          const uint8Array = stringToUint8Array(JSON.stringify(data));  
          bufferVal = uint8Array.buffer;  

          // 同样处理slice  
          if (  
            uint8Array.byteOffset !== 0 ||  
            uint8Array.byteLength !== uint8Array.buffer.byteLength  
          ) {  
            bufferVal = uint8Array.buffer.slice(  
              uint8Array.byteOffset,  
              uint8Array.byteOffset + uint8Array.byteLength  
            );  
          }  
        }  

        console.log("准备写入数据", this.currentDeviceId, bufferVal, writeType);  

        uni.writeBLECharacteristicValue({  
          deviceId: this.currentDeviceId,  
          serviceId: targetServiceId!,  
          characteristicId: targetCharacteristicId!,  
          value: bufferVal,  
          writeType: writeType,  
          success: (res: any) => {  
            console.log("数据传输成功", res);  
            resolve();  
          },  
          fail: (err: any) => {  
            console.error("蓝牙数据写入失败", err);  
            // 尝试另一种写入类型  
            const alternateWriteType = writeType === "write" ? "writeNoResponse" : "write";  
            uni.writeBLECharacteristicValue({  
              deviceId: this.currentDeviceId,  
              serviceId: targetServiceId!,  
              characteristicId: targetCharacteristicId!,  
              value: bufferVal,  
              writeType: alternateWriteType,  
              success: (res2: any) => {  
                console.log("第二次尝试写入成功", res2);  
                resolve();  
              },  
              fail: (err2: any) => {  
                console.error("第二次尝试也失败了", err2);  
                reject(new Error("蓝牙数据写入失败"));  
              },  
            });  
          },  
        });  
      } catch (error) {  
        console.error("写入数据过程出错:", error);  
        reject(error);  
      }  
    });  
  }
2025-11-06 18:17 负责人:无 分享
已邀请:

要回复问题请先登录注册