/// <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(); }
/// <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); }