HDL-ON_Android/Assets/Language.ini
@@ -810,43 +810,7 @@ 6095=More than 30 add buttons 7108=Leak/No Leak 7109=Leak 7110=No leak 7111=Water leaking/no water leaking 7112=Water leaking 7113=No water leaking 7114=Someone/Nobody 7115=Someone 7116=Nobody 7117=Open/Close 7118=On 7119=Close 7120=Anti-dismantling function 7121=Online 7122=Not online 7123=Air quality 7124=Excellent 7125=Good 7126=Poor 7127=Send notification 7128=Notification content 7129=(within 100 characters) 7130=Account selection 7131=App push 7132=Automation 7133=Executed 7134=Target State 7135=Tumble 7136=Temperature 7137=Humidity 7138=PM2.5 7139=CO2 7140=TVOC 7141=Exceeding 7142=Serious 7143=High 7144=excellence 6000=Rename @@ -975,6 +939,46 @@ 7105=Light pollution: 75 ~ 115ug/m3 7106=Moderate pollution: 115 ~ 150ug/m3 7107=Heavy pollution: > 150ug/m3 7108=Leak/No Leak 7109=Leak 7110=No leak 7111=Water leaking/no water leaking 7112=Water leaking 7113=No water leaking 7114=Someone/Nobody 7115=Someone 7116=Nobody 7117=Open/Close 7118=On 7119=Close 7120=Anti-dismantling function 7121=Online 7122=Not online 7123=Air quality 7124=Excellent 7125=Good 7126=Poor 7127=Send notification 7128=Notification content 7129=(within 100 characters) 7130=Account selection 7131=App push 7132=Automation 7133=Executed 7134=Target State 7135=Tumble 7136=Temperature 7137=Humidity 7138=PM2.5 7139=CO2 7140=TVOC 7141=Exceeding 7142=Serious 7143=High 7144=excellence 7145=Security 7146=Add security 7146=添加安防 9000=Please sign in with new cell phone number. 9001=Please sign in with new email address. @@ -2041,6 +2045,7 @@ 7142=严重 7143=偏高 7144=优秀 7145=安防 9000=请使用新的手机账号登录APP 9001=请使用新的邮箱账号登录APP HDL-ON_Android/Assets/Phone/LogicIcon/security.png
HDL-ON_iOS/Resources/Language.ini
@@ -824,43 +824,7 @@ 6095=More than 30 add buttons 7108=Leak/No Leak 7109=Leak 7110=No leak 7111=Water leaking/no water leaking 7112=Water leaking 7113=No water leaking 7114=Someone/Nobody 7115=Someone 7116=Nobody 7117=Open/Close 7118=On 7119=Close 7120=Anti-dismantling function 7121=Online 7122=Not online 7123=Air quality 7124=Excellent 7125=Good 7126=Poor 7127=Send notification 7128=Notification content 7129=(within 100 characters) 7130=Account selection 7131=App push 7132=Automation 7133=Executed 7134=Target State 7135=Tumble 7136=Temperature 7137=Humidity 7138=PM2.5 7139=CO2 7140=TVOC 7141=Exceeding 7142=Serious 7143=High 7144=excellence 6000=Rename @@ -989,6 +953,47 @@ 7105=Light pollution: 75 ~ 115ug/m3 7106=Moderate pollution: 115 ~ 150ug/m3 7107=Heavy pollution: > 150ug/m3 7108=Leak/No Leak 7109=Leak 7110=No leak 7111=Water leaking/no water leaking 7112=Water leaking 7113=No water leaking 7114=Someone/Nobody 7115=Someone 7116=Nobody 7117=Open/Close 7118=On 7119=Close 7120=Anti-dismantling function 7121=Online 7122=Not online 7123=Air quality 7124=Excellent 7125=Good 7126=Poor 7127=Send notification 7128=Notification content 7129=(within 100 characters) 7130=Account selection 7131=App push 7132=Automation 7133=Executed 7134=Target State 7135=Tumble 7136=Temperature 7137=Humidity 7138=PM2.5 7139=CO2 7140=TVOC 7141=Exceeding 7142=Serious 7143=High 7144=excellence 7145=Security 7146=Add security 9000=Please sign in with new cell phone number. 9001=Please sign in with new email address. @@ -2068,6 +2073,9 @@ 7142=严重 7143=偏高 7144=优秀 7145=安防 7146=添加安防 9000=请使用新的手机账号登录APP 9001=请使用新的邮箱账号登录APP HDL-ON_iOS/Resources/Phone/LogicIcon/security.png
HDL_ON/Common/R.cs
@@ -2539,6 +2539,14 @@ /// 优秀 /// </summary> public const int youxiu = 7144; /// <summary> /// 安防 /// </summary> public const int anfang = 7145; /// <summary> /// 添加安防 /// </summary> public const int addSecurityLogic = 7046; #region LE新增 HDL_ON/UI/UI2/3-Intelligence/Automation/AddInputType.cs
@@ -49,9 +49,16 @@ functionView.frameLayout.Y = Application.GetRealHeight(0); } //场景 LogicView.SelectTypeView sceneView = new LogicView.SelectTypeView(); sceneView.frameLayout.Y = functionView.frameLayout.Bottom; sceneView.btnText.TextID = StringId.Scenes; sceneView.btnIcon.UnSelectedImagePath = "LogicIcon/scene.png"; viewLayout.AddChidren(sceneView.FLayoutView()); //室外变化 LogicView.SelectTypeView shiwaiView = new LogicView.SelectTypeView(); shiwaiView.frameLayout.Y = functionView.frameLayout.Bottom; shiwaiView.frameLayout.Y = sceneView.frameLayout.Bottom; shiwaiView.btnText.TextID = StringId.shiwaibainhua; shiwaiView.btnIcon.UnSelectedImagePath = "LogicIcon/changesinoutdoor.png"; @@ -78,6 +85,11 @@ funTpye.Show(LogicMethod.condition_if); MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1; }; //场景点击事件 sceneView.btnClick.MouseUpEventHandler += (sen, e) => { SceneMethod(); }; //室外变化 shiwaiView.btnClick.MouseUpEventHandler += (sen, e) => { Weather weather = new Weather(); @@ -88,5 +100,70 @@ #endregion } /// <summary> /// 添加场景 /// </summary> public void SceneMethod() { var sceneList = LogicMethod.CurrLogicMethod.GetSceneList(); List<string> nameList = new List<string>(); for (int i = 0; i < sceneList.Count; i++) { var scene = sceneList[i]; nameList.Add(scene.name); } PublicInterface publicInterface = new PublicInterface(); publicInterface.FrameOrVv(this, nameList, new List<string> { }, StringId.addSceneLogic, (index) => { var sceneSelecetd = sceneList[index]; Input input = new Input(); input.sid = sceneSelecetd.sid; input.condition_type = "10"; Dictionary<string, string> dic = new Dictionary<string, string>(); LogicMethod.CurrLogicMethod.dictionary(dic, "key", "scene"); LogicMethod.CurrLogicMethod.dictionary(dic, "comparator", "="); LogicMethod.CurrLogicMethod.dictionary(dic, "data_type", "string"); LogicMethod.CurrLogicMethod.dictionary(dic, "value", "on"); input.condition.Add(dic); AddCondition(input); LogicMethod.CurrLogicMethod.RemoveAllView(); AddLogic addLogic = new AddLogic(); MainPage.BasePageView.AddChidren(addLogic); addLogic.Show(); MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1; }); } /// <summary> /// 添加条件 /// </summary> /// <param name="input"></param> private void AddCondition(Input input) { ///记录索引值 int index = -1; for (var i = 0; i < Logic.currlogic.input.Count; i++) { var condition_type = Logic.currlogic.input[i].condition_type; if (condition_type == "10") { ///找到标记索引,退出循环体 index = i; break; } } if (index != -1) { //移除旧数据 Logic.currlogic.input.RemoveAt(index); //新数据插入旧数据的位置 Logic.currlogic.input.Insert(index, input); } else { Logic.currlogic.input.Add(input); } } } } HDL_ON/UI/UI2/3-Intelligence/Automation/AddTarget.cs
@@ -36,11 +36,18 @@ viewLayout.AddChidren(functionView.FLayoutView()); //场景 LogicView.SelectTypeView sceneView = new LogicView.SelectTypeView(); LogicView.SelectTypeView sceneView= new LogicView.SelectTypeView(); sceneView.frameLayout.Y = functionView.frameLayout.Bottom; sceneView.btnText.TextID = StringId.Scenes; sceneView.btnIcon.UnSelectedImagePath = "LogicIcon/scene.png"; viewLayout.AddChidren(sceneView.FLayoutView()); //安防 LogicView.SelectTypeView securityView = new LogicView.SelectTypeView(); securityView.frameLayout.Y = sceneView.frameLayout.Bottom; securityView.btnText.TextID = StringId.anfang; securityView.btnIcon.UnSelectedImagePath = "LogicIcon/security.png"; viewLayout.AddChidren(securityView.FLayoutView()); //延时 LogicView.SelectTypeView delayView = new LogicView.SelectTypeView(); @@ -64,6 +71,11 @@ sceneView.btnClick.MouseUpEventHandler += (sen, e) => { SceneMethod(); }; //安防点击事件 securityView.btnClick.MouseUpEventHandler += (sen, e) => { SecurityMethod(this); }; //延时点击事件 delayView.btnClick.MouseUpEventHandler += (sen, e) => @@ -92,7 +104,7 @@ nameList.Add(scene.name); } PublicInterface publicInterface = new PublicInterface(); publicInterface.FrameOrVv(this, nameList, StringId.addSceneLogic, (index) => publicInterface.FrameOrVv(this, nameList,new List<string> { }, StringId.addSceneLogic, (index) => { var sceneSelecetd = sceneList[index]; Output outputDevice = new Output(); @@ -108,7 +120,41 @@ MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1; }); } /// <summary> /// 添加安防 /// </summary> public void SecurityMethod(FrameLayout frameLayout, bool edit=false, int index1=-1) { List<string> stateList = new List<string>(); if (edit&& index1 != -1) { Output output = Logic.currlogic.output[index1]; var security = LogicMethod.CurrLogicMethod.GetSecurity(output.sid); stateList.Add(security.name); } var securityList = LogicMethod.CurrLogicMethod.GetSecurityList(); List<string> nameList = new List<string>(); for (int i = 0; i < securityList.Count; i++) { var security = securityList[i]; nameList.Add(security.name); } PublicInterface publicInterface = new PublicInterface(); publicInterface.FrameOrVv(frameLayout, nameList, stateList, StringId.addSecurityLogic,(index) => { var securitySelecetd = securityList[index]; Output outputDevice = new Output(); outputDevice.target_type = "3"; outputDevice.sid = securitySelecetd.sid; //没啥作用,为了发送数据格式统一; outputDevice.status = new List<Dictionary<string, string>> { new Dictionary<string, string> { { "key", "security" }, { "value", "0" } } }; AddOutput(outputDevice,true); LogicMethod.CurrLogicMethod.RemoveAllView(); AddLogic addLogic = new AddLogic(); MainPage.BasePageView.AddChidren(addLogic); addLogic.Show(); MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1; }); } /// <summary> /// 延时时间方法 /// </summary> @@ -137,7 +183,7 @@ if (edit) { Output output = Logic.currlogic.output[index]; if (output.target_type == "3") if (output.target_type == "4") { List<Dictionary<string, string>> dicList = output.status as List<Dictionary<string, string>>; foreach (var dic in dicList) @@ -169,7 +215,7 @@ } Output outputTime= new Output(); outputTime.sid = LogicMethod.CurrLogicMethod.NewSid(); outputTime.target_type = "3"; outputTime.target_type = "4"; Dictionary<string, string> dic = new Dictionary<string, string>(); LogicMethod.CurrLogicMethod.dictionary(dic, "key", "delay"); LogicMethod.CurrLogicMethod.dictionary(dic, "value", timepoint); @@ -195,23 +241,34 @@ }; } /// <summary> /// 添加目标 /// </summary> /// <param name="target"></param> private void AddOutput(Output target) /// <param name="bool_if">表示启用不同条件</param> private void AddOutput(Output target,bool bool_if=false) { int indexValue = -1; for (int i = 0; i < Logic.currlogic.output.Count; i++) { if (Logic.currlogic.output[i].sid == target.sid) if (bool_if) { indexValue = i; break; ///安防允许一种 if (Logic.currlogic.output[i].target_type == target.target_type) { indexValue = i; break; } } else { if (Logic.currlogic.output[i].sid == target.sid) { indexValue = i; break; } } } if (indexValue != -1) { Logic.currlogic.output.RemoveAt(indexValue); HDL_ON/UI/UI2/3-Intelligence/Automation/InpOrOutLogicMethod.cs
@@ -504,6 +504,17 @@ } } break; case "10": { //用sid找到场景; var scene = LogicMethod.CurrLogicMethod.GetSecne(inputCondition.sid); inputView.btnIcon.UnSelectedImagePath = "LogicIcon/scene.png"; inputView.btnNextIcon.Visible = false; inputView.btnClick.Visible = false; //显示场景名称 inputView.btnText.Text = scene.name; } break; } //再次编辑条件状态点击事件 @@ -755,6 +766,7 @@ MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1; } break; } }; ///删除控件 @@ -1088,6 +1100,15 @@ break; case "3": { //用sid找到安防; var security = LogicMethod.CurrLogicMethod.GetSecurity(outputTarget.sid); targetView.btnIcon.UnSelectedImagePath = "LogicIcon/security.png"; //显示安防名称 stateStr = security.name; } break; case "4": { targetView.btnIcon.UnSelectedImagePath = "LogicIcon/time.png"; foreach (var dic in dicList) { @@ -1139,7 +1160,12 @@ break; case "3": { AddTarget addTarget = new AddTarget(); addTarget.SecurityMethod(thisView, edit, indexVulae); } break; case "4": { FrameLayout fLayout = new FrameLayout { BackgroundColor = CSS.CSS_Color.viewTrans60lucence, HDL_ON/UI/UI2/3-Intelligence/Automation/Logic.cs
@@ -93,6 +93,8 @@ /// 云端天气条件=6; /// 某个逻辑/场景的输出条件=7; /// 地理围栏=8; /// 空气质量=9; /// 场景=10; /// </summary> public string condition_type = ""; public List<Dictionary<string, string>> condition = new List<Dictionary<string, string>>(); @@ -119,7 +121,8 @@ /// 逻辑输出目标类型 /// 设备=1; /// 场景=2; /// 延时=3; /// 安防=3; /// 延时=4; /// </summary> public string target_type = ""; public List<Dictionary<string, string>> status = new List<Dictionary<string, string>>(); HDL_ON/UI/UI2/3-Intelligence/Automation/LogicMethod.cs
@@ -179,12 +179,21 @@ return Entity.FunctionList.List.GetDeviceFunctionList(); } /// <summary> /// 获取网关场景列表 /// 获取场景列表 /// </summary> /// <returns></returns> public List<HDL_ON.Entity.Scene> GetSceneList() { return HDL_ON.Entity.FunctionList.List.scenes; } /// <summary> /// 获取安防列表 /// </summary> /// <returns></returns> public List<HDL_ON.Entity.SecurityAlarm> GetSecurityList() { return FunctionList.List.securities; } /// <summary> /// 获取房间的设备列表 @@ -217,7 +226,7 @@ return deviceLists; } /// <summary> /// 获取当个设备 /// 获取设备(功能)对象 /// </summary> /// <param name="sid">设备唯一标识</param> /// <returns></returns> @@ -238,7 +247,7 @@ } /// <summary> /// 获取当个场景 /// 获取场景对象 /// </summary> /// <param name="sid">场景唯一标识</param> /// <returns></returns> @@ -258,6 +267,26 @@ return scene; } /// <summary> /// 获取安防对象 /// </summary> /// <param name="sid">安防唯一标识</param> /// <returns></returns> public HDL_ON.Entity.SecurityAlarm GetSecurity(string sid) { HDL_ON.Entity.SecurityAlarm security = new Entity.SecurityAlarm() { name = "Unknown" }; List<HDL_ON.Entity.SecurityAlarm> SecurityLists = GetSecurityList(); for (int i = 0; i < SecurityLists.Count; i++) { var sce = SecurityLists[i]; if (sce.sid == sid) { security = sce; break; } } return security; } /// <summary> /// 获取房间名(即是=区域名称) /// </summary> /// <param name="device">设备</param> HDL_ON/UI/UI2/3-Intelligence/Automation/MainView.cs
@@ -357,6 +357,8 @@ //1-10(表示条件图标)自己局部定义为了显示选中条件类型图标 //1-时间图标 //2-功能图标 //3-云端图标 //4-场景图标 for (int i = 0; i < logic.input.Count; i++) { if (logic.input[i] == null) @@ -386,6 +388,12 @@ } break; case 10: { iconInt = 4; } break; } if (!iconIntValue.Contains(iconInt)) @@ -401,6 +409,7 @@ //12-20(表示目标图标)自己局部定义为了显示选中目标类型图标 //12-功能图标 //13-场景图标 //14-安防图标 //14-延时图标 for (int i = 0; i < logic.output.Count; i++) { @@ -423,6 +432,12 @@ case 3: { iconInt = 14; } break; case 4: { iconInt = 15; } break; @@ -483,6 +498,12 @@ strIcon = "LogicIcon/shiwaitianqi.png"; } break; case 4: { strIcon = "LogicIcon/selectTheScene.png"; } break; case 11: { //分割条件和目标的图标 @@ -502,7 +523,14 @@ break; case 14: { strIcon = "LogicIcon/security.png"; } break; case 15: { //strIcon = "LogicIcon/timeicon.png"; } break; HDL_ON/UI/UI2/3-Intelligence/Automation/PublicInterface.cs
@@ -263,7 +263,7 @@ /// <param name="list">显示数据源</param> /// <param name="titleText">标题</param> /// <param name="action">返回值索引值</param> public void FrameOrVv(FrameLayout frame, List<string> list, int titleText, Action<int> action) public void FrameOrVv(FrameLayout frame, List<string> list, List<string> stateList, int titleText, Action<int> action) { int line = 0; @@ -366,6 +366,11 @@ { verticalRefresh.AddChidren(checkView.FLayoutView()); } if (stateList.Contains(strName)) { checkView.btnCheckIcon.IsSelected = true; } checkView.btnText.Text = strName; checkView.btnClick.Tag = i;//标记 //点击事件 @@ -391,8 +396,7 @@ frameLayout.RemoveFromParent(); }; } } /// <summary> /// 超出5个元素该用滑动控件 /// </summary> @@ -400,7 +404,7 @@ /// <param name="list">显示数据源</param> /// <param name="stateList">之前状态数据源</param> /// <param name="titleText">标题</param> /// <param name="action">返回值索引值</param> /// <param name="action">返回值列表</param> public void FrameOrVvList(FrameLayout frame, List<string> list, List<string> stateList, int titleText, Action<List<string>> action) { HDL_ON/UI/UI2/FuntionControlView/Music/A31PlayMusicPage.cs
@@ -97,6 +97,8 @@ ///切换播放模式点击事件; playView.playOrderBtn.MouseUpEventHandler += (sender, e) => { //single/single_cycle/order/list_cycle/random string modeValueString = string.Empty; string msg = Language.StringByID(StringId.switchTo); switch (A31MusicModel.Current.A31PlayStatus.loop) { @@ -119,8 +121,9 @@ break; } new PublicAssmebly().TipMsgAutoClose(msg, false,1000); string url = "http://" + A31MusicModel.Current.IPAddress + "/httpapi.asp?command=setPlayerCmd:" + "loopmode:" + A31MusicModel.Current.A31PlayStatus.loop; SendMethod.SendCommand(url); Dictionary<string, string> dic = new Dictionary<string, string>(); dic.Add("mode",modeValueString); //SendMethod.sendMethod.SendControlCommand(,dic); }; ///添加喜爱点击事件; playView.loveBtn.MouseUpEventHandler += (sender, e) => HDL_ON/UI/UI2/FuntionControlView/Music/MusicMain.cs
@@ -3,6 +3,8 @@ using Shared; using Shared.IO; using System.Net; using HDL_ON.Entity; namespace HDL_ON.UI.Music { public class MusicMain : FrameLayout @@ -56,19 +58,22 @@ /// <summary> /// 显示加载界面 /// </summary> public static Loading loading = new Loading(); public static Loading loading = new Loading(); /// <summary> /// 定义全局对象 /// </summary> VerticalRefreshLayout verticalRefresh; /// <summary> /// 为了音乐刷新状态定义全局对象 /// </summary> MusicView musicView = new MusicView(); public void Show() { #region 界面布局 this.BackgroundColor = MusicColor.ViewColor; var topView = new TopView(); this.AddChidren(topView.TopFLayoutView()); topView.topNameBtn.TextID =StringId.a31Music; topView.topNameBtn.TextID = StringId.a31Music; topView.clickBackBtn.MouseUpEventHandler += (sender, e) => { RemoveFromParent(); @@ -84,200 +89,71 @@ verticalRefresh.BeginHeaderRefreshingAction += () => { SeachMusic(false); SeachMusic(); }; this.AddChidren(loading); SeachMusic(); if (A31MusicModel.A31MusicModelList.Count == 0) { SeachMusic(true); } else { clearA31Threads(); //verticalRefresh.RemoveAll(); for (int i = 0; i < A31MusicModel.A31MusicModelList.Count; i++) { var a31player = A31MusicModel.A31MusicModelList[i]; ///这个状态是之前保存的,加载完成后要标记为不在线,后面再读取正确的状态 if (!a31player.IsCanShow) { continue; } if (A31MusicModel.A31MusicModelList.Count - 1 == i) { a31player.IsEnd = true; } else { a31player.IsEnd = false; } ///加载界面时默认不在线 ///这里标记是为了不读取不在线播放器状态 a31player.IsOnLine = false; MusicListView(a31player); } ///读取正确的信息,包括IP和端口及名称 SendMethod.Seach((obj) => { try { if (obj == null) { ///这里要读取主从关系 readServerOrClientMode(); A31MusicModel.Save(); return; } var a31MusicModel = A31MusicModel.A31MusicModelList.Find((music) => music.UniqueDeviceName == obj.UniqueDeviceName); if (a31MusicModel != null) { a31MusicModel.IPAddress = obj.IPAddress; a31MusicModel.Port = obj.Port; a31MusicModel.Name = obj.Name; a31MusicModel.IsCanShow = true; a31MusicModel.IsOnLine = true; } } catch (Exception e) { MainPage.Log(e.Message); } }); } } /// <summary> /// 刷新播放器列表 /// </summary> /// <param name="Yes">是否显示刷新图标</param> void SeachMusic(bool Yes = false) void SeachMusic() { for (int i = 0; i < A31MusicModel.A31MusicModelList.Count; i++) Application.RunOnMainThread(() => { var a31player = A31MusicModel.A31MusicModelList[i]; a31player.IsCanShow = false; a31player.IsOnLine = false; } if (Yes) { //为了第一次进来log一下; loading.Start(); } SendMethod.Seach((obj) => { if (obj == null) verticalRefresh.RemoveAll(); for (int i = 0; i < SendMethod.sendMethod.GetMusicList.Count; i++) { readServerOrClientMode(); A31MusicModel.Save(); if (!Yes) var playerFunction = SendMethod.sendMethod.GetMusicList[i]; if (!playerFunction.online) { ///等待跑完在关闭 verticalRefresh.EndHeaderRefreshing(); //过滤掉不在线的音乐播放器 continue; } Application.RunOnMainThread(() => { if (Yes) { //为了第一次进来log一下; loading.Hide(); } verticalRefresh.RemoveAll(); for (int i = 0; i < A31MusicModel.A31MusicModelList.Count; i++) { var a31player = A31MusicModel.A31MusicModelList[i]; //这个状态是之前保存的,加载完成后要标记为不在线,后面再读取正确的状态 if (!a31player.IsCanShow) { continue; } if (A31MusicModel.A31MusicModelList.Count - 1 == i) { a31player.IsEnd = true; } else { a31player.IsEnd = false; } MusicListView(a31player); } //A31MusicModel.ReadMusicStates(); MusicListView(playerFunction); } }); return; } var a31MusicModel = A31MusicModel.A31MusicModelList.Find((music) => { return music.UniqueDeviceName == obj.UniqueDeviceName; }); if (a31MusicModel == null) { //不是我们支持的品牌不支持 if (obj.Name != null) { obj.sid = "030101123456780909020123AABB" + obj.UniqueDeviceName; A31MusicModel.A31MusicModelList.Add(obj); } } else { a31MusicModel.IPAddress = obj.IPAddress; a31MusicModel.Port = obj.Port; a31MusicModel.Name = obj.Name; a31MusicModel.IsCanShow = true; a31MusicModel.IsOnLine = true; } }); } /// <summary> /// 显示音乐列表的方法 /// </summary> void MusicListView(A31MusicModel a31player) void MusicListView(Function player) { MusicView musicView = new MusicView(); musicView.View(verticalRefresh); musicView.singerBtn.Text = a31player.A31PlayStatus.Artist; musicView.songNameBtn.Text = a31player.A31PlayStatus.Title; musicView.musicNameBtn.Text = new View.DialogView { }.NamePlayer(a31player); if (a31player.IsEnd) { musicView.muiscFl.Height = Application.GetRealHeight(12 + 139 + 12); } musicView.singerBtn.Text = player.GetAttrState("song_name"); musicView.songNameBtn.Text = player.GetAttrState("song_name"); musicView.musicNameBtn.Text = player.name; //if (player.IsEnd) //{ // musicView.muiscFl.Height = Application.GetRealHeight(12 + 139 + 12); //} musicView.collectIconBtn.MouseUpEventHandler += (sender, e) => { musicView.collectIconBtn.IsSelected = !musicView.collectIconBtn.IsSelected; if (a31player.ServerClientType == 1) if (musicView.collectIconBtn.IsSelected) { if (musicView.collectIconBtn.IsSelected) { a31player.MainPlayCollection = true; } else { a31player.MainPlayCollection = false; } player.collect = true; } else { if (musicView.collectIconBtn.IsSelected) { a31player.collect = true; } else { a31player.collect = false; } player.collect = false; } A31MusicModel.Save(); }; EventHandler<MouseEventArgs> clickMergence = (sender, e) => { if (a31player.ServerClientType == 0) { new View.DialogView { }.PlayMergence(a31player); } else if (a31player.ServerClientType == 1) { new View.DialogView { }.DetachPlayMergence(a31player); } //if (player.ServerClientType == 0) //{ // new View.DialogView { }.PlayMergence(player); //} //else if (player.ServerClientType == 1) //{ // new View.DialogView { }.DetachPlayMergence(player); //} }; musicView.mergeBjBtn.MouseUpEventHandler += clickMergence; musicView.mergeBtn.MouseUpEventHandler += clickMergence; @@ -285,7 +161,6 @@ EventHandler<MouseEventArgs> clickPlayView = (sender, e) => { A31MusicModel.Current = a31player;//当前播放器 var a31PlayMusicPage = new A31PlayMusicPage(); MainPage.BasePageView.AddChidren(a31PlayMusicPage); a31PlayMusicPage.Show(); @@ -302,7 +177,9 @@ musicView.prevBtn.MouseDownEventHandler += (sender, e) => { musicView.prevBtn.IsSelected = true; SendMethod.Previous(a31player); Dictionary<string, string> dic = new Dictionary<string, string>(); dic.Add("song_step", "up"); SendMethod.sendMethod.SendControlCommand(player, dic); }; musicView.prevBtn.MouseUpEventHandler += (sender, e) => { @@ -311,24 +188,28 @@ ///暂停/播放点击事件 musicView.playBtn.MouseDownEventHandler += (sender, e) => { string status = "off"; if (musicView.playBtn.IsSelected) { musicView.playBtn.IsSelected = false; SendMethod.Pause(a31player); a31player.A31PlayStatus.status = "pause"; status = "off"; } else { musicView.playBtn.IsSelected = true; SendMethod.Play(a31player); a31player.A31PlayStatus.status = "play"; status = "on"; } Dictionary<string, string> dic = new Dictionary<string, string>(); dic.Add("on_off", status); SendMethod.sendMethod.SendControlCommand(player, dic); }; ///下一曲点击事件 musicView.nextBtn.MouseDownEventHandler += (sender, e) => { musicView.nextBtn.IsSelected = true; SendMethod.Next(a31player); Dictionary<string, string> dic = new Dictionary<string, string>(); dic.Add("song_step", "down"); SendMethod.sendMethod.SendControlCommand(player, dic); }; musicView.nextBtn.MouseUpEventHandler += (sender, e) => { @@ -340,47 +221,49 @@ while (true) { System.Threading.Thread.Sleep(1000); if (!a31player.IsOnLine) if (!player.online) { continue; } SendMethod.ReadStatus(a31player); //SendMethod.ReadStatus(player); SendMethod.sendMethod.RefreshDeviceStatus(player,new List<string> { player.deviceId }); Application.RunOnMainThread(() => { musicView.singerBtn.Text = a31player.A31PlayStatus.Artist; musicView.songNameBtn.Text = a31player.A31PlayStatus.Title; musicView.musicNameBtn.Text = new View.DialogView { }.NamePlayer(a31player); if (a31player.A31PlayStatus.status == "play") { musicView.playBtn.IsSelected = true; } else { musicView.playBtn.IsSelected = false; } musicView.regionBtn.Text = a31player.GetRoomListName(); if (a31player.ServerClientType == 1) { if (a31player.MainPlayCollection) { musicView.collectIconBtn.IsSelected = true; } else { musicView.collectIconBtn.IsSelected = false; } } else { if (a31player.collect) { musicView.collectIconBtn.IsSelected = true; } else { musicView.collectIconBtn.IsSelected = false; } } //musicView.singerBtn.Text = player.A31PlayStatus.Artist; //musicView.songNameBtn.Text = player.A31PlayStatus.Title; //musicView.musicNameBtn.Text = new View.DialogView { }.NamePlayer(player); //if (player.A31PlayStatus.status == "play") //{ // musicView.playBtn.IsSelected = true; //} //else //{ // musicView.playBtn.IsSelected = false; //} //musicView.regionBtn.Text = player.GetRoomListName(); //if (player.ServerClientType == 1) //{ // if (player.MainPlayCollection) // { // musicView.collectIconBtn.IsSelected = true; // } // else // { // musicView.collectIconBtn.IsSelected = false; // } //} //else //{ // if (player.collect) // { // musicView.collectIconBtn.IsSelected = true; // } // else // { // musicView.collectIconBtn.IsSelected = false; // } //} }); } }) @@ -388,99 +271,67 @@ musicThread.Start(); threadLists.Add(musicThread); } /// <summary> /// 读取主从关系 ///指定刷新界面 /// </summary> void readServerOrClientMode() /// <param name="strView">判断字符</param> public void RefreshView(string strView) { try Application.RunOnMainThread(() => { for (int i = 0; i < A31MusicModel.A31MusicModelList.Count; i++) try { var a31player = A31MusicModel.A31MusicModelList[i]; if (!a31player.IsOnLine) for (int i = MainPage.BasePageView.ChildrenCount - 1; 0 <= i; i--) { continue; } try { a31player.ServerClientType = 0; var result = SendMethod.OpenWeb("http://" + a31player.IPAddress + "/httpapi.asp?command=multiroom:getSlaveList"); if (result == null && result == "Failed") var view = MainPage.BasePageView.GetChildren(i); if (strView == view.Tag.ToString()) { result = SendMethod.OpenWeb("http://" + a31player.IPAddress + "/httpapi.asp?command=multiroom:getSlaveList"); } if (result != null && result != "Failed") { a31player.Slave = Newtonsoft.Json.JsonConvert.DeserializeObject<Slaves>(result); } } catch (Exception e) { var d = e.Message; } } //分析主从关系 for (int i = 0; i < A31MusicModel.A31MusicModelList.Count; i++) { var a31player = A31MusicModel.A31MusicModelList[i]; if (!a31player.IsOnLine) { continue; } try { if (a31player.Slave != null && "0" != a31player.Slave.slaves) { a31player.ServerClientType = 1;//主的 string str = a31player.Name; for (int j = 0; j < a31player.Slave.slave_list.Count; j++) if (view.GetType() == typeof(MusicMain)) { var slave = a31player.Slave.slave_list[j]; str = str + "+" + slave.name; var tempA31Player = A31MusicModel.A31MusicModelList.Find((obj) => slave.uuid.Replace("uuid:", "") == obj.UniqueDeviceName); if (tempA31Player == null) { A31MusicModel.A31MusicModelList.Add(new A31MusicModel { sid = "030101123456780909020123AABB" + slave.uuid.Replace("uuid:", ""), ServerClientType = -1,//从的 IPAddress = slave.ip, MainPlayIP = a31player.IPAddress, UniqueDeviceName = slave.uuid.Replace("uuid:", ""), Name = slave.name, IsCanShow = false, IsOnLine = false,//true作用为了读取从播放器的音量 }); } //如果找到就更新为从的 else { tempA31Player.ServerClientType = -1;//从的 tempA31Player.IPAddress = slave.ip; tempA31Player.MainPlayIP = a31player.IPAddress; tempA31Player.Name = slave.name; tempA31Player.UniqueDeviceName = slave.uuid.Replace("uuid:", ""); tempA31Player.IsCanShow = false; tempA31Player.IsOnLine = false;//true作用为了读取从播放器的音量 } //musicView.singerBtn.Text = player.A31PlayStatus.Artist; //musicView.songNameBtn.Text = player.A31PlayStatus.Title; //musicView.musicNameBtn.Text = new View.DialogView { }.NamePlayer(player); //if (player.A31PlayStatus.status == "play") //{ // musicView.playBtn.IsSelected = true; //} //else //{ // musicView.playBtn.IsSelected = false; //} //musicView.regionBtn.Text = player.GetRoomListName(); //if (player.ServerClientType == 1) //{ // if (player.MainPlayCollection) // { // musicView.collectIconBtn.IsSelected = true; // } // else // { // musicView.collectIconBtn.IsSelected = false; // } //} //else //{ // if (player.collect) // { // musicView.collectIconBtn.IsSelected = true; // } // else // { // musicView.collectIconBtn.IsSelected = false; // } //} } a31player.MainPlayName = str; } } catch (Exception e) { var ss = e.Message; } } } catch { } catch { } }); } } } HDL_ON/UI/UI2/FuntionControlView/Music/SendMethod.cs
@@ -4,12 +4,28 @@ using System.Net.Sockets; using System.Security; using System.Text; using HDL_ON.DAL.Server; using HDL_ON.Entity; using Shared; namespace HDL_ON.UI.Music { public class SendMethod { private static SendMethod m_sendMethod=null; public static SendMethod sendMethod { get { if (m_sendMethod == null) { m_sendMethod = new SendMethod(); } return m_sendMethod; } } /// <summary> ///搜索A31音乐播放器 /// </summary> @@ -209,7 +225,7 @@ a31MusicModel.A31PlayStatus.loop = se.SearchForTextOfTag("LoopMode"); a31MusicModel.A31PlayStatus.Source = se.SearchForTextOfTag("PlayMedium"); a31MusicModel.A31PlayStatus.playSource = se.SearchForTextOfTag("TrackSource"); a31MusicModel.A31PlayStatus.TrackURL = se.SearchForTextOfTag("TrackURI").Replace("&", "&amp;"); a31MusicModel.A31PlayStatus.TrackURL = se.SearchForTextOfTag("TrackURI").Replace("&", "&amp;"); } catch (Exception ex) @@ -463,7 +479,8 @@ /// <param name="volume">Volume.</param> public static void ControlVolume(int volume, A31MusicModel a31player) { System.Threading.Tasks.Task.Run(() => { System.Threading.Tasks.Task.Run(() => { A31MusicModel.ProgressDateTime = DateTime.Now; try { @@ -526,7 +543,7 @@ musicInfo.URL = track.SearchForTextOfTag("URL").Replace("&", "&amp;"); var metadata = track.SearchForTextOfTag("Metadata").Replace("&", "&"); var item = SecurityElement.FromString(metadata).SearchForChildByTag("item"); musicInfo.Title = item.SearchForTextOfTag("dc:title").Replace("&", "&amp;"); musicInfo.Title = item.SearchForTextOfTag("dc:title").Replace("&", "&amp;"); musicInfo.Artist = item.SearchForTextOfTag("upnp:artist").Replace("&", "&amp;"); musicInfo.Album = item.SearchForTextOfTag("upnp:album").Replace("&", "&amp;"); musicInfo.Duration = item.SearchForTextOfTag("res"); @@ -597,7 +614,7 @@ /// <summary> /// 获取当前播放的列表 /// </summary> public static string GetCurrentPlayList(A31MusicModel a31player) public static string GetCurrentPlayList(A31MusicModel a31player) { System.Text.StringBuilder getPlayList = new System.Text.StringBuilder(); getPlayList.AppendLine("<?xml version=\"1.0\"encoding=\"utf-8\"?>"); @@ -656,7 +673,7 @@ /// <param name="musicInfo">播放音乐</param> /// <param name="listName">列表名称</param> /// <param name="musicList">推送列表(默认推50首)</param> public static void PushList(MusicInfo musicInfo, string listName, List<MusicInfo> musicList, A31MusicModel a31player,string musicSource) public static void PushList(MusicInfo musicInfo, string listName, List<MusicInfo> musicList, A31MusicModel a31player, string musicSource) { //最大发送的条数 @@ -739,10 +756,12 @@ sb.AppendLine("&lt;dc:title&gt;" + tempMusicInfo.Title + "&lt;/dc:title&gt;"); sb.AppendLine("&lt;dc:creator&gt;DJ Sanny J&lt;/dc:creator&gt;"); if (musicSource== "我的列表") { if (musicSource == "我的列表") { sb.AppendLine("&lt;upnp:artist&gt;" + listName + "&lt;/upnp:artist&gt;"); } else { else { sb.AppendLine("&lt;upnp:artist&gt;" + tempMusicInfo.Artist + "&lt;/upnp:artist&gt;"); } sb.AppendLine("&lt;upnp:album&gt;" + tempMusicInfo.Album + "&lt;/upnp:album&gt;"); @@ -778,7 +797,7 @@ Play(a31player.IPAddress, a31player.Port, playString.ToString()); } static void SendMusicLists(string ip, int port, string soapAction, string listInfo) static void SendMusicLists(string ip, int port, string soapAction, string listInfo) { System.Net.WebClient webClient = new System.Net.WebClient(); webClient.Headers.Add("SOAPACTION", "\"urn:schemas-wiimu-com:service:PlayQueue:1#" + soapAction + "\""); @@ -788,13 +807,13 @@ byte[] recevieBytes = webClient.UploadData(new Uri("http://" + ip + ":" + port + "/upnp/control/PlayQueue1"), "POST", System.Text.Encoding.UTF8.GetBytes(listInfo)); var s = System.Text.Encoding.UTF8.GetString(recevieBytes, 0, recevieBytes.Length); } catch(Exception e) catch (Exception e) { var d = e.Message; } } static void Play(string ip, int port, string info) static void Play(string ip, int port, string info) { System.Net.WebClient webClient = new System.Net.WebClient(); webClient.Headers.Add("SOAPACTION", "\"urn:schemas-wiimu-com:service:PlayQueue:1#PlayQueueWithIndex\""); @@ -882,5 +901,72 @@ public string creator = string.Empty; } /// <summary> /// 获取音乐列表 /// </summary> public List<Function> GetMusicList { get { return FunctionList.List.GetMusicList(); } } /// <summary> /// 发送控制命令 /// </summary> /// <param name="function">当前设备</param> /// <param name="dic">发送控制数据</param> public void SendControlCommand(Function function, Dictionary<string, string> dic) { new System.Threading.Thread(() => { DriverLayer.Control.Ins.SendWriteCommand(function, dic); }) { IsBackground = true }.Start(); } /// <summary> /// 刷新设备状态 /// </summary> /// <returns></returns> public void RefreshDeviceStatus(Function music, List<string> functionIds) { try { Dictionary<string, object> d = new Dictionary<string, object>(); d.Add("homeId", DB_ResidenceData.Instance.CurrentRegion.id); d.Add("deviceIds", functionIds); var responsePackNew = RequestServerhomeId(d, NewAPI.Api_Post_RefreshDeviceStatus); if (responsePackNew.Code != "0") { return; } //数据返序列化为Function对象 var str = Newtonsoft.Json.JsonConvert.SerializeObject(responsePackNew.Data.ToString()); var function = Newtonsoft.Json.JsonConvert.DeserializeObject<Function>(str); if (function == null) { return; } music.name = function.name; music.sid = function.sid; music.spk = function.spk; music.status = function.status; music.roomIds = function.roomIds; music.attributes = function.attributes; } catch { } } /// <summary> ///请求服务器(与住宅有关:例如;homeId) /// </summary> /// <returns></returns> public ResponsePackNew RequestServerhomeId(object o, string api_Url, int mTimeout = 5) { var requestJson = HttpUtil.GetSignRequestJson(o); return HttpUtil.RequestHttpsPostFroHome(api_Url, requestJson, mTimeout); } } }