Files
Web_CRICS_Server_VS2010_Prod/RCUHost/Implement/HeartReceiver.cs

220 lines
9.0 KiB
C#
Raw Normal View History

2025-12-11 09:17:16 +08:00
using System;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System.IO;
using System.Linq;
using System.Text;
using CacheManager.Core;
using Common;
using Dao;
using RCUHost.Protocols;
using CommonEntity;
namespace RCUHost.Implement
{
/// <summary>
/// 心跳包 Receiver
/// </summary>
public class HeartReceiver : GenericReceiverBase, IHeartReceiver
{
private static log4net.ILog logger = log4net.LogManager.GetLogger(typeof(HeartReceiver));
public void SendHeart(string hostNumber, string mac)
{
byte[] data = CreateDataPacket();
Send(data, hostNumber, mac);
}
public override void Process(ReceiverContext context)
{
bool bkb = GenericReceiverBase.DealWwith(context);
if (bkb == false)
{
return;
}
//心跳包维持连接
//新的 使用MAC
//logger.Error("下位机来连接了");
//AA 55 17 00 54 33 53 41 02 78 90 1F 08 75 D9
//34 D0 B8 11 75 D9 MAC地址
//D5 B6
if (context.Data.Length > 17)
{
//logger.Error("下位机来连接了");
//17: 34-D0-B8-11-5C-77 172.16.5.58:3341
//logger.Error("17: " + BitConverter.ToString(context.Data, 15, 6)+context.RemoteEndPoint.Address.ToString() + ":" + context.RemoteEndPoint.Port.ToString());
string Key = BitConverter.ToString(context.Data, 15, 6);
CSRedisCacheHelper.Set(Key, context.RemoteEndPoint.Address.ToString() + ":" + context.RemoteEndPoint.Port.ToString());//mac地址
string EndPoint = context.RemoteEndPoint.ToString();
string hostnum = context.SystemHeader.Value.HostNumber.ToString();
long hotelcode = context.SystemHeader.Value.HostNumber.ToHotelCode();
//PO~P5:RCU 主机MAC地址←
//P6:解析版本←
//P6:取电状态<
//P7:设备类型<
//P8:设备地址<
//P8~P9:设备回路<
//P10:设备数据长度<
//P11~P12:通道电压,单位:10mV
//P13~P16:通道电流,单位:10mV
//P17~P20:通道功率,单位:mW
//P21~P24:通道能耗,单位:Wh(1度电=1KWh)
//P25~P28:通道总能耗,单位:Wh(1度电=1KWh)
var Data = context.Data;
if (Data.Length > 17 + 6)
{
//AA 55 2F 00 54 33 53 41 02 34 80 EB 03 6B 24
//34 D0 B8 11 6B 24
//01 解析版本
//01 取电
//01 设备数量
//39
//01
//01
//00
//10 ///长度
//F0 55 //电压
//E8 03 //电流
//E8 03 00 00 功率
//E8 03 00 00 能耗
//E8 03 00 00 总能耗
//9E 00
//byte[] MAC = Data.Skip(15).Take(6).ToArray();
//string MACStr = Tools.ByteToString(MAC).Trim();
//MACStr = MACStr.Replace(" ", "-");
//byte Version = Data.Skip(21).Take(1).FirstOrDefault();
////从第21个数据开始
//byte TakeCard = Data.Skip(22).Take(1).FirstOrDefault();
////设备数量
//byte DeviceCount = Data.Skip(23).Take(1).FirstOrDefault();
//byte LeiXing = Data.Skip(24).Take(1).FirstOrDefault();
//byte Address = Data.Skip(25).Take(1).FirstOrDefault();
//byte[] Num = Data.Skip(26).Take(2).ToArray();
//List<byte> lll = new List<byte>();
//lll.Add(LeiXing);
//lll.Add(Address);
//lll.AddRange(Num);
//string address = new DeviceAddress(lll.ToArray()).ToString();
//byte Len = Data.Skip(28).Take(1).FirstOrDefault();
//byte[] DianYa = Data.Skip(29).Take(2).ToArray();
//byte[] DianLiu = Data.Skip(31).Take(2).ToArray();
//byte[] Power = Data.Skip(33).Take(4).ToArray();
//byte[] PowerUsed = Data.Skip(37).Take(4).ToArray();
//byte[] TotalPowerUsed = Data.Skip(41).Take(4).ToArray();
//uint dianya = BitConverter.ToUInt16(DianYa, 0);
//uint dianliu = BitConverter.ToUInt16(DianLiu, 0);
//uint gonglv = BitConverter.ToUInt32(Power, 0);
//uint nenghao = BitConverter.ToUInt32(PowerUsed, 0);
//uint zongnenghao = BitConverter.ToUInt32(TotalPowerUsed, 0);
//double V = (double)dianya * 10 / 1000;
//double A = (double)dianliu * 10 / 1000;
//double P = (double)gonglv / 1000;
//double KW_H = (double)nenghao / 1000;
//double Sum_KW_H = (double)zongnenghao / 1000;
//NengHao n = new NengHao();
//n.HotelCode = hotelcode;
//n.HostNumber = hostnum;
//n.Mac = MACStr;
//n.EndPoint = EndPoint;
//n.Version = ((int)Version).ToString();
//if (TakeCard == 0x01)
//{
// n.IsTakeCard = true;
//}
//else
//{
// n.IsTakeCard = false;
//}
//n.V = Math.Round(V, 2);
//n.A = Math.Round(A, 2);
//n.P = Math.Round(P, 2);
//n.KW_H = KW_H;
//n.Sum_KW_H = Sum_KW_H;
//long ti = Tools.GetUnixTime();
//n.CreateTime = ti;
//string KKey = CacheKey.NengHao + "_" + MACStr;
////CSRedisCacheHelper.Forever<NengHao>(KKey, n);
//CSRedisCacheHelper.Set_PartitionWithTime<NengHao>(KKey, n, 30, 1);
//string mns = Newtonsoft.Json.JsonConvert.SerializeObject(n);
//CSRedisCacheHelper.Publish("redis-power", mns);
//string KeyFilter = "能耗";
//RCUHost.RCUHostCommon.tools.LanJieData(KeyFilter, hotelcode.ToString());
}
}
else
{
//旧版本数据
//使用hostnumber
//logger.Error("MAC: "+context.SystemHeader.Value.HostNumber.ToString()+" "+ context.RemoteEndPoint.Address.ToString() + ":" + context.RemoteEndPoint.Port.ToString());
string Key = context.SystemHeader.Value.HostNumber.ToString();
string hotelCode = context.SystemHeader.Value.HostNumber.ToHotelCode().ToString();
//string EEE = CSRedisCacheHelper.Get<string>(Key);
//if (string.IsNullOrEmpty(EEE))
//{
// OnOffLineData o = new OnOffLineData();
// o.HostNumber = Key;
// o.HotelCode = hotelCode;
// o.CurrentStatus = "on";
// o.CurrentTime = DateTime.Now;
// //新来的数据
// var n = Newtonsoft.Json.JsonConvert.SerializeObject(o);
// CSRedisCacheHelper.Publish("redis-on_off_line", n);
//}
CSRedisCacheHelper.Set(Key, context.RemoteEndPoint.Address.ToString() + ":" + context.RemoteEndPoint.Port.ToString());//主机编码
//CSRedisCacheHelper.HMSet(CacheKey.RCUOnLine,Key);
}
//判断是否需要给下位机回复命令(下位机判断累计三次未回复则重启主机)
//string frameNo = Tools.ByteToString(context.Data).Substring(27, 5);//(frameNo == "FF FF")
if (context.SystemHeader.Value.FrameNo == 65535)
{
Send(CreateDataPacket(), context.RemoteEndPoint);
}
}
public override CommandType CommandType
{
get { return CommandType.Heart; }
}
private byte[] CreateDataPacket()
{
using (MemoryStream stream = new MemoryStream())
{
var headerLen = StructConverter.SizeOf(typeof(SystemHeader));
stream.Seek(headerLen, SeekOrigin.Begin);
stream.Write(new byte[] { 0, 0 }, 0, 2);
var header = CreateSystemHeader((int)stream.Length - headerLen);
byte[] headerData = StructConverter.StructToBytes(header);
stream.Seek(0, SeekOrigin.Begin);
stream.Write(headerData, 0, headerData.Length);
return stream.ToArray();
}
}
}
}