Files
xiaomubiao-master/test-kmz-websocket.html
2026-05-22 16:13:20 +08:00

249 lines
12 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>测试KMZ WebSocket数据</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
background-color: #f5f5f5;
}
.container {
max-width: 800px;
margin: 0 auto;
background: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.test-data {
background: #f8f9fa;
padding: 15px;
border-radius: 4px;
margin: 15px 0;
word-break: break-all;
font-size: 12px;
}
.button {
background: #52c41a;
color: white;
border: none;
padding: 10px 20px;
border-radius: 4px;
cursor: pointer;
margin: 5px;
}
.button:hover {
background: #73d13d;
}
.info {
background: #e6f7ff;
border: 1px solid #91d5ff;
padding: 10px;
border-radius: 4px;
margin: 10px 0;
}
.success {
background: #f6ffed;
border: 1px solid #b7eb8f;
color: #52c41a;
}
</style>
</head>
<body>
<div class="container">
<h1>🧪 KMZ WebSocket数据测试</h1>
<div class="info">
<strong>测试说明:</strong> 点击下面的按钮来模拟发送您提供的KMZ文件数据测试下载功能
</div>
<h3>📊 测试数据</h3>
<div class="test-data" id="test-data">
已加载您提供的KMZ文件数据格式
</div>
<h3>🎛️ 测试操作</h3>
<button class="button" onclick="testDownload()">📥 测试下载KMZ文件</button>
<button class="button" onclick="showFileInfo()">📋 显示文件信息</button>
<button class="button" onclick="simulateMultipleFiles()">📁 模拟多文件接收</button>
<h3>📝 测试结果</h3>
<div id="result"></div>
</div>
<script>
// 您提供的KMZ文件数据
const kmzData = {
"version": "1.0",
"timestamp": 1757341102539,
"data": {
"host": {
"message_type": "kmz_data",
"task_id": "\u0001",
"task_name": "位置点侦查御4E",
"battle_unit_code": "1581F5FHC248A00DXGLU",
"data_type": "route",
"kmz_file": {
"file_name": "位置点侦查御4E_5_daotong_20250908_221822.kmz",
"file_size": 2136,
"file_path": "/opt/dji/routes/位置点侦查御4E_5_daotong_20250908_221822.kmz",
"download_url": "/api/v1/kmz/download/\u0001",
"file_type": "kmz"
},
"waypoints": [],
"task_config": {
"fly_to_wayline_mode": "safely",
"finish_action": "goHome",
"exit_on_rclost": "executeLostAction",
"execute_rclost_action": "goBack",
"take_off_security_height": 20,
"global_transitional_speed": 15,
"drone_info": {
"drone_enum_value": 77,
"drone_sub_enum_value": 0
},
"payload_info": {
"payload_enum_value": 66,
"payload_sub_enum_value": 0,
"payload_position_index": 0
},
"coordinate_system": {
"coordinate_mode": "WGS84",
"height_mode": "relativeToStartPoint",
"positioning_type": "GPS"
}
},
"create_time": "2025-09-08 22:18:22",
"update_time": "2025-09-08 22:18:22",
"file_data": "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",
"file_size": 2136
},
"sn": "1581F5FHC248A00DXGLU"
},
"biz_code": "kmz_file_data"
};
// 显示测试数据
document.getElementById('test-data').innerHTML = `
<strong>任务名称:</strong> ${kmzData.data.host.task_name}<br>
<strong>文件名:</strong> ${kmzData.data.host.kmz_file.file_name}<br>
<strong>文件大小:</strong> ${formatFileSize(kmzData.data.host.kmz_file.file_size)}<br>
<strong>设备SN:</strong> ${kmzData.data.sn}<br>
<strong>创建时间:</strong> ${kmzData.data.host.create_time}
`;
// 格式化文件大小
function formatFileSize(bytes) {
if (bytes === 0) return '0 Bytes';
const k = 1024;
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}
// 测试下载功能
function testDownload() {
try {
const fileData = kmzData.data.host.file_data;
const fileName = kmzData.data.host.kmz_file.file_name;
// 解码Base64数据
const byteCharacters = atob(fileData);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
const blob = new Blob([byteArray], { type: 'application/zip' });
// 创建下载链接
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = fileName;
a.style.display = 'none';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
showResult(`✅ KMZ文件下载成功: ${fileName}`, 'success');
} catch (error) {
console.error('KMZ文件下载失败:', error);
showResult(`❌ KMZ文件下载失败: ${error.message}`, 'error');
}
}
// 显示文件信息
function showFileInfo() {
const info = `
<h4>📁 KMZ文件详细信息</h4>
<p><strong>任务ID:</strong> ${kmzData.data.host.task_id}</p>
<p><strong>任务名称:</strong> ${kmzData.data.host.task_name}</p>
<p><strong>文件名:</strong> ${kmzData.data.host.kmz_file.file_name}</p>
<p><strong>文件大小:</strong> ${formatFileSize(kmzData.data.host.kmz_file.file_size)}</p>
<p><strong>文件类型:</strong> ${kmzData.data.host.kmz_file.file_type}</p>
<p><strong>设备SN:</strong> ${kmzData.data.sn}</p>
<p><strong>作战单位:</strong> ${kmzData.data.host.battle_unit_code}</p>
<p><strong>创建时间:</strong> ${kmzData.data.host.create_time}</p>
<p><strong>更新时间:</strong> ${kmzData.data.host.update_time}</p>
<p><strong>数据类型:</strong> ${kmzData.data.host.data_type}</p>
`;
showResult(info, 'info');
}
// 模拟多文件接收
function simulateMultipleFiles() {
const djiFile = {
...kmzData,
data: {
...kmzData.data,
host: {
...kmzData.data.host,
kmz_file: {
...kmzData.data.host.kmz_file,
file_name: "位置点侦查御4E_5_dji_20250908_221822.kmz"
}
}
}
};
const daotongFile = {
...kmzData,
data: {
...kmzData.data,
host: {
...kmzData.data.host,
kmz_file: {
...kmzData.data.host.kmz_file,
file_name: "位置点侦查御4E_5_daotong_20250908_221822.kmz"
}
}
}
};
showResult(`
<h4>📁 模拟多文件数据</h4>
<div style="background: #e6f7ff; padding: 10px; margin: 10px 0; border-radius: 4px;">
<p><strong>大疆文件:</strong> ${djiFile.data.host.kmz_file.file_name}</p>
<p><strong>道通文件:</strong> ${daotongFile.data.host.kmz_file.file_name}</p>
<p>在实际应用中,这些文件会分别显示在文件列表中,用户可以选择下载任意一个或全部下载。</p>
</div>
`, 'info');
}
function showResult(message, type) {
const resultDiv = document.getElementById('result');
resultDiv.innerHTML = `<div class="${type}">${message}</div>`;
}
</script>
</body>
</html>