Initial commit
This commit is contained in:
201
src/api/websocket/gkDataConfig.ts
Normal file
201
src/api/websocket/gkDataConfig.ts
Normal file
@@ -0,0 +1,201 @@
|
||||
/*
|
||||
* @Date: 2024-12-19
|
||||
* @Description: GK数据WebSocket配置文件
|
||||
* @Author: Assistant
|
||||
* @FilePath: \drone-v2-command-screen\src\api\websocket\gkDataConfig.ts
|
||||
*/
|
||||
import { ELocalStorageKey } from '/@/types/enums'
|
||||
|
||||
/**
|
||||
* GK数据WebSocket配置接口
|
||||
*/
|
||||
export interface GKWebSocketConfig {
|
||||
/** 主服务器地址 */
|
||||
primary: string
|
||||
/** 备用服务器地址 */
|
||||
fallback: string
|
||||
/** WebSocket连接路径 */
|
||||
path: string
|
||||
/** 自动重连配置 */
|
||||
reconnect: {
|
||||
maxReconnectionDelay: number
|
||||
minReconnectionDelay: number
|
||||
maxRetries: number
|
||||
reconnectionDelayGrowFactor: number
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 默认GK数据WebSocket配置
|
||||
* 基于项目中的主服务器配置
|
||||
*/
|
||||
export const DEFAULT_GK_WEBSOCKET_CONFIG: GKWebSocketConfig = {
|
||||
// 主服务器地址(当前使用)
|
||||
primary: 'ws://27.11.11.30',
|
||||
|
||||
// 备用服务器地址
|
||||
fallback: 'ws://221.226.33.58:18800',
|
||||
|
||||
// WebSocket连接路径(与项目中的WebSocket路径保持一致)
|
||||
path: '/dji/api/v1/ws',
|
||||
|
||||
// 自动重连配置
|
||||
reconnect: {
|
||||
maxReconnectionDelay: 20000, // 最大重连延迟:20秒
|
||||
minReconnectionDelay: 5000, // 最小重连延迟:5秒
|
||||
maxRetries: 10, // 最大重试次数
|
||||
reconnectionDelayGrowFactor: 1.3
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取完整的GK数据WebSocket URL(带token认证)
|
||||
* @param useFallback 是否使用备用地址
|
||||
* @returns 完整的WebSocket URL
|
||||
*/
|
||||
export function getGKWebSocketUrl(useFallback: boolean = false): string {
|
||||
// 获取token(与项目现有方式保持一致)
|
||||
const token: string = localStorage.getItem(ELocalStorageKey.Token) || localStorage.getItem(ELocalStorageKey.WsToken) || ''
|
||||
|
||||
// 在开发环境下使用代理路径,生产环境使用直接连接
|
||||
if (import.meta.env.DEV) {
|
||||
// 开发环境:使用vite代理
|
||||
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'
|
||||
const host = window.location.host
|
||||
const baseUrl = `${protocol}//${host}/dji/api/v1/ws`
|
||||
|
||||
// 添加token认证参数
|
||||
if (token) {
|
||||
return `${baseUrl}?x-auth-token=${encodeURIComponent(token)}`
|
||||
}
|
||||
return baseUrl
|
||||
} else {
|
||||
// 生产环境:直接连接
|
||||
const config = DEFAULT_GK_WEBSOCKET_CONFIG
|
||||
const baseUrl = useFallback ? config.fallback : config.primary
|
||||
const fullUrl = `${baseUrl}${config.path}`
|
||||
|
||||
// 添加token认证参数
|
||||
if (token) {
|
||||
return `${fullUrl}?x-auth-token=${encodeURIComponent(token)}`
|
||||
}
|
||||
return fullUrl
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有可用的GK数据WebSocket URL
|
||||
* @returns 主地址和备用地址数组
|
||||
*/
|
||||
export function getAllGKWebSocketUrls(): string[] {
|
||||
return [
|
||||
getGKWebSocketUrl(false), // 主地址
|
||||
getGKWebSocketUrl(true) // 备用地址
|
||||
]
|
||||
}
|
||||
|
||||
/**
|
||||
* 从环境变量或进程中获取基础URL
|
||||
* 与vite.config.ts中的配置保持一致
|
||||
*/
|
||||
export function getBaseTargetUrl(): string {
|
||||
// 尝试从环境变量中获取(与vite.config.ts保持一致)
|
||||
if (typeof process !== 'undefined' && process.env?.BASE_TARGET_URL) {
|
||||
return process.env.BASE_TARGET_URL.replace(/"/g, '') // 移除JSON.stringify添加的引号
|
||||
}
|
||||
|
||||
// 默认返回主服务器地址
|
||||
return '27.11.11.30/'
|
||||
}
|
||||
|
||||
/**
|
||||
* 动态构建GK数据WebSocket URL
|
||||
* 基于项目运行时的配置
|
||||
*/
|
||||
export function buildGKWebSocketUrl(): string {
|
||||
const baseUrl = getBaseTargetUrl()
|
||||
|
||||
// 确保URL格式正确
|
||||
let wsUrl = baseUrl.startsWith('ws://') ? baseUrl : `ws://${baseUrl}`
|
||||
|
||||
// 移除末尾的斜杠(如果存在)
|
||||
if (wsUrl.endsWith('/')) {
|
||||
wsUrl = wsUrl.slice(0, -1)
|
||||
}
|
||||
|
||||
return `${wsUrl}${DEFAULT_GK_WEBSOCKET_CONFIG.path}`
|
||||
}
|
||||
|
||||
/**
|
||||
* GK数据WebSocket配置管理器
|
||||
*/
|
||||
export class GKWebSocketConfigManager {
|
||||
private currentUrl: string
|
||||
private fallbackUrl: string
|
||||
private retryCount: number = 0
|
||||
|
||||
constructor() {
|
||||
this.currentUrl = getGKWebSocketUrl(false)
|
||||
this.fallbackUrl = getGKWebSocketUrl(true)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前使用的WebSocket URL
|
||||
*/
|
||||
getCurrentUrl(): string {
|
||||
return this.currentUrl
|
||||
}
|
||||
|
||||
/**
|
||||
* 切换到备用地址
|
||||
*/
|
||||
switchToFallback(): void {
|
||||
console.log(`GK WebSocket 切换到备用地址: ${this.fallbackUrl}`)
|
||||
this.currentUrl = this.fallbackUrl
|
||||
this.retryCount++
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置到主地址
|
||||
*/
|
||||
resetToPrimary(): void {
|
||||
console.log(`GK WebSocket 重置到主地址: ${getGKWebSocketUrl(false)}`)
|
||||
this.currentUrl = getGKWebSocketUrl(false)
|
||||
this.retryCount = 0
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取重试次数
|
||||
*/
|
||||
getRetryCount(): number {
|
||||
return this.retryCount
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否应该切换到备用地址
|
||||
*/
|
||||
shouldSwitchToFallback(): boolean {
|
||||
return this.retryCount >= 3 && this.currentUrl !== this.fallbackUrl
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取重连配置
|
||||
*/
|
||||
getReconnectConfig() {
|
||||
return DEFAULT_GK_WEBSOCKET_CONFIG.reconnect
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 全局GK数据WebSocket配置管理器实例
|
||||
*/
|
||||
export const gkWebSocketConfigManager = new GKWebSocketConfigManager()
|
||||
|
||||
export default {
|
||||
DEFAULT_GK_WEBSOCKET_CONFIG,
|
||||
getGKWebSocketUrl,
|
||||
getAllGKWebSocketUrls,
|
||||
buildGKWebSocketUrl,
|
||||
GKWebSocketConfigManager,
|
||||
gkWebSocketConfigManager
|
||||
}
|
||||
Reference in New Issue
Block a user