Exemplo n.º 1
0
        /// <summary>
        /// 返回当前请求session的答案
        /// </summary>
        /// <param name="msg"></param>
        public static string ResponseSoundBodyResult(SoundBodyResult bodyResult)
        {
            string returnMsg = "";

            if (_SessionDic.ContainsKey(bodyResult.deviceId))
            {
                WebSocketSession session = _SessionDic[bodyResult.deviceId];
                if (session != null)
                {
                    string jsonResult = JsonConvert.SerializeObject(bodyResult);
                    if (session.TrySend(jsonResult))
                    {
                        returnMsg = $"{bodyResult.questions} 返回音响成功:{jsonResult}";
                    }
                    else
                    {
                        returnMsg = $"{bodyResult.questions} WebSocketSession连接失效,返回结果失败";
                    }
                }
                else
                {
                    returnMsg = $"{bodyResult.questions} 音响对应的WebSocketSession为null";
                }
            }
            else
            {
                returnMsg = $"{bodyResult.questions} 音响不存在WebSocketSession连接";
            }
            log.Info(returnMsg);
            return(returnMsg);
        }
Exemplo n.º 2
0
 /// <summary>
 /// 主动请求音响
 /// </summary>
 /// <param name="msg"></param>
 public static bool ResponseSoundToRequest(SoundBodyResult bodyRequest)
 {
     if (_SessionDic.ContainsKey(bodyRequest.deviceId))
     {
         WebSocketSession session = _SessionDic[bodyRequest.deviceId];
         if (session != null)
         {
             string jsonResult = JsonConvert.SerializeObject(bodyRequest);
             if (session.TrySend(jsonResult))
             {
                 log.Info($"{bodyRequest.deviceId}请求音响成功:{jsonResult}");
                 return(true);
             }
             else
             {
                 log.Error($"{bodyRequest.deviceId}WebSocketSession连接失效,请求失败");
                 return(false);
             }
         }
         else
         {
             log.Info($"{bodyRequest.deviceId}音响对应的WebSocketSession为null,请求失败");
             return(false);
         }
     }
     else
     {
         log.Info($"{bodyRequest.deviceId}音响不存在WebSocketSession连接,请求失败");
         return(false);
     }
 }
Exemplo n.º 3
0
        /// <summary>
        /// 播放url内容,播放完成后自动唤醒
        /// </summary>
        /// <param name="msg">user:wali_Server type:other
        /// msg:wali_C40BCB80050A;3;3011;ac83f318064f(设备id);64(中文)1$/r$</param>
        public static string SoundMsg(string msg)
        {
            string devmac = msg.Split(';')[3];//给指定的音响发送消息
            string msg64j = EncryptionHelp.Decrypt(msg.Split(';')[4].Replace("$/r$", ""), false);
            //SoundPassiveRequest _SoundPassiveRequest = new SoundPassiveRequest()
            //{
            //    sessionId = Guid.NewGuid().ToString(),
            //    deviceId = devmac,
            //    actionId = "2011",
            //    req= msg64j,
            //    url= BaiduSDK.Tts(msg64j),
            //    blwakeup = "0"
            //};
            SoundBodyResult _SoundBodyRequest = new SoundBodyResult()
            {
                sessionId = Guid.NewGuid().ToString(),
                deviceId  = devmac,
                questions = "提醒",
                actionId  = "301",//与2011相似
                req       = msg64j,
                url       = BaiduSDK.Tts(msg64j),
                blwakeup  = "0"
            };

            if (_NlpControlerRequestMsg(_SoundBodyRequest))
            {
                return($"Remind OK");
            }
            else
            {
                return($"Remind Fail");
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// 更改是否自身播放音乐状态反转
        /// </summary>
        /// <param name="msg">user:wali_Server type:other
        /// msg:wali_C40BCB80050A;8;8215;88888888;1$/r$</param>
        public static string SoundReversal(string msg)
        {
            string userid = msg.Split(';')[0];

            userid = GetNewUserId_Server(userid);//主机_Server
            string devmac = msg.Split(';')[3];

            SoundBodyResult _SoundPassiveRequest = new SoundBodyResult()
            {
                sessionId = Guid.NewGuid().ToString(),
                deviceId  = devmac,
                actionId  = "8215",
                blwakeup  = "0"
            };

            //如果发送到音响失败,则不修改数据库
            if (_NlpControlerRequestMsg(_SoundPassiveRequest))
            {
                using (HsfDBContext hsfDBContext = new HsfDBContext())
                {
                    //获取主机和设备,删除标记为0,未删除的
                    var soundhostEntity = hsfDBContext.sound_host.Where(t => t.userid == userid && t.devmac == devmac && t.deletemark == 0).FirstOrDefault();
                    if (soundhostEntity != null)
                    {
                        //反转状态
                        if (soundhostEntity.playstate == 1 || soundhostEntity.playstate == null)
                        {
                            soundhostEntity.playstate = 0;
                        }
                        else
                        {
                            soundhostEntity.playstate = 1;
                        }
                        soundhostEntity.modifiytime = DateTime.Now;
                        hsfDBContext.SaveChanges();
                        return($"Reversal OK");
                    }
                    else
                    {
                        return($"Reversal Fail Database");
                    }
                }
            }
            else
            {
                return($"Reversal Fail");
            }
        }
Exemplo n.º 5
0
        public static void BackAnswers(string sessionId, string deviceId, string questions, string actionId, string req, string url)
        {
            //语义槽为空的情况下,只返回
            SoundBodyResult bodyResult = new SoundBodyResult()
            {
                sessionId = sessionId,
                deviceId  = deviceId,
                questions = questions,
                actionId  = actionId,
                req       = req,
                url       = url,//只有2014和2011返回的req走百度语音合成
                blwakeup  = "0"
            };

            HsfWebSocket.ResponseSoundBodyResult(bodyResult);
            //释放当前session
            SessionDispose(sessionId);
        }
Exemplo n.º 6
0
        /// <summary>
        /// 音响升级
        /// </summary>
        /// <param name="msg">user:wali_Server type:other
        /// msg:wali_C40BCB80050A;8;8216;88888888;1$/r$</param>
        public static string SoundUpgrade(string msg)
        {
            string          devmac = msg.Split(';')[3];//给指定的音响发送消息
            SoundBodyResult _SoundPassiveRequest = new SoundBodyResult()
            {
                sessionId = Guid.NewGuid().ToString(),
                deviceId  = devmac,
                actionId  = "8216",
                blwakeup  = "0"
            };

            if (_NlpControlerRequestMsg(_SoundPassiveRequest))
            {
                return($"Upgrade OK");
            }
            else
            {
                return($"Upgrade Fail");
            }
        }
Exemplo n.º 7
0
        /// <summary>
        /// 接收到消息,发送给Nlp管理器
        /// </summary>
        /// <param name="session">会话</param>
        /// <param name="message">消息内容</param>
        public static void ws_NewMessageReceived(WebSocketSession session, string message)
        {
            message = message.Replace(" ", "");
            message = message.Replace("\t", "");
            message = message.Replace("\r", "");
            message = message.Replace("\n", "");
            //log.Info($"web消息:{session.RemoteEndPoint.ToString()} : {message}");
            if (message.Equals("ping"))
            {
                session.Send("ping");
            }
            else if (message.Contains("\"actionId\":\"800\""))//心跳
            {
                //log.Info($"心跳: {session.RemoteEndPoint.ToString()}说: {message}");
                message = message.Replace("800", "801");
                session.Send(message);
            }
            else
            {
                //log.Info($"心跳外所有的消息: {session.RemoteEndPoint.ToString()}说: {message}");
                if (message.Contains("\"actionId\":\"111\""))///注册
                {
                    log.Info($"新的注册消息:{session.RemoteEndPoint.ToString()} : {message}");

                    #region 注册认证
                    try
                    {
                        SoundAuthentication soundEntity = JsonConvert.DeserializeObject <SoundAuthentication>(message);
                        if (soundEntity.req == "123")
                        {
                            //判断是否已经存在该主机的认证信息
                            SoundAuthentication soundAuth = SoundListIn.Where(a => a.deviceId == soundEntity.deviceId).FirstOrDefault();
                            //初次认证
                            if (soundAuth == null)
                            {
                                soundEntity.actionId  = "1111";
                                soundEntity.IPAddress = session.RemoteEndPoint.Address.ToString(); //登录ip
                                soundEntity.req       = Guid.NewGuid().ToString();                 // 如果成功,token会放入req内容处,客户端每次提交请求,都需带上token
                                SoundListIn.Add(soundEntity);                                      //放入音响缓存list

                                //保存当前session连接与主机对应
                                _SessionDic.TryAdd(soundEntity.deviceId, session);

                                //认证返回
                                SoundAuthenticationBack authBack = new SoundAuthenticationBack()
                                {
                                    sessionId = soundEntity.sessionId,
                                    actionId  = soundEntity.actionId,//1111
                                    req       = soundEntity.req,
                                };

                                session.Send(JsonConvert.SerializeObject(authBack));
                                log.Info($"认证成功:deviceId { soundEntity.deviceId} token {soundEntity.req}");
                            }
                            else
                            {
                                //断线之后会再次认证,返回之前的令牌,替换当前的session
                                //已经认证过的
                                SoundAuthenticationBack authBack = new SoundAuthenticationBack()
                                {
                                    sessionId = soundEntity.sessionId, //当前请求的session
                                    actionId  = soundAuth.actionId,    //1111
                                    req       = soundAuth.req,         //之前认证的令牌
                                };
                                //保存当前session连接与主机对应
                                _SessionDic.TryUpdate(soundEntity.deviceId, session, _SessionDic[soundEntity.deviceId]);

                                session.Send(JsonConvert.SerializeObject(authBack));
                                log.Info($"{ soundEntity.deviceId}已认证成功,req:{soundAuth.req}");
                            }
                        }
                        else
                        {
                            SoundAuthenticationBack authBack = new SoundAuthenticationBack()
                            {
                                sessionId = soundEntity.sessionId,
                                actionId  = "1112",
                            };
                            session.Send(JsonConvert.SerializeObject(authBack));
                            log.Info(soundEntity.deviceId + "认证失败");
                        }
                    }
                    catch (Exception ex)
                    {
                        SoundAuthenticationBack authBack = new SoundAuthenticationBack()
                        {
                            actionId = "1112",
                        };
                        session.Send(JsonConvert.SerializeObject(authBack));
                        log.Info("认证异常:" + ex.Message);
                    }
                    #endregion
                }
                else if (message.Contains("\"actionId\":\"201\""))///语音请求,音乐返回的语音结果
                {
                    log.Info($"\r\n新的语音请求: {message}");
                    #region 语音请求
                    try
                    {
                        SoundBodyRequest body = JsonConvert.DeserializeObject <SoundBodyRequest>(message);

                        //如果缓存中的音响槽,包括当前请求的  1.设备id  2.服务器分配的token一致  3.ip地址
                        SoundAuthentication sound = SoundListIn.Where(a => a.deviceId == body.deviceId && a.req == body.token).FirstOrDefault(); //&& a.IPAddress == session.RemoteEndPoint.Address.ToString()
                                                                                                                                                 //缓存中存在,则视为正常访问
                        if (sound != null)
                        {
                            //2.0增加人工智能处理部分代码
                            AIFunction(body);
                            ////1.0启动多线程
                            //Task.Run(() =>
                            //{
                            //    //发送收到的语音到NLP管理器
                            //    NlpControler.ProcessingRequest(body);
                            //});
                        }
                        else
                        {
                            //缓存中不存在则返回认证失败
                            SoundAuthenticationBack authBack = new SoundAuthenticationBack()
                            {
                                sessionId = body.sessionId,
                                actionId  = "1112",
                                req       = "认证失败"
                            };
                            session.Send(JsonConvert.SerializeObject(authBack));

                            //插入认证失败表
                            using (HsfDBContext hsfDBContext = new HsfDBContext())
                            {
                                sound_fail sound_Fail = new sound_fail()
                                {
                                    sessionId  = body.sessionId,
                                    deviceId   = body.deviceId,
                                    actionId   = body.actionId,
                                    token      = body.token,
                                    questions  = body.questions,
                                    IPAddress  = session.RemoteEndPoint.Address.ToString(),
                                    CreateTime = DateTime.Now
                                };
                                hsfDBContext.sound_fail.Add(sound_Fail);
                                hsfDBContext.SaveChanges();
                            }
                            log.Info(body.deviceId + "认证失败,已写入认证失败记录表");
                        }
                    }
                    catch (Exception ex)
                    {
                        SoundBodyResult bodyResult = new SoundBodyResult()
                        {
                            actionId = "2025",//异常,暂时返回不能识别
                            req      = ex.Message,
                            blwakeup = "0"
                        };
                        string jsonResult = JsonConvert.SerializeObject(bodyResult);
                        session.Send(jsonResult);
                    }
                    #endregion
                }
                else if (message.Contains("\"actionId\":\"202\""))///url媒体文件播放完
                {
                }
                else if (message.Contains("\"actionId\":\"205\""))///url媒体文件播放完
                {
                }
                else
                {
                    ///不做任何处理,让音箱执行自己逻辑
                    SoundBodyResult bodyResult = new SoundBodyResult()
                    {
                        actionId = "2010",
                        blwakeup = "0"
                    };
                    string jsonResult = JsonConvert.SerializeObject(bodyResult);
                    session.Send(jsonResult);
                }
            }
        }
Exemplo n.º 8
0
 /// <summary>
 /// 拼装返回音响的Json串,并返回
 /// </summary>
 public static bool NlpControlerRequestMsg(SoundBodyResult _SoundPassiveRequest)
 {
     log.Info($"智能家居app向音响发起请求: {_SoundPassiveRequest.req}");
     return(HsfWebSocket.ResponseSoundToRequest(_SoundPassiveRequest));
 }