Commit 29c0b1a9 authored by 赵文静's avatar 赵文静

补充新闻rabbitmq部分

parent dbfeba08
...@@ -9,7 +9,7 @@ Server: ...@@ -9,7 +9,7 @@ Server:
Deregister: 1 #注销时间,相当于过期时间,单位:分钟 Deregister: 1 #注销时间,相当于过期时间,单位:分钟
RabbitMq: RabbitMq:
Url: amqp://iot:qwe!23@172.28.5.42:5672/voice Url: amqp://iot:qwe!23@172.28.124.106:5672/voice
ExchangeName: voice.media.ctrl ExchangeName: voice.media.ctrl
ExchangeType: direct ExchangeType: direct
...@@ -31,6 +31,12 @@ Device: #举例 ...@@ -31,6 +31,12 @@ Device: #举例
DB: DB:
Dsn: root:123456@tcp(172.28.124.105:3306)/chatroom?charset=utf8 Dsn: root:123456@tcp(172.28.124.105:3306)/chatroom?charset=utf8
Speech:
ProductId: 279629895
Apikey : 0c74988953dd4ed4bf31955527802cf3
Url: wss://dds.dui.ai/dds/v2/test
FeedBackUrl: http://apis.duiopen.com/feedback/letingv4
MusicDomain: MusicDomain:
IsQQMusicRemid: true # 是否替换为自定义的提醒 IsQQMusicRemid: true # 是否替换为自定义的提醒
QQMusicRemid: 。您的语音空调尚未激活,请尽快更新格力+APP,进入语音空调语音技能页面,点击QQ音乐进行授权,授权过程不产生任何费用。 QQMusicRemid: 。您的语音空调尚未激活,请尽快更新格力+APP,进入语音空调语音技能页面,点击QQ音乐进行授权,授权过程不产生任何费用。
......
...@@ -41,6 +41,7 @@ require ( ...@@ -41,6 +41,7 @@ require (
github.com/modern-go/reflect2 v1.0.2 // indirect github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect
github.com/pkg/errors v0.9.1 // indirect github.com/pkg/errors v0.9.1 // indirect
github.com/rabbitmq/amqp091-go v1.10.0 // indirect
github.com/smartystreets/goconvey v1.8.0 // indirect github.com/smartystreets/goconvey v1.8.0 // indirect
github.com/spf13/afero v1.9.5 // indirect github.com/spf13/afero v1.9.5 // indirect
github.com/spf13/cast v1.5.1 // indirect github.com/spf13/cast v1.5.1 // indirect
......
...@@ -306,6 +306,8 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b ...@@ -306,6 +306,8 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw=
github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o=
github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
......
...@@ -7,9 +7,12 @@ import ( ...@@ -7,9 +7,12 @@ import (
"log" "log"
"net" "net"
"net/url" "net/url"
"os"
"os/signal"
"runtime" "runtime"
"speech-nlu-parse/service/speechNlu" "speech-nlu-parse/service/speechNlu"
"strings" "strings"
"syscall"
"time" "time"
"speech-nlu-parse/dao" "speech-nlu-parse/dao"
...@@ -86,16 +89,30 @@ func setup() error { ...@@ -86,16 +89,30 @@ func setup() error {
} }
func main() { func main() {
var err error // 初始化配置
// 初始化, 加载配置 if err := setup(); err != nil {
err = setup() log.Fatalf("[FATAL] Setup failed: %v", err)
}
// 初始化 RabbitMQ 消费者
consumer, err := speechNlu.NewConsumer(
global.RabbitMqSetting.Url,
global.RabbitMqSetting.ExchangeName,
global.RabbitMqSetting.ExchangeType,
)
if err != nil { if err != nil {
return log.Fatalf("[FATAL] Create consumer failed: %v", err)
} }
defer func() {
if err := consumer.Shutdown(); err != nil {
log.Printf("[WARN] Consumer shutdown error: %v", err)
}
}()
lis, err := net.Listen("tcp", fmt.Sprintf(":%v", global.ServerSetting.Port)) // 初始化 gRPC
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", global.ServerSetting.Port))
if err != nil { if err != nil {
log.Fatalf("listen error:%v", err) log.Fatalf("[FATAL] Listen failed: %v", err)
} }
server := grpc.NewServer( server := grpc.NewServer(
...@@ -107,26 +124,26 @@ func main() { ...@@ -107,26 +124,26 @@ func main() {
)), )),
) )
proto.RegisterTencentNluServer(server, &service.TencentNlu{}) proto.RegisterTencentNluServer(server, &service.TencentNlu{})
grpc_health_v1.RegisterHealthServer(server, &consul.HealthImpl{})
_ = consul.RegisterService(global.ServerSetting) //将服务注册到注册中心 reflection.Register(server)
grpc_health_v1.RegisterHealthServer(server, &consul.HealthImpl{}) //执行健康检查
// 启动 gRPC 服务
reflection.Register(server) //使用grpcurl、grpcui工具需添加该行 go func() {
global.Logger.Info("service is running......")
global.Logger.Info("service is running......") if err := server.Serve(lis); err != nil {
log.Fatalf("[FATAL] gRPC serve error: %v", err)
if err = server.Serve(lis); err != nil { }
log.Fatalf("start service error:%v", err) }()
}
// 阻塞等待信号
c, err := speechNlu.NewConsumer(global.RabbitMqSetting.Url, global.RabbitMqSetting.ExchangeName, global.RabbitMqSetting.ExchangeType) stop := make(chan os.Signal, 1)
if err != nil { signal.Notify(stop, os.Interrupt, syscall.SIGTERM)
log.Fatalf("%s", err) <-stop
}
// 优雅关闭
if err := c.Shutdown(); err != nil { log.Println("[INFO] Shutting down...")
log.Printf("error during shutdown: %s", err) server.GracefulStop()
} log.Println("[INFO] Server stopped")
} }
func setupFlag() error { func setupFlag() error {
......
...@@ -91,9 +91,10 @@ type TencentGwSetting struct { ...@@ -91,9 +91,10 @@ type TencentGwSetting struct {
} }
type SpeechSettings struct { type SpeechSettings struct {
ProductId string ProductId string
ApiKey string ApiKey string
Url string Url string
FeedBackUrl string
} }
type RabbitMqSettings struct { type RabbitMqSettings struct {
......
...@@ -611,8 +611,8 @@ func (TencentNlu) TencentNluParseStream(stream proto.TencentNlu_TencentNluParseS ...@@ -611,8 +611,8 @@ func (TencentNlu) TencentNluParseStream(stream proto.TencentNlu_TencentNluParseS
speechNluWs := speechNlu.SpeechNlpWs{} speechNluWs := speechNlu.SpeechNlpWs{}
var nlpWsConn *websocket.Conn var nlpWsConn *websocket.Conn
deviceId := util.ComputerMd5(mac) deviceId := util.EncodeMD5(mac)
nlpWsConn, err = speechNluWs.SpeechWs(mac, ip, deviceId) nlpWsConn, err = speechNluWs.SpeechWs(ip, deviceId)
if err != nil { if err != nil {
global.Logger.Errorf("speechWs.SpeechWs error. %v", err) global.Logger.Errorf("speechWs.SpeechWs error. %v", err)
return err return err
......
...@@ -176,12 +176,6 @@ func chatDomain(params *model.SpeechDomainParams) []byte { ...@@ -176,12 +176,6 @@ func chatDomain(params *model.SpeechDomainParams) []byte {
// 目前无返回 // 目前无返回
func newsDomain(params *model.SpeechDomainParams) []byte { func newsDomain(params *model.SpeechDomainParams) []byte {
//resp, err := FeedBackNews(3, "45.244.56.176")
//if err != nil {
// return nil
//}
//fmt.Println(resp)
res, err := baseParse(params) res, err := baseParse(params)
if err != nil { if err != nil {
global.Logger.WithFields(logger.Fields{ global.Logger.WithFields(logger.Fields{
...@@ -193,6 +187,44 @@ func newsDomain(params *model.SpeechDomainParams) []byte { ...@@ -193,6 +187,44 @@ func newsDomain(params *model.SpeechDomainParams) []byte {
return replyWithChat(error_reply, "doudi") return replyWithChat(error_reply, "doudi")
} }
res.Header.Semantic.Domain = "news"
res.Header.Semantic.Intent = "search"
res.Header.Semantic.SkillId = res.Header.Semantic.Domain + "." + res.Header.Semantic.Intent
res.ListItems = make([]map[string]interface{}, 0)
sliceData, isSlice := params.SpeechWsResp.Dm.Widget.Content.([]interface{})
if !isSlice {
global.Logger.WithFields(logger.Fields{
"requestId": params.RequestId,
"mac": params.Mac,
"mid": params.Mid,
"vender": params.MidType,
}).Error("params.SpeechWsResp.Dm.Widget.Content不是数组类型")
if res.ResponseText != "" {
return replyWithChat(res.ResponseText, "doudi")
}
return replyWithChat(error_reply, "doudi")
}
for _, item := range sliceData {
itemBytes, _ := json.Marshal(item)
var con model.Content
if err := json.Unmarshal(itemBytes, &con); err != nil {
global.Logger.WithFields(logger.Fields{
"requestId": params.RequestId,
"mac": params.Mac,
"mid": params.Mid,
"vender": params.MidType,
}).Errorf("json.Unmarshal元素解析失败: %v", err)
return replyWithChat(error_reply, "doudi")
}
res.ListItems = append(res.ListItems, map[string]interface{}{
"url": con.LinkUrl,
"title": con.Title,
"newsFrom": "",
"newsType": "",
})
}
return Marshal(params, res) return Marshal(params, res)
} }
...@@ -923,8 +955,22 @@ func speechOtherDomain(params *model.SpeechDomainParams) []byte { ...@@ -923,8 +955,22 @@ func speechOtherDomain(params *model.SpeechDomainParams) []byte {
} }
func helpDomain(params *model.SpeechDomainParams) []byte { func helpDomain(params *model.SpeechDomainParams) []byte {
resultTextStr := "我可以控制空调开机、播放音乐、查询时间天气、调节温度,设置模式,例如您可以对我说,空调开机。" if !params.CheckDm() {
return replyWithChat(resultTextStr, "chat.chat") resultTextStr := "我可以控制空调开机、播放音乐、查询时间天气、调节温度,设置模式,例如您可以对我说,空调开机。"
return replyWithChat(resultTextStr, "chat.chat")
}
var result model.ResponseBody
result.Header.Semantic.Code = 0
result.Header.Semantic.Domain = "chat"
result.Header.Semantic.Intent = "chat"
result.Header.Semantic.Msg = speech_nlu_parse
result.Header.Semantic.SessionComplete = params.SpeechWsResp.Dm.ShouldEndSession //params.SpeechWsResp.Dm.ShouldEndSession
result.Header.Semantic.SkillId = result.Header.Semantic.Domain + "." + result.Header.Semantic.Intent
result.ResponseText = params.SpeechWsResp.Dm.Nlg
result.AsrRecongize = params.SpeechWsResp.Dm.Input
return Marshal(params, &result)
} }
func Marshal(params *model.SpeechDomainParams, res *model.ResponseBody) []byte { func Marshal(params *model.SpeechDomainParams, res *model.ResponseBody) []byte {
......
...@@ -37,12 +37,14 @@ type FeedBackResp struct { ...@@ -37,12 +37,14 @@ type FeedBackResp struct {
Source string `json:"source"` Source string `json:"source"`
} }
func FeedBackNews(actionType, duration int, ip, sid string) (*FeedBackResp, error) { func FeedBackNews(actionType, duration int, ip, sid, uid string) (*FeedBackResp, error) {
url := "http://apis.duiopen.com/feedback/letingv4?productId=279629895&apikey=0c74988953dd4ed4bf31955527802cf3&uid=111" //url := "http://apis.duiopen.com/feedback/letingv4?productId=279629895&apikey=0c74988953dd4ed4bf31955527802cf3&uid=111"
url := global.SpeechSetting.FeedBackUrl + "?productId=" + global.SpeechSetting.ProductId +
"&apikey=" + global.SpeechSetting.ApiKey + "&uid=" + uid
request := FeedBackReq{ request := FeedBackReq{
ActionType: actionType, ActionType: actionType,
Timestamp: time.Now().Unix(), Timestamp: time.Now().Unix(),
ClientIp: ip, ClientIp: ip, //ip
Brand: "gree", Brand: "gree",
Data: []map[string]interface{}{ Data: []map[string]interface{}{
{ {
......
...@@ -6,213 +6,227 @@ import ( ...@@ -6,213 +6,227 @@ import (
"log" "log"
"speech-nlu-parse/global" "speech-nlu-parse/global"
"speech-nlu-parse/pkg/logger" "speech-nlu-parse/pkg/logger"
"speech-nlu-parse/pkg/util"
"time" "time"
amqp "github.com/rabbitmq/amqp091-go" amqp "github.com/rabbitmq/amqp091-go"
) )
type Consumer struct { type Consumer struct {
conn *amqp.Connection conn *amqp.Connection
channel *amqp.Channel channel *amqp.Channel
tag string tag string
done chan error done chan error
amqpURI string
exchangeName string
exchangeType string
closeNotifier chan *amqp.Error
} }
func failOnError(err error, msg string) {
if err != nil {
global.Logger.Errorf("%s: %s", msg, err)
return
}
}
var consumerErr int
func NewConsumer(amqpURI, exchangeName, exchangeType string) (*Consumer, error) { func NewConsumer(amqpURI, exchangeName, exchangeType string) (*Consumer, error) {
c := &Consumer{ c := &Consumer{
conn: nil, amqpURI: amqpURI,
channel: nil, exchangeName: exchangeName,
done: make(chan error), exchangeType: exchangeType,
done: make(chan error),
} }
var err error
// 最大重试次数
maxRetries := 3 maxRetries := 3
retryInterval := 3 * time.Second
// 连接 RabbitMQ var err error
log.Printf("dialing %q", amqpURI) for i := 0; i < maxRetries; i++ {
c.conn, err = amqp.Dial(amqpURI) if err = c.connect(); err == nil {
if err != nil { break
global.Logger.Errorf("Dial: %s", err)
consumerErr++
if consumerErr > maxRetries {
return nil, fmt.Errorf("failed to connect after %d retries", maxRetries)
} }
time.Sleep(3 * time.Second) log.Printf("Connection attempt %d failed: %v", i+1, err)
return NewConsumer(amqpURI, exchangeName, exchangeType) // 重试连接 time.Sleep(retryInterval)
} }
defer c.conn.Close()
// 创建信道
log.Printf("got Connection, getting Channel")
c.channel, err = c.conn.Channel()
if err != nil { if err != nil {
global.Logger.Errorf("Failed to open a channel: %s", err) return nil, fmt.Errorf("failed to connect after %d retries: %v", maxRetries, err)
return nil, err
} }
defer c.channel.Close()
// 声明交换机 // 初始化 Exchange、Queue 和 Binding
log.Printf("got Channel, declaring Exchange (%q)", exchangeName) if err := c.setup(); err != nil {
err = c.exchangeDeclare(exchangeName, exchangeType) return nil, fmt.Errorf("setup failed: %v", err)
if err != nil {
global.Logger.Errorf("Failed to declare exchange: %s", err)
return nil, err
} }
queue := "news" // 启动消费者协程
routingKey := "news" go c.Consume()
// 监听通道关闭事件
go c.handleChannelClose()
// 声明队列并绑定 return c, nil
log.Printf("declared Exchange, declaring Queue %q", queue) }
err = c.queueDeclare(queue)
func (c *Consumer) connect() error {
var err error
c.conn, err = amqp.Dial(c.amqpURI)
if err != nil { if err != nil {
global.Logger.Errorf("Failed to declare queue %s: %s", queue, err) return fmt.Errorf("dial error: %v", err)
return nil, err
} }
err = c.channel.QueueBind(queue, routingKey, exchangeName, false, nil) c.channel, err = c.conn.Channel()
if err != nil { if err != nil {
global.Logger.Errorf("Failed to bind queue %s: %s", queue, err) c.conn.Close()
return nil, err return fmt.Errorf("channel error: %v", err)
} }
// 设置 QoS return nil
err = c.channel.Qos(10, 0, false) }
if err != nil {
global.Logger.Errorf("Failed to set QoS: %s", err) func (c *Consumer) setup() error {
return nil, err // 声明 Exchange
if err := c.channel.ExchangeDeclare(
c.exchangeName,
c.exchangeType,
true, // durable
false, // autoDelete
false, // internal
false, // noWait
nil, // args
); err != nil {
return fmt.Errorf("declare exchange error: %v", err)
} }
// 启动消费者 // 声明队列
err = c.Consume() queue := "news"
if err != nil { if _, err := c.channel.QueueDeclare(queue,
global.Logger.Errorf("Failed to start consumer: %s", err) true, // durable
return nil, err false, // autoDelete
false, // exclusive
false, // noWait
nil, // args
); err != nil {
return fmt.Errorf("declare queue error: %v", err)
} }
// 监听通道关闭事件 // 绑定队列
closeChan := make(chan *amqp.Error, 1) routingKey := "mqhandle"
notifyClose := c.channel.NotifyClose(closeChan) if err := c.channel.QueueBind(
queue,
routingKey,
c.exchangeName,
false, // noWait
nil, // args
); err != nil {
return fmt.Errorf("queue bind error: %v", err)
}
// 处理通道关闭事件 // 设置 QoS
for { if err := c.channel.Qos(10, 0, false); err != nil {
select { return fmt.Errorf("QoS error: %v", err)
case e := <-notifyClose:
global.Logger.Errorf("chan通道错误:%v", e.Error())
time.Sleep(5 * time.Second)
log.Println("休息5秒后重新连接")
// 重新连接
c, err = NewConsumer(amqpURI, exchangeName, exchangeType)
if err != nil {
global.Logger.Errorf("Failed to reconnect: %s", err)
return nil, err
}
return c, nil // 返回新的 Consumer 实例
}
} }
return nil
} }
func (c *Consumer) queueDeclare(queue string) error { func (c *Consumer) handleChannelClose() {
_, err := c.channel.QueueDeclare(queue, true, false, false, false, nil) closeErr := <-c.channel.NotifyClose(make(chan *amqp.Error))
return err if closeErr != nil {
global.Logger.Errorf("Channel closed: %v", closeErr)
// 触发重连逻辑
c.reconnect()
}
} }
func (c *Consumer) exchangeDeclare(exchangeName, exchangeType string) error { func (c *Consumer) reconnect() {
err := c.channel.ExchangeDeclare( log.Println("Attempting to reconnect...")
exchangeName, // name of the exchange var err error
exchangeType, // type for {
true, // durable time.Sleep(5 * time.Second)
false, // delete when complete if err := c.connect(); err == nil {
false, // internal if err := c.setup(); err == nil {
false, // noWait go c.Consume()
nil, // arguments go c.handleChannelClose()
) log.Println("Reconnected successfully")
return err return
}
}
log.Printf("Reconnect failed: %v", err)
}
} }
func (c *Consumer) Shutdown() error { func (c *Consumer) Shutdown() error {
// will close() the deliveries channel if c.channel != nil {
if err := c.channel.Cancel(c.tag, true); err != nil { if err := c.channel.Close(); err != nil {
return fmt.Errorf("Consumer cancel failed: %s", err) return fmt.Errorf("channel close error: %v", err)
}
}
if c.conn != nil {
if err := c.conn.Close(); err != nil {
return fmt.Errorf("connection close error: %v", err)
}
} }
return nil
}
if err := c.conn.Close(); err != nil { func (c *Consumer) Consume() {
return fmt.Errorf("AMQP connection close error: %s", err) msgs, err := c.channel.Consume(
"news",
"", // consumer
false, // autoAck
false, // exclusive
false, // noLocal
false, // noWait
nil, // args
)
if err != nil {
global.Logger.Errorf("Consume error: %v", err)
return
} }
defer log.Printf("AMQP shutdown OK") for d := range msgs {
var resp ReData
if err := json.Unmarshal(d.Body, &resp); err != nil {
global.Logger.Errorf("Unmarshal error: %v", err)
_ = d.Nack(false, true)
continue // 继续处理下一条消息
}
global.Logger.WithFields(logger.Fields{
"RoutingKey": d.RoutingKey,
"Body": string(d.Body),
"Response": resp,
}).Info("Received message")
// 处理消息逻辑
state, offset, mediaId := parseData(&resp)
uid := util.EncodeMD5(resp.Mac)
ip := "14.215.222.17" //todo:待改
if _, err := FeedBackNews(state, offset, ip, mediaId, uid); err != nil {
global.Logger.Errorf("Feedback error: %v", err)
_ = d.Nack(false, true)
continue
}
// wait for handle() to exit _ = d.Ack(false)
return <-c.done }
} }
type ReData struct { type ReData struct {
Mac string `json:"mac"`
Cols []string `json:"cols"` Cols []string `json:"cols"`
Dat []interface{} `json:"dat"` Dat []interface{} `json:"dat"`
} }
func (c *Consumer) Consume() { func parseData(resp *ReData) (state, offset int, mediaId string) {
msgs, err := c.channel.Consume("news", "", false, false, false, false, nil) for i, col := range resp.Cols {
failOnError(err, "Failed to register a consumer") switch col {
for d := range msgs { case "state":
resp := ReData{} if val, ok := resp.Dat[i].(float64); ok {
err := json.Unmarshal(d.Body, &resp) state = int(val)
if err != nil {
global.Logger.WithFields(logger.Fields{"requestId": requestId}).Errorf("subdev json.Unmarshal error: %v", err)
d.Nack(false, true)
break
}
global.Logger.WithFields(logger.Fields{
"requestId": requestId,
"RoutingKey": d.RoutingKey,
"Body": fmt.Sprintf("%s", d.Body),
"re": re,
}).Info("news")
// 初始化变量
var (
state, offset int
mediaId, ip string
)
//todo:还需要判断domain
// 遍历 cols 找到索引并取值
for i, col := range resp.Cols {
switch col {
case "state":
if val, ok := resp.Dat[i].(float64); ok {
state = int(val)
}
case "mediaId":
if val, ok := resp.Dat[i].(string); ok {
mediaId = val
}
case "offset":
if val, ok := resp.Dat[i].(float64); ok {
offset = int(val)
}
} }
//todo:还需要ip和mac case "mediaId":
feedBack, err := FeedBackNews(state, offset, ip, mediaId) if val, ok := resp.Dat[i].(string); ok {
failOnError(err, "FeedBackNews err") mediaId = val
if feedBack.Code != 0 { }
d.Nack(false, true) case "offset":
break if val, ok := resp.Dat[i].(float64); ok {
offset = int(val)
} }
d.Ack(false)
} }
} }
return
} }
...@@ -79,9 +79,9 @@ func SpeechNlu(reqStruct *model.SemanticReq) (string, *errCode.Error) { ...@@ -79,9 +79,9 @@ func SpeechNlu(reqStruct *model.SemanticReq) (string, *errCode.Error) {
speechNluWs := SpeechNlpWs{} speechNluWs := SpeechNlpWs{}
var nlpWsConn *websocket.Conn var nlpWsConn *websocket.Conn
deviceId := util.ComputerMd5(reqStruct.MacVoice) deviceId := util.EncodeMD5(reqStruct.MacVoice)
nlpWsConn, err = speechNluWs.SpeechWs(reqStruct.MacVoice, reqStruct.Ip, deviceId) nlpWsConn, err = speechNluWs.SpeechWs(reqStruct.Ip, deviceId)
if err != nil { if err != nil {
global.Logger.WithFields(logger.Fields{ global.Logger.WithFields(logger.Fields{
"requestId": reqStruct.RequestId, "requestId": reqStruct.RequestId,
......
...@@ -19,7 +19,7 @@ type SpeechNlpWs struct { ...@@ -19,7 +19,7 @@ type SpeechNlpWs struct {
mutex sync.Mutex mutex sync.Mutex
} }
func (s *SpeechNlpWs) SpeechWs(mac, ip, deviceId string) (*websocket.Conn, error) { func (s *SpeechNlpWs) SpeechWs(ip, deviceId string) (*websocket.Conn, error) {
SpeechWs_Url := global.SpeechSetting.Url SpeechWs_Url := global.SpeechSetting.Url
SpeechWs_ProductId := global.SpeechSetting.ProductId SpeechWs_ProductId := global.SpeechSetting.ProductId
SpeechWs_ApiKey := global.SpeechSetting.ApiKey SpeechWs_ApiKey := global.SpeechSetting.ApiKey
...@@ -34,6 +34,7 @@ func (s *SpeechNlpWs) SpeechWs(mac, ip, deviceId string) (*websocket.Conn, error ...@@ -34,6 +34,7 @@ func (s *SpeechNlpWs) SpeechWs(mac, ip, deviceId string) (*websocket.Conn, error
SpeechUrl := SpeechWs_Url + "?serviceType=websocket&productId=" + SpeechWs_ProductId + SpeechUrl := SpeechWs_Url + "?serviceType=websocket&productId=" + SpeechWs_ProductId +
"&apikey=" + SpeechWs_ApiKey + "&deviceId=" + deviceId "&apikey=" + SpeechWs_ApiKey + "&deviceId=" + deviceId
fmt.Println(SpeechUrl)
conn, resp, err := dialer.Dial(SpeechUrl, header) conn, resp, err := dialer.Dial(SpeechUrl, header)
if err != nil { if err != nil {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment