From ddd4f5a6b483511fa396c4c777a3f5a1c25484b3 Mon Sep 17 00:00:00 2001 From: TianMaiCheng <746290578@qq.com> Date: Mon, 16 Mar 2026 13:57:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E7=A6=BB=E7=BA=BF=E7=9A=84=E5=88=A4=E6=96=AD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CRICS_V3_1124.suo | Bin 12780544 -> 12780544 bytes Common/CSRedisCacheHelper.cs | 12 ++ Common/Tools.cs | 6 + CommonEntity/LMRegisterInfo.cs | 5 + ConsoleApplication4/Program.cs | 126 +++++++++++++++++---- RCUHost/Implement/HostRegisterReceiver.cs | 9 +- RCUHost/Implement/HostServer.cs | 78 ++++++++----- WebSite/Global.asax.cs | 2 +- WebSite/Scripts/simon-room-status-index.js | 65 +++++++---- 9 files changed, 224 insertions(+), 79 deletions(-) diff --git a/CRICS_V3_1124.suo b/CRICS_V3_1124.suo index 4ad139be0f3392e68ac19c654f8475dbe5c1d66a..4407d5ee33c3119e94a6c7a72753ee33abc5a319 100644 GIT binary patch delta 43778 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 + /// 最后一次升级时间 + /// + public long upgrade_ts_ms { get; set; } } } diff --git a/ConsoleApplication4/Program.cs b/ConsoleApplication4/Program.cs index eca8855..374dacc 100644 --- a/ConsoleApplication4/Program.cs +++ b/ConsoleApplication4/Program.cs @@ -1,50 +1,130 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Net.Sockets; using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; namespace ConsoleApplication4 { internal class UdpState { - private UdpClient udpClient; + public UdpClient UdpClient { get; set;} + public IPEndPoint RemoteEndPoint { get; set; } + public UdpState(UdpClient client) { - this.udpClient = client; - } - public UdpClient UdpClient - { - get { return this.udpClient; } + this.UdpClient = client; } } + class Program { + private static bool _isRunning = true; + static void Main(string[] args) { - var udpClient = new UdpClient(3340); - udpClient.Client.ReceiveBufferSize = 3 * 1024 * 1024; - udpClient.BeginReceive(ReceiveCallback, new UdpState(udpClient)); - Console.ReadLine(); + Console.CancelKeyPress += (sender, e) => + { + _isRunning = false; + e.Cancel = true; + }; + + try + { + var udpClient = new UdpClient(3340); + udpClient.Client.ReceiveBufferSize = 3 * 1024 * 1024; + + // 开始接收 + udpClient.BeginReceive(ReceiveCallback, new UdpState(udpClient)); + + Console.WriteLine("UDP服务器已启动,按Ctrl+C停止..."); + + // 保持程序运行 + while (_isRunning) + { + Thread.Sleep(100); + } + + udpClient.Close(); + Console.WriteLine("服务器已停止"); + } + catch (Exception ex) + { + Console.WriteLine($"启动失败: {ex.Message}"); + } } public static void ReceiveCallback(IAsyncResult ar) { UdpState state = ar.AsyncState as UdpState; - // 1. 结束异步接收,获取数据和远程端点 - IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); - byte[] receivedData = state.UdpClient.EndReceive(ar, ref remoteEndPoint); - - state.UdpClient.BeginReceive(ReceiveCallback, state); + try { - Console.WriteLine(11111111111111); + // 1. 先获取接收到的数据 + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + byte[] receivedData = state.UdpClient.EndReceive(ar, ref remoteEndPoint); + + // 2. 立即开始下一次接收(不等待数据处理完成) + state.UdpClient.BeginReceive(ReceiveCallback, state); + + // 3. 异步处理数据,避免阻塞接收 + ThreadPool.QueueUserWorkItem(_ => + { + ProcessData(receivedData, remoteEndPoint, state.UdpClient); + }); } - catch (Exception) + catch (ObjectDisposedException) { - + // 正常关闭,忽略 + } + catch (SocketException ex) + { + //Console.WriteLine($"网络错误: {ex.SocketErrorCode} - {ex.Message}"); + + //// 尝试重新开始接收 + //if (_isRunning && state?.UdpClient?.Client != null) + //{ + // try + // { + // state.UdpClient.BeginReceive(ReceiveCallback, state); + // } + // catch { } + //} + } + catch (Exception ex) + { + //Console.WriteLine($"接收回调错误: {ex.Message}"); + } + } + + private static void ProcessData(byte[] data, IPEndPoint remoteEP, UdpClient udpClient) + { + try + { + //// 这里是您的数据处理逻辑 + //Console.WriteLine($"收到来自 {remoteEP} 的数据,长度: {data.Length} 字节"); + + //// 示例:解码为字符串 + //if (data.Length > 0) + //{ + // string text = Encoding.UTF8.GetString(data); + // Console.WriteLine($"内容: {text}"); + //} + + //// 这里可以处理复杂的业务逻辑 + //// 例如:数据库操作、文件处理、复杂计算等 + + //// 如果需要回复 + //if (data.Length > 0) + //{ + // byte[] response = Encoding.UTF8.GetBytes($"已收到: {data.Length} 字节"); + // udpClient.Send(response, response.Length, remoteEP); + //} + } + catch (Exception ex) + { + //Console.WriteLine($"数据处理失败: {ex.Message}"); } } } -} +} \ No newline at end of file diff --git a/RCUHost/Implement/HostRegisterReceiver.cs b/RCUHost/Implement/HostRegisterReceiver.cs index e8ff2dd..cf073a3 100644 --- a/RCUHost/Implement/HostRegisterReceiver.cs +++ b/RCUHost/Implement/HostRegisterReceiver.cs @@ -297,10 +297,17 @@ namespace RCUHost.Implement mcu_name = core, central_control_name = model, configure_hotel_name = hotel_name, - configure_room_type_name = roomtype_remark + configure_room_type_name = roomtype_remark, }; + if (host.UpgradeTime.HasValue) + { + var upgrade_ts_ms = Tools.GetCurrentTimeStamp_MS(host.UpgradeTime.Value); + rsg.upgrade_ts_ms = upgrade_ts_ms; + } + + string N1N = Newtonsoft.Json.JsonConvert.SerializeObject(rsg); CSRedisCacheHelper.Publish("redis-0XB1", N1N); diff --git a/RCUHost/Implement/HostServer.cs b/RCUHost/Implement/HostServer.cs index 8a3c95a..a35cf40 100644 --- a/RCUHost/Implement/HostServer.cs +++ b/RCUHost/Implement/HostServer.cs @@ -1321,9 +1321,13 @@ namespace RCUHost.Implement DateTime SSS = DateTime.Now; DateTime.TryParse(dtstart, out SSS); TimeSpan ssspan = DateTime.Now - SSS; - if (string.IsNullOrEmpty(EEE) && ssspan.TotalMinutes > 5) + //var TTT111= CSRedisCacheHelper.Get_Partition(HostNNN,7); + //if ((string.IsNullOrEmpty(EEE) && ssspan.TotalMinutes > 5)||string.IsNullOrEmpty(TTT111)) + //if ((string.IsNullOrEmpty(EEE) && ssspan.TotalMinutes > 5)) + if (string.IsNullOrEmpty(EEE)) { CSRedisCacheHelper.Publish("redis-on_off_line", n); + //CSRedisCacheHelper.Set_PartitionWithForever(HostNNN,"1",7); } //6号分区 做离在线数据 //但是离线的时候,只能得到Key值 @@ -2382,36 +2386,8 @@ namespace RCUHost.Implement ///碳达人状态更新 if (!string.IsNullOrEmpty(HostID)) { - string KKey = CacheKey.HostModalStatus_Prefix + "_" + HostID + "_" + "054000001"; - var OldHostModal = CSRedisCacheHelper.Get_Partition(KKey); - if (OldHostModal != null) - { - OldHostModal.Status = CarbonVIP; - CSRedisCacheHelper.Set_Partition(KKey, OldHostModal); - } - - - StringBuilder sb = new StringBuilder(); - sb.Append(CacheKey.CarbonVIP_Prefix); - sb.Append("_"); - sb.Append(HostID.ToString()); - string Key = sb.ToString(); - - string current_status_new = ""; - if (CarbonVIP == 0x01) - { - current_status_new = "open"; - } - else if (CarbonVIP == 0x02) - { - current_status_new = "close"; - } - else - { - current_status_new = "unknow"; - } - - CSRedisCacheHelper.Set(Key, current_status_new); + CarbonVIPReport(HostID, CarbonVIP,"054001000"); + CarbonVIPReport(HostID, CarbonVIP,"054000001"); } var DeviceCount = reader.ReadByte(); @@ -2757,6 +2733,46 @@ namespace RCUHost.Implement }, tuple); } + + /// + /// 碳达人上报 + /// + /// + /// + /// + private static void CarbonVIPReport(string HostID, byte CarbonVIP,string Address) + { + string KKey = CacheKey.HostModalStatus_Prefix + "_" + HostID + "_" +Address; + var OldHostModal = CSRedisCacheHelper.Get_Partition(KKey); + if (OldHostModal != null) + { + OldHostModal.Status = CarbonVIP; + CSRedisCacheHelper.Set_Partition(KKey, OldHostModal); + } + + + StringBuilder sb = new StringBuilder(); + sb.Append(CacheKey.CarbonVIP_Prefix); + sb.Append("_"); + sb.Append(HostID.ToString()); + string Key = sb.ToString(); + + string current_status_new = ""; + if (CarbonVIP == 0x01) + { + current_status_new = "open"; + } + else if (CarbonVIP == 0x02) + { + current_status_new = "close"; + } + else + { + current_status_new = "unknow"; + } + + CSRedisCacheHelper.Set(Key, current_status_new); + } public struct JiNamTongPaiTeShu { public string HostNumber { get; set; } diff --git a/WebSite/Global.asax.cs b/WebSite/Global.asax.cs index 7aecf97..7985b0b 100644 --- a/WebSite/Global.asax.cs +++ b/WebSite/Global.asax.cs @@ -160,7 +160,7 @@ namespace WebSite { RedisTongJiData tq1 = new RedisTongJiData(); tq1.url = "api/CaiJiData"; - tq1.cron_exp = string.Format("*/{0} * * * *", 10); + tq1.cron_exp = string.Format("*/{0} * * * *", 1); tq1.mission_key = MvcApplication.IntervalKey; CSRedisCacheHelper.Forever(IntervalKey, tq1); } diff --git a/WebSite/Scripts/simon-room-status-index.js b/WebSite/Scripts/simon-room-status-index.js index 603230d..b1872ef 100644 --- a/WebSite/Scripts/simon-room-status-index.js +++ b/WebSite/Scripts/simon-room-status-index.js @@ -199,22 +199,30 @@ function loadRooms(opts, callback) { type: "POST", cache: false, data: { page: page, rows: rows, groupId: options.group, isAirDetect: $("#chkAirDetect").is(':checked') }, - success: function (r) { - if (r.IsSuccess) { + success: function (r) + { + if (r.IsSuccess) + { var tdCount = Math.floor(document.documentElement.clientWidth / 124); $('#rooms').html(""); var strHtml = ""; - for (var i = 0; i < r.Data.length; i++) { - for (var j = 0; j < r.Data[i].FloorRooms.length; j++) { - if (j == 0) { + for (var i = 0; i < r.Data.length; i++) + { + for (var j = 0; j < r.Data[i].FloorRooms.length; j++) + { + if (j == 0) + { strHtml += ""; - } else if ($("#chkSwitchLine").is(':checked') && (j + 1) % tdCount == 1) { + } else if ($("#chkSwitchLine").is(':checked') && (j + 1) % tdCount == 1) + { strHtml += ""; } var strRoomTemp = ""; //室内温度:大于28°显示红色,小于22°显示蓝色,默认显示绿色 - if (r.Data[i].FloorRooms[j].RoomTemp > 28) { + if (r.Data[i].FloorRooms[j].RoomTemp > 28) + { strRoomTemp = ""; - } else if (r.Data[i].FloorRooms[j].RoomTemp < 22) { + } else if (r.Data[i].FloorRooms[j].RoomTemp < 22) + { strRoomTemp = ""; } strHtml += "
  • "; + console.log("VIP:"+CarbonVIP_Status); + if (CarbonVIP_Status == "open") + { + strHtml += "" + r.Data[i].FloorRooms[j].RoomNumber + ""; } - else if (CarbonVIP_Status == "close") { - strHtml += ""+r.Data[i].FloorRooms[j].RoomNumber+""; + else if (CarbonVIP_Status == "close") + { + strHtml += "" + r.Data[i].FloorRooms[j].RoomNumber + ""; } - else if (CarbonVIP_Status == "exists_nostatus") { - strHtml += ""+r.Data[i].FloorRooms[j].RoomNumber+""; + else if (CarbonVIP_Status == "exists_nostatus") + { + strHtml += "" + r.Data[i].FloorRooms[j].RoomNumber + ""; } - else { + else + { } - + //strHtml += "
    "; - if ($("#chkAirDetect").is(':checked') && r.Data[i].FloorRooms[j].AirDetects.length > 0) {//显示空气质量检测 - for (var k = 0; k < r.Data[i].FloorRooms[j].AirDetects.length; k++) { + if ($("#chkAirDetect").is(':checked') && r.Data[i].FloorRooms[j].AirDetects.length > 0) + {//显示空气质量检测 + for (var k = 0; k < r.Data[i].FloorRooms[j].AirDetects.length; k++) + { strHtml += "
    " + r.Data[i].FloorRooms[j].AirDetects[k].Name + ":" + r.Data[i].FloorRooms[j].AirDetects[k].Value + "
    "; } strHtml += "
    "; } - else { + else + { //strHtml += "
    " + r.Data[i].FloorRooms[j].Power + "
    "; - strHtml += "
    " + r.Data[i].FloorRooms[j].RoomStatus + " "+r.Data[i].FloorRooms[j].Power+"
    "; + strHtml += "
    " + r.Data[i].FloorRooms[j].RoomStatus + " " + r.Data[i].FloorRooms[j].Power + "
    "; strHtml += "
    " + lang.Identity + ":" + r.Data[i].FloorRooms[j].Identity + " " + r.Data[i].FloorRooms[j].PowerSupplyName + "
    "; strHtml += "
    " + r.Data[i].FloorRooms[j].AirStatusName + " " + strRoomTemp + r.Data[i].FloorRooms[j].RoomTemp + "℃ " + r.Data[i].FloorRooms[j].SettingTemp + "℃" + "
    "; strHtml += "
    " + r.Data[i].FloorRooms[j].ValveName + " " + airMode(r.Data[i].FloorRooms[j].Mode) + " " + fanSpeed(r.Data[i].FloorRooms[j].FanSpeed) + "
    "; - if (r.Data[i].FloorRooms[j].Peripheral != "") { + if (r.Data[i].FloorRooms[j].Peripheral != "") + { strHtml += "
    " + r.Data[i].FloorRooms[j].Peripheral + "
    "; } strHtml += "
    " + lang.CurrentService + ":" + r.Data[i].FloorRooms[j].Services.length + "
    "; strHtml += "
    "; - for (var k = 0; k < r.Data[i].FloorRooms[j].Services.length; k++) { + for (var k = 0; k < r.Data[i].FloorRooms[j].Services.length; k++) + { strHtml += "" + r.Data[i].FloorRooms[j].Services[k].Name + ""; } strHtml += "
    "; @@ -270,7 +288,8 @@ function loadRooms(opts, callback) { !options.timeRefresh && $.tools.ajaxLoadEnd(); callback && callback(); }, - error: function () { + error: function () + { !options.timeRefresh && $.tools.ajaxLoadEnd(); callback && callback(); }