/// <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); }
/// <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); } }
/// <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"); } }
/// <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"); } }
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); }
/// <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"); } }
/// <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); } } }
/// <summary> /// 拼装返回音响的Json串,并返回 /// </summary> public static bool NlpControlerRequestMsg(SoundBodyResult _SoundPassiveRequest) { log.Info($"智能家居app向音响发起请求: {_SoundPassiveRequest.req}"); return(HsfWebSocket.ResponseSoundToRequest(_SoundPassiveRequest)); }