package speechNlu //type WebSocketSession struct { // Conn *websocket.Conn // SessionID string // RequestChan chan []byte // 发送请求的通道 // ResponseChan chan model.SpeechWsResp // 接收响应的通道 // ErrorChan chan error // 错误通知通道 // CloseChan chan struct{} // 主动关闭信号 // IsAlive bool // 连接状态标记 //} // //func SpeechWs(ip, deviceId string) (*websocket.Conn, error) { // SpeechWs_Url := global.SpeechSetting.Url // SpeechWs_ProductId := global.SpeechSetting.ProductId // SpeechWs_ApiKey := global.SpeechSetting.ApiKey // // //st := time.Now() // dialer := websocket.Dialer{ // HandshakeTimeout: 30 * time.Second, // } // // header := http.Header{} // header.Set("X-Forwarded-For", ip) // // SpeechUrl := SpeechWs_Url + "?serviceType=websocket&productId=" + SpeechWs_ProductId + // "&apikey=" + SpeechWs_ApiKey + "&deviceId=" + deviceId // fmt.Println(SpeechUrl) // // conn, resp, err := dialer.Dial(SpeechUrl, header) // if err != nil { // global.Logger.WithFields(logger.Fields{ // "url": SpeechUrl, // "resp": readResp(resp), // }).Errorf("[SpeechWs] Connect error : %v", err.Error()) // return nil, err // } // return conn, nil //} // //func SpeechNlpWsReq1(data *model.SemanticReq, session *WebSocketSession) *SpeechWsData { // req := &SpeechWsData{ // Topic: "nlu.input.text", // RecordId: data.RequestId, // SessionId: session.SessionID, // 直接从会话中获取 SessionID // RefText: data.Query, // } // global.Logger.WithFields(logger.Fields{ // "req": req, // "sessionId": session.SessionID, // }).Info("构造 NLU 请求") // return req //} // //func NewWebSocketSession(ip, deviceID string) (*WebSocketSession, error) { // // 建立 WebSocket 连接 // conn, err := SpeechWs(ip, deviceID) // if err != nil { // return nil, err // } // // session := &WebSocketSession{ // Conn: conn, // RequestChan: make(chan []byte, 10), // ResponseChan: make(chan model.SpeechWsResp, 10), // ErrorChan: make(chan error), // CloseChan: make(chan struct{}), // IsAlive: true, // } // // // 启动读写协程 // go session.readLoop() // go session.writeLoop() // // return session, nil //} // //func (s *WebSocketSession) readLoop() { // defer s.cleanup() // // for { // select { // case <-s.CloseChan: // return // default: // _, message, err := s.Conn.ReadMessage() // if err != nil { // s.ErrorChan <- fmt.Errorf("读取消息失败: %v", err) // return // } // // var resp model.SpeechWsResp // if err := json.Unmarshal(message, &resp); err != nil { // s.ErrorChan <- fmt.Errorf("解析消息失败: %v", err) // continue // } // // // 更新 SessionID(假设服务端返回 sessionId) // if resp.SessionId != "" { // s.SessionID = resp.SessionId // } // // s.ResponseChan <- resp // // // 检查是否需要结束会话(根据业务逻辑) // if resp.Dm != nil && resp.Dm.ShouldEndSession { // s.CloseChan <- struct{}{} // } // } // } //} // //func (s *WebSocketSession) writeLoop() { // defer s.cleanup() // // for { // select { // case <-s.CloseChan: // return // case req := <-s.RequestChan: // if err := s.Conn.WriteMessage(websocket.TextMessage, req); err != nil { // s.ErrorChan <- fmt.Errorf("发送请求失败: %v", err) // return // } // } // } //} // //func (s *WebSocketSession) Close() { // if s.IsAlive { // close(s.CloseChan) // 通知读写协程退出 // s.Conn.Close() // 关闭 WebSocket 连接 // s.IsAlive = false // } //} // //func (s *WebSocketSession) cleanup() { // close(s.RequestChan) // close(s.ResponseChan) // close(s.ErrorChan) //}