using System; using System.Collections.Generic; using System.Threading; using HDL_ON.DAL.Server; using HDL_ON.Entity; using HDL_ON.UI; using HDL_ON.UI.UI2.FuntionControlView.Video; using HDL_ON.UI.UI2.Intelligence.Automation; using Newtonsoft.Json; using Shared; namespace HDL_ON.Common { public class ApiUtlis { public ApiUtlis() { } static ApiUtlis apiUtlis; public static ApiUtlis Ins { get { if (apiUtlis == null) { apiUtlis = new ApiUtlis(); } return apiUtlis; } } HttpServerRequest httpRequest; public HttpServerRequest HttpRequest { get { if (httpRequest == null) { httpRequest = new HttpServerRequest(); } return httpRequest; } } bool complateGetHomePagerInfo = false; bool complateGetUserInfo = false; bool complateGetRoomListInfo = false; bool complateGetGroupControl = false; bool complateGetSecurityListInfo = false; bool complateGetLogicListInfo = false; bool complateGet3tyInfo = false; bool complateDevice = false; bool complateScene = false; /// /// 下载数据完成标记 /// public bool DownloadDataComplete = false; /// /// token是否有效 /// public bool IsValidToken = true; /// /// 下载数据 /// public void DownloadData() { IsValidToken = true; if (MainPage.NoLoginMode) { DownloadDataComplete = true; return; } MainPage.Log($"开始同步云端数据"); DownloadDataComplete = false; var waitPage = new Loading(); MainPage.BaseView.AddChidren(waitPage); waitPage.Start(Language.StringByID(StringId.PleaseWait)); var downloadDataThread = new Thread(() => { MainPage.Log($"进入读取云端数据线程"); try { #region ===================刷新Token======================= var code = Ins.HttpRequest.RefreshToken(); if (code == StateCode.SUCCESS) { IsValidToken = true; complateGetHomePagerInfo = complateGetUserInfo = complateGetRoomListInfo = complateGetGroupControl = complateGetSecurityListInfo = complateGetLogicListInfo = complateGet3tyInfo = complateDevice = complateScene = false; } else { IsValidToken = false; DownloadDataComplete = true; complateGetHomePagerInfo = complateGetUserInfo = complateGetRoomListInfo = complateGetGroupControl = complateGetSecurityListInfo = complateGetLogicListInfo = complateGet3tyInfo = complateDevice = complateScene = true; //complateGetSecurityListInfo = false; } #endregion if (IsValidToken) { #region ===================刷新住宅信息======================= new Thread(() => { code = Ins.HttpRequest.GetHomePager(); complateGetHomePagerInfo = true; }) { IsBackground = true }.Start(); #endregion #region ===================刷新个人信息======================= new Thread(() => { code = Ins.HttpRequest.GetUserInfo(); complateGetUserInfo = true; }) { IsBackground = true }.Start(); #endregion #region ===================房间======================= new Thread(() => { var roomResult = Ins.HttpRequest.GetRoomList(); if (roomResult.Code == StateCode.SUCCESS) { var revData = JsonConvert.DeserializeObject(roomResult.Data.ToString()); if (revData == null) { revData = new SpatialApiPack(); } SpatialInfo.CurrentSpatial.UpdateSpatialList(revData.list); try { var ssd = System.Text.Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(revData.list)); FileUtlis.Files.WriteFileByBytes("SpatialInfoData", ssd); } catch (Exception ex) { MainPage.Log("Error", $"{this.GetType()}:保存房间信息异常:{ex.StackTrace}"); } } complateGetRoomListInfo = true; }) { IsBackground = true }.Start(); #endregion #region ===================设备======================= new Thread(() => { try { var deviceResult = Ins.HttpRequest.GetDeviceList("30", "1"); if (deviceResult.Code == StateCode.SUCCESS) { MainPage.Log($"读取设备信息成功"); //MainPage.Log($"sid列表获取====\r\n", deviceResult.Data.ToString()); var deviceList = JsonConvert.DeserializeObject(deviceResult.Data.ToString()); if (deviceList == null) { deviceList = new DevcieApiPack(); } try { while (deviceList.totalPage != deviceList.pageNo) { var deviceResult2 = Ins.HttpRequest.GetDeviceList("30", Convert.ToInt32(deviceList.pageNo) + 1 + ""); if (deviceResult2.Code == StateCode.SUCCESS) { var deviceList2 = JsonConvert.DeserializeObject(deviceResult.Data.ToString()); deviceList.pageNo = deviceList2.pageNo; deviceList.list.AddRange(deviceList2.list); } } } catch (Exception ex) { MainPage.Log("Error", $"解析设备信息异常:{ex.StackTrace}"); } string delFile = ""; if (FunctionList.List.GetDeviceFunctionList().Count > 0) { for (int i = 0; i < FunctionList.List.GetDeviceFunctionList().Count;) { var localFunction = FunctionList.List.GetDeviceFunctionList()[i]; var newFunction = deviceList.list.Find((obj) => obj.deviceId == localFunction.deviceId); if (delFile == localFunction.savePath) { i++; continue; } delFile = localFunction.savePath; FunctionList.List.DeleteFunction(localFunction); } } //处理剩下的新增功能 foreach (var newDevice in deviceList.list) { newDevice.AssembleStatus(); newDevice.SaveFunctionFile(); FunctionList.List.IniFunctionList(newDevice.savePath, true); } //===================读取可视对讲数据========================== //判断是否有可视对讲数据,有则显示可视对讲icon //var flVideoInfo = HttpRequest.CheckFlVideo(); //if(flVideoInfo.Code == StateCode.SUCCESS) //{ // FunctionList.List.videoIntercom1111 = Newtonsoft.Json.JsonConvert.DeserializeObject(flVideoInfo.Data.ToString()); //} //======================获取可视对讲设备列表==================== bool isInterphoneType_HDL = false;//是否为HDLLinphone可视对讲 bool isInterphoneType_FREEVIEW = false;//是否为全视通可视对讲 var videoInfo = VideoSend.GetVideoInfoList(); if (videoInfo.Code == StateCode.SUCCESS) { string videoList = videoInfo.Data.ToString(); FunctionList.List.videoIntercom = JsonConvert.DeserializeObject>(videoList); for (int i = 0; i < FunctionList.List.videoIntercom.Count; i++) { var video = FunctionList.List.videoIntercom[i]; if (video.interphoneType == InterphoneType.HDL.ToString()) { isInterphoneType_HDL = true; DB_ResidenceData.Instance.SupportFacePass = true; DB_ResidenceData.Instance.SaveResidenceData(); } } } //======================获取Sip账号并且初始化SDK可视对讲设备列表==================== //如果检测线程没启动,才继续下面操作 因为App有可能刚启动马上收到推送了,然后才执行到这里 if (HDLLinphone.Current.CheckIncomingCallThreadIsNull()) { //当前住宅是HDL可视对讲类型的设备 if (isInterphoneType_HDL) { //HDLLinphone可视对讲,获取Sip账号并初始化SDK HDLCallVideoInfo callVideoInfo = new HDLCallVideoInfo(); callVideoInfo.HomeId = DB_ResidenceData.Instance.CurrentRegion.id; callVideoInfo.InterphoneType = InterphoneType.HDL.ToString(); HDLLinphone.Current.GetHDLSipInfoAndInitSDK(callVideoInfo); } else if (isInterphoneType_FREEVIEW) { //HDLLinphone可视对讲,获取Sip账号并初始化SDK HDLCallVideoInfo callVideoInfo = new HDLCallVideoInfo(); callVideoInfo.HomeId = DB_ResidenceData.Instance.CurrentRegion.id; callVideoInfo.InterphoneType = InterphoneType.FREEVIEW.ToString(); HDLLinphone.Current.GetHDLSipInfoAndInitSDK(callVideoInfo); } else { Utlis.WriteLine("当前住宅不支持HDL可视对讲,退出登录所有账号"); //当前住宅不支持HDL可视对讲 HDLLinphone.Current.LogoutAllAccount(); } } //======================登录全视通==================== if (isInterphoneType_FREEVIEW) { #if __IOS__ //string systemVersion = UIKit.UIDevice.CurrentDevice.SystemVersion; //string errorVersion = "16.2.0"; //if (systemVersion.CompareTo(errorVersion) < 0)///全视通不兼容ios16以上的系统,不要加载这个先 //{ // List dataList = new List(); // Dictionary dictionary = new Dictionary(); // dictionary.Add("homeId", Entity.DB_ResidenceData.Instance.CurrentRegion.id); // var requestJson = HttpUtil.GetSignRequestJson(dictionary); // ResponsePackNew pack = HttpUtil.RequestHttpsPost(NewAPI.Api_Post_GetExtMemberInfo, requestJson); // if (pack != null) // { // var data = JsonConvert.DeserializeObject(pack.Data.ToString()); // //登录全视通 // Shared.IOS.HDLFVSDK.Video.Init("", data.extUserId, DB_ResidenceData.Instance.CurrentRegion.id, "78FF1E4D-FC0A-4E71-9B79-0448E4460BD7", "T0001", "120.77.53.170:9700", "120.77.53.170:21664"); // } //} #endif } } else { MainPage.Log($"读取云端设备数据失败:Code:{deviceResult.Code}; Msg:{deviceResult.message}"); } } catch (Exception ex) { MainPage.Log("Error", $"============设备============{ex.StackTrace}"); } finally { complateDevice = true; MainPage.Log($"============设备============完成" + FunctionList.List.Functions.Count); } }) { IsBackground = true }.Start(); #endregion #region ======================群控==================== new Thread(() => { try { if (DB_ResidenceData.Instance.HomeGateway.isSupportGroupControl) { var pack = Ins.HttpRequest.GetGroupControlList(); if (pack != null) { if (pack.Code == StateCode.SUCCESS) { try { var groupControlList = JsonConvert.DeserializeObject>(pack.Data.ToString()); var readSidList = new List(); foreach (var temp in groupControlList) { FunctionList.List.groupControls.Clear(); readSidList.Add(temp.userDeviceGroupControlId); if (readSidList.Count >= 20) { var data = Ins.httpRequest.GetGroupControInfo(readSidList); if (data != null) { if (data.Code == StateCode.SUCCESS) { var groupControlInfoList = JsonConvert.DeserializeObject>(data.Data.ToString()); FunctionList.List.groupControls.AddRange(groupControlInfoList); } else { IMessageCommon.Current.ShowErrorInfoAlter(pack.Code); } } readSidList.Clear(); } //FunctionList.List.Functions.AddRange(FunctionList.List.groupControls); } if (readSidList.Count > 0) { var data = Ins.httpRequest.GetGroupControInfo(readSidList); if (data != null) { if (data.Code == StateCode.SUCCESS) { var groupControlInfoList = JsonConvert.DeserializeObject>(data.Data.ToString()); FunctionList.List.groupControls.AddRange(groupControlInfoList); } else { IMessageCommon.Current.ShowErrorInfoAlter(pack.Code); } } readSidList.Clear(); } } catch (Exception ex) { MainPage.Log("Error", $"读取组控列表失败:{ex.StackTrace}"); } } else { IMessageCommon.Current.ShowErrorInfoAlter(pack.Code); } } } } catch (Exception ex) { MainPage.Log($"群控:{ex.StackTrace}"); } finally { complateGetGroupControl = true; } }) { IsBackground = true }.Start(); #endregion #region ======================场景==================== new Thread(() => { try { var pack = Ins.HttpRequest.GetSceneList(); if (pack.Code == StateCode.SUCCESS) { MainPage.Log($"读取场景数据成功"); var sceneList = JsonConvert.DeserializeObject>(pack.Data.ToString()); if (sceneList == null) { sceneList = new List(); } FunctionList.List.scenes.Clear(); //处理剩下的新增功能 foreach (var tempScene in sceneList) { tempScene.SaveSceneFile(); FunctionList.List.scenes.Add(tempScene); } MainPage.Log($"读取场景数据成功:{FunctionList.List.scenes.Count}"); //如果是一端口需要提前下载场景数据,否则控制不了一端口场景 if (DB_ResidenceData.Instance.GatewayType == 0) { var sceneIds = new List(); foreach (var tempScene in FunctionList.List.scenes) { sceneIds.Add(tempScene.userSceneId); } var packInfo = HttpRequest.GetSceneListInfo(sceneIds); if (packInfo.Code == StateCode.SUCCESS) { var serverTempList = JsonConvert.DeserializeObject>(packInfo.Data.ToString()); foreach (var localScene in FunctionList.List.scenes) { var serverTemp = serverTempList.Find((obj) => obj.userSceneId == localScene.userSceneId); if (serverTemp != null) { localScene.functions = serverTemp.functions; localScene.SaveSceneFile(); } } } } } else { MainPage.Log($"读取云端场景数据失败:Code:{pack.Code}; Msg:{pack.message}"); } } catch (Exception ex) { MainPage.Log("Error", $"===场景==={ex.StackTrace}"); } finally { complateScene = true; } }) { IsBackground = true }.Start(); #endregion #region ======================安防==================== new Thread(() => { try { GetSecurityList(); } catch (Exception ex) { MainPage.Log($"安防:{ex.StackTrace}"); } finally { complateGetSecurityListInfo = true; } }) { IsBackground = true }.Start(); #endregion #region ======================读取逻辑列表==================== new Thread(() => { try { Logic.LogicList.Clear();//主页下拉强制刷新自动化列表 MainView.GetLogicList();//读取自动化列表 } catch (Exception ex) { MainPage.Log($"读取逻辑列表:{ex.StackTrace}"); } finally { complateGetLogicListInfo = true; } }) { IsBackground = true }.Start(); #endregion #region ======================注册推送==================== httpRequest.RegisteredPush(); #endregion #region ======================第三方设备==================== new Thread(() => { try { FunctionList.List.Read3tyFunctionStatus(); } catch (Exception ex) { MainPage.Log("Error", "读取第三方设备状态失败:" + ex.StackTrace); } finally { complateGet3tyInfo = true; } }) { IsBackground = true }.Start(); #endregion } #region ===========终止下载线程=========== new Thread(() => { try { int sleepCout = 0; while (true) { if (complateGetHomePagerInfo && complateGetUserInfo && complateGetRoomListInfo && complateGetGroupControl && complateGetSecurityListInfo && complateGetLogicListInfo && complateGet3tyInfo && complateDevice && complateScene) { break; } Thread.Sleep(100); if (sleepCout > 150) { MainPage.Log("=======超时,退出休眠======="); break; } else { //MainPage.Log($"=======休眠,等待数据{sleepCout}======="); sleepCout++; } } LoadLocalData(); Application.RunOnMainThread(() => { if (waitPage != null) { waitPage.RemoveFromParent(); waitPage = null; } }); } catch { } finally { DownloadDataComplete = true; if (DB_ResidenceData.Instance.CurrentRegion != null) { //不考虑网关情况,直接订阅 DAL.Mqtt.MqttClient.InitState(); #region 重置TCP客户端 try { DriverLayer.Control.Ins.LocalTcpClientLogin = false; if (DriverLayer.Control.Ins.myTcpClient != null) { DriverLayer.Control.Ins.myTcpClient.Dispose(); DriverLayer.Control.Ins.myTcpClient = null; } } catch (Exception ex) { MainPage.Log("Error", $"重置TCP客户端异常:{ex.Message}"); } #endregion try { DriverLayer.Control.Ins.SearchLoaclGateway(); } catch (Exception ex) { MainPage.Log("Error", $"搜索网关:{ex.StackTrace}"); } try { HomePage.LoadEvent_CheckTokenValid(); if (!IsValidToken && UserInfo.Current.TipInvalidToken) { UserInfo.Current.TipInvalidToken = false; UserInfo.Current.SaveUserInfo(); Application.RunOnMainThread(() => { try { new PublicAssmebly().TipOptionMsg(StringId.Tip, StringId.TokenInvalidTipMsg, StringId.OfflineControl, StringId.GoLogin, () => { HDLCommon.Current.Logout(); }); } catch (Exception ex) { MainPage.Log("Error", $"提示登录凭证窗口加载异常:{ex.StackTrace}"); } }); } } catch (Exception ex) { MainPage.Log("Error", $"更新登录凭证方法调用异常:{ex.StackTrace}"); } } } }) { IsBackground = true }.Start(); #endregion } catch (Exception ex) { MainPage.Log($"读取云端数据线程异常:{ex.StackTrace}"); } }); downloadDataThread.IsBackground = true; downloadDataThread.Priority = ThreadPriority.Highest; downloadDataThread.Start(); } /// /// 获取安防列表 /// public void GetSecurityList() { lock (FunctionList.List.securities) { try { var pack = Ins.HttpRequest.GetSecurityList(); if (pack.Code == StateCode.SUCCESS) { var packList = JsonConvert.DeserializeObject>(pack.Data.ToString()); var sidList = new List(); foreach (var function in packList) { sidList.Add(function.sid); } if (sidList.Count == 0) { return; } var infoListPack = Ins.httpRequest.GetSecurityInfo(sidList, new List()); var infoList = JsonConvert.DeserializeObject>(infoListPack.Data.ToString()); if (infoList != null) { var filePathList = FileUtlis.Files.ReadFiles().FindAll((obj) => obj.StartsWith("SecurityData_")); if (filePathList != null) { foreach (var file in filePathList) { FileUtlis.Files.DeleteFile(file); } } FunctionList.List.securities.Clear(); foreach (var function in infoList) { function.SaveFile(); FunctionList.List.IniFunctionList(function.savePath, true); } } } else { MainPage.Log($"读取安防列表失败:Code:{pack.Code}; Msg:{pack.message}"); } } catch (Exception ex) { MainPage.Log("Error", $"读取安防列表失败:Code:{ex.StackTrace}"); } } } /// /// 加载本地数据 /// private void LoadLocalData() { MainPage.Log("=========APiUtlis开始加载数据========="); FunctionList.List.ClearDatas(); try { var spatialInfoDataBytes = FileUtlis.Files.ReadFile("SpatialInfoData"); if (spatialInfoDataBytes != null) { var spatialInfoDataString = System.Text.Encoding.UTF8.GetString(spatialInfoDataBytes); if (spatialInfoDataString != null && !string.IsNullOrEmpty(spatialInfoDataString)) { var spatialInfoDataList = JsonConvert.DeserializeObject>(spatialInfoDataString); SpatialInfo.CurrentSpatial.UpdateSpatialList(spatialInfoDataList); } } } catch (Exception ex) { MainPage.Log("Error", $"{this.GetType()}:加载缓存房间数据异常:{ex.StackTrace}"); } try { var fileList = FileUtlis.Files.ReadFiles(); foreach (var file in fileList) { FunctionList.List.IniFunctionList(file, true); } Room.CurrentSpatial.InitRoomListFunctions(); } catch (Exception ex) { MainPage.Log("Error", $"{this.GetType()}:加载缓存设备数据异常:{ex.StackTrace}"); } MainPage.Log("=========APiUtlis完成加载数据========="); } } }