New file |
| | |
| | | using System; |
| | | using HDL_ON.DAL.Server; |
| | | using Shared; |
| | | using System.Collections.Generic; |
| | | using Newtonsoft.Json.Linq; |
| | | |
| | | namespace HDL_ON.UI.UI2.PersonalCenter.PirDevice |
| | | { |
| | | public class PirMethod |
| | | { |
| | | |
| | | /// <summary> |
| | | /// 红外宝程序主入口 |
| | | /// </summary> |
| | | /// <param name="frame"></param> |
| | | /// <param name="function"></param> |
| | | public void MainView(FrameLayout frame, Entity.Function function, Action action) |
| | | { |
| | | Pir pirDevice = new Pir(); |
| | | if (function != null) |
| | | {//数据转换 |
| | | pirDevice.name = function.name; |
| | | pirDevice.deviceId = function.deviceId; |
| | | pirDevice.sid = function.sid; |
| | | pirDevice.online = function.online; |
| | | pirDevice.versions = function.versions; |
| | | } |
| | | Pir.currPir = pirDevice; |
| | | GetControlList(frame, () => |
| | | { |
| | | Application.RunOnMainThread(() => |
| | | { |
| | | var page = new PirMain(); |
| | | MainPage.BasePageView.AddChidren(page); |
| | | page.Show(); |
| | | MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1; |
| | | PirMain.BackAction += () => |
| | | { |
| | | action?.Invoke(); |
| | | PirMain.BackAction = null; |
| | | }; |
| | | }); |
| | | }, Pir.currPir); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 管理位置 |
| | | /// </summary> |
| | | /// <param name="control">当前设备</param> |
| | | /// <param name="action">回调函数</param> |
| | | public void ManagementPosition(Entity.Function control, Action action) |
| | | { |
| | | var view = new ChooseRoomPage(control, action); |
| | | MainPage.BasePageView.AddChidren(view); |
| | | view.LoadPage(); |
| | | MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1; |
| | | } |
| | | /// <summary> |
| | | /// 修改名称 |
| | | /// </summary> |
| | | /// <param name="tipText">提示标题文本</param> |
| | | /// <param name="list">当前存在名称列表</param> |
| | | /// <param name="currName">当前名称</param> |
| | | /// <param name="action">回调函数</param> |
| | | public void EditControlName(int tipText, List<string> list, string currName, Action<string, Dialog> action, Action actionCancel, bool tag = false) |
| | | { |
| | | new View.TipView().InputBox(tipText, currName, StringId.nameNull, StringId.NameAlreadyExists, list, (text, view |
| | | ) => |
| | | { |
| | | action(text, view); |
| | | }, () => { actionCancel(); }, tag); |
| | | } |
| | | /// <summary> |
| | | /// 添加遥控器的方法 |
| | | /// </summary> |
| | | /// <param name="frameLayout">log图标加载界面</param> |
| | | /// <param name="action">回调函数</param> |
| | | public void AddControl(FrameLayout frameLayout, Action<Control> action) |
| | | { |
| | | View.TipView tipView = new View.TipView(); |
| | | tipView.InputBox(frameLayout, "", (name, frame) => |
| | | { |
| | | if (Pir.currPir != null && Pir.currPir.FunctioList.Count < 10) |
| | | { |
| | | Control control = new Control(); |
| | | control.name = name; |
| | | control.type = "learn"; |
| | | control.spk = "ir.learn"; |
| | | control.deviceId = Pir.currPir.deviceId; |
| | | ThreadAddControl(control, frame, action); |
| | | } |
| | | else |
| | | { |
| | | View.TipView tt = new View.TipView(); |
| | | tt.TipBox(StringId.tip, StringId.bunengchaoguo10); |
| | | } |
| | | }, false); |
| | | |
| | | } |
| | | /// <summary> |
| | | /// 发送遥控器命令方法 |
| | | /// </summary> |
| | | /// <param name="control">发送参数对象</param> |
| | | /// <param name="frame">log图标加载界面</param> |
| | | /// <param name="action">回调函数</param> |
| | | public void ThreadAddControl(Control control, FrameLayout frame, Action<Control> action) |
| | | { |
| | | Cloud mqttdate = null; |
| | | Loading loading = new Loading(); |
| | | frame.AddChidren(loading); |
| | | loading.Start(); |
| | | new System.Threading.Thread(() => |
| | | { |
| | | try |
| | | { |
| | | //发送添加命令 |
| | | var responsePackNew = PirSend.Add(control); |
| | | if (responsePackNew != null && responsePackNew.Code == "0" && responsePackNew.Data.ToString() != "") |
| | | { |
| | | string sid = responsePackNew.Data.ToString(); |
| | | controldata = ""; |
| | | mqttdate = MqttDate("遥控器", sid); |
| | | if (mqttdate != null) |
| | | { |
| | | control.sid = sid; |
| | | } |
| | | } |
| | | |
| | | } |
| | | catch { } |
| | | finally |
| | | { |
| | | Application.RunOnMainThread(() => |
| | | { |
| | | loading.Hide(); |
| | | ///这里:监听MTTP推送下来主题; |
| | | if (mqttdate != null) |
| | | { |
| | | //休眠1000毫秒,为等待云端创建deviceid; |
| | | System.Threading.Thread.Sleep(1000); |
| | | //读取添加遥控器deviceID,才知道是否添加成功; |
| | | GetControl(frame, control, (device) => |
| | | { |
| | | if (device != null) |
| | | { |
| | | |
| | | control.deviceId = device.deviceId; |
| | | //遥控器添加到列表; |
| | | if (null == Pir.currPir.FunctioList.Find((c) => c.deviceId == device.deviceId)) |
| | | { |
| | | Pir.currPir.FunctioList.Add(device); |
| | | } |
| | | frame.RemoveFromParent();//添加成功关闭弹窗 |
| | | action(control); |
| | | } |
| | | else |
| | | { |
| | | //监听Mqtt推送下来状态码做提示 |
| | | View.FailView failView = new View.FailView(); |
| | | failView.ShouError((view) => |
| | | { |
| | | view.Close(); |
| | | ThreadAddControl(control, frame, action); |
| | | }); |
| | | |
| | | } |
| | | |
| | | }); |
| | | } |
| | | else |
| | | { |
| | | //监听Mqtt推送下来状态码做提示 |
| | | View.FailView failView = new View.FailView(); |
| | | failView.ShouError((view) => |
| | | { |
| | | view.Close(); |
| | | ThreadAddControl(control, frame, action); |
| | | }); |
| | | } |
| | | |
| | | |
| | | }); |
| | | |
| | | } |
| | | }) |
| | | { IsBackground = true }.Start(); |
| | | |
| | | } |
| | | /// <summary> |
| | | /// 获取红外设备列表 |
| | | /// </summary> |
| | | /// <param name="frame">log图标加载界面</param> |
| | | /// <param name="action">回调函数</param> |
| | | public static void GetPirDeviceList(FrameLayout frame, Action action) |
| | | { |
| | | //清除之前列表; |
| | | Pir.pirDeviceList.Clear(); |
| | | //加载log |
| | | Loading loading = new Loading(); |
| | | frame.AddChidren(loading); |
| | | loading.Start(); |
| | | new System.Threading.Thread(() => |
| | | { |
| | | try |
| | | { |
| | | var responsePackNew = PirSend.GetDeviceList("ir.module"); |
| | | if (responsePackNew != null && responsePackNew.Code == "0" && responsePackNew.Data.ToString() != "") |
| | | { |
| | | var jobject = Newtonsoft.Json.Linq.JObject.Parse(responsePackNew.Data.ToString()); |
| | | string list = jobject["list"].ToString(); |
| | | |
| | | var jArray = Newtonsoft.Json.Linq.JArray.Parse(list); |
| | | for (int a = 0; a < jArray.Count; a++) |
| | | { |
| | | var jay = jArray[a]; |
| | | string spk = jay["spk"].ToString(); |
| | | if (spk == "ir.module") |
| | | { |
| | | //数据返序列化为Logic对象 |
| | | var str = Newtonsoft.Json.JsonConvert.SerializeObject(jay); |
| | | var pirJosn = Newtonsoft.Json.JsonConvert.DeserializeObject<Pir>(str); |
| | | if (pirJosn != null) |
| | | { |
| | | |
| | | if (null == PirDevice.Pir.pirDeviceList.Find((c) => c.deviceId == pirJosn.deviceId)) |
| | | { |
| | | PirDevice.Pir.pirDeviceList.Add(pirJosn); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | } |
| | | catch { } |
| | | finally |
| | | { |
| | | Application.RunOnMainThread(() => |
| | | { |
| | | try |
| | | { |
| | | if (Pir.pirDeviceList.Count != 0) |
| | | { |
| | | GetControlList(() => |
| | | { |
| | | loading.Hide(); |
| | | action(); |
| | | |
| | | }); |
| | | } |
| | | else |
| | | { |
| | | loading.Hide(); |
| | | PirMethod method = new PirMethod(); |
| | | method.ErrorShow(null, "读取红外宝列表失败"); |
| | | } |
| | | } |
| | | catch { } |
| | | |
| | | }); |
| | | } |
| | | |
| | | }) |
| | | { IsBackground = true }.Start(); |
| | | |
| | | } |
| | | /// <summary> |
| | | /// 获取所有红外宝遥控器列表 |
| | | /// </summary> |
| | | /// <param name="action">回调函数</param> |
| | | public static void GetControlList(Action action) |
| | | { |
| | | |
| | | new System.Threading.Thread(() => |
| | | { |
| | | try |
| | | { |
| | | for (int i = 0; i < Pir.pirDeviceList.Count; i++) |
| | | { |
| | | var pirDevice = Pir.pirDeviceList[i]; |
| | | try |
| | | { |
| | | var responsePackNew = PirSend.ControlList(pirDevice.deviceId); |
| | | if (responsePackNew != null && responsePackNew.Code == "0" && responsePackNew.Data.ToString() != "") |
| | | { |
| | | var jArray = JArray.Parse(responsePackNew.Data.ToString()); |
| | | for (int a = 0; a < jArray.Count; a++) |
| | | { |
| | | var jay = jArray[a]; |
| | | //数据返序列化为Logic对象 |
| | | var str = Newtonsoft.Json.JsonConvert.SerializeObject(jay); |
| | | var pirJosn = Newtonsoft.Json.JsonConvert.DeserializeObject<Entity.Function>(str); |
| | | if (pirJosn != null) |
| | | { |
| | | if (null == pirDevice.FunctioList.Find((c) => c.sid == pirJosn.sid)) |
| | | { |
| | | pirDevice.FunctioList.Add(pirJosn); |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | } |
| | | catch { } |
| | | |
| | | } |
| | | } |
| | | catch { } |
| | | finally |
| | | { |
| | | |
| | | Application.RunOnMainThread(() => |
| | | { |
| | | action(); |
| | | }); |
| | | } |
| | | |
| | | }) |
| | | { IsBackground = true }.Start(); |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取单个红外宝遥控器列表 |
| | | /// </summary> |
| | | /// <param name="action">回调函数</param> |
| | | public static void GetControlList(FrameLayout frame, Action action, Pir pirDevice) |
| | | { |
| | | ThreadSend(new Control { deviceId = pirDevice.deviceId }, (responsePackNew) => |
| | | { |
| | | var jArray = JArray.Parse(responsePackNew.Data.ToString()); |
| | | for (int a = 0; a < jArray.Count; a++) |
| | | { |
| | | var jay = jArray[a]; |
| | | //数据返序列化为Logic对象 |
| | | var str = Newtonsoft.Json.JsonConvert.SerializeObject(jay); |
| | | var pirJosn = Newtonsoft.Json.JsonConvert.DeserializeObject<Entity.Function>(str); |
| | | if (pirJosn != null) |
| | | { |
| | | if (null == pirDevice.FunctioList.Find((c) => c.deviceId == pirJosn.deviceId)) |
| | | { |
| | | pirDevice.FunctioList.Add(pirJosn); |
| | | } |
| | | } |
| | | } |
| | | action(); |
| | | }, "获取遥控器列表", "frame", frame, null); |
| | | |
| | | } |
| | | /// <summary> |
| | | /// 获取设备详情通过(spk,sid) |
| | | /// </summary> |
| | | /// <param name="frame">log图标加载界面</param> |
| | | /// <param name="control">发送参数对象</param> |
| | | /// <param name="action">回调函数</param> |
| | | public void GetControl(FrameLayout frame, Control control, Action<Entity.Function> action) |
| | | { |
| | | ThreadSend(control, (responsePackNew) => |
| | | { |
| | | var function = Newtonsoft.Json.JsonConvert.DeserializeObject<Entity.Function>(responsePackNew.Data.ToString()); |
| | | action(function); |
| | | }, "获取设备详情", "frame", frame, null); |
| | | } |
| | | /// <summary> |
| | | /// 发送命令线程 |
| | | /// </summary> |
| | | /// <param name="control">发送数据对象</param> |
| | | /// <param name="action">回调函数</param> |
| | | /// <param name="str">判断字符</param> |
| | | /// <param name="view">判断log父控件</param> |
| | | /// <param name="frame">log父控件</param> |
| | | /// <param name="dialog">log父控件</param> |
| | | /// <param name="attributesStatus">学习按键</param> |
| | | public static void ThreadSend(Control control, Action<ResponsePackNew> action, string str, string view, FrameLayout frame, Dialog dialog, Entity.AttributesStatus attributesStatus = null) |
| | | { |
| | | |
| | | //加载log |
| | | Loading loading = new Loading(); |
| | | if (view == "dialog") |
| | | { |
| | | dialog.AddChidren(loading); |
| | | } |
| | | else |
| | | { |
| | | frame.AddChidren(loading); |
| | | } |
| | | loading.Start(); |
| | | ResponsePackNew responsePackNew = null; |
| | | new System.Threading.Thread(() => |
| | | { |
| | | try |
| | | { |
| | | if (str == "删除") |
| | | { |
| | | responsePackNew = PirSend.DeleteDevice(control.deviceId); |
| | | } |
| | | else if (str == "修改名称") |
| | | { |
| | | |
| | | responsePackNew = PirSend.DeviceRename(control.deviceId, control.name); |
| | | } |
| | | else if (str == "删除按键") |
| | | { |
| | | if (attributesStatus != null) |
| | | { |
| | | responsePackNew = PirSend.CodeRemove(attributesStatus, control.deviceId); |
| | | } |
| | | } |
| | | else if (str == "获取设备详情") |
| | | { |
| | | // 获取设备详情通过(spk,sid) |
| | | responsePackNew = PirSend.GetinfoBySid(control); |
| | | } |
| | | else if (str == "获取遥控器列表") |
| | | { |
| | | responsePackNew = PirSend.ControlList(control.deviceId); |
| | | } |
| | | else if (str == "库码测试") |
| | | { |
| | | responsePackNew = PirSend.CodeTest(control); |
| | | } |
| | | } |
| | | catch { } |
| | | finally |
| | | { |
| | | Application.RunOnMainThread(() => |
| | | { |
| | | loading.Hide(); |
| | | if (responsePackNew != null && responsePackNew.Code == "0" && responsePackNew.Data.ToString() != "") |
| | | { |
| | | action(responsePackNew); |
| | | } |
| | | else |
| | | { |
| | | PirMethod method = new PirMethod(); |
| | | //自定义错误提示文本 |
| | | string eorroText = ""; |
| | | if (str == "删除") |
| | | { |
| | | } |
| | | else if (str == "修改名称") |
| | | { |
| | | |
| | | } |
| | | else if (str == "删除按键") |
| | | { |
| | | } |
| | | else if (str == "获取设备详情") |
| | | { |
| | | } |
| | | else if (str == "获取遥控器列表") |
| | | { |
| | | } |
| | | else if (str == "库码测试") |
| | | { |
| | | } |
| | | method.ErrorShow(responsePackNew, eorroText); |
| | | } |
| | | |
| | | }); |
| | | } |
| | | |
| | | }) |
| | | { IsBackground = true }.Start(); |
| | | |
| | | |
| | | } |
| | | /// <summary> |
| | | /// MQTT主题推送下来的遥控器数据 |
| | | /// </summary> |
| | | public static string controldata = ""; |
| | | /// <summary> |
| | | /// MQTT主题推送下来按键的数据 |
| | | /// </summary> |
| | | public static string buttondata = ""; |
| | | /// <summary> |
| | | /// 判断这个主题是否是添加遥控器主题 |
| | | /// </summary> |
| | | /// <param name="text">表示不同主题数据</param> |
| | | /// <param name="sid">唯一标识</param> |
| | | /// <param name="timeValue">等待时间值</param> |
| | | /// <returns></returns> |
| | | public Cloud MqttDate(string text, string sid, int timeValue = 10) |
| | | { |
| | | Cloud cloud = null; |
| | | var dateTime = DateTime.Now; |
| | | while ((DateTime.Now - dateTime).TotalMilliseconds < timeValue * 1000) |
| | | { |
| | | string str = ""; |
| | | if (text == "遥控器") |
| | | { |
| | | str = controldata; |
| | | } |
| | | else if (text == "按键") |
| | | { |
| | | str = buttondata; |
| | | } |
| | | |
| | | if (!string.IsNullOrEmpty(str)) |
| | | { |
| | | try |
| | | { |
| | | var cloudjson = Newtonsoft.Json.JsonConvert.DeserializeObject<Cloud>(str); |
| | | for (int i = 0; i < cloudjson.objects.Count; i++) |
| | | { |
| | | var objects = cloudjson.objects[i]; |
| | | if (sid == objects.sid) |
| | | { |
| | | cloud = cloudjson; |
| | | break; |
| | | } |
| | | } |
| | | if (cloud != null) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | catch { } |
| | | } |
| | | |
| | | } |
| | | return cloud; |
| | | } |
| | | /// <summary> |
| | | /// 错误码提示 |
| | | /// </summary> |
| | | /// <param name="responsePackNew"></param> |
| | | /// <param name="text">自定义错误文本</param> |
| | | /// <param name="popValue">弹框类型(1=闪烁弹框)</param> |
| | | public void ErrorShow(ResponsePackNew responsePackNew, string text, int popValue = 1) |
| | | { |
| | | string str = ""; |
| | | if (text == "删除遥控器") |
| | | { |
| | | str = Language.StringByID(StringId.delFail); |
| | | } |
| | | else if (text == "读取红外宝列表失败") |
| | | { |
| | | str = Language.StringByID(StringId.huoqushujushibao); |
| | | } |
| | | else if (text == "添加失败") |
| | | { |
| | | str = Language.StringByID(StringId.tianjiashibai); |
| | | } |
| | | else |
| | | { |
| | | if (responsePackNew != null) |
| | | { |
| | | |
| | | switch (responsePackNew.Code) |
| | | { |
| | | |
| | | case "14005": |
| | | { |
| | | str = Language.StringByID(StringId.gatewayNotOnline); |
| | | |
| | | } |
| | | break; |
| | | case "10807": |
| | | { |
| | | str = Language.StringByID(StringId.bunengchaoguo10); |
| | | |
| | | |
| | | } |
| | | break; |
| | | case "2": |
| | | { |
| | | str = Language.StringByID(StringId.xitongweihuzhong); |
| | | } |
| | | break; |
| | | default: |
| | | { |
| | | str = Language.StringByID(StringId.huoqushujushibao); |
| | | } |
| | | break; |
| | | |
| | | } |
| | | } |
| | | } |
| | | switch (popValue) |
| | | { |
| | | case 1: |
| | | { |
| | | new Intelligence.Automation.LogicView.TipPopView().FlashingBox(str); |
| | | } |
| | | break; |
| | | case 2: { } break; |
| | | case 3: { } break; |
| | | } |
| | | } |
| | | /// <summary> |
| | | ///指定刷新界面 |
| | | /// </summary> |
| | | /// <param name="strView">判断字符</param> |
| | | public static void RefreshView(string strView) |
| | | { |
| | | //标记是不是已经刷新完成 |
| | | bool if_bool = false; |
| | | for (int i = MainPage.BasePageView.ChildrenCount - 1; 0 <= i; i--) |
| | | { |
| | | var view = MainPage.BasePageView.GetChildren(i); |
| | | if (strView == "PirMain") |
| | | { |
| | | if (view.GetType() == typeof(PirMain)) |
| | | { |
| | | //强制转换对象 |
| | | var f = (PirMain)view; |
| | | //移除所有子控件 |
| | | f.RemoveAll(); |
| | | //重新加载UI |
| | | f.Show(); |
| | | //退出for循环 |
| | | //break; |
| | | if_bool = true; |
| | | } |
| | | } |
| | | if (if_bool) |
| | | { |
| | | //退出for循环 |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// 指定删除界面 |
| | | /// </summary> |
| | | /// <param name="strView">判断字符</param> |
| | | public static void RemoveView(string strView) |
| | | { |
| | | |
| | | for (int i = MainPage.BasePageView.ChildrenCount - 1; 0 <= i; i--) |
| | | { |
| | | var view = MainPage.BasePageView.GetChildren(i); |
| | | if (strView == "PirMain") |
| | | { |
| | | if (view.GetType() == typeof(PirMain)) |
| | | { |
| | | //移除界面 |
| | | view.RemoveFromParent(); |
| | | } |
| | | |
| | | } |
| | | else if (strView == "AddControl") |
| | | { |
| | | |
| | | if (view.GetType() == typeof(AddControl)) |
| | | { |
| | | //找到移除 |
| | | view.RemoveFromParent(); |
| | | } |
| | | } |
| | | else if (strView == "AddControlComplete") |
| | | { |
| | | |
| | | if (view.GetType() == typeof(AddControlComplete)) |
| | | { |
| | | //找到移除 |
| | | view.RemoveFromParent(); |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | } |
| | | [Serializable] |
| | | public class Cloud |
| | | { |
| | | public string id = ""; |
| | | public List<Objects> objects = new List<Objects>(); |
| | | public string time_stamp = string.Empty; |
| | | |
| | | |
| | | } |
| | | [Serializable] |
| | | public class Objects |
| | | { |
| | | |
| | | public string sid = string.Empty; |
| | | public string spk = string.Empty; |
| | | public List<Attributes> attributes = new List<Attributes>(); |
| | | } |
| | | [Serializable] |
| | | public class Attributes |
| | | { |
| | | public string key = ""; |
| | | public string data_type = ""; |
| | | public List<string> value = new List<string>(); |
| | | |
| | | } |
| | | } |