HDL-ON_Android/Properties/AndroidManifest.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL-ON_iOS/Info.plist | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL_ON/DAL/DriverLayer/Control.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL_ON/DAL/DriverLayer/Control_TcpClient.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL_ON/Entity/Function/Scene.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL_ON/Entity/FunctionList.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL_ON/UI/UI2/FuntionControlView/1ContorlPage/AcControlPage.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
HDL-ON_Android/Properties/AndroidManifest.xml
@@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.6.0" package="com.hdl.onpro" xmlns:tools="http://schemas.android.com/tools" android:versionCode="202208151"> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.6.0" package="com.hdl.onpro" xmlns:tools="http://schemas.android.com/tools" android:versionCode="202208191"> <uses-sdk android:minSdkVersion="26" android:targetSdkVersion="29" /> <!--友盟--> <!--<uses-sdk android:minSdkVersion="8"></uses-sdk>--> HDL-ON_iOS/Info.plist
@@ -100,9 +100,9 @@ <key>UIStatusBarStyle</key> <string>UIStatusBarStyleLightContent</string> <key>CFBundleShortVersionString</key> <string>1.6.002208151</string> <string>1.6.002208191</string> <key>CFBundleVersion</key> <string>1.6.008151</string> <string>1.6.008191</string> <key>NSLocationWhenInUseUsageDescription</key> <string>Use geographic location to provide services such as weather</string> <key>NSAppleMusicUsageDescription</key> HDL_ON/DAL/DriverLayer/Control.cs
@@ -29,11 +29,27 @@ /// 记录接收到的消息,方便zb的工程师调试他们的设备 /// </summary> public List<string> MsgInfoList = new List<string>(); private bool _LocalTcpClientLogin = false; /// <summary> /// 本地tcp客户端连接是否成功 /// 是否登录网关成功 /// </summary> public bool LocalTcpClientLogin = false; public bool LocalTcpClientLogin { get { return _LocalTcpClientLogin; } set { _LocalTcpClientLogin = value; if (!value) { loginGatewayThread?.Abort(); loginGatewayThread = null; } } } int _msg_id = 1; /// <summary> @@ -222,8 +238,9 @@ if (myTcpClient == null) { myTcpClient = new Control_TcpClient(reportIp); myTcpClient.Connect(); } myTcpClient.Connect(); } /// <summary> @@ -294,9 +311,9 @@ if(loginGatewayThread== null) { loginGatewayThread = new System.Threading.Thread(() => { while (true) while (!Ins.myTcpClient.isConnected) { if (Ins.GatewayOnline_Local && myTcpClient.isConnected && LocalTcpClientLogin) if (Ins.GatewayOnline_Local && myTcpClient.isConnected) { var sendData = new { clientType = "app", version = "1.0" }; var sendJob = new { id = Control.Ins.msg_id.ToString(), time_stamp = Utlis.GetTimestamp(), objects = sendData }; @@ -309,9 +326,28 @@ } System.Threading.Thread.Sleep(2000); } //loginGatewayThread?.Abort(); //loginGatewayThread = null; }); loginGatewayThread.Start(); } else { try { loginGatewayThread?.Abort(); }catch (Exception ex) { MainPage.Log($"重启登录网关线程异常:{ex.Message}"); } finally { loginGatewayThread = null; LoginGateway(); } } } @@ -880,7 +916,6 @@ { LocalCommunicationData receiveObj = new LocalCommunicationData(); MainPage.Log($"局域网信息: \r\n{receiveString}"); var res = receiveString.Split("\r\n\r\n"); @@ -912,9 +947,10 @@ //} receiveObj.BodyDataString = res[1]; if(receiveObj.Topic == CommunicationTopic.ct.HeartBeat) if (receiveObj.Topic == CommunicationTopic.ct.HeartBeat + "_reply") { Ins.myTcpClient.ClearHeartBeatLog(); MainPage.Log("tcp心跳回复"); return null; } @@ -924,7 +960,6 @@ //判断当前网关是否开启了本地加密 if (IsLocalEncryptAndGetAesKey) { MainPage.Log($"局域网信息 开始解密"); if (originalReceiveBytes != null) { //拿到原始Bytes数据去解密 @@ -955,6 +990,10 @@ //MainPage.Log($"局域网信息: 解密后:" + receiveObj.BodyDataString); } } else { MainPage.Log($"局域网信息: 明文:" + receiveObj.BodyDataString); } } @@ -1008,7 +1047,6 @@ OpenTcpClent(); LoginGateway(); } } @@ -1058,6 +1096,19 @@ if (temp.GetValue("objects").ToString().Contains("success")) { LocalTcpClientLogin = true; try { loginGatewayThread?.Abort(); } catch (Exception ex) { MainPage.Log($"终止登录网关tcp异常:{ex.Message}"); } finally { loginGatewayThread = null; } MainPage.Log("局域网tcp连接登录网关成功"); } } else HDL_ON/DAL/DriverLayer/Control_TcpClient.cs
@@ -6,6 +6,7 @@ using System.Threading.Tasks; using HDL_ON.Entity; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace HDL_ON.DriverLayer { @@ -15,7 +16,25 @@ //声明IP,端口,和一个用来连接的Socket public string _ip; private TcpClient _tcpClient; private TcpClient _clinet; private TcpClient _tcpClient { get { return _clinet; } set { _clinet = value; if (_clinet == null) { if(connectThread!= null) { connectThread.Abort(); connectThread = null; } } } } //创建一个委托,用来满足其他类调用 //public delegate void DelegateMessage(string str); @@ -25,10 +44,47 @@ /// 连接次数 /// </summary> private int reconnectIndex = 0; private bool _isConnected = false; /// <summary> /// 是否连接成功 /// </summary> public bool isConnected = false; public bool isConnected { get { return _isConnected; } set { _isConnected = value; if (value) { Control.Ins.LoginGateway(); HeartBeat(); } else { try { _tcpClient.Close(); _tcpClient = null; } catch (Exception) { } } } } private List<string> heartBeatLogIdList = new List<string>(); /// <summary> /// 心跳记录 /// </summary> public void ClearHeartBeatLog() { heartBeatLogIdList.Clear(); } /// <summary> @@ -53,14 +109,14 @@ try { _tcpClient.Connect(IPAddress.Parse(_ip), 8586); Task.Run(new Action(ReceiveMessage));//开启线程,不停接收消息 ReceiveMessage();//开启线程,不停接收消息 MainPage.Log($"打开tcp client{_ip}:8586"); isConnected = true; } catch (Exception e) { MainPage.Log(e.Message); throw; MainPage.Log($"打开tcp异常:"+e.Message); return false; } return true;//返回连接状态 } @@ -74,42 +130,80 @@ /// </summary> public void Connect() { if(connectThread == null) lock (lockObj) { connectThread = new Thread(() => { while (Control.Ins.GatewayOnline_Local) if (isConnected) { return; } if (connectThread == null) { connectThread = new Thread(() => { if (_tcpClient == null) while (Control.Ins.GatewayOnline_Local && !isConnected) { ConnectToTcp(); } else { if (!_tcpClient.Connected) if (_tcpClient == null) { try ConnectToTcp(); } else { if (!_tcpClient.Connected) { //_tcpClient.ReceiveTimeout = _tcpClient.Connect(IPAddress.Parse(_ip), 8586); Task.Run(new Action(ReceiveMessage));//开启线程,不停接收消息 } catch (Exception ex) { MainPage.Log($"tcp重连异常:{ex.Message}"); _tcpClient.Close(); _tcpClient = null; try { //_tcpClient.ReceiveTimeout = _tcpClient.Connect(IPAddress.Parse(_ip), 8586); ReceiveMessage();//开启线程,不停接收消息 isConnected = true; } catch (Exception ex) { MainPage.Log($"tcp重连异常:{ex.Message}"); } } } Thread.Sleep(1000); } Thread.Sleep(1000); }); connectThread.Start(); } else { if (!isConnected) { try { connectThread?.Abort(); } catch { } finally { connectThread = null; } Connect(); } }); connectThread.Start(); } } } /// <summary> /// 重连 /// </summary> public void Reconect() { if (_tcpClient == null) { Connect(); } else { _tcpClient.Close(); _tcpClient = null; Connect(); } } /// <summary> /// 关闭连接 @@ -130,29 +224,81 @@ /// <param name="bytes">需要发送的字节</param> public void SendMessage(byte[] bytes) { if (_tcpClient.GetStream().CanWrite) if (heartBeatLogIdList.Count > 3) { _tcpClient.GetStream().Write(bytes, 0, bytes.Length); try { MainPage.Log("心跳多次未回复,断开tcp连接"); heartBeatLogIdList.Clear(); isConnected = false; Reconect(); return; }catch (Exception ex) { MainPage.Log($"重连tcp异常:{ex.Message}"); } } try { if (_tcpClient.GetStream().CanWrite&& isConnected) { _tcpClient.GetStream().Write(bytes, 0, bytes.Length); } }catch(Exception ex) { MainPage.Log($"tcp客户端发送数据异常:{ex.Message}"); isConnected = false; } } /// <summary> /// 心跳包线程 /// </summary> private Thread heartBeatThread; private DateTime heartBeatTime; public void HeartBeat() { if(heartBeatThread == null) lock (lockObj) { heartBeatThread = new Thread(() => { if(_tcpClient.Connected&&10 *1000 <(System.DateTime.Now - heartBeatTime).TotalMilliseconds) if (heartBeatThread == null) { MainPage.Log($"心跳包线程启动"); heartBeatThread = new Thread(() => { var sendBytes = Control.Ins.ConvertSendBodyData(CommunicationTopic.ct.HeartBeat, ""); SendMessage(sendBytes); while (isConnected) { if (_tcpClient.Connected && 10 * 1000 < (System.DateTime.Now - heartBeatTime).TotalMilliseconds) { string msgId = Control.Ins.msg_id.ToString(); heartBeatLogIdList.Add(msgId); var sendJob = new JObject { { "id", Control.Ins.msg_id.ToString() }, { "time_stamp", Utlis.GetTimestamp() } }; var bodyString = JsonConvert.SerializeObject(sendJob); var sendBytes = Control.Ins.ConvertSendBodyData(CommunicationTopic.ct.HeartBeat, bodyString, false); SendMessage(sendBytes); heartBeatTime = DateTime.Now; } Thread.Sleep(100); } }); heartBeatThread.Start(); } else { try { heartBeatThread?.Abort(); } Thread.Sleep(100); }); heartBeatThread.Start(); catch (Exception ex) { MainPage.Log($"启动心跳线程,重启线程异常:{ex.Message}"); } finally { heartBeatThread = null; HeartBeat(); } } } } /// <summary> @@ -160,49 +306,84 @@ /// </summary> private Thread receiveThread; private object lockObj = new object(); //接收消息 public void ReceiveMessage() { if(receiveThread == null) lock (lockObj) { receiveThread = new Thread(() => { while (true) if (receiveThread == null) { receiveThread = new Thread(() => { if(_tcpClient == null) while (isConnected) { receiveThread.Abort(); receiveThread = null; return; } if (!_tcpClient.Connected) { MainPage.Log("tcp客户端断开了连接..."); receiveThread.Abort(); receiveThread = null; isConnected = false; return; if (_tcpClient == null) { try { receiveThread?.Abort(); } catch { } finally { receiveThread = null; } return; } if (!_tcpClient.Connected) { MainPage.Log("tcp客户端断开了连接..."); isConnected = false; return; } try { // 定义一个2M的缓存区; byte[] arrMsgRec = new byte[1024 * 1024 * 2]; try { int size = _tcpClient.GetStream().Read(arrMsgRec, 0, arrMsgRec.Length); } catch (Exception ex) { isConnected = false; MainPage.Log($"局域网tcp数据接收异常:{ex.Message}"); return; } var tcpDataString = System.Text.Encoding.UTF8.GetString(arrMsgRec, 0, arrMsgRec.Length); if (!string.IsNullOrEmpty(tcpDataString)) { MainPage.Log($"局域网tcp数据接收"); Control.Ins.ConvertReceiveData(arrMsgRec, null); } } catch (Exception) { } } // 定义一个2M的缓存区; byte[] arrMsgRec = new byte[1024 * 1024 * 2]; int size = _tcpClient.GetStream().Read(arrMsgRec, 0, arrMsgRec.Length); var tcpDataString = System.Text.Encoding.UTF8.GetString(arrMsgRec, 0, arrMsgRec.Length); if (!string.IsNullOrEmpty(tcpDataString)) { MainPage.Log($"局域网tcp数据接收"); Control.Ins.ConvertReceiveData(arrMsgRec, null); } }); //receiveThread.IsBackground = true; receiveThread.Start(); } else { try { receiveThread?.Abort(); } }); //receiveThread.IsBackground = true; receiveThread.Start(); catch { } finally { receiveThread = null; ReceiveMessage(); } } } } } } HDL_ON/Entity/Function/Scene.cs
@@ -95,7 +95,7 @@ /// <summary> /// 云端oss存储图片的路径 /// </summary> public string image = ""; public string image = "Intelligence/Gallery/scenebg1.png"; ///// <summary> ///// 场景背景 @@ -119,10 +119,10 @@ } else { var sceneImageInfo = OssSceneImages.Find((obj) => obj.defaultIconName == image); var sceneImageInfo = OssSceneImages.Find((obj) => obj.defaultIconUrl == image); if (sceneImageInfo != null) { return sceneImageInfo.defaultIconName; return sceneImageInfo.localUrl; } return image; } @@ -152,51 +152,61 @@ new SceneImageInfo { defaultIconName = "scenebg1", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/781c397f-611a-48a2-a3ed-2520ffb971bb.png" defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/781c397f-611a-48a2-a3ed-2520ffb971bb.png", localUrl = "Intelligence/Gallery/scenebg1.png", }, new SceneImageInfo { defaultIconName = "scenebg2", localUrl = "Intelligence/Gallery/scenebg2.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/be2a7c63-a6c0-427a-bb6d-f5c06f5b2f05.png" }, new SceneImageInfo { defaultIconName = "scenebg3", localUrl = "Intelligence/Gallery/scenebg3.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/5d801aca-03fb-4ef3-88ec-75ade3aa1c94.png" }, new SceneImageInfo { defaultIconName = "scenebg4", localUrl = "Intelligence/Gallery/scenebg4.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/a205306c-4fcd-4ea1-8e88-e84282dc0d54.png" }, new SceneImageInfo { defaultIconName = "scenebg5", localUrl = "Intelligence/Gallery/scenebg5.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/93a0acdc-14be-4776-a9fd-e0fc6f13c909.png" }, new SceneImageInfo { defaultIconName = "scenebg6", localUrl = "Intelligence/Gallery/scenebg6.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/45074923-2227-422a-be33-e37e6c3f9d23.png" }, new SceneImageInfo { defaultIconName = "scenebg7", localUrl = "Intelligence/Gallery/scenebg7.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/28b3e459-041e-4ea1-9ff9-57053c5357f4.png" }, new SceneImageInfo { defaultIconName = "scenebg8", localUrl = "Intelligence/Gallery/scenebg8.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/d470b979-cc06-4701-a2bd-7301856c9195.png" }, new SceneImageInfo { defaultIconName = "scenebg9", localUrl = "Intelligence/Gallery/scenebg9.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/1a130d03-86b2-4174-b986-6f6c312a959f.png" }, new SceneImageInfo { defaultIconName = "scenebg10", localUrl = "Intelligence/Gallery/scenebg10.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/54c1c7ab-9b63-4487-a77d-d5d3dadd9801.png" } }; @@ -862,6 +872,7 @@ { public string defaultIconName; public string defaultIconUrl; public string localUrl; } HDL_ON/Entity/FunctionList.cs
@@ -24,7 +24,11 @@ var filePathList = FileUtlis.Files.ReadFiles(); foreach (var filePath in filePathList) { _FunctionList.IniFunctionList(filePath); try { _FunctionList.IniFunctionList(filePath); } catch { } } #endregion } HDL_ON/UI/UI2/FuntionControlView/1ContorlPage/AcControlPage.cs
@@ -170,10 +170,11 @@ TextColor = CSS_Color.FirstLevelTitleColor, TextSize = 50, IsBold = true, Text = Convert.ToDouble(temp).ToString(), Text = "28", TextAlignment = TextAlignment.Center, }; btnTemp.Width = btnTemp.GetTextWidth() + Application.GetRealWidth(5); btnTemp.Text = Convert.ToDouble(temp).ToString(); FrameWhiteCentet1.AddChidren(btnTemp); @@ -959,7 +960,7 @@ device.SetAttrState(FunctionAttributeKey.SetTemp, arcBar.Progress.ToString()); btnTemp.Text = arcBar.Progress.ToString(); controlTime = DateTime.Now; System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>(); Dictionary<string, string> d = new Dictionary<string, string>(); d.Add(FunctionAttributeKey.SetTemp, arcBar.Progress.ToString()); Control.Ins.SendWriteCommand(device, d); };