Skip to content

Commit 848283c

Browse files
authored
feat: 新增react-native-ble-manager中write方法maxByteSize字段 (#32)
1 parent d4c4069 commit 848283c

File tree

4 files changed

+78
-17
lines changed

4 files changed

+78
-17
lines changed

harmony/ble_manager/src/main/ets/BleTurboModule.ts

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -249,23 +249,16 @@ export class BleTurboModule extends TurboModule implements TM.ReactNativeBleMana
249249

250250
async write(peripheralId: string, serviceUUID: string, characteristicUUID: string, data: number[],
251251
maxByteSize: number): Promise<void> {
252+
if(serviceUUID === null || characteristicUUID === null) {
253+
return Promise.reject('ServiceUUID and characteristicUUID required.')
254+
}
252255
try {
253-
let peripheral: PeripheralData = this.retrieveOrCreatePeripheral(peripheralId);
254-
if(serviceUUID === null || characteristicUUID === null) {
255-
return Promise.reject('ServiceUUID and characteristicUUID required.')
256-
}
257-
let result:Array<ble.GattService> = await peripheral.retrieveServices(peripheralId, [serviceUUID]);
258-
let gattService:ble.GattService = result.find((gattService) => gattService.serviceUuid === serviceUUID)
259-
console.info('gattService =====' + JSON.stringify(gattService))
260-
if(gattService === null || gattService === undefined) {
261-
return Promise.reject(`serviceUUID + ${serviceUUID} + not found.`)
262-
}
263-
let characteristic: ble.BLECharacteristic = peripheral.findWritableCharacteristic(gattService,characteristicUUID,ble.GattWriteType.WRITE);
264-
if(characteristic === null || characteristic === undefined) {
265-
return Promise.reject(`Characteristic + ${characteristicUUID} + not found.`)
256+
let peripheral = this.peripherals.get(peripheralId);
257+
if (peripheral) {
258+
peripheral.write(serviceUUID,characteristicUUID,new Uint8Array(data),maxByteSize,ble.GattWriteType.WRITE);
259+
} else {
260+
return Promise.reject('Peripheral not found')
266261
}
267-
let device: ble.GattClientDevice = peripheral.getDevice();
268-
device.writeCharacteristicValue(characteristic, ble.GattWriteType.WRITE);
269262
return Promise.resolve()
270263
} catch (error) {
271264
return Promise.reject(error + "Write failed")
@@ -714,8 +707,7 @@ export class BleTurboModule extends TurboModule implements TM.ReactNativeBleMana
714707
if (peripheralData === null || peripheralData === undefined) {
715708
if (peripheralId) {
716709
peripheralId = peripheralId.toLowerCase();
717-
}
718-
;
710+
};
719711
if (this.isBluetoothAddress(peripheralId)) {
720712
try {
721713
let device: ble.GattClientDevice = ble.createGattClientDevice(peripheralId);

harmony/ble_manager/src/main/ets/PeripheralData.ts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,75 @@ export default class PeripheralData {
240240
});
241241
}
242242

243+
async write(serviceUUID: string, characteristicUUID: string, data:Uint8Array,
244+
maxByteSize: number,writeType:number): Promise<void> {
245+
if(!this.isConnected || this.device === null) {
246+
return Promise.reject('Device is not connected')
247+
}
248+
let result:Array<ble.GattService> = await this.device.getServices();
249+
let gattService:ble.GattService = result.find((gattService) => gattService.serviceUuid === serviceUUID)
250+
if(gattService === null || gattService === undefined) {
251+
return Promise.reject(`serviceUUID + ${serviceUUID} + not found.`)
252+
}
253+
let characteristic: ble.BLECharacteristic = this.findWritableCharacteristic(gattService,characteristicUUID,writeType);
254+
if(characteristic === null || characteristic === undefined) {
255+
return Promise.reject(`Characteristic + ${characteristicUUID} + not found.`)
256+
}
257+
if(data.length <= maxByteSize) {
258+
if(!this.doWrite(characteristic,new Uint8Array(data))) {
259+
return Promise.reject("Write failed")
260+
} else {
261+
return Promise.resolve();
262+
}
263+
} else {
264+
let dataLength = data.length;
265+
let count = 0;
266+
let firstMessage:Uint8Array = null;
267+
const splittedMessage = [];
268+
while (count < dataLength && (dataLength -count)> maxByteSize) {
269+
if(count == 0) {
270+
//处理第一个信息
271+
firstMessage = new Uint8Array(data).subarray(count, count + maxByteSize);
272+
} else {
273+
//将其分割数据添加到列表
274+
splittedMessage.push(new Uint8Array(data).subarray(count,count + maxByteSize))
275+
}
276+
count += maxByteSize;
277+
}
278+
if(count < dataLength) {
279+
splittedMessage.push(new Uint8Array(data).subarray(count, data.length))
280+
}
281+
//harmonyOS 默认writeType == ble.GattWriteType.WRITE
282+
let writeError:boolean = false;
283+
if(!this.doWrite(characteristic,firstMessage)) {
284+
writeError = true;
285+
return Promise.reject('Write failed')
286+
}
287+
if(!writeError) {
288+
for (let i = 0;i< splittedMessage.length;i++) {
289+
let message = splittedMessage[i];
290+
if(!this.doWrite(characteristic,message)) {
291+
writeError = true;
292+
return Promise.reject('Write failed')
293+
}
294+
}
295+
}
296+
}
297+
return Promise.resolve();
298+
}
299+
300+
doWrite(characteristic: ble.BLECharacteristic,data:Uint8Array):boolean{
301+
try {
302+
characteristic.characteristicValue = data.buffer;
303+
this.device.writeCharacteristicValue(characteristic,ble.GattWriteType.WRITE)
304+
return true;
305+
} catch (error) {
306+
console.info('Write failed :' + JSON.stringify(error))
307+
return false;
308+
}
309+
}
310+
311+
243312
findWritableCharacteristic(gattService:ble.GattService,characteristicUUID: string,writeType:number):ble.BLECharacteristic{
244313
let writeProperty = ble.GattWriteType.WRITE;
245314
if(writeType == ble.GattWriteType.WRITE_NO_RESPONSE) {

harmony/ble_managerGatt.har

518 Bytes
Binary file not shown.

harmony/ble_managerServers.har

526 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)