expo-ble模块测试demo 联调BLE模块 take 3 添加跟多log

This commit is contained in:
Yudi Xiao
2025-12-10 20:16:05 +08:00
parent 56a5d0d45e
commit 1d3a7eba45
4 changed files with 23 additions and 17 deletions

View File

@@ -1,5 +1,5 @@
import {ProtocolFrame} from './types';
import {FRAME_CONSTANTS} from './Constants';
import {FRAME_CONSTANTS, COMMAND_TYPES, FRAME_HEAD} from './Constants';
export class ProtocolManager {
@@ -15,22 +15,26 @@ export class ProtocolManager {
}
const checksumV1 = (0 - sum) & 0xff
const checksum = (~sum + 1) & 0xff
console.debug(`[ProtocolManager] Checksum V1 calculated: 0 - ${sum} = ${checksumV1}`);
console.debug(`[ProtocolManager] Checksum calculated: 0 - ${sum} = ${checksum}`);
console.debug(`[ProtocolManager] Checksum V1 calculated: 0 - ${sum} = ${checksumV1.toString(16).padStart(2, '0')}`);
console.debug(`[ProtocolManager] Checksum calculated: 0 - ${sum} = ${checksum.toString(16).padStart(2, '0')}`);
return checksum;
}
static verifyChecksum(frameData: Uint8Array, expectedChecksum: number): boolean {
const calculated = this.calculateChecksum(frameData);
return calculated === expectedChecksum;
return (frameData.length + expectedChecksum) === 0;
}
static createFrame(
type: number,
type: COMMAND_TYPES,
data: Uint8Array,
head: number = FRAME_CONSTANTS.HEAD_APP_TO_DEVICE,
head: FRAME_HEAD = FRAME_CONSTANTS.HEAD_APP_TO_DEVICE,
requireFragmentation: boolean = true
): Uint8Array[] {
// Max pages index is 4 bytes, so we can fit up to 65535 pages of data
const maxDataSize = 0xffff * (FRAME_CONSTANTS.HEADER_SIZE + FRAME_CONSTANTS.MAX_DATA_SIZE + FRAME_CONSTANTS.FOOTER_SIZE);
if (data.length > maxDataSize) {
throw new Error(`Data size ${data.length} exceeds max size ${maxDataSize}`);
}
if (data.length <= FRAME_CONSTANTS.MAX_DATA_SIZE || !requireFragmentation) {
console.debug(`[ProtocolManager] Frame size ${data.length} is less than max size ${FRAME_CONSTANTS.MAX_DATA_SIZE}, not fragmented`);
return [this.createSingleFrame(type, data, head)];
@@ -40,7 +44,7 @@ export class ProtocolManager {
}
}
private static createSingleFrame(type: number, data: Uint8Array, head: number): Uint8Array {
private static createSingleFrame(type: COMMAND_TYPES, data: Uint8Array, head: FRAME_HEAD): Uint8Array {
const buffer = new Uint8Array(FRAME_CONSTANTS.HEADER_SIZE + data.length + FRAME_CONSTANTS.FOOTER_SIZE);
let offset = 0;
@@ -71,7 +75,7 @@ export class ProtocolManager {
return buffer;
}
private static createFragmentedFrames(type: number, data: Uint8Array, head: number): Uint8Array[] {
private static createFragmentedFrames(type: COMMAND_TYPES, data: Uint8Array, head: FRAME_HEAD): Uint8Array[] {
const frames: Uint8Array[] = [];
const totalSize = data.length;
const maxDataSize = FRAME_CONSTANTS.MAX_DATA_SIZE;
@@ -92,9 +96,7 @@ export class ProtocolManager {
buffer[offset++] = (totalPages >> 8) & 0xff;
buffer[offset++] = totalPages & 0xff;
// curPage (descending order usually? No, BleManagerV2 comments said: "Protocol specifies: page numbers count down from highest to 0")
// Wait, ProtocolUtilsV2 code:
// const curPageVal = totalPages - 1 - i;
// Protocol specifies: page numbers count down from highest to 0
const curPageVal = totalPages - 1 - i;
buffer[offset++] = (curPageVal >> 8) & 0xff;
@@ -103,13 +105,15 @@ export class ProtocolManager {
// dataLen
buffer[offset++] = (chunk.length >> 8) & 0xff;
buffer[offset++] = chunk.length & 0xff;
console.debug(`chunk length = ${chunk.length}, buffer 8 header = ${buffer.slice(0, 8).toString()}`)
const hexHeader = Array.from(buffer.slice(0, offset)).map(b => b.toString(16).padStart(2, '0')).join(' ');
console.debug(`chunk length = ${chunk.length}, buffer 8 header = ${hexHeader}`)
// data
buffer.set(chunk, offset);
offset += chunk.length;
buffer[offset] = this.calculateChecksum(buffer.slice(0, offset));
const verify = this.verifyChecksum(buffer.slice(0, offset), buffer[offset]);
console.debug(`[ProtocolManager] Verify checksum: ${verify}`);
frames.push(buffer);
}