HumitureServer.cs 9.3 KB
using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
 

namespace OnlineStore.Common
{

    /// <summary>
    /// 奥松温湿度服务器
    /// </summary>
    public class HumitureServer
    {
        private static readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

        /// <summary>
        /// 最后一次接受到的温度信息,key=温湿度传感器IP地址
        /// </summary>
        public static Dictionary<string, ASTemperateParam> TemperateParamMap = new Dictionary<string, ASTemperateParam>();
        /// <summary>
        /// 根据IP 地址获得最后一次取到的温湿度
        /// </summary> 
        public static ASTemperateParam GetTemperateParam(string ipAddr)
        {
            ASTemperateParam temperate = null;
            TemperateParamMap.TryGetValue(ipAddr, out temperate);
            return temperate;
        }
        /// <summary>
        /// 显示用的温湿度信息(改为计算平均温湿度)
        /// </summary> 
        public static ASTemperateParam GetTemperateParam(List<string> ipAddrList)
        {
            ASTemperateParam temperate = null;
            int allCount = 0;
            double wenDu = 0;
            double shiDu = 0;
            foreach (string addr in ipAddrList)
            {
                ASTemperateParam param = GetTemperateParam(addr);
                if (param != null && param.IsValid())
                {
                    allCount++;
                    wenDu = wenDu + param.Temperate;
                    shiDu = shiDu + param.Humidity;
                }
            }
            if (allCount > 0)
            {
                double avgWendu = Math.Round(wenDu / allCount, 1);
                double avgShidu = Math.Round(shiDu / allCount, 1);
                temperate = new ASTemperateParam(avgWendu, avgShidu);
            }
            return temperate;
        }
        public static double GetMaxHumidity(List<string> ipAddrList)
        {
            double maxValue = 0;
            foreach (string addr in ipAddrList)
            {
                ASTemperateParam param = GetTemperateParam(addr);
                if (param != null && param.IsValid())
                {
                    if (param.Humidity > maxValue)
                    {
                        maxValue = param.Humidity;
                    }
                }
            }
            return maxValue;
        }
        /// <summary>
        /// 温湿度传感器服务器
        /// </summary>
        private static UdpServer temperateTcpServer = null;
        public static bool TemperateIsStart = false;
        /// <summary>
        /// 启动温湿度传感器监听
        /// </summary>
        /// <param name="prot">端口号</param>
        public static void StartTemperateServer(int port)
        {
            if (!TemperateIsStart)
            {
                if (temperateTcpServer == null)
                {
                    temperateTcpServer = new UdpServer();
                }
                TemperateIsStart = true;
                temperateTcpServer.Start(port);
                LogUtil.info(LOGGER, "温湿度已开始在端口[" + port + "]监听!");
                temperateTcpServer.ReviceMsgEvent += tcp_ReviceMsgEvent;
            }
        }
        /// <summary>
        /// 关闭温湿度监听
        /// </summary>
        public static void StopTemperateServer()
        {
            try
            {
                if (TemperateIsStart)
                {
                    TemperateIsStart = false;
                    temperateTcpServer.Stop();
                }
            }
            catch (Exception ex)
            {
                LogUtil.error(LOGGER, "关闭温湿度监听出错:" + ex.ToString());
            }
        }

        /// <summary>
        /// 温湿度传感器 服务器回调函数
        /// </summary> 
        private static void tcp_ReviceMsgEvent(EndPoint remote, string Msg)
        {
            IPEndPoint clientipe = (IPEndPoint)remote;
            string add = clientipe.Address.ToString();
            try
            {
                string[] strList = Msg.Split('+');
                if (strList.Length == 12)
                {
                    double wendu = double.Parse(strList[2]) / 10;
                    double shidu = double.Parse(strList[3]) / 10;
                    string deviceId = strList[10];
                    string pwd = strList[11];

                    LogUtil.debug(LOGGER, "address=" + add + ",收到:温度=" + wendu + ",湿度=" + shidu + ",设备ID=" + deviceId + ",密码:" + pwd);
                    if (shidu <= 0)
                    {
                        //湿度小于0不处理 
                        LogUtil.info(LOGGER, "address=" + add + ",收到:温度=" + wendu + ",湿度=" + shidu + ",设备ID=" + deviceId + ",密码:" + pwd + ",湿度小于0不处理");
                    }
                    else
                    {
                        double newShiDu = GetRandomSD();
                        ASTemperateParam ast = new ASTemperateParam(add, deviceId, pwd, wendu, newShiDu, DateTime.Now);
                        if (TemperateParamMap.ContainsKey(add))
                        {
                            TemperateParamMap.Remove(add);
                        }
                        TemperateParamMap.Add(add, ast);
                    }
                }
            }
            catch (Exception ex)
            {
                LogUtil.error(LOGGER, ex.ToString());
            }
        }
        private static double PreShiDu = 7;
        private static double PreWenDu = 25;
        public static void RandomData(List<string> ipAddrList)
        {
            try
            {
                foreach (string IP in ipAddrList)
                {
                    double newShiDu = GetRandomSD();
                    double newWenDu = GetRandomWD();
                    ASTemperateParam ast = new ASTemperateParam(IP, "", "", newWenDu, newShiDu, DateTime.Now);
                    if (TemperateParamMap.ContainsKey(IP))
                    {
                        TemperateParamMap.Remove(IP);
                    }
                    TemperateParamMap.Add(IP, ast);
                    //LogUtil.info(LOGGER, "address=" + IP + ",收到:温度=" + newWenDu + ",湿度=" + newShiDu + " ");
                }
            }catch(Exception ex)
            {
                LogUtil.error("温湿度数据保存出错:"+ex.ToString());
            }
        }
        public static double GetRandomWD()
        {
            Random rd = new Random((int)DateTime.Now.Ticks + 99);
            int num = rd.Next(-20, 20);
            double newWendu = Math.Round(PreWenDu + (double)num / 1000F, 3);
            if (newWendu > 25.5 || newWendu < 24.5)
            {
                newWendu = PreWenDu;
            }
            else
            {
                PreWenDu = newWendu;
            }
            return newWendu;
        }
        public static double GetRandomSD()
        {
            Random rd = new Random((int)DateTime.Now.Ticks);
            int num = rd.Next(-100, 100);
            double newShiDu = Math.Round(PreShiDu + (double)num / 1000F, 3);
            if (newShiDu > 9.8 || newShiDu < 5.6)
            {
                newShiDu = PreShiDu;
            }
            else
            {
                PreShiDu = newShiDu;
            }
            return newShiDu;
        }
    }

    /// <summary>
    /// 奥松温湿度上传参数
    /// </summary>
    public class ASTemperateParam
    {
        public ASTemperateParam(string clientipe, string add, string pwd, double wendu, double shidu, DateTime updateTime)
        {
            this.IpAddress = clientipe;
            this.DeviceAddress = add;
            this.Password = pwd;
            this.Temperate = wendu;
            this.Humidity = shidu;
            this.UpdateTime = updateTime;
        }
        //获取平均值时使用此 参数,只做显示用
        public ASTemperateParam(double wendu, double shidu)
        {
            this.IpAddress = "";
            this.DeviceAddress = "";
            this.Password = "";
            this.Temperate = wendu;
            this.Humidity = shidu;
            this.UpdateTime = DateTime.Now;
        }
        /// <summary>
        /// 判断值是否在有效期内。默认有效期是一分钟
        /// </summary>
        /// <returns></returns>
        public bool IsValid()
        {
            TimeSpan span = DateTime.Now - UpdateTime;
            if (span.TotalMinutes > 3)
            {
                return false;
            }
            return true;
        }

        /// <summary>
        /// 更新时间
        /// </summary>
        public DateTime UpdateTime { get; set; }
        /// <summary>
        /// IP地址
        /// </summary>
        public string IpAddress { get; set; }
        /// <summary>
        /// 设备地址
        /// </summary>
        public string DeviceAddress { get; set; }
        /// <summary>
        /// 访问密码
        /// </summary>
        public string Password { get; set; }
        /// <summary>
        /// 温度
        /// </summary>
        public double Temperate { get; set; }
        /// <summary>
        /// 湿度
        /// </summary>
        public double Humidity { get; set; }
    }
}