Beispiel #1
0
        /// <summary>
        /// 将结果放入当前sessionid的语义槽
        /// </summary>
        /// <param name="sessionId">与请求对应的sessionid</param>
        /// <param name="_SingleAnswers">返回的答案</param>
        public static void NlpControlerReceiveMsg(string sessionId, NlpAnswers _NlpAnswers)
        {
            //如果语义槽为空不再执行
            if (_SemanticsDic.ContainsKey(sessionId))
            {
                //如果当前语义槽标识位为State=0,则表示可以继续执行
                if (_SemanticsDic[sessionId].State == 0)
                {
                    //将结果放入当前sessionid的语义槽
                    _SemanticsDic[sessionId].NlpAnswers.Add(_NlpAnswers);
                    _SemanticsDic[sessionId].Answertimes += 1;
                    log.Info($"{_SemanticsDic[sessionId].Questions} {_SemanticsDic[sessionId].Answertimes} {_NlpAnswers.Code} 入槽内容(异步): { _NlpAnswers.Answers}");

                    //判断异步放入语义槽之后的数量,数量相等发送AI进行处理
                    if (_SemanticsDic[sessionId].Answertimes == INlps)
                    {
                        //把当前session状态设置1,表示全部放入完毕
                        _SemanticsDic[sessionId].State = 1;
                        //返回AI处理结果
                        AIControler.GetAIAnswers(_SemanticsDic[sessionId], "异步");
                    }
                }
                else
                {
                    log.Info($"异步超时入槽失败session :{sessionId},返回语义 : {_NlpAnswers.Answers}");
                }
            }
            else
            {
                log.Info($"异步响应未找到session :{sessionId},返回语义 : {_NlpAnswers.Answers}");
            }
        }
Beispiel #2
0
        public NlpAnswers SendMsg(SoundBodyRequest body)
        {
            NlpAnswers semanticsSlot = new NlpAnswers()
            {
                Code    = "SoundNlp",
                Name    = "音响",
                Level   = 2,
                Answers = body.req.ToString()
            };

            if (!string.IsNullOrEmpty(body.req.ToString()) && !body.req.ToString().Contains("name\":\"Speak"))
            {
                if (body.req.ToString().Contains("askingType\":\"WEATHER"))
                {
                    dynamic result = JsonConvert.DeserializeObject <dynamic>(body.req.ToString());//反序列化
                    //临沂今天阴转多云,4℃~11℃,和昨天差不多,当前空气质量指数170,中度污染,外出记得带上口罩。  description
                    semanticsSlot.Answers = result.directive.payload["description"].Value;
                }
                else
                {
                    semanticsSlot.Answers = body.req.ToString();
                }
            }
            else
            {
                semanticsSlot.Answers = "";
            }
            return(semanticsSlot);
        }
Beispiel #3
0
        public NlpAnswers SendMsg(SoundBodyRequest body)
        {
            NlpAnswers semanticsSlot = new NlpAnswers()
            {
                Code    = "ShopNlp",
                Name    = "购物",
                Answers = "购买窗帘",
            };

            return(semanticsSlot);
        }
Beispiel #4
0
        public NlpAnswers SendMsg(SoundBodyRequest body)
        {
            NlpAnswers semanticsSlot = new NlpAnswers()
            {
                Code    = "MusicNlp",
                Name    = "音乐",
                Answers = "播放《卷珠帘》",
            };

            return(semanticsSlot);
        }
Beispiel #5
0
        /// <summary>
        /// 异步返回智能家居数据
        /// 12345678_Ying;513;5omT5byA56qX5biY;Zip;H4sIAAAAAAAAAAEfAOD/6K6+5aSH5peg5rOV6K+G5YirQOaJk+W8gOeql+W4mCDHP38fAAAA$/r$
        /// </summary>
        /// <param name="msg"></param>
        public static void AsyncReceiveMsg(string msg)
        {
            log.Info($"AsyncSmartHomeReceiveMsg异步返回:{msg}");
            try
            {
                if (msg.IndexOf(";") > 0)
                {
                    //根据返回字符串得到sessionId
                    string sessionId = msg.Split(';')[0].Split('_')[0];
                    string deviceId  = msg.Split(';')[0].Split('_')[1];
                    log.Info("AsyncSmartHomeReceiveMsg异步返回sessionId:" + sessionId);

                    //添加当前智能家居异步返回语义
                    string msg64j = EncryptionHelp.Decrypt(msg.Split(';')[4].Replace("$/r$", ""), true);//解密"设备无法识别@打开窗帘"
                    string Answers;
                    if (msg64j.IndexOf("@") > 0)
                    {
                        Answers = "";//2020播放响应效果音可持续交流
                    }
                    else
                    {
                        Answers = msg64j; //2011播放url内容,播放完自动唤醒
                    }
                    NlpAnswers _NlpAnswers = new NlpAnswers()
                    {
                        Code    = "SmartHomeNlp",
                        Name    = "家居",
                        Answers = Answers,
                    };

                    //————————————————向中枢控制器指定的sessionId发送返回的语义结果——————————————————————————
                    NlpControler.AsyncReturnMsg(sessionId, _NlpAnswers);

                    log.Info($"AsyncSmartHomeReceiveMsg异步完毕,向中枢控制器指定的{sessionId}发送返回的语义结果:{_NlpAnswers.Answers}");
                }
            }
            catch (Exception ex)
            {
                log.Info($"异步发生异常:" + ex.Message);
            }
        }
Beispiel #6
0
 /// <summary>
 /// 异步返回智能家居数据
 /// user:16080_ac83f318064f type:other msg:16080_ac83f318064f;513;6Zi/5aeo5L+u6YeM6Z2i;Zip;H4sIAAAAAAAAAAEiAN3/6K6+5aSH5peg5rOV6K+G5YirQOmYv+WnqOS/rumHjOmdokgOnEMiAAAA$/r$
 /// </summary>
 /// <param name="msg">收到的响应结果</param>
 public static void SmartHomeNlpReceiveMsg(string msg)
 {
     try
     {
         string sessionId = msg.Split(';')[0].Split('_')[0];                                     //根据返回字符串得到sessionId
         string msg64j    = EncryptionHelp.Decrypt(msg.Split(';')[4].Replace("$/r$", ""), true); //解密"设备无法识别@打开窗帘"
                                                                                                 //拼装返回答案
         NlpAnswers _NlpAnswers = new NlpAnswers()
         {
             Code    = "SmartHomeNlp",
             Name    = "家居",
             Answers = msg64j,
             Level   = 1
         };
         //向中枢控制器指定的sessionId发送返回的语义结果
         _NlpControlerReceiveMsg(sessionId, _NlpAnswers);
     }
     catch (Exception)
     {
         throw;
     }
 }
Beispiel #7
0
        public NlpAnswers SendMsg(SoundBodyRequest body)
        {
            NlpAnswers semanticsSlot = new NlpAnswers()
            {
                Code  = "BaseNlp",
                Name  = "基础",
                Level = 0,
            };

            if (body.questions.Contains("几点"))
            {
                semanticsSlot.Answers = "现在时间是" + DateTime.Now.Hour + "点" + DateTime.Now.Minute + "分";
            }
            //else if (body.questions.Contains("天气") && !body.req.ToString().Contains("天气"))
            //{
            //    semanticsSlot.Answers = "今天气温2℃~11℃,天气晴,空气质量状况良";
            //}
            else
            {
                semanticsSlot.Answers = "";
            }
            return(semanticsSlot);
        }
Beispiel #8
0
        /// <summary>
        /// 接收到请求过来的消息,再开始发送向所有nlp多线程发送消息
        /// </summary>
        /// <param name="session">接收客户端session</param>
        /// <param name="body.questions">接收消息内容</param>
        public static void ProcessingRequest(SoundBodyRequest body)
        {
            try
            {
                log.Info($"--------------------------开始向各个NLP发送问题: {body.questions} --------------------------");
                if (body.sourceId == null)
                {
                    body.sourceId = "";
                }
                //添加当前请求到语义槽
                SemanticsSlot semanticsSlot = new SemanticsSlot()
                {
                    SessionId   = body.sessionId,
                    DeviceId    = body.deviceId,
                    Questions   = body.questions,
                    SourceId    = body.sourceId,
                    NlpAnswers  = new List <NlpAnswers>(),
                    Answertimes = 0,
                    State       = 0
                };
                //创建语义槽
                _SemanticsDic.TryAdd(body.sessionId, semanticsSlot);

                //超时检测标识
                CancellationTokenSource cts = new CancellationTokenSource();
                //多线程集合
                List <Task> taskList    = new List <Task>();
                TaskFactory taskFactory = new TaskFactory();

                var type  = typeof(INlp);
                var types = AppDomain.CurrentDomain.GetAssemblies()
                            .SelectMany(a => a.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(INlp))))
                            .ToArray();
                INlps = types.Count();//语义槽应该放入个数

                foreach (var v in types)
                {
                    if (v.IsClass)
                    {
                        taskList.Add(taskFactory.StartNew(() =>
                        {
                            try
                            {
                                //开始发送消息,并接收返回的语义
                                NlpAnswers _NlpAnswers = (Activator.CreateInstance(v) as INlp).SendMsg(body);
                                //如果线程没有被取消,放入语义槽
                                if (!cts.IsCancellationRequested)
                                {
                                    //过滤异步
                                    if (_NlpAnswers != null)
                                    {
                                        _SemanticsDic[body.sessionId].Answertimes += 1;
                                        lock (_lock)
                                        {
                                            //过滤""
                                            if (_NlpAnswers.Answers != "")
                                            {
                                                _SemanticsDic[body.sessionId].NlpAnswers.Add(_NlpAnswers);
                                                log.Info($"{body.questions} {_SemanticsDic[body.sessionId].Answertimes} {v.Name}  入槽内容: { _NlpAnswers.Answers.Replace("\r\n","")}");
                                            }
                                            else
                                            {
                                                log.Info($"{body.questions} {_SemanticsDic[body.sessionId].Answertimes} {v.Name} 返回内容为空");
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    log.Info($"{body.questions} {v.Name} 超时线程取消未入槽!");
                                }
                            }
                            catch (Exception ex)
                            {
                                log.Info($"开始向{v.Name}发送消息异常:{ex.Message}");
                            }
                        }, cts.Token));
                    }
                }

                //到了1.5秒还没有全部执行的,取消线程并返回
                taskList.Add(Task.Delay(1500).ContinueWith(t =>
                {
                    //如果语义槽为空不再执行
                    if (_SemanticsDic.ContainsKey(body.sessionId))
                    {
                        //如果当前语义槽标识位为State=0,则表示可以继续执行
                        if (_SemanticsDic[body.sessionId].State == 0)
                        {
                            //把当前session状态设置false
                            _SemanticsDic[body.sessionId].State = -1;
                            lock (_lock)
                            {
                                cts.Cancel();
                            }
                            //如果语义槽不为null再继续执行
                            if (_SemanticsDic[body.sessionId] != null)
                            {
                                //返回语义结果
                                AIControler.GetAIAnswers(_SemanticsDic[body.sessionId], "超时");
                            }
                        }
                    }
                }));
            }
            catch (Exception ex)
            {
                log.Info($"发送消息异常:{ex.Message}");
            }
        }