feat: update inference reporting and ffmpeg video merge

This commit is contained in:
gqc
2026-07-06 16:26:08 +08:00
parent 79490bd27b
commit 0842f555fd
10 changed files with 1430 additions and 990 deletions
+54 -14
View File
@@ -132,6 +132,7 @@ type WSClient struct {
subscribers map[string]func([]byte)
closeChan chan struct{}
reconnectFlag bool
reconnecting bool
}
// NewWSClient creates WebSocket client
@@ -185,7 +186,6 @@ func InitWSChannel() error {
}
isConnecting = true
defer func() { isConnecting = false }()
logger.Logger.Printf("Starting WebSocket connection initialization: %s", wsURL)
@@ -194,15 +194,21 @@ func InitWSChannel() error {
client, err := NewWSClient(wsURL)
if err != nil {
logger.Logger.Printf("Failed to create WebSocket client: %v", err)
wsMutex.Lock()
isConnecting = false
wsMutex.Unlock()
return
}
wsMutex.Lock()
defer wsMutex.Unlock()
if ConfigUpdateChan == nil {
ConfigUpdateChan = make(chan DeviceData, 100)
}
// Note: No longer calling LoadDeviceData() here to avoid duplicate loading
wsClient = client
isConnecting = false
logger.Logger.Printf("WebSocket connection initialized successfully (asynchronous)")
}()
@@ -228,7 +234,8 @@ func GetServiceID() string {
// RegisterService service registration - modified: now requires providing own server_id
func RegisterService(containerName string) (string, error) {
if wsClient == nil {
client := GetWSClient()
if client == nil {
return "", fmt.Errorf("WebSocket client not initialized")
}
@@ -243,7 +250,7 @@ func RegisterService(containerName string) (string, error) {
},
}
logger.Logger.Printf("Starting service registration: ContainerName=%s, ServiceID=%s", containerName, serviceID)
response, err := wsClient.sendRequest("register", params, true)
response, err := client.sendRequest("register", params, true)
if err != nil {
logger.Logger.Printf("Service registration failed: %v", err)
return "", err
@@ -258,21 +265,24 @@ func RegisterService(containerName string) (string, error) {
return "", fmt.Errorf("Service registration failed: Server returned abnormal response")
}
wsClient.serviceID = serviceID
client.mutex.Lock()
client.serviceID = serviceID
client.mutex.Unlock()
logger.Logger.Printf("Service registration successful: ServiceID=%s", serviceID)
return serviceID, nil
}
// SubscribeTopic topic subscription
func SubscribeTopic(topic string, callback func([]byte)) error {
if wsClient == nil {
client := GetWSClient()
if client == nil {
return fmt.Errorf("WebSocket client not initialized")
}
params := SubscribeParams{
Topic: topic,
}
logger.Logger.Printf("Starting topic subscription: Topic=%s", topic)
response, err := wsClient.sendRequest("subscribe", params, true)
response, err := client.sendRequest("subscribe", params, true)
if err != nil {
logger.Logger.Printf("Topic subscription failed: %v", err)
return err
@@ -281,9 +291,9 @@ func SubscribeTopic(topic string, callback func([]byte)) error {
logger.Logger.Printf("Topic subscription error: Code=%d, Message=%s", response.Error.Code, response.Error.Message)
return fmt.Errorf("Topic subscription error: %s", response.Error.Message)
}
wsClient.mutex.Lock()
wsClient.subscribers[topic] = callback
wsClient.mutex.Unlock()
client.mutex.Lock()
client.subscribers[topic] = callback
client.mutex.Unlock()
logger.Logger.Printf("Topic subscription successful: Topic=%s", topic)
return nil
}
@@ -344,7 +354,7 @@ func (c *WSClient) sendBinaryFrame(frameType byte, payload []byte) error {
if err != nil {
logger.Logger.Printf("WebSocket message sending failed: %v", err)
c.connected = false
go c.reconnect()
c.startReconnectLocked()
return fmt.Errorf("Message sending failed: %v", err)
}
return nil
@@ -431,7 +441,7 @@ func (c *WSClient) readLoop() {
c.mutex.Lock()
c.connected = false
c.mutex.Unlock()
go c.reconnect() // Trigger reconnection
c.startReconnect() // Trigger reconnection
return
}
@@ -569,7 +579,7 @@ func (c *WSClient) heartbeatLoop() {
c.mutex.Lock()
c.connected = false
c.mutex.Unlock()
go c.reconnect()
c.startReconnect()
} else {
logger.Logger.Printf("Ping sent successfully")
}
@@ -596,7 +606,13 @@ func (c *WSClient) reRegisterAndResubscribe() {
logger.Logger.Printf("Re-registration successful: ServiceID=%s", serviceID)
// 3. 重新订阅
c.mutex.Lock()
subscribers := make(map[string]func([]byte), len(c.subscribers))
for topic, callback := range c.subscribers {
subscribers[topic] = callback
}
c.mutex.Unlock()
for topic, callback := range subscribers {
if err := SubscribeTopic(topic, callback); err != nil {
logger.Logger.Printf("Failed to re-subscribe topic %s: %v", topic, err)
} else {
@@ -605,9 +621,32 @@ func (c *WSClient) reRegisterAndResubscribe() {
}
}
func (c *WSClient) startReconnect() {
c.mutex.Lock()
defer c.mutex.Unlock()
c.startReconnectLocked()
}
func (c *WSClient) startReconnectLocked() {
if !c.reconnectFlag || c.reconnecting {
return
}
c.reconnecting = true
go c.reconnect()
}
// connect/wschannel.go → reconnect complete fix
func (c *WSClient) reconnect() {
if !c.reconnectFlag {
defer func() {
c.mutex.Lock()
c.reconnecting = false
c.mutex.Unlock()
}()
c.mutex.Lock()
reconnectFlag := c.reconnectFlag
c.mutex.Unlock()
if !reconnectFlag {
return
}
@@ -636,12 +675,13 @@ func (c *WSClient) reconnect() {
// 重启读写循环
go c.readLoop()
go c.heartbeatLoop()
return
}
logger.Logger.Printf("Reconnection failed after 12 attempts")
c.mutex.Lock()
c.reconnectFlag = false
c.mutex.Unlock()
}
func (d *DeviceData) ToInferenceParams(port int) InferenceParams {
return InferenceParams{