expo-ble模块测试demo 联调BLE模块, 文件发送通过校验,去除多余的ANI文件缓存步骤
This commit is contained in:
@@ -6,7 +6,7 @@ import {
|
||||
BleClient,
|
||||
BleDevice,
|
||||
BleError,
|
||||
BleProtocolService, APP_COMMAND_TYPES,
|
||||
BleProtocolService,
|
||||
ConnectionState,
|
||||
DeviceInfo, COMMAND_TYPES,
|
||||
} from '../index';
|
||||
@@ -333,7 +333,7 @@ export const useBleExplorer = () => {
|
||||
}
|
||||
};
|
||||
|
||||
const convertToANI = useCallback(async (tempDir: Directory, media: ImagePicker.ImagePickerAsset): Promise<File> => {
|
||||
const convertToANIAsFile = useCallback(async (tempDir: Directory, media: ImagePicker.ImagePickerAsset): Promise<File> => {
|
||||
const tempFile = new File(tempDir, `${media.fileName?.split('.')[0]}.ani`)
|
||||
const formData = new FormData();
|
||||
formData.append('file', {
|
||||
@@ -356,7 +356,27 @@ export const useBleExplorer = () => {
|
||||
return tempFile;
|
||||
}, []);
|
||||
|
||||
const transferSampleFile = useCallback(async () => {
|
||||
const convertToANIAsBuffer = useCallback(async (tempDir: Directory, media: ImagePicker.ImagePickerAsset): Promise<ArrayBuffer> => {
|
||||
const formData = new FormData();
|
||||
formData.append('file', {
|
||||
uri: media.uri,
|
||||
name: media.fileName || 'video.mp4',
|
||||
type: media.mimeType || 'video/mp4',
|
||||
} as any);
|
||||
const response = await fetch("https://bowongai-test--ani-video-converter-fastapi-app.modal.run/api/convert/ani", {
|
||||
method: "POST",
|
||||
body: formData,
|
||||
headers: {'Accept': 'multipart/form-data',}
|
||||
});
|
||||
if (!response.ok) {
|
||||
throw new Error(`Conversion failed with status ${response.status}`);
|
||||
}
|
||||
const content = await response.arrayBuffer()
|
||||
console.debug(`Converted video size : ${content.byteLength} bytes`);
|
||||
return content;
|
||||
}, []);
|
||||
|
||||
const transferMedia = useCallback(async () => {
|
||||
if (!state.connectedDevice) {
|
||||
setError('No device connected');
|
||||
return;
|
||||
@@ -368,25 +388,22 @@ export const useBleExplorer = () => {
|
||||
console.debug(`[${state.connectedDevice.id}] processing ${medias.length} files...`);
|
||||
for (const media of medias) {
|
||||
if (media.type === 'video') {
|
||||
let tempFile: File;
|
||||
// let tempFile: File;
|
||||
let tempBuffer: ArrayBuffer;
|
||||
console.debug(`Converting video: ${media.fileName || 'video'}...`);
|
||||
setState(prev => ({...prev, loading: {...prev.loading, converting: true}}));
|
||||
tempFile = await convertToANI(tempDir, media)
|
||||
// tempFile = await convertToANIAsFile(tempDir, media)
|
||||
tempBuffer = await convertToANIAsBuffer(tempDir, media)
|
||||
setState(prev => ({...prev, loading: {...prev.loading, converting: false}}));
|
||||
console.log(`Transferring converted file to device...`);
|
||||
await fileTransferService.transferFile(
|
||||
state.connectedDevice.id,
|
||||
tempFile.uri,
|
||||
COMMAND_TYPES.TRANSFER_ANI_VIDEO,
|
||||
(progress) => {
|
||||
setState(prev => ({...prev, transferProgress: progress * 100}));
|
||||
// Optional: throttle logs to avoid spam
|
||||
if (Math.round(progress * 100) % 10 === 0) {
|
||||
// addLog(`Transfer progress: ${Math.round(progress * 100)}%`);
|
||||
}
|
||||
await fileTransferService.transferFile(state.connectedDevice.id, tempBuffer, COMMAND_TYPES.TRANSFER_ANI_VIDEO, (progress) => {
|
||||
setState(prev => ({...prev, transferProgress: progress * 100}));
|
||||
// Optional: throttle logs to avoid spam
|
||||
if (Math.round(progress * 100) % 10 === 0) {
|
||||
// addLog(`Transfer progress: ${Math.round(progress * 100)}%`);
|
||||
}
|
||||
);
|
||||
tempFile.delete();
|
||||
});
|
||||
// tempFile.delete();
|
||||
console.log(`Transfer successful`);
|
||||
} else if (media.type === 'image') {
|
||||
try {
|
||||
@@ -397,18 +414,15 @@ export const useBleExplorer = () => {
|
||||
|
||||
if (isGif) {
|
||||
console.debug(`Converting GIF to ANI: ${media.fileName || 'gif'}...`);
|
||||
const tempFile = await convertToANI(tempDir, media)
|
||||
// const tempFile = await convertToANIAsFile(tempDir, media)
|
||||
const tempBuffer = await convertToANIAsBuffer(tempDir, media)
|
||||
console.log(`Transferring converted file to device...`);
|
||||
await fileTransferService.transferFile(
|
||||
state.connectedDevice.id,
|
||||
tempFile.uri,
|
||||
COMMAND_TYPES.TRANSFER_ANI_VIDEO,
|
||||
(progress) => {
|
||||
await fileTransferService.transferFile(state.connectedDevice.id, tempBuffer, COMMAND_TYPES.TRANSFER_ANI_VIDEO, (progress) => {
|
||||
setState(prev => ({...prev, transferProgress: progress * 100}));
|
||||
}
|
||||
);
|
||||
console.log(`Transfer successful`);
|
||||
tempFile.delete();
|
||||
// tempFile.delete();
|
||||
console.log(`Cleaned up temp file`);
|
||||
return;
|
||||
}
|
||||
@@ -456,20 +470,7 @@ export const useBleExplorer = () => {
|
||||
console.log(`Unsupported media type: ${media.type}`);
|
||||
}
|
||||
}
|
||||
}, [state.connectedDevice, fileTransferService, convertToANI, setError]);
|
||||
|
||||
const transferEmptyTestPackage = useCallback(async () => {
|
||||
if (!state.connectedDevice) {
|
||||
setError('No device connected');
|
||||
return;
|
||||
}
|
||||
await fileTransferService.transferTestPackage(
|
||||
state.connectedDevice.id,
|
||||
(progress) => {
|
||||
setState(prev => ({...prev, transferProgress: progress * 100}));
|
||||
}
|
||||
)
|
||||
}, [fileTransferService, setError, state.connectedDevice])
|
||||
}, [state.connectedDevice, fileTransferService, convertToANIAsBuffer, setError]);
|
||||
|
||||
const clearLogs = useCallback(() => setState(prev => ({...prev, logs: []})), []);
|
||||
|
||||
@@ -482,8 +483,7 @@ export const useBleExplorer = () => {
|
||||
requestDeviceInfo,
|
||||
queryDeviceVersion,
|
||||
queryActivationStatus,
|
||||
transferSampleFile,
|
||||
transferEmptyTestPackage,
|
||||
transferMedia,
|
||||
clearLogs,
|
||||
updateActivationTime: () => {
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user