Exemple #1
0
        /// <summary>
        /// 添加监控管理的设备
        /// </summary>
        /// <param name="devid">请求的客户端</param>
        /// <param name="ispatrol">是否持续巡检</param>
        private void addDevice(string devid, bool ispatrol)
        {
            //设备已经监控,则不再增加设备信息
            DeviceBase[] devices = this.devlist.ToArray();
            for (int i = 0; i < devices.Length; i++)
            {
                if (devid == devices[i].DevID)
                {
                    return;
                }
            }

            //增加设备监控
            Estar.Common.Tools.NameObjectList ps = new Estar.Common.Tools.NameObjectList();
            ps["设备ID"] = devid;
            DataTable tab = this.query.getTable("设备通讯参数", ps);

            if (null == tab || tab.Rows.Count < 1)
            {
                return;
            }
            DataRow dr     = tab.Rows[0];
            string  dvtype = Convert.ToString(dr["通讯协议"]);

            if (string.IsNullOrEmpty(dvtype) || DBNull.Value == dr["站址"])
            {
                return;
            }
            int          station  = Convert.ToInt32(dr["站址"]);
            CommiTarget  target   = this.getTarget(dr);
            CommiManager commimgr = CommiManager.GlobalManager;
            DeviceBase   device   = null;

            switch (dvtype)
            {
            case "门禁":
                device = new DeviceDoor();
                target.setProtocol(Protocol.PTLDoor);
                break;

            case "消费":
                device = new DeviceEatery();
                target.setProtocol(Protocol.PTLEatery);
                break;

            default:
                return;
            }
            device.IsPatrol = ispatrol;
            device.SetDevice(commimgr, target, devid, station);
            this.devlist.Add(device);
            device.RecordHandle += new EventHandler <DvRecordEventArgs>(device_RecordHandle);
            device.SignalHandle += new EventHandler <DvSignalEventArgs>(device_SignalHandle);
            device.AlarmHandle  += new EventHandler <DvAlarmEventArgs>(device_AlarmHandle);
            device.StartGather();
        }
Exemple #2
0
        /// <summary>
        /// 添加监控管理的设备
        /// </summary>
        /// <param name="devid">请求的客户端</param>
        /// <param name="ispatrol">是否持续巡检</param>
        private DeviceBase addDevice(string devid, bool ispatrol)
        {
            //增加设备监控
            Estar.Common.Tools.NameObjectList ps = new Estar.Common.Tools.NameObjectList();
            ps["设备ID"] = devid;
            DataTable tab = this.query.getTable("设备通讯参数", ps);

            if (null == tab || tab.Rows.Count < 1)
            {
                return(null);
            }
            DataRow dr     = tab.Rows[0];
            string  dvtype = Convert.ToString(dr["通讯协议"]);

            if (string.IsNullOrEmpty(dvtype) || DBNull.Value == dr["站址"])
            {
                return(null);
            }
            int          station  = Convert.ToInt32(dr["站址"]);
            CommiTarget  target   = this.getTarget(dr);
            CommiManager commimgr = CommiManager.GlobalManager;
            DeviceBase   device   = null;

            switch (dvtype)
            {
            case "门禁":
                device = new DeviceDoor();
                target.setProtocol(Protocol.PTLDoor);
                break;

            case "消费":
                device = new DeviceEatery();
                target.setProtocol(Protocol.PTLEatery);
                break;

            default:
                return(null);
            }
            device.IsPatrol = ispatrol;
            device.dtBeat   = DateTime.Now;
            device.SetDevice(commimgr, target, devid, station);
            this.devlist.Add(device);
            device.StartGather();
            return(device);
        }
 /// <summary>
 /// 读取记录数据
 /// </summary>
 /// <param name="devices">设备ID,逗号分割</param>
 /// <returns>转换成表格数据</returns>
 private void FireOpenDoor(string devices)
 {
     if (string.IsNullOrEmpty(devices))
         return;
     string[] devid = devices.ToLower().Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
     //检查设备,没有的添加入缓存
     CommiManager commimgr = CommiManager.GlobalManager;
     DeviceBase[] devs = devlist.ToArray();
     DeviceBase[] reqs = new DeviceBase[devid.Length];
     for (int i = 0; i < devid.Length; i++)
     {
         DeviceBase device = null;
         //检查设备已缓存
         for (int j = 0; j < devs.Length; j++)
         {
             if (devid[i] != devs[j].DevID)
                 continue;
             device = reqs[i] = devs[j];
             break;
         }
         //增加设备监控
         if (null != device)
             continue;
         NameObjectList ps = new NameObjectList();
         ps["设备ID"] = devid[i];
         DataTable tab = query.getTable("设备通讯参数", ps);
         if (null == tab || tab.Rows.Count < 1)
             continue;
         DataRow dr = tab.Rows[0];
         string dvtype = Convert.ToString(dr["通讯协议"]);
         if (string.IsNullOrEmpty(dvtype) || "门禁" != dvtype || DBNull.Value == dr["站址"])
             continue;
         string ctrltype = Convert.ToString(dr["控制器类型"]);
         if ("考勤机" == ctrltype)
             continue;
         CommiTarget target = this.getTarget(dr);
         if (null == target) continue;
         target.setProtocol(Protocol.PTLDoor);
         int station = Convert.ToInt32(dr["站址"]);
         if ("进出口" == ctrltype || "出入口" == ctrltype)
             device = new DeviceChannel();
         else
             device = new DeviceDoor();
         device.IsPatrol = false;
         device.dtBeat = DateTime.Now;
         device.SetDevice(commimgr, target, devid[i], station);
         devlist.Add(device);
         reqs[i] = device;
     }
     for (int i = 0; i < reqs.Length; i++)
     {
         if (null == reqs[i])
             continue;
         DeviceBase dv = reqs[i];
         if (!(reqs[i] is DeviceDoor) && !(reqs[i] is DeviceChannel))
             continue;
         if (dv is DeviceDoor)
             ((DeviceDoor)dv).FireOpenDoor();
         else if (dv is DeviceChannel)
             ((DeviceChannel)dv).FireOpenDoor();
     }
 }
 /// <summary>
 /// 读取记录数据
 /// </summary>
 /// <param name="devices">设备ID,逗号分割</param>
 /// <returns>转换成表格数据</returns>
 private string readRecord(string devices)
 {
     if (string.IsNullOrEmpty(devices))
         return "";
     //没有启动巡检的设备,启动巡检
     string[] devid = devices.ToLower().Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
     string rdformat = "<Row><Device>{0}</Device><Dt>{1}</Dt><Data>{2}</Data></Row>";
     string data = "";
     //检查设备,没有的添加入缓存
     CommiManager commimgr = CommiManager.GlobalManager;
     DeviceBase[] devs = devlist.ToArray();
     DeviceBase[] reqs = new DeviceBase[devid.Length];
     for (int i = 0; i < devid.Length; i++)
     {
         DeviceBase device = null;
         //检查设备已缓存
         for (int j = 0; j < devs.Length; j++)
         {
             if (devid[i] != devs[j].DevID)
                 continue;
             device = reqs[i] = devs[j];
             break;
         }
         //增加设备监控
         if (null != device)
             continue;
         NameObjectList ps = new NameObjectList();
         ps["设备ID"] = devid[i];
         DataTable tab = query.getTable("设备通讯参数", ps);
         if (null == tab || tab.Rows.Count < 1)
             continue;
         DataRow dr = tab.Rows[0];
         string dvtype = Convert.ToString(dr["通讯协议"]);
         if (string.IsNullOrEmpty(dvtype) || DBNull.Value == dr["站址"])
             continue;
         int station = Convert.ToInt32(dr["站址"]);
         CommiTarget target = this.getTarget(dr);
         if (null == target) continue;
         switch (dvtype)
         {
             case "门禁":
                 string ctrltype = Convert.ToString(dr["控制器类型"]);
                 if ("进出口" == ctrltype || "出入口" == ctrltype)
                     device = new DeviceChannel();
                 else
                     device = new DeviceDoor();
                 target.setProtocol(Protocol.PTLDoor);
                 break;
             case "消费":
                 device = new DeviceEatery();
                 target.setProtocol(Protocol.PTLEatery);
                 break;
             default:
                 continue;
         }
         device.IsPatrol = false;
         device.dtBeat = DateTime.Now;
         device.SetDevice(commimgr, target, devid[i], station);
         devlist.Add(device);
         reqs[i] = device;
     }
     //通讯获取数据
     List<ManualResetEvent> ehm = new List<ManualResetEvent>();
     for (int i = 0; i < reqs.Length; i++)
     {
         DeviceSyn syn = new DeviceSyn();
         syn.dev = reqs[i];
         syn.eh = new ManualResetEvent(false);
         ehm.Add(syn.eh);
         ThreadManager.QueueUserWorkItem(delegate(object obj) { this.readRecordSyn(obj); }, syn);
     }
     ManualResetEvent[] ehs = ehm.ToArray();
     ManualResetEvent.WaitAll(ehs);
     myLog.Flush();
     return dataResult;
 }
        /// <summary>
        /// 读取设备信息,包含了数据和状态
        /// </summary>
        /// <param name="info">指令内容:service='readinfo',device,id, dt='yyyy-MM-dd HH:mm:ss',datatype='record|alarm|signal'</param>
        /// <param name="client">客户端连接信息</param>
        public void ReadInfodev(NameValueCollection info, ClientInfo client)
        {
            if (null == info)
            {
                return;
            }

            string cmdid    = info["id"];
            string devid    = info["device"];
            string datatype = info["datatype"];
            string dt       = info["dt"];

            if (string.IsNullOrEmpty(devid))
            {
                return;
            }
            if ("record" != datatype && "signal" != datatype && "alarm" != datatype)
            {
                return;
            }
            devid = devid.ToLower();
            DateTime dtindex = DateTime.Now.AddSeconds(-30);

            if (!string.IsNullOrEmpty(dt))
            {
                try { dtindex = Convert.ToDateTime(dt); }
                catch { }
            }

            //不是持续巡检设备,启动巡检
            Monitor.Enter(devlist);
            DeviceBase[] devs = this.devlist.ToArray();
            Monitor.PulseAll(devlist);
            Monitor.Exit(devlist);
            DeviceBase device = null;

            for (int i = 0; i < devs.Length; i++)
            {
                if (devid != devs[i].DevID.ToLower())
                {
                    continue;
                }
                device = devs[i];
                break;
            }
            if (null == device)
            {
                device = this.addDevice(devid, true);
                if (null == device)
                {
                    return;
                }
                Thread.Sleep(200);
            }
            device.dtBeat = DateTime.Now;
            //获取数据
            string tag = "";

            if ("alarm" == datatype)
            {
                tag = device.Alarm.tag;
                dt  = device.Alarm.dtReceive.ToString("yyyy-MM-dd HH:mm:ss");
            }
            else if ("signal" == datatype)
            {
                tag = device.Signal.tag;
                dt  = device.Signal.dtReceive.ToString("yyyy-MM-dd HH:mm:ss");
            }
            else if ("record" == datatype)
            {
                Debug.WriteLine("record");
                RecordDev[] rds = device.Rows.ToArray();
                for (int i = 0; i < rds.Length; i++)
                {
                    if (rds[i].dtReceive < dtindex)
                    {
                        continue;
                    }
                    tag += ";" + rds[i].tag;
                    dt   = rds[i].dtReceive.ToString("yyyy-MM-dd HH:mm:ss");
                }
                if (!string.IsNullOrEmpty(tag))
                {
                    tag = tag.Substring(1);
                }
            }
            if (("alarm" == datatype || "signal" == datatype) && string.IsNullOrEmpty(tag))
            {
                device.ReStartGather();
            }
            NameValueCollection nvclient = new NameValueCollection();

            string[,] map = { { "id", cmdid }, { "cmd", "TransFile.extend" }, { "service", "readinfo" }, { "len", "0" }, { "deviceid", device.DevID }, { "datatype", datatype }, { "dt", dt } };
            for (int i = 0; i < map.GetLength(0); i++)
            {
                nvclient.Add(map[i, 0], map[i, 1]);
            }

            byte[] data = Encoding.GetEncoding("GB2312").GetBytes(tag);
            nvclient["len"] = Convert.ToString(data.LongLength);
            byte[] context = SvrFileTrans.ParseInfo(nvclient);
            long   len     = context.LongLength;

            byte[] response = new byte[context.LongLength + data.LongLength];
            Array.Copy(context, response, len);
            Array.Copy(data, 0, response, len, data.LongLength);
            Monitor.Enter(client);
            client.BufferResponse.Add(response);
            Monitor.PulseAll(client);
            Monitor.Exit(client);
        }
        /// <summary>
        /// 添加监控管理的设备
        /// </summary>
        /// <param name="devid">请求的客户端</param>
        /// <param name="ispatrol">是否持续巡检</param>
        private DeviceBase addDevice(string devid, bool ispatrol)
        {
            //增加设备监控
            NameObjectList ps = new NameObjectList();

            ps["设备ID"] = devid;
            DataTable tab = this.query.getTable("设备通讯参数", ps);

            if (null == tab || tab.Rows.Count < 1)
            {
                return(null);
            }
            DataRow dr = tab.Rows[0];

            if (!tab.Columns.Contains("通讯协议"))
            {
                string msg = "";
                foreach (object obj in dr.ItemArray)
                {
                    msg += Convert.ToString(obj) + " ";
                }
                Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " 设备通讯参数值:" + msg);
                myLog.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " 设备通讯参数值:" + msg);
                return(null);
            }
            string dvtype = Convert.ToString(dr["通讯协议"]);

            if (string.IsNullOrEmpty(dvtype) || DBNull.Value == dr["站址"])
            {
                return(null);
            }
            int         station = Convert.ToInt32(dr["站址"]);
            CommiTarget target  = this.getTarget(dr);

            if (null == target)
            {
                return(null);
            }
            CommiManager commimgr = CommiManager.GlobalManager;
            DeviceBase   device   = null;

            switch (dvtype)
            {
            case "门禁":
                Debug.WriteLine("门禁");
                string ctrltype = Convert.ToString(dr["控制器类型"]);
                if ("进出口" == ctrltype || "出入口" == ctrltype)
                {
                    device = new DeviceChannel();
                }
                else
                {
                    device = new DeviceDoor();
                }
                target.setProtocol(Protocol.PTLDoor);
                device.AlarmHandle += new EventHandler <DvAlarmEventArgs>(device_AlarmHandle);
                break;

            case "消费":
                device = new DeviceEatery();
                target.setProtocol(Protocol.PTLEatery);
                break;

            default:
                return(null);
            }
            device.RecordHandle += new EventHandler <DvRecordEventArgs>(device_RecordHandle);
            Monitor.Enter(devlist);
            this.devlist.Add(device);
            Monitor.PulseAll(devlist);
            Monitor.Exit(devlist);
            device.IsPatrol = ispatrol;
            device.dtBeat   = DateTime.Now;
            device.SetDevice(commimgr, target, devid, station);
            device.StartGather();
            Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " 启动:" + Convert.ToString(station) + " 设备ID:" + devid);
            myLog.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " 启动:" + Convert.ToString(station) + " 设备ID:" + devid);
            return(device);
        }