using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using Common; using Dao; using RCUHost.Protocols; using CommonEntity; namespace RCUHost.Implement { public abstract class GenericReceiverBase : IReceiver { #region Static Memberss private static log4net.ILog logger = log4net.LogManager.GetLogger(typeof(GenericReceiverBase)); private static readonly Object _locker = new object(); protected static ushort frameNo = 0; #endregion #region Privates Properties private IHostServer hostServer; private ISysSettingRepository sysSettingRepository; public ISysSystemLogsRepository SysSystemLogsRepository { get; set; } /// /// 服务器通信IP /// private string messageIP = "0.0.0.0"; /// /// 服务器通信端口 /// private int messagePort = 3389; /// /// 组播地址 /// private string multicastIP = "239.7.8.9"; /// /// RCU主机通信端口,组播端口 /// private int mulitcastPort = 3341; private string ftpServer = "106.75.37.225"; private ushort ftpPort = 21; private string ftpName = "blw"; private string ftpPassword = "blw@123"; #endregion #region Public Properties public IHostServer HostServer { get { return this.hostServer; } set { this.hostServer = value; //this.hostServer.BeforeStart += new EventHandler(hostServer_BeforeStart); //this.hostServer.AfterStart += new EventHandler(hostServer_AfterStart); } } public ISysSettingRepository SysSettingRepository { get { return this.sysSettingRepository; } set { this.sysSettingRepository = value; this.multicastIP = SysSettingRepository.GetValue("MulticastIP").ToString(); this.mulitcastPort = Convert.ToInt32(SysSettingRepository.GetValue("MulticastPort")); this.messageIP = SysSettingRepository.GetValue("MessageIP").ToString(); this.messagePort = Convert.ToInt32(SysSettingRepository.GetValue("MessagePort")); this.ftpServer = SysSettingRepository.GetValue("FTPServer").ToString(); this.ftpPort = Convert.ToUInt16(SysSettingRepository.GetValue("FTPPort")); this.ftpName = SysSettingRepository.GetValue("FTPName").ToString(); this.ftpPassword = SysSettingRepository.GetValue("FTPPassword").ToString(); } } /// /// 服务器通信IP,默认 0.0.0.0 /// public string MessageIP { get { return this.messageIP; } } /// /// 服务器通信端口,默认3389 /// public int MessagePort { get { return this.messagePort; } } /// /// 组播地址,默认 239.7.8.9 /// public string MulticastIP { get { return this.multicastIP; } } /// /// RCU主机通信端口,组播端口,默认 3341 /// public int MulticastPort { get { return this.mulitcastPort; } } public string FTPServer { get { return this.ftpServer; } } public ushort FTPPort { get { return this.ftpPort; } } public string FTPName { get { return this.ftpName; } } public string FTPPassword { get { return this.ftpPassword; } } /// /// 命令类型 /// public abstract CommandType CommandType { get; } #endregion /// /// 处理数据 /// /// public virtual void Process(ReceiverContext context) { } public static bool DealWwith(ReceiverContext context) { string HostNumberOnly = context.SystemHeader.Value.HostNumber.ToString(); var UUU = context.SystemHeader.Value; string IP_PORTStr = context.RemoteEndPoint.ToString(); if (UUU.CmdType == 0x02) { //如果公告的帧号和要处理的不一致就直接返回 //ushort CurrentFrameNO = context.SystemHeader.Value.FrameNo; //string PublicPop = CacheKey.PublicKeyboard + "_" + IP_PORTStr; //object ooo = MemoryCacheHelper.Get(PublicPop); //if (ooo != null) //{ // ushort Newlast = Convert.ToUInt16(ooo); // if (Newlast != CurrentFrameNO) // { // return false; // } //} //如果超过2秒就不再处理了 //string ShiJianLanJie = CacheKey.SyncTimeIntercept + "_" + HostNumberOnly; string ShiJianLanJie = CacheKey.TimeIntercept + "_" + HostNumberOnly; object VVV = MemoryCacheHelper.Get(ShiJianLanJie); if (VVV == null) { string hotelCode = context.SystemHeader.Value.HostNumber.ToHotelCode().ToString();//获取酒店编码 string RegisterKey1 = "RoomStatusTimeOutDrop"; RCUHost.RCUHostCommon.tools.LanJieData(RegisterKey1, hotelCode); return false; } } return true; } /// /// 获取下一个帧号:小于32767 /// /// protected ushort GetNextFrameNo() { lock (_locker) { if (frameNo >= 0x7EFF)//32767 { frameNo = 0; } else { frameNo++; } } return frameNo; } /// /// HostServer 启动之前调用 /// /// protected virtual void HostServer_BeforeStart(HostServer hostServer) { } /// /// HostServer 启动之后调用 /// /// protected virtual void HostServer_AfterStart(HostServer hostServer) { } /// /// 发送数据 /// /// /// protected void Send(byte[] data, string hostNumber, string mac) { string ipAndPort = CSRedisCacheHelper.Get(hostNumber, mac); if (!string.IsNullOrEmpty(ipAndPort)) { //if (HostServer!=null) //{ // logger.Error("1111111111"); //} //else //{ // logger.Error("222222222222222222222"); //} HostServer.Send(data, ipAndPort.ToString().Split(':')[0], int.Parse(ipAndPort.ToString().Split(':')[1])); } } /// /// 发送数据 /// /// /// protected void Send(byte[] data, IPEndPoint endPoint) { HostServer.Send(data, endPoint); } /// /// 发送数据并添加到队列 /// /// /// protected void SendAndPushCommandQueue(byte[] data, string hostNumber, string mac) { string ipAndPort = CSRedisCacheHelper.Get(hostNumber, mac); if (!string.IsNullOrEmpty(ipAndPort)) { HostServer.SendAndPushCommandQueue(data, ipAndPort.ToString().Split(':')[0], Convert.ToInt32(ipAndPort.ToString().Split(':')[1])); } } /// /// 回复下位机命令 /// /// protected void Reply(ReceiverContext context) { var headerLen = StructConverter.SizeOf(context.SystemHeader); var headerData = new byte[headerLen + 2]; Array.Copy(context.Data, headerData, headerLen); headerData[2] = 0x11; headerData[3] = 0x00; Send(headerData, context.RemoteEndPoint); } /// /// 创建 SystemHeader /// /// protected SystemHeader CreateSystemHeader() { return CreateSystemHeader(0); } /// /// 创建 SystemHeader /// /// 数据包长度,不包含头部长度 /// protected SystemHeader CreateSystemHeader(int dataLength) { return CreateSystemHeader(CommandType, dataLength); } /// /// 创建 SystemHeader /// /// 命令类型 /// 数据包长度,不包含头部长度 /// protected SystemHeader CreateSystemHeader(CommandType commandType, int dataLength) { var systemHeader = new SystemHeader(); systemHeader.Signature = SystemHeader.SIGNATURE; systemHeader.FrameLength = (ushort)(StructConverter.SizeOf(systemHeader) + dataLength); systemHeader.SystemID = SystemHeader.SYSTEM_ID.ToCharArray(); systemHeader.CmdType = (byte)commandType; systemHeader.FrameNo = GetNextFrameNo(); systemHeader.HostNumber = new HostNumber { NBuild = 0xFF, NFloor = 0xFF, NRoom = 0xFF, NUnit = 0xFF }; return systemHeader; } /// /// 创建 DeviceHeader /// /// protected DeviceHeader CreateDeviceHeader() { return new DeviceHeader { NodeAddr = 0x00, CmdType = (ushort)IPAddress.HostToNetworkOrder((short)this.CommandType), AskAck = 0x01, RoomNumber = new HostNumber { NBuild = 0xff, NFloor = 0xff, NRoom = 0xff, NUnit = 0xff } }; } /// /// 记录操作日志 /// /// 权限ID /// 动作 /// 详细 /// 操作结果 /// 帐号 /// 所属酒店ID protected void SaveSystemLog(int authorityID, string action, string detail, string result, string account, string ip, int hotelID) { try { Domain.SysSystemLogs entity = new Domain.SysSystemLogs(); entity.ID = 0; entity.AuthorityID = authorityID; entity.Action = action; entity.Detail = detail; entity.Result = result; entity.Account = account; entity.IP = ip; entity.Time = DateTime.Now; entity.HotelID = hotelID; SysSystemLogsRepository.Save(entity); } catch (Exception ex) { logger.Error("保存操作日志失败:" + ex.ToString()); } } #region Private Methods private void hostServer_BeforeStart(object sender, EventArgs e) { HostServer_BeforeStart(sender as HostServer); } private void hostServer_AfterStart(object sender, EventArgs e) { HostServer_AfterStart(sender as HostServer); } #endregion } }