Files
Web_CRICS_Server_VS2010_Prod/RCUHost/Implement/HostRegisterReceiver.cs
2025-12-11 09:17:16 +08:00

362 lines
20 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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; }
}
}
}