初始化CRICS

This commit is contained in:
2025-12-11 09:17:16 +08:00
commit 83247ec0a2
2735 changed files with 787765 additions and 0 deletions

View File

@@ -0,0 +1,361 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Common;
using Domain;
using RCUHost.Protocols;
using Dao;
using RestSharp;
using System.Threading.Tasks;
using System.Configuration;
using CommonEntity;
namespace RCUHost.Implement
{
/// <summary>
/// 发送命令给rcu获取寄存器内容改为读取主机信息命令
/// </summary>
public class HostRegisterReceiver : GenericReceiverBase, IHostRegisterReceiver
{
private static log4net.ILog logger = log4net.LogManager.GetLogger(typeof(HostRegisterReceiver));
public IHostRepository HostRepository { get; set; }
public IHostRCURepository HostRCURepository { get; set; }
public IRoomStatusRepository RoomStatusRepository { get; set; }
public void Send(Host host)
{
var data = CreateHostSecretPacket(host);
Send(data, host.HostNumber, host.MAC);
}
public void Send(string hostnumber, string mac)
{
var data = CreateHostSecretPacket();
Send(data, hostnumber, mac);
}
public byte[] CreateHostSecretPacket()
{
SystemHeader systemHeader = CreateSystemHeader();
byte[] registerAddr = new byte[] { 0, 0, 0, 0 };
int size = StructConverter.SizeOf(systemHeader) + 2 + registerAddr.Length;
systemHeader.FrameLength = (ushort)size;
using (MemoryStream stream = new MemoryStream(size))
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(StructConverter.StructToBytes(systemHeader));
writer.Write(registerAddr);
writer.Write(new byte[] { 0, 0 });
return stream.ToArray();
}
}
}
public byte[] CreateHostSecretPacket(Host host)
{
SystemHeader systemHeader = CreateSystemHeader();
byte[] registerAddr = new byte[] { 0, 0, 0, 0 };
//byte[] registerAddr = new byte[] {
// 13, //需要读取寄存器的个数
// 0, 0, 0, 0, //局域網IP
// 4, 0, 0, 0, //局域网端口
// 8, 0, 0, 0, //子网掩码
// 12, 0, 0, 0, //网关
// 16, 0, 0, 0, //DNS
// 24, 0, 0, 0, //服务器IP
// 28, 0, 0, 0, //服务器端口
// 32, 0, 0, 0, //授权到期时间
// 40, 0, 0, 0, //设置到期时间
// 48, 0, 0, 0, //IP类型
// 60, 0, 0, 0, //固件版本号
// 64, 0, 0, 0, //配置版本号
// 80, 0, 0, 0 //季节
//};
int size = StructConverter.SizeOf(systemHeader) + 2 + registerAddr.Length;
systemHeader.FrameLength = (ushort)size;
using (MemoryStream stream = new MemoryStream(size))
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(StructConverter.StructToBytes(systemHeader));
writer.Write(registerAddr);
writer.Write(new byte[] { 0, 0 });
return stream.ToArray();
}
}
}
//public static string Debug_RegeditInfo = ConfigurationManager.AppSettings["debug_registerinfo"];
public override void Process(ReceiverContext context)
{
string msg = context.RemoteEndPoint.Address.ToString() + ":" + context.RemoteEndPoint.Port.ToString() + ":" + Tools.ByteToString(context.Data);
//logger.Error("收到主机信息数据:" + msg);
string dataHex = Tools.ByteToString(context.Data);
string HostNumberOnly = context.SystemHeader.Value.HostNumber.ToString();
Host host = HostRepository.GetByHostNumber(HostNumberOnly);
if (host != null)
{
try
{
int offset = StructConverter.SizeOf(context.SystemHeader);
int length = context.Data.Length - offset - 2;
using (MemoryStream stream = new MemoryStream(context.Data, offset, length))
{
using (BinaryReader reader = new BinaryReader(stream))
{
int ipType = reader.ReadByte();//IP类型
string type_number = Encoding.GetEncoding("GBK").GetString(reader.ReadBytes(16)).Replace(@"\u0000", "").Replace("", "").Trim();//机型编码
string lan_ip = String.Join(".", reader.ReadBytes(4));//局域网IP
string server_ip = String.Join(".", reader.ReadBytes(4));//服务器IP
string subnet_mask = String.Join(".", reader.ReadBytes(4));//子网掩码
string gateway = String.Join(".", reader.ReadBytes(4));//网关
int lan_port = BitConverter.ToInt32(reader.ReadBytes(4), 0);//局域网端口
string dns = String.Join(".", reader.ReadBytes(4));//DNS
string software_version = Encoding.GetEncoding("GBK").GetString(reader.ReadBytes(20)).Replace(@"\u0000", "").Replace("", "").Trim();//软件版本号
int year = reader.ReadByte();
int month = reader.ReadByte();
int day = reader.ReadByte();
int hour = reader.ReadByte();
int minute = reader.ReadByte();
int second = reader.ReadByte();
string rcuTime = string.Format("20{0}-{1}-{2} {3}:{4}:{5}", year, month, day, hour, minute, second);
//logger.Error("rcu time:" + rcuTime);
DateTime rcu_time = DateTime.Now;
DateTime.TryParse(rcuTime, out rcu_time);
string launcher_version = Encoding.GetEncoding("GBK").GetString(reader.ReadBytes(20)).Replace(@"\u0000", "").Replace("", "").Trim();//Launcher版本
string mac = BitConverter.ToString(reader.ReadBytes(6));//MAC
long hotel_code = Tools.Byte4ToLong(reader.ReadBytes(4));//项目编码
int host_id = BitConverter.ToInt32(reader.ReadBytes(4), 0);//房号ID
int roomtype_id = BitConverter.ToInt32(reader.ReadBytes(4), 0);//房型ID
string setting_version = String.Join(".", reader.ReadBytes(4));//配置版本号
int room_status_id = BitConverter.ToInt32(reader.ReadBytes(4), 0);//房态
byte[] season = reader.ReadBytes(4);//季节
StringBuilder sbSeason = new StringBuilder();
sbSeason.Append((season[0] >> 0) & 3);
sbSeason.Append((season[0] >> 2) & 3);
sbSeason.Append((season[0] >> 4) & 3);
sbSeason.Append((season[0] >> 6) & 3);
sbSeason.Append((season[1] >> 0) & 3);
sbSeason.Append((season[1] >> 2) & 3);
sbSeason.Append((season[1] >> 4) & 3);
sbSeason.Append((season[1] >> 6) & 3);
sbSeason.Append((season[2] >> 0) & 3);
sbSeason.Append((season[2] >> 2) & 3);
sbSeason.Append((season[2] >> 4) & 3);
sbSeason.Append((season[2] >> 6) & 3);
int lock_status = BitConverter.ToInt32(reader.ReadBytes(4), 0);//锁定状态
long set_expiration_time = BitConverter.ToUInt32(reader.ReadBytes(4), 0);//授权时间戳
long expiration_time = BitConverter.ToUInt32(reader.ReadBytes(4), 0);//授权到期时间戳
string roomnumber = Encoding.GetEncoding("GBK").GetString(reader.ReadBytes(16)).Replace(@"\u0000", "").Replace("", "").Trim();//房号备注
string roomtype = Encoding.GetEncoding("GBK").GetString(reader.ReadBytes(16)).Replace(@"\u0000", "").Replace("", "").Trim();//房型备注
string room_remark = Encoding.GetEncoding("GBK").GetString(reader.ReadBytes(96)).Replace(@"\u0000", "").Replace("", "").Trim();//房间备注
string core = Encoding.GetEncoding("GBK").GetString(reader.ReadBytes(64)).Replace(@"\u0000", "").Replace("", "").Trim();//MCU机型名称
string model = Encoding.GetEncoding("GBK").GetString(reader.ReadBytes(64)).Replace(@"\u0000", "").Replace("", "").Trim();//中控机型名称
string hotel_name = Encoding.GetEncoding("GBK").GetString(reader.ReadBytes(32)).Replace(@"\u0000", "").Replace("", "").Trim();//配置数据酒店名称
string roomtype_remark = Encoding.GetEncoding("GBK").GetString(reader.ReadBytes(32)).Replace(@"\u0000", "").Replace("", "").Trim();//配置数据房型别名
var hostRCU = HostRCURepository.GetByHostID(host_id);
if (hostRCU == null)
{
hostRCU = new HostRCU();
}
hostRCU.HotelID = host.SysHotel.ID;
hostRCU.IPType = ipType;
hostRCU.TypeNumber = type_number;
hostRCU.LanIP = lan_ip;
hostRCU.ServerIP = server_ip;
hostRCU.SubnetMask = subnet_mask;
hostRCU.Gateway = gateway;
hostRCU.LanPort = lan_port;
hostRCU.DNS = dns;
hostRCU.Version = software_version;
hostRCU.RunTime = (rcu_time.Year < 1800 ? DateTime.Now : rcu_time);
hostRCU.LauncherVersion = launcher_version;
hostRCU.MAC = mac;
hostRCU.HotelCode = hotel_code.ToString();
hostRCU.HostID = host_id;
hostRCU.RoomTypeID = roomtype_id;
hostRCU.ConfigVersion = setting_version.Substring(0, 5);
var TTT = new Tuple<Host, string>(host, hostRCU.ConfigVersion);
Task.Factory.StartNew((State) =>
{
var NNN = (Tuple<Host, string>)State;
BarData bbb = new BarData();
bbb.HostID = NNN.Item1.ID;
//这里才是真正的版本数据
string output = HostSearchReceiver.NormalizeVersion(NNN.Item2);
bbb.ConfiguraVersion = output;
UploadCurrentVersionReceiver.UP_Grade_Json(NNN.Item1, bbb);
}, TTT);
hostRCU.RoomStatusID = room_status_id;
#region
////host_take.HotelID = host.SysHotel.ID;
//host_take.IPType = ipType;
////host_take.TypeNumber = type_number;
//host_take.LanIP = lan_ip;
//host_take.ServerIP = server_ip;
//host_take.SubnetMask = subnet_mask;
//host_take.Gateway = gateway;
//host_take.LanPort = lan_port;
//host_take.DNS = dns;
//host_take.Version = software_version;
//host_take.RunTime = (rcu_time.Year < 1800 ? DateTime.Now : rcu_time);
//host_take.LauncherVersion = launcher_version;
//host_take.MAC = mac;
//host_take.SysHotel.Code = hotel_code.ToString();
//host_take.ID = host_id;
//host_take.RoomType.ID = roomtype_id;
//host_take.ConfigVersion = setting_version.Substring(0, 5);
//host_take.RoomStatus.ID = room_status_id;
//host_take.Season = sbSeason.ToString();
//host_take.LockStatus = lock_status;
//host_take.RoomNumber = roomnumber;
//host_take.Model = model;
//host_take.UpgradeTime = DateTime.Now;
#endregion
var roomStatus = RoomStatusRepository.Get(room_status_id);
if (roomStatus != null)
{
hostRCU.RoomStatus = roomStatus.Name;
}
hostRCU.Season = sbSeason.ToString();
hostRCU.LockStatus = lock_status;
switch (expiration_time)
{
case 0://永久
hostRCU.ExpireTime = Convert.ToDateTime("2100-12-31");
hostRCU.SetExpireTime = TimeHelper.ToDateTime(set_expiration_time);
break;
case 65535://未设置当永久
hostRCU.ExpireTime = Convert.ToDateTime("2100-12-31");
break;
default:
hostRCU.ExpireTime = TimeHelper.ToDateTime(expiration_time);
hostRCU.SetExpireTime = TimeHelper.ToDateTime(set_expiration_time);
break;
}
hostRCU.RoomNumber = roomnumber;
hostRCU.RoomType = roomtype;
hostRCU.RoomRemark = room_remark;
hostRCU.Core = core;
hostRCU.Model = model;
hostRCU.HotelName = hotel_name;
hostRCU.RoomTypeRemark = roomtype_remark;
hostRCU.UpdateTime = DateTime.Now;
HostRepository.SetModelAndLauncher(host, lan_ip, lan_port, model, launcher_version, hostRCU.ExpireTime, hostRCU.SetExpireTime);
HostRCURepository.SaveOrUpdate(hostRCU);
//logger.Error(string.Format("酒店({0})客房({1})主机已同步信息Model{2}Launcher{3}", host.SysHotel.Name + host.SysHotel.Code, host.RoomNumber, model, launcher_version));
#region
/*int count = reader.ReadByte();//个数
reader.ReadBytes(4);
string lan_ip = String.Join(".", reader.ReadBytes(4));//局域网IP
reader.ReadBytes(4);
int lan_port = BitConverter.ToInt32(reader.ReadBytes(4), 0);//局域网端口
reader.ReadBytes(4);
string subnet_mask = String.Join(".", reader.ReadBytes(4));//子网掩码
reader.ReadBytes(4);
string gateway = String.Join(".", reader.ReadBytes(4));//网关
reader.ReadBytes(4);
string dns = String.Join(".", reader.ReadBytes(4));//DNS
reader.ReadBytes(4);
string server_ip = String.Join(".", reader.ReadBytes(4));//服务器IP
reader.ReadBytes(4);
int server_port = BitConverter.ToInt32(reader.ReadBytes(4), 0);//服务器端口
reader.ReadBytes(4);
long expiration_time = BitConverter.ToInt32(reader.ReadBytes(4), 0);//授权到期时间戳
reader.ReadBytes(4);
long set_expiration_time = BitConverter.ToInt32(reader.ReadBytes(4), 0);//设置到期时间戳
reader.ReadBytes(4);
int ip_way = reader.ReadByte();//IP类型1自动2手动
reader.ReadBytes(3);
reader.ReadBytes(4);
string firmware_version = String.Join(".", reader.ReadBytes(4));//固件版本号
reader.ReadBytes(4);
string setting_version = String.Join(".", reader.ReadBytes(4));//配置版本号
reader.ReadBytes(4);
byte[] season = reader.ReadBytes(4);//季节
StringBuilder sbSeason = new StringBuilder();
sbSeason.Append((season[0] >> 0) & 3);
sbSeason.Append((season[0] >> 2) & 3);
sbSeason.Append((season[0] >> 4) & 3);
sbSeason.Append((season[0] >> 6) & 3);
sbSeason.Append((season[1] >> 0) & 3);
sbSeason.Append((season[1] >> 2) & 3);
sbSeason.Append((season[1] >> 4) & 3);
sbSeason.Append((season[1] >> 6) & 3);
sbSeason.Append((season[2] >> 0) & 3);
sbSeason.Append((season[2] >> 2) & 3);
sbSeason.Append((season[2] >> 4) & 3);
sbSeason.Append((season[2] >> 6) & 3);
logger.Error(string.Format("count:{0},server_ip:{1},expiration_time:{2},ip_way:{3},firmware_version:{4},setting_version:{5},season:{6}",
count, server_ip, expiration_time, ip_way, firmware_version, setting_version, sbSeason.ToString()));
switch (expiration_time)
{
case 0://永久
host.ExpireTime = Convert.ToDateTime("2999-12-31");
host.SetExpireTime = TimeHelper.ToDateTime(set_expiration_time.ToString());
break;
case 65535://未设置
host.ExpireTime = host.SetExpireTime = null;
break;
default:
host.ExpireTime = TimeHelper.ToDateTime(expiration_time.ToString());
host.SetExpireTime = TimeHelper.ToDateTime(set_expiration_time.ToString());
break;
}
host.LanIP = lan_ip;
host.LanPort = lan_port;
host.SubnetMask = subnet_mask;
host.Gateway = gateway;
host.DNS = dns;
host.ServerIP = server_ip;
host.ServerPort = server_port;
host.IPType = ip_way;
//host.Version = firmware_version;
//host.ConfigVersion = setting_version;
host.Season = sbSeason.ToString();
HostRepository.Update(host);*/
#endregion
}
}
}
catch (Exception ex)
{
logger.Error(string.Format("解释酒店({0})客房({1})主机信息失败,原因:{2},数据:{3}", host.SysHotel.Name + host.SysHotel.Code, host.RoomNumber, ex.ToString(), msg));
}
}
}
public override CommandType CommandType
{
get { return CommandType.RCUInfo; }
}
}
}