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);
}
});
}
0 个回复