124 lines
3.7 KiB
JavaScript
124 lines
3.7 KiB
JavaScript
import { otaStatusStyle } from './document.js';
|
|
import { log } from './utils/logger.js';
|
|
|
|
// WebSocket 连接
|
|
export async function webSocketConnect(otaUrl, config) {
|
|
|
|
if (!validateConfig(config)) {
|
|
return;
|
|
}
|
|
|
|
// 发送OTA请求并获取返回的websocket信息
|
|
const otaResult = await sendOTA(otaUrl, config);
|
|
if (!otaResult) {
|
|
log('无法从OTA服务器获取信息', 'error');
|
|
return;
|
|
}
|
|
|
|
// 从OTA响应中提取websocket信息
|
|
const { websocket } = otaResult;
|
|
if (!websocket || !websocket.url) {
|
|
log('OTA响应中缺少websocket信息', 'error');
|
|
return;
|
|
}
|
|
|
|
// 使用OTA返回的websocket URL
|
|
let connUrl = new URL(websocket.url);
|
|
|
|
// 添加token参数(从OTA响应中获取)
|
|
if (websocket.token) {
|
|
if (websocket.token.startsWith("Bearer ")) {
|
|
connUrl.searchParams.append('authorization', websocket.token);
|
|
} else {
|
|
connUrl.searchParams.append('authorization', 'Bearer ' + websocket.token);
|
|
}
|
|
}
|
|
|
|
// 添加认证参数(保持原有逻辑)
|
|
connUrl.searchParams.append('device-id', config.deviceId);
|
|
connUrl.searchParams.append('client-id', config.clientId);
|
|
|
|
const wsurl = connUrl.toString()
|
|
|
|
log(`正在连接: ${wsurl}`, 'info');
|
|
|
|
if (wsurl) {
|
|
document.getElementById('serverUrl').value = wsurl;
|
|
}
|
|
|
|
return new WebSocket(connUrl.toString());
|
|
}
|
|
|
|
// 验证配置
|
|
function validateConfig(config) {
|
|
if (!config.deviceMac) {
|
|
log('设备MAC地址不能为空', 'error');
|
|
return false;
|
|
}
|
|
if (!config.clientId) {
|
|
log('客户端ID不能为空', 'error');
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// 判断wsUrl路径是否存在错误
|
|
function validateWsUrl(wsUrl) {
|
|
if (wsUrl === '') return false;
|
|
// 检查URL格式
|
|
if (!wsUrl.startsWith('ws://') && !wsUrl.startsWith('wss://')) {
|
|
log('URL格式错误,必须以ws://或wss://开头', 'error');
|
|
return false;
|
|
}
|
|
return true
|
|
}
|
|
|
|
|
|
// OTA发送请求,验证状态,并返回响应数据
|
|
async function sendOTA(otaUrl, config) {
|
|
try {
|
|
const res = await fetch(otaUrl, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'Device-Id': config.deviceId,
|
|
'Client-Id': config.clientId
|
|
},
|
|
body: JSON.stringify({
|
|
version: 0,
|
|
uuid: '',
|
|
application: {
|
|
name: 'xiaozhi-web-test',
|
|
version: '1.0.0',
|
|
compile_time: '2025-04-16 10:00:00',
|
|
idf_version: '4.4.3',
|
|
elf_sha256: '1234567890abcdef1234567890abcdef1234567890abcdef'
|
|
},
|
|
ota: { label: 'xiaozhi-web-test' },
|
|
board: {
|
|
type: 'xiaozhi-web-test',
|
|
ssid: 'xiaozhi-web-test',
|
|
rssi: 0,
|
|
channel: 0,
|
|
ip: '192.168.1.1',
|
|
mac: config.deviceMac
|
|
},
|
|
flash_size: 0,
|
|
minimum_free_heap_size: 0,
|
|
mac_address: config.deviceMac,
|
|
chip_model_name: '',
|
|
chip_info: { model: 0, cores: 0, revision: 0, features: 0 },
|
|
partition_table: [{ label: '', type: 0, subtype: 0, address: 0, size: 0 }]
|
|
})
|
|
});
|
|
|
|
if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);
|
|
|
|
const result = await res.json();
|
|
otaStatusStyle(true)
|
|
return result; // 返回完整的响应数据
|
|
} catch (err) {
|
|
otaStatusStyle(false)
|
|
return null; // 失败返回null
|
|
}
|
|
} |