Пример #1
0
        /// <summary>
        /// 发行器信息
        /// </summary>
        public void initCmdCard()
        {
            DataTable tab = initDev();

            if (null == tab || tab.Rows.Count < 1)
            {
                this.cmdCard.SetTarget(null, -1, false);
                return;
            }
            DataRow dr       = this.dsUnit.Tables["发行器"].Rows[0];
            string  port     = Convert.ToString(dr["串口"]);
            int     baudrate = Convert.ToInt32(dr["波特率"]);
            Parity  parity   = Parity.None;
            int     databits = Convert.ToInt32(dr["数据位"]);

            DevIdS = Convert.ToString(dr["站址"]);
            StopBits stopbits = StopBits.One;

            switch (Convert.ToString(dr["停止位"]))
            {
            case "1.5位": stopbits = StopBits.OnePointFive; break;

            case "2位": stopbits = StopBits.Two; break;

            default: stopbits = StopBits.One; break;
            }
            CommiTarget target  = new CommiTarget(port, baudrate, parity, databits, stopbits);
            int         addrst  = Convert.ToInt32(dr["站址"]);
            bool        success = this.cmdCard.SetTarget(target, addrst, false);

            if (success)
            {
                this.cmdCard.Buzz(true);
            }
        }
Пример #2
0
        /// <summary>
        /// 检查通讯目标是否可连接
        /// </summary>
        /// <param name="dest">通讯目标</param>
        /// <param name="timeout">超时时间,毫秒ms</param>
        /// <returns>返回是否可连接</returns>
        private static bool Ping(CommiTarget dest, int timeout)
        {
            bool rtn = false;

            if (null == dest)
            {
                return(rtn);
            }
            DateTime dt1 = DateTime.Now;

            do
            {
                rtn = CommiManager.GlobalManager.TestConnect(dest);
                DateTime dt2 = DateTime.Now;
                if (!rtn && timeout > 0)
                {
                    TimeSpan ts = dt2 - dt1;
                    if (ts.TotalMilliseconds > timeout)
                    {
                        break;
                    }
                    Thread.Sleep(1000);
                }
            } while (!rtn && timeout > 0);
            return(rtn);
        }
Пример #3
0
        /// <summary>
        /// 设置通讯设备
        /// </summary>
        /// <param name="devid">设备ID</param>
        /// <param name="target">通讯目标</param>
        /// <param name="station">站址</param>
        public override void SetDevice(CommiManager mgr, CommiTarget target, string devid, int station)
        {
            if (null == mgr || string.IsNullOrEmpty(devid) || null == target || station < 1)
            {
                return;
            }
            this.commimgr = mgr;
            this.target   = target;
            this.devid    = devid;
            this.station  = station;
            NameObjectList ps = new NameObjectList();

            ps["分组ID"] = devid;
            DataTable tab = this.query.getTable("门禁设备", ps);

            if (null == tab || tab.Rows.Count < 1)
            {
                return;
            }
            object val = tab.Rows[0]["记录位置"];

            if (null == val || DBNull.Value == val)
            {
                val = 0;
            }
            this.posRecord = Convert.ToInt32(val);
            val            = tab.Rows[0]["控制器类型"];
            this.devtype   = Convert.ToString(val);
            if (string.IsNullOrEmpty(this.devtype))
            {
                this.devtype = "考勤机";
            }
        }
Пример #4
0
 /// <summary>
 /// 设置通讯参数,port为空或station范围不正确则通讯置空
 /// </summary>
 /// <param name="port">通讯端口</param>
 /// <param name="baudRate">通讯波特率</param>
 /// <param name="station">通讯站址</param>
 /// <param name="isCardIC">是否IC卡</param>
 /// <returns>是否成功设置通讯参数</returns>
 public bool setTarget(string port, int baudRate, int station, bool isCardIC)
 {
     CommiManager.GlobalManager.ClearCommand();
     if (string.IsNullOrEmpty(port) || station < 1 || station > 255)
     {
         this.target = null;
         this.cmdCard.SetTarget(null, -1, false);
         return(false);
     }
     try
     {
         this.Beat();
         this.target   = new CommiTarget(port, baudRate);
         this.station  = station;
         this.isCardIC = isCardIC;
         return(this.cmdCard.SetTarget(target, station, isCardIC));
     }
     catch (Exception ex)
     {
         this.target = null;
         this.cmdCard.SetTarget(null, -1, false);
         return(false);
     }
     return(true);
 }
Пример #5
0
        /// <summary>
        /// 发送指令,获取指令结果,在通讯失败时自动尝试执行5次
        /// </summary>
        /// <param name="mgr">通讯管理器</param>
        /// <param name="target">通讯目标</param>
        /// <param name="cmd">执行指令</param>
        /// <param name="timeout">超时间隔</param>
        /// <returns>返回指令响应结果</returns>
        private static string getResponse(CommiManager mgr, CommiTarget target, CmdProtocol cmd, TimeSpan timeout)
        {
            if (null == mgr || null == target || null == cmd)
            {
                return("");
            }
            if (null == cmd.EventWh)
            {
                cmd.EventWh = new ManualResetEvent(false);
            }
            string msg = "";

            for (int i = 0; i < 5; i++)
            {
                msg = "";
                cmd.ResetState();
                mgr.SendCommand(target, cmd);
                if (cmd.EventWh.WaitOne(timeout, false))
                {
                    msg = cmd.ResponseFormat;
                }
                string suc = basefun.valtag(msg, "Success");
                if ("true" == suc)
                {
                    break;
                }
                Thread.Sleep(200);
            }
            return(msg);
        }
Пример #6
0
        /// <summary>
        /// 发行器信息
        /// </summary>
        public void initCmdCard()
        {
            DataTable taboption = initSet();

            if (null == taboption || taboption.Rows.Count < 1)
            {
                this.cmdCard.SetTarget(null, -1, false);
                return;
            }
            DataRow  dr       = taboption.Rows[0];
            string   port     = Convert.ToString(dr["串口"]);
            int      baudrate = Convert.ToInt32(dr["波特率"]);
            Parity   parity   = Parity.None;
            int      databits = Convert.ToInt32(dr["数据位"]);
            StopBits stopbits = StopBits.One;

            switch (Convert.ToString(dr["停止位"]))
            {
            case "1.5": stopbits = StopBits.OnePointFive; break;

            case "2": stopbits = StopBits.Two; break;

            default: stopbits = StopBits.One; break;
            }
            CommiTarget target  = new CommiTarget(port, baudrate, parity, databits, stopbits);
            int         addrst  = Convert.ToInt32(dr["站址"]);
            bool        success = this.cmdCard.SetTarget(target, addrst, this.radic.Checked);
        }
Пример #7
0
 /// <summary>
 /// 对目标通讯关闭心跳
 /// </summary>
 /// <param name="mgr">通讯管理器</param>
 /// <param name="target">通讯目标</param>
 public static void CloseHeaderBeat(CommiManager mgr, CommiTarget target)
 {
     if (null == mgr || null == target)
     {
         return;
     }
     mgr.RemoveCommand(target, CmdHeaderBeat);
 }
Пример #8
0
 /// <summary>
 /// 对目标通讯启动心跳,已经有则不会重复
 /// </summary>
 /// <param name="mgr">通讯管理器</param>
 /// <param name="target">通讯目标</param>
 public static void OpenHeaderBeat(CommiManager mgr, CommiTarget target)
 {
     if (null == mgr || null == target)
     {
         return;
     }
     target.setProtocol(CmdFileTrans.PTL);
     mgr.SendCommand(target, CmdHeaderBeat);
 }
Пример #9
0
        /// <summary>
        /// 搜索网络内支持UDP通讯的设备信息,设备信息使用tag格式数据
        /// </summary>
        /// <returns>返回tag格式数据信息</returns>
        public static string[] SearchUDPnet()
        {
            IPEndPoint  srv    = new IPEndPoint(IPAddress.Broadcast, initport);
            CommiTarget target = new CommiTarget(srv, CommiType.UDP);

            target.setProtocol(ptlZnet);

            DateTime    dtStart = DateTime.Now;
            CommandBase cmd     = new CommandBase(false);

            cmd.TimeSendInv     = new TimeSpan(0, 0, 50);
            cmd.TimeOut         = new TimeSpan(0, 0, 2);
            cmd.TimeFailLimit   = new TimeSpan(0, 0, 5);
            cmd.TimeLimit       = new TimeSpan(0, 0, 20);
            cmd.IsResposeHandle = isRpsZnet;

            cmd.setCommand(initcmd, true);
            cmd.ResponseHandle += new EventHandler <ResponseEventArgs>(cmd_ResponseHandle);
            CommiManager.GlobalManager.SendCommand(target, cmd);
            //广播搜索,有多个设备返回信息,直到超时停止接收
            List <string> infolist = cmd.Tag as List <string>;

            while (cmd.EventWh.WaitOne(cmd.TimeLimit, false) && DateTime.Now - dtStart < cmd.TimeLimit)
            {
                infolist = cmd.Tag as List <string>;
                if (null == infolist || infolist.Count < 1)
                {
                    continue;
                }
                string[] infos      = infolist.ToArray();
                bool     iscomplete = true;
                for (int i = 0; i < infos.Length; i++)
                {
                    if (!string.IsNullOrEmpty(basefun.valtag(infos[i], "工作端口")))
                    {
                        continue;
                    }
                    iscomplete = false;
                    break;
                }
                if (iscomplete)
                {
                    break;
                }
            }
            cmd.TimeSendInv = new TimeSpan(0, 0, -10);
            CommiManager.GlobalManager.RemoveCommand(target, cmd);
            //返回搜索结果
            infolist = cmd.Tag as List <string>;
            cmd.Tag  = null;
            if (null == infolist || infolist.Count < 1)
            {
                return(new string[0]);
            }
            return(infolist.ToArray());
        }
Пример #10
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();
        }
Пример #11
0
 /// <summary>
 /// 设置通讯设备
 /// </summary>
 /// <param name="devid">设备ID</param>
 /// <param name="target">通讯目标</param>
 /// <param name="station">站址</param>
 public virtual void SetDevice(CommiManager mgr, CommiTarget target, string devid, int station)
 {
     if (null == mgr || string.IsNullOrEmpty(devid) || null == target || station < 1)
     {
         return;
     }
     this.commimgr = mgr;
     this.target   = target;
     this.devid    = devid;
     this.station  = station;
 }
Пример #12
0
        /// <summary>
        /// 从服务器中获得图片
        /// </summary>
        /// <param name="savePath">图片保存相对路径</param>
        /// <param name="pl">显示图片的容器</param>
        public void getPic_Server(string filepath, Panel pl)
        {
            if (string.IsNullOrEmpty(filepath))
            {
                return;
            }
            int    port  = 2010;
            string ipsrv = "127.0.0.1";
            string sport = DataAccRes.AppSettings("Granity文件服务");
            string conn  = DataAccRes.DefaultDataConnInfo.Value;

            if (!string.IsNullOrEmpty(sport))
            {
                try { port = Convert.ToInt32(sport); }
                catch { return; }
            }
            Regex regIP = new Regex(@"server=([\w.\(\)]*)(;|\\)");

            if (regIP.IsMatch(conn))
            {
                Match mt = regIP.Match(conn);
                if (mt.Groups.Count > 1)
                {
                    ipsrv = mt.Groups[1].Value.ToLower();
                }
                if ("(local)" == ipsrv || "127.0.0.1" == ipsrv)
                {
                    ipsrv = Dns.GetHostName();
                }
                ipsrv = Dns.GetHostAddresses(ipsrv)[0].ToString();
            }
            CommiTarget target = new CommiTarget(ipsrv, port, CommiType.TCP);

            target.setProtocol(CmdFileTrans.PTL);
            CmdFileTrans cmd = new CmdFileTrans(false);

            cmd.GetFile(filepath);
            CommiManager.GlobalManager.SendCommand(target, cmd);
            if (cmd.EventWh.WaitOne(new TimeSpan(0, 0, 15), false))
            {
                byte[] data = cmd.FileContext;
                if (data.Length < 1)
                {
                    return;
                }
                MemoryStream stream = new MemoryStream(data);
                pl.BackgroundImage = Image.FromStream(stream);
            }
        }
Пример #13
0
        /// <summary>
        /// 获取数据行的设备目标位置参数
        /// 记录包含字段【访问方式】(TCP/UDP/SerialPort)、【端口】(60000/COM1)、【地址】(192.168.1.146)
        /// </summary>
        /// <param name="dr">数据记录</param>
        /// <returns></returns>
        private CommiTarget getTarget(DataRow dr)
        {
            if (null == dr)
            {
                return(null);
            }
            CommiTarget target    = new CommiTarget();
            CommiType   commiType = CommiType.UDP;
            int         typecommi = 0;

            if (dr["通讯类别"].ToString() == "485")
            {
                typecommi = 1;
            }
            else if (dr["通讯类别"].ToString() == @"TCP\IP")
            {
                typecommi = 2;
            }
            else
            {
                typecommi = 3;
            }
            if (DBNull.Value != dr["通讯类别"])
            {
                //int typecommi = Convert.ToInt16(dr["通讯类别"]);
                if (1 == typecommi)
                {
                    commiType = CommiType.SerialPort;
                }
                if (2 == typecommi)
                {
                    commiType = CommiType.TCP;
                }
            }
            if (CommiType.SerialPort == commiType)
            {
                string portname = "COM" + Convert.ToString(dr["端口"]);
                target.SetProtocolParam(portname, 19200);
            }
            else
            {
                string addr = Convert.ToString(dr["站址"]);
                int    port = Convert.ToInt16(dr["端口"]);
                target.SetProtocolParam(addr, port, commiType);
            }
            target.setProtocol(Protocol.PTLPark);
            return(target);
        }
Пример #14
0
        /// <summary>
        /// 初始化发行器
        /// </summary>
        public void initCmdCard()
        {
            IPHostEntry IpEntry = Dns.GetHostEntry(Dns.GetHostName());
            string      myip    = IpEntry.AddressList[0].ToString();

            NameObjectList pstrans = new NameObjectList();

            ParamManager.MergeParam(pstrans, this.paramwin);
            pstrans["IP地址"] = myip;
            //查询数据
            QueryDataRes query = new QueryDataRes(this.unitItem.DataSrcFile);
            DataTable    tab   = dsUnit.Tables["设备设置"];

            tab.Clear();
            query.FillDataSet(tab.TableName, pstrans, this.dsUnit);
            if (null == tab || tab.Rows.Count < 1)
            {
                return;
            }
            if (tab.Rows.Count < 1)
            {
                MessageBox.Show("请设置发行器");
                return;
            }
            DataRow  dr       = this.dsUnit.Tables["设备设置"].Rows[0];
            string   port     = Convert.ToString(dr["串口"]);
            int      baudrate = Convert.ToInt32(dr["波特率"]);
            Parity   parity   = Parity.None;
            int      databits = Convert.ToInt32(dr["数据位"]);
            StopBits stopbits = StopBits.One;

            switch (Convert.ToString(dr["停止位"]))
            {
            case "1.5位": stopbits = StopBits.OnePointFive; break;

            case "2位": stopbits = StopBits.Two; break;

            default: stopbits = StopBits.One; break;
            }
            CommiTarget target  = new CommiTarget(port, baudrate, parity, databits, stopbits);
            int         addrst  = Convert.ToInt32(dr["站址"]);
            bool        success = this.cmdCard.SetTarget(target, addrst, this.radic.Checked);

            if (success)
            {
                this.cmdCard.Buzz(true);
            }
        }
Пример #15
0
        /// <summary>
        /// 发送指令,获取指令结果,在通讯失败时自动尝试执行5次
        /// </summary>
        /// <param name="mgr">通讯管理器</param>
        /// <param name="target">通讯目标</param>
        /// <param name="cmd">执行指令</param>
        /// <param name="strcmd">指令名称</param>
        /// <param name="tag">指令内容</param>
        /// <param name="timeout">超时间隔</param>
        /// <returns>返回指令响应结果</returns>
        private string getResponse(CommiManager mgr, CommiTarget target, CmdProtocol cmd, string strcmd, string tag, TimeSpan timeout)
        {
            if (null == mgr || null == target || null == cmd)
            {
                return("");
            }
            if (null == cmd.EventWh)
            {
                cmd.EventWh = new ManualResetEvent(false);
            }
            string msg = "";

            for (int i = 0; i < 3; i++)
            {
                msg = "";
                cmd.setCommand("门禁", strcmd, tag);
                Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " 指令:" + strcmd + "  " + tag);
                myLog.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " 指令:" + strcmd + "  " + tag);
                mgr.SendCommand(target, cmd, true);
                this.isexecuting = true;
                if (cmd.EventWh.WaitOne(timeout, false))
                {
                    msg = cmd.ResponseFormat;
                }
                this.isexecuting = false;
                Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " 响应:" + msg);
                myLog.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " 响应:" + msg);
                string suc = basefun.valtag(msg, "Success");
                if (!string.IsNullOrEmpty(suc))
                {
                    break;
                }
                if (string.IsNullOrEmpty(msg) && CommiType.SerialPort != target.ProtocolType)
                {
                    Debug.WriteLine(String.Format("{0:HH:mm:ss.fff} 测试网络连接...", DateTime.Now));
                    myLog.WriteLine(String.Format("{0:HH:mm:ss.fff} 测试网络连接...", DateTime.Now));
                    bool pingcn = Ping(target, CNtimeout);
                    Debug.WriteLine(String.Format("{0:HH:mm:ss.fff} Ping 连接   {1}", DateTime.Now, pingcn));
                    myLog.WriteLine(String.Format("{0:HH:mm:ss.fff} Ping 连接   {1}", DateTime.Now, pingcn));
                    if (!pingcn)
                    {
                        break;
                    }
                }
            }
            return(msg);
        }
Пример #16
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);
        }
Пример #17
0
        /// <summary>
        /// 发送指令,获取指令结果,在通讯失败时自动尝试执行5次
        /// </summary>
        /// <param name="mgr">通讯管理器</param>
        /// <param name="target">通讯目标</param>
        /// <param name="cmd">执行指令</param>
        /// <param name="strcmd">指令名称</param>
        /// <param name="timeout">超时间隔</param>
        /// <returns>返回指令响应结果</returns>
        private string getResponse(CommiManager mgr, CommiTarget target, CmdProtocol cmd, string strcmd, string tag, TimeSpan timeout)
        {
            if (null == mgr || null == target || null == cmd || string.IsNullOrEmpty(strcmd) || string.IsNullOrEmpty(tag))
            {
                return("");
            }
            if (null == cmd.EventWh)
            {
                cmd.EventWh = new ManualResetEvent(false);
            }
            string msg = "";

            for (int i = 0; i < 5; i++)
            {
                msg = "";
                Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " 请求:" + strcmd + " " + tag);
                myLog.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " 请求:" + strcmd + " " + tag);
                cmd.setCommand("消费", strcmd, tag);
                mgr.SendCommand(target, cmd, true);
                this.isexecuting = true;
                if (cmd.EventWh.WaitOne(timeout, false))
                {
                    msg = cmd.ResponseFormat;
                }
                this.isexecuting = false;
                Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " 响应:" + msg);
                myLog.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " 响应:" + msg);
                string suc = basefun.valtag(msg, "Success");
                if ("true" == suc)
                {
                    break;
                }
                //失败时重新采集当前记录
                if ("取下一条消费记录" == strcmd)
                {
                    strcmd = "取当前消费记录";
                }
                if ("取下一条补助记录" == strcmd)
                {
                    strcmd = "取当前补助记录";
                }
                Thread.Sleep(200);
            }
            return(msg);
        }
Пример #18
0
        /// <summary>
        /// 加载系统时间
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SetTimeBtn_Click(object sender, EventArgs e)
        {
            int[] indexlist = this.getCheckedList();
            if (indexlist.Length < 1)
            {
                MessageBox.Show("请选择设备", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            string    msg = "";
            string    tpl = "停车场", cmd = "加载系统时间";
            DataTable tab = this.dbGrid.DataSource as DataTable;

            foreach (int i in indexlist)
            {
                DataRow     dr      = tab.Rows[i];
                CommiTarget target  = this.getTarget(dr);
                CmdProtocol cmdP    = new CmdProtocol(Convert.ToString(dr["名称"]), false);
                string      tagdata = "@设备地址=" + Convert.ToString(dr["站址"]);
                cmdP.setCommand(tpl, cmd, tagdata);
                CommiManager.GlobalManager.SendCommand(target, cmdP);

                if (!cmdP.EventWh.WaitOne(2000, false))
                {
                    msg = cmdP.CmdId + ":通讯失败,请检查设备连接或通讯参数后重试!";
                }
                string rpmsg = basefun.valtag(cmdP.ResponseFormat, "{状态}");
                if (string.IsNullOrEmpty(msg) && !string.IsNullOrEmpty(rpmsg) && "操作成功!" != rpmsg)
                {
                    msg = cmdP.CmdId + ":" + rpmsg;
                }
                if (!string.IsNullOrEmpty(msg))
                {
                    break;
                }
            }
            if (string.IsNullOrEmpty(msg))
            {
                MessageBox.Show("成功加载系统时间!", "设备通讯", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show(msg, "设备通讯", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
Пример #19
0
        /// <summary>
        /// 设置通讯设备
        /// </summary>
        /// <param name="devid">设备ID</param>
        /// <param name="target">通讯目标</param>
        /// <param name="station">站址</param>
        public override void SetDevice(CommiManager mgr, CommiTarget target, string devid, int station)
        {
            if (null == mgr || string.IsNullOrEmpty(devid) || null == target || station < 1)
            {
                return;
            }
            this.commimgr = mgr;
            this.target   = target;
            this.devid    = devid;
            this.station  = station;
            NameObjectList ps = new NameObjectList();

            ps["分组ID"] = devid;
            DataTable tab = null;

            try
            {
                Monitor.Enter(objquery);
                tab = this.query.getTable("道闸设备", ps);
            }
            finally
            {
                Monitor.PulseAll(objquery);
                Monitor.Exit(objquery);
            }
            if (null == tab || tab.Rows.Count < 1)
            {
                return;
            }
            object val = tab.Rows[0]["控制器类型"];

            this.devtype  = Convert.ToString(val);
            val           = tab.Rows[0]["区域"];
            this.region   = Convert.ToString(val);
            val           = tab.Rows[0]["区域ID"];
            this.regionID = Convert.ToString(val);
            DataRow[] drs = tab.Select("", "读卡器号");
            for (int i = 0; i < 4 && i < drs.Length; i++)
            {
                channels[i] = Convert.ToString(drs[i]["名称"]);
            }
        }
Пример #20
0
        /// <summary>
        /// 火警联动
        /// </summary>
        /// <param name="sender">门禁设备</param>
        /// <param name="e">报警事件</param>
        void device_AlarmHandle(object sender, DvAlarmEventArgs e)
        {
            DeviceDoor door = sender as DeviceDoor;

            if (null == door || null == e || string.IsNullOrEmpty(e.TagAlarm))
            {
                return;
            }
            string fire = basefun.valtag(e.TagAlarm, "火警");

            if ("1" != fire)
            {
                return;
            }
            NameObjectList ps = new NameObjectList();

            ps["设备ID"] = door.DevID;
            DataTable    tab      = this.query.getTable("同组设备", ps);
            CommiManager commimgr = CommiManager.GlobalManager;

            for (int i = 0; i < tab.Rows.Count; i++)
            {
                DataRow dr     = tab.Rows[i];
                string  dvid   = Convert.ToString(dr["ID"]);
                string  dvtype = Convert.ToString(dr["通讯协议"]);
                if (string.IsNullOrEmpty(dvtype) || DBNull.Value == dr["站址"])
                {
                    return;
                }
                int         station = Convert.ToInt32(dr["站址"]);
                CommiTarget target  = this.getTarget(dr);
                if (null == target)
                {
                    return;
                }
                target.setProtocol(Protocol.PTLDoor);
                door = new DeviceDoor();
                door.SetDevice(commimgr, target, dvid, station);
                door.FireOpenDoor();
            }
        }
Пример #21
0
        /// <summary>
        /// 设置通讯设备
        /// </summary>
        /// <param name="devid">设备ID</param>
        /// <param name="target">通讯目标</param>
        /// <param name="station">站址</param>
        public override void SetDevice(CommiManager mgr, CommiTarget target, string devid, int station)
        {
            if (null == mgr || string.IsNullOrEmpty(devid) || null == target || station < 1)
            {
                return;
            }
            this.commimgr = mgr;
            this.target   = target;
            this.devid    = devid;
            this.station  = station;
            NameObjectList ps = new NameObjectList();

            ps["设备ID"] = devid;
            DataTable tab = this.query.getTable("消费设备", ps);

            if (null == tab || tab.Rows.Count < 1)
            {
                return;
            }
            this.devName = Convert.ToString(tab.Rows[0]["名称"]);
        }
Пример #22
0
        /// <summary>
        /// 设置RF通讯端口,波特率,站址,被动只接收数据
        /// </summary>
        /// <param name="port">RF射频串口</param>
        /// <param name="baudRate">波特率</param>
        /// <returns>能够打开端口则成功,端口占用或参数非法则失败</returns>
        public bool setRfTarget(string port, int baudRate)
        {
            CommiManager mgr = CommiManager.GlobalManager;

            if (null != this.rftar && this.rftar.PortName == port)
            {
                mgr.SendCommand(this.rftar, this.cmdRFID);
                return(true);
            }
            if (null != this.rftar)
            {
                mgr.RemoveCommand(this.rftar);
            }
            this.rftar = null;
            try
            {
                CommiTarget tar = new CommiTarget(port, baudRate);
                Protocol    ptl = new Protocol();
                ptl.FrameHeader = new byte[] { 0x02 };
                ptl.FrameFoot   = new byte[] { 0x03, 0x0A, 0x0D };
                ptl.TotalBytes  = 13;
                tar.setProtocol(ptl);
                if (!mgr.TestConnect(tar))
                {
                    return(false);
                }
                this.rftar = tar;
            }
            catch
            {
                return(false);
            }
            //命令只接收数据
            this.cmdRFID.ResetState();
            byte[] request = new byte[] { 0x02, 0x00, 0x00, 0x03, 0x0A, 0x0D };
            this.cmdRFID.setCommand(request);
            mgr.SendCommand(this.rftar, this.cmdRFID);
            return(true);
        }
Пример #23
0
        /// <summary>
        /// 搜索网络内支持UDP通讯的设备信息,设备信息使用tag格式数据
        /// </summary>
        /// <returns>返回tag格式数据信息</returns>
        public static string[] SearchUDPDoor()
        {
            IPEndPoint  srv    = new IPEndPoint(IPAddress.Broadcast, searport);
            CommiTarget target = new CommiTarget(srv, CommiType.UDP);

            target.setProtocol(Protocol.PTLDoor);

            DateTime    dtStart = DateTime.Now;
            CommandBase cmd     = new CommandBase(false);

            cmd.TimeSendInv     = new TimeSpan(0, 0, 50);
            cmd.TimeOut         = new TimeSpan(0, 0, 2);
            cmd.TimeFailLimit   = new TimeSpan(0, 0, 5);
            cmd.TimeLimit       = new TimeSpan(0, 0, 20);
            cmd.IsResposeHandle = isRpsDoor;

            cmd.setCommand(searcmd, true);
            cmd.ResponseHandle += new EventHandler <ResponseEventArgs>(cmd_RpsDoorHandle);
            CommiManager.GlobalManager.SendCommand(target, cmd);
            //广播搜索,有多个设备返回信息,直到超时停止接收
            List <string> infolist = cmd.Tag as List <string>;

            while (cmd.EventWh.WaitOne(cmd.TimeLimit, false) && DateTime.Now - dtStart < cmd.TimeLimit)
            {
                cmd.EventWh.Reset();
            }
            cmd.TimeSendInv = new TimeSpan(0, 0, -10);
            CommiManager.GlobalManager.RemoveCommand(target, cmd);
            //返回搜索结果
            infolist = cmd.Tag as List <string>;
            cmd.Tag  = null;
            if (null == infolist || infolist.Count < 1)
            {
                return(new string[0]);
            }
            return(infolist.ToArray());
        }
Пример #24
0
        /// <summary>
        /// 接收广播反馈,需要多次交互获取完整信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void cmd_ResponseHandle(object sender, ResponseEventArgs e)
        {
            if (null == sender || !(sender is CommandBase) || null == e || !e.Success || null == e.Response || e.Response.Length < 1)
            {
                return;
            }
            CommandBase cmd = sender as CommandBase;
            string      rsl = CommandBase.Parse(cmd.ResponseData, true);
            //检查功能码:搜索功能,获取网络信息,获取详细信息
            string codesearch  = "A1FD000922";
            string codedetailA = "A114010200";
            string codedetailB = "A114010202";
            string code        = parseFunCode(rsl);
            string addr        = parseAddrMac(rsl);

            if (codesearch != code && codedetailA != code && codedetailB != code)
            {
                return;
            }

            //格式参数:普通/物理地址/IP地址/文本/数字
            string[] formatinit = { "功能码,10,4;", "物理地址,4,6", "IP地址,17,4;", "", "" };
            string[] formatdtlA = { "功能码,10,4;",                                  "物理地址,4,6",
                                    "IP地址,47,4;子网掩码,51,4;网关IP,55,4;DNS服务器,59,4;",
                                    "设备名称,15,16;密码,31,5;",
                                    "网页端口,71,1;命令端口,72,2;" };
            string[] formatdtlB = { "功能码,10,4;", "物理地址,4,6", "", "",
                                    "工作方式,15,1;工作端口,16,2;超时断开时间,18,3;心跳时间,21,1;波特率,26,3;数据位,29,1;停止位,30,1;校验位,31,1;" };
            formatdtlB[4] += "分包长度,32,3;帧间隔,35,2;目标端口1,47,2;目标端口2,49,2;目标端口3,51,2;目标端口4,53,2;目标端口5,55,2;目标端口6,57,2;目标端口7,59,2;目标端口8,61,2;";

            //读取信息列表
            List <string> infolist = new List <string>();

            if (null == cmd.Tag)
            {
                cmd.Tag = infolist;
            }

            int index = -1;

            infolist = cmd.Tag as List <string>;
            for (int i = 0; i < infolist.Count; i++)
            {
                if (addr != basefun.valtag(infolist[i], "物理地址"))
                {
                    continue;
                }
                index = i;
                break;
            }
            string info = "";

            if (index > -1)
            {
                info = infolist[index];
            }
            if (codesearch == code)
            {
                info = parseDetail(rsl, info, formatinit[0], formatinit[1], formatinit[2], formatinit[3], formatinit[4], false);
            }
            else if (codedetailA == code)
            {
                info = parseDetail(rsl, info, formatdtlA[0], formatdtlA[1], formatdtlA[2], formatdtlA[3], formatdtlA[4], false);
            }
            else if (codedetailB == code)
            {
                info = parseDetail(rsl, info, formatdtlB[0], formatdtlB[1], formatdtlB[2], formatdtlB[3], formatdtlB[4], false);
            }
            if (index > -1)
            {
                infolist[index] = info;
            }
            else
            {
                infolist.Add(info);
            }

            //最后一步获取详细信息后结束
            if (codedetailB == code)
            {
                return;
            }
            //再获取网络信息,最后获取详细信息
            IPEndPoint  srv    = new IPEndPoint(IPAddress.Broadcast, infoport);
            CommiTarget target = new CommiTarget(srv, CommiType.UDP);

            target.setProtocol(ptlZnet);
            string      strcmd  = string.Format(infocmd, addr.Replace("-", " "), codesearch == code ? "A114000200" : "A114000202");
            CommandBase cmdNext = new CommandBase();

            //使用相同的同步事件,可动态检测UDP搜索反馈结果
            cmdNext.EventWh         = cmd.EventWh;
            cmdNext.Tag             = cmd.Tag;
            cmdNext.ResponseHandle += new EventHandler <ResponseEventArgs>(cmd_ResponseHandle);
            cmdNext.IsResposeHandle = isResponseCmd;
            cmdNext.setCommand(strcmd, true);
            CommiManager.GlobalManager.SendCommand(target, cmdNext);
        }
Пример #25
0
        /// <summary>
        /// 获取数据行的设备目标位置参数
        /// 记录包含字段【访问方式】(TCP/UDP/SerialPort)、【端口】(60000/COM1)、【地址】(192.168.1.146)
        /// </summary>
        /// <param name="dr">数据记录</param>
        /// <returns></returns>
        private CommiTarget getTarget(DataRow dr)
        {
            if (null == dr || (DBNull.Value == dr["串口"] && DBNull.Value == dr["IP地址"]))
            {
                return(null);
            }
            CommiTarget target    = new CommiTarget();
            CommiType   commiType = CommiType.UDP;
            string      stype     = Convert.ToString(dr["通讯类别"]);

            switch (stype)
            {
            case "TCP/IP(局域网)":
                commiType = CommiType.TCP; break;

            case "UDP/IP(局域网)":
                commiType = CommiType.UDP; break;

            default:
                commiType = CommiType.SerialPort; break;
            }
            try
            {
                if (CommiType.SerialPort == commiType)
                {
                    string   portname = Convert.ToString(dr["串口"]);
                    int      baudRate = Convert.ToInt16(dr["波特率"]);
                    int      dataBits = Convert.ToInt16(dr["数据位"]);
                    decimal  s        = Convert.ToDecimal(dr["停止位"]);
                    StopBits sb       = StopBits.None;
                    if (1 == s)
                    {
                        sb = StopBits.One;
                    }
                    else if (2 == s)
                    {
                        sb = StopBits.Two;
                    }
                    else if (1 < s && s < 2)
                    {
                        sb = StopBits.OnePointFive;
                    }

                    target.SetProtocolParam(portname, baudRate, Parity.None, dataBits, sb);
                }
                else
                {
                    string addr = Convert.ToString(dr["IP地址"]);
                    if (string.IsNullOrEmpty(addr) || DBNull.Value == dr["端口"])
                    {
                        return(null);
                    }
                    int port = Convert.ToInt32(dr["端口"]);
                    target.SetProtocolParam(addr, port, commiType);
                }
            }
            catch (Exception ex)
            {
                NameValueCollection data = new NameValueCollection();
                data["操作"]   = "创建通讯目标";
                data["设备ID"] = Convert.ToString(dr["ID"]);
                ServiceTool.LogMessage(ex, data, EventLogEntryType.Error);
                return(null);
            }
            return(target);
        }
Пример #26
0
        /// <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);
        }
Пример #27
0
        /// <summary>
        /// 设置发行器
        /// </summary>
        /// <param name="target">发行器地址</param>
        /// <param name="stationNum">发行器站址</param>
        /// <param name="isCardIC">是否IC卡</param>
        /// <returns>是否成功设置发行器</returns>
        public bool SetTarget(CommiTarget target, int stationNum, bool isCardIC)
        {
            //重新设置则保持当前状态
            if (null != target && stationNum > 0 && stationNum < 255 && null != this.targetwr)
            {
                if (this.addrst == Convert.ToString(stationNum) && this.isCardIC == isCardIC &&
                    ((null != target.SrvEndPoint && null != this.targetwr.SrvEndPoint && this.targetwr.SrvEndPoint.Port == target.SrvEndPoint.Port && this.targetwr.SrvEndPoint.Address.ToString() == target.SrvEndPoint.Address.ToString()) ||
                     (this.targetwr.PortName == target.PortName && this.targetwr.BaudRate == target.BaudRate)))
                {
                    if (!string.IsNullOrEmpty(this.cardid) || 0 == this.stateChecking)
                    {
                        return(true);
                    }
                    this.reChecking(1);
                    return(true);
                }
            }
            this.TimeSendInv   = new TimeSpan(24, 0, 0);
            this.stateChecking = 0;
            this.cardid        = "";
            this.cardserno     = "";
            this.cardnum       = "";

            string tagdata = "@设备地址=" + this.addrst;

            //原发行器脱机
            string[,] cmds = { { "卡务中心", "脱机" }, { "卡务中心", "蜂鸣" } };
            if (null != this.targetwr && !string.IsNullOrEmpty(this.addrst))
            {
                for (int i = 0; i < cmds.GetLength(0); i++)
                {
                    this.setCommand(cmds[i, 0], cmds[i, 1], tagdata);
                    this.ResetState();
                    this.commiMgr.SendCommand(this.targetwr, this);
                    this.EventWh.WaitOne(this.waitTime, false);
                }
                this.commiMgr.RemoveCommand(this.targetwr, this);
            }

            //置发行器脱机并蜂鸣提示
            this.isCardIC = isCardIC;
            this.targetwr = null;
            this.addrst   = "3";
            if (null == target || stationNum < 1 || stationNum > 255)
            {
                return(false);
            }
            this.targetwr = target;
            this.addrst   = Convert.ToString(stationNum);
            target.setProtocol(Protocol.PTLCard);
            tagdata = "@设备地址=" + this.addrst;
            cmds    = new string[, ] {
                { "卡务中心", "联机" }, { "卡务中心", "防冲突" }
            };
            if (!isCardIC)
            {
                cmds = new string[, ] {
                    { "卡务中心", "读卡" }
                }
            }
            ;
            for (int i = 0; i < cmds.GetLength(0); i++)
            {
                this.setCommand(cmds[i, 0], cmds[i, 1], tagdata);
                this.ResetState();
                this.commiMgr.SendCommand(this.targetwr, this);
                if (!this.EventWh.WaitOne(this.waitTime, false))
                {
                    return(false);
                }
            }
            this.tmIDcache.Change(Timeout.Infinite, Timeout.Infinite);
            this.TimeSendInv   = new TimeSpan(3000000);
            this.stateChecking = isCardIC ? 2 : 1;
            return(true);
        }
Пример #28
0
        private void tmRefresh_Tick(object sender, EventArgs e)
        {
            if (isRunning)
            {
                return;
            }
            isRunning = true;
            //巡检过的设备地址加入devs中,避免重复巡检
            string devs = ",", tpl = "门禁";
            // isrealtime/是否实时状态,在最后刷卡时间5分钟不变化时可对累积数据大批量采集
            bool     isrealtime = false;
            DateTime dtpre      = DateTime.Now.AddMinutes(-5);
            //有信息则记录日志
            DataView dvinfo = gridViewInfo.DataSource as DataView;
            //站址/记录数列表,非实时采集状态时优先批量采集记录数大的
            Dictionary <string, int>      devrecord  = new Dictionary <string, int>();
            Dictionary <string, string[]> devinfo    = new Dictionary <string, string[]>();
            List <CommiTarget>            targetlist = new List <CommiTarget>();
            CmdProtocol cmdP = new CmdProtocol(false);

            cmdP.TimeOut       = new TimeSpan(400 * 10000);
            cmdP.TimeSendInv   = new TimeSpan(1, 0, 0);
            cmdP.TimeFailLimit = new TimeSpan(900 * 10000);
            cmdP.TimeLimit     = new TimeSpan(900 * 10000);
            NameObjectList psdata = new NameObjectList();

            for (int i = 0; i < lvDoor.Items.Count; i++)
            {
                string tag = Convert.ToString(lvDoor.Items[i].Tag);
                if (string.IsNullOrEmpty(tag))
                {
                    continue;
                }
                string[] devps = tag.Split(",".ToCharArray());
                if (devs.Contains("," + devps[7] + ","))
                {
                    continue;
                }
                CommiTarget target = this.getTarget(devps);
                if (null == target)
                {
                    continue;
                }
                targetlist.Add(target);
                tag   = "@设备地址=" + devps[7];
                devs += devps[7] + ",";
                cmdP.setCommand(tpl, "检测状态", tag);
                cmdP.ResetState();
                CommiManager.GlobalManager.SendCommand(target, cmdP);
                if (!cmdP.EventWh.WaitOne(300, false))
                {
                    continue;
                }
                string msg = cmdP.ResponseFormat;
                DevID = basefun.valtag(msg, "{设备地址}");
                //获得要开的门
                getDKQ(devps[10], basefun.valtag(msg, "读卡器"));
                //通讯图标显示
                ListViewItem list1 = null;
                for (int k = 0; k < lvDoor.Items.Count; k++)
                {
                    list1 = this.lvDoor.Items[k];
                    DoorStatus(list1, basefun.valtag(msg, "Success"));
                }
                if ("true" != basefun.valtag(msg, "Success"))
                {
                    continue;
                }
                //对比最后刷卡时间
                string dtstr = basefun.valtag(msg, "{刷卡时间}");
                if (!string.IsNullOrEmpty(dtstr) && !isrealtime)
                {
                    if (dtpre < Convert.ToDateTime(dtstr))
                    {
                        isrealtime = true;
                    }
                }
                //记录数列表
                int sum = Convert.ToInt32(basefun.valtag(msg, "{刷卡记录数}"));
                devrecord.Add(devps[7], sum);
                devinfo.Add(devps[7], devps);

                //记录数少于50则直接采集
                int rdcount = 0;
                for (int j = 0; j < sum && sum <= 50; j++)
                {
                    cmdP.ResetState();
                    cmdP.setCommand(tpl, "读取记录", tag);
                    CommiManager.GlobalManager.SendCommand(target, cmdP);
                    if (!cmdP.EventWh.WaitOne(1000, false))
                    {
                        continue;
                    }
                    msg = cmdP.ResponseFormat;
                    if ("true" != basefun.valtag(msg, "Success"))
                    {
                        break;
                    }
                    string state = basefun.valtag(msg, "状态编号");
                    state         = this.getStateDoorCard(state);
                    psdata["控制器"] = devps[8];
                    psdata["读卡器"] = DKQNUN;
                    psdata["时间"]  = basefun.valtag(msg, "{刷卡时间}");
                    psdata["卡号"]  = basefun.valtag(msg, "{卡号}");
                    if (devps[10] == "考勤机")
                    {
                        psdata["状态"] = "考勤机";
                    }
                    else
                    {
                        psdata["状态"] = state;
                    }
                    this.Query.ExecuteNonQuery("采集门禁数据", psdata, psdata, psdata);
                    rdcount++;
                    //devrecord.Remove(devps[7]);
                    //DataRow drinfo = dvinfo.Table.NewRow();
                    //drinfo["状态"] = state;
                    //drinfo["卡号"] = basefun.valtag(msg, "{卡号}");
                    //int dkq = Convert.ToInt16(basefun.valtag(msg, "读卡器"));
                    //dkq = dkq + 1;
                    //drinfo["门"] = doorName + "(" + Convert.ToString(dkq) + ")";
                    //drinfo["设备地址"] = basefun.valtag(msg, "{设备地址}");
                    //drinfo["时间"] = basefun.valtag(msg, "{刷卡时间}");
                    //dvinfo.Table.Rows.InsertAt(drinfo, 0);
                    //gridViewInfo.SelectRow(0);
                }

                if (rdcount > 0)
                {
                    dataCount = rdcount.ToString();
                }
                else
                {
                    dataCount = "0";
                }
                //检查状态改变则记录
                this.validateSate(lvDoor.Items[i], devps[8], msg, devps[10]);
            }
            //当前是实时状态,则忽略采集数据
            if (isrealtime || devrecord.Count < 1)
            {
                foreach (CommiTarget tar in targetlist)
                {
                    CommiManager.GlobalManager.RemoveCommand(tar, cmdP);
                }
                isRunning = false;
                return;
            }
            string[] info   = new string[0];
            int      summax = 0;

            foreach (string key in devrecord.Keys)
            {
                if (summax >= devrecord[key])
                {
                    continue;
                }
                summax = devrecord[key];
                info   = devinfo[key];
            }
            if (summax < 1)
            {
                foreach (CommiTarget tar in targetlist)
                {
                    CommiManager.GlobalManager.RemoveCommand(tar, cmdP);
                }
                isRunning = false;
                return;
            }
            CommiTarget dev = this.getTarget(info);
            //记录数少于50则直接采集
            int rdcountmax = 0;

            for (int j = 0; j < summax && null != dev; j++)
            {
                string tag = "@设备地址=" + info[7];
                cmdP.ResetState();
                cmdP.setCommand(tpl, "读取记录", tag);
                CommiManager.GlobalManager.SendCommand(dev, cmdP);
                if (!cmdP.EventWh.WaitOne(1000, false))
                {
                    continue;
                }
                string msg = cmdP.ResponseFormat;
                if ("true" != basefun.valtag(msg, "Success"))
                {
                    break;
                }
                string state = basefun.valtag(msg, "状态编号");
                state         = this.getStateDoorCard(state);
                psdata["控制器"] = info[8];
                psdata["读卡器"] = DKQNUN;
                psdata["卡号"]  = basefun.valtag(msg, "{卡号}");
                psdata["时间"]  = basefun.valtag(msg, "{刷卡时间}");
                psdata["状态"]  = state;
                this.Query.ExecuteNonQuery("采集门禁数据", psdata, psdata, psdata);
                rdcountmax++;
            }
            foreach (CommiTarget tar in targetlist)
            {
                CommiManager.GlobalManager.RemoveCommand(tar, cmdP);
            }
            isRunning = false;
        }
Пример #29
0
        /// <summary>
        /// 获取数据行的设备目标位置参数
        /// 记录包含字段【访问方式】(TCP/UDP/SerialPort)、【端口】(60000/COM1)、【地址】(192.168.1.146)
        /// </summary>
        /// <param name="dr">数据记录</param>
        /// <returns></returns>
        private CommiTarget getTarget(string[] devps)
        {
            string[] cols = { "通讯类别", "串口", "波特率", "数据位", "停止位", "IP地址", "端口", "站址", "控制器", "名称" };

            if (null == devps || devps.Length < 7)
            {
                return(null);
            }
            CommiTarget target = new CommiTarget();

            target.setProtocol(Protocol.PTLDoor);
            CommiType commiType = CommiType.UDP;
            string    stype     = Convert.ToString(devps[0]);

            switch (stype)
            {
            case "TCP/IP(局域网)":
                commiType = CommiType.TCP; break;

            case "UDP/IP(局域网)":
                commiType = CommiType.UDP; break;

            default:
                commiType = CommiType.SerialPort; break;
            }
            try
            {
                if (CommiType.SerialPort == commiType)
                {
                    string   portname = Convert.ToString(devps[1]);
                    int      baudRate = Convert.ToInt16(devps[2]);
                    int      dataBits = Convert.ToInt16(devps[3]);
                    decimal  s        = Convert.ToDecimal(devps[4]);
                    StopBits sb       = StopBits.None;
                    if (1 == s)
                    {
                        sb = StopBits.One;
                    }
                    else if (2 == s)
                    {
                        sb = StopBits.Two;
                    }
                    else if (1 < s && s < 2)
                    {
                        sb = StopBits.OnePointFive;
                    }

                    target.SetProtocolParam(portname, baudRate, Parity.None, dataBits, sb);
                }
                else
                {
                    string addr = Convert.ToString(devps[5]);
                    int    port = Convert.ToInt32(devps[6]);
                    target.SetProtocolParam(addr, port, commiType);
                }
            }
            catch (Exception ex)
            {
                return(null);
            }
            return(target);
        }
Пример #30
0
        /// <summary>-
        /// 保存设备
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsbSave_Click(object sender, EventArgs e)
        {
            this.validateFeeTab();
            DataTable tabpark  = this.ds.Tables["停车场管理"];
            DataTable tabfee   = this.ds.Tables["收费标准"];
            DataTable tabdspan = this.ds.Tables["收费标准时段"];
            DataTable tabdtime = this.ds.Tables["收费标准时刻"];

            DataTable[] tablist   = { tabpark, tabfee, tabdspan, tabdtime };
            bool        isSuccess = this.Query.BeginTransaction();
            string      msg       = "";

            if (!isSuccess)
            {
                msg = "保存失败,无法打开事务!";
            }
            else
            {
                foreach (DataTable tab in tablist)
                {
                    NameObjectList[] psins = ParamManager.createParam(tab, DataRowState.Added);
                    NameObjectList[] psupt = ParamManager.createParam(tab, DataRowState.Modified);
                    NameObjectList[] psdel = ParamManager.createParam(tab, DataRowState.Deleted);
                    isSuccess = this.Query.ExecuteNonQuery(tab.TableName, psins, psupt, psdel);
                    if (!isSuccess)
                    {
                        msg = "保存失败,请检查数据是否合法!";
                        break;
                    }
                }
            }
            if (!isSuccess)
            {
                this.Query.RollbackAndClose();
            }
            else
            {
                this.Query.Commit();
                this.Query.Close();
                foreach (DataTable tab in tablist)
                {
                    tab.AcceptChanges();
                }
                //发出通讯更新设备
                int    port  = 2010;
                string sport = DataAccRes.AppSettings("Granity文件服务");
                if (!string.IsNullOrEmpty(sport))
                {
                    try { port = Convert.ToInt32(sport); }
                    catch { return; }
                }
                string conn  = DataAccRes.DefaultDataConnInfo.Value;
                Regex  regIP = new Regex(@"server=([\w.\(\)]*)(;|\\)");
                string ipsrv = "127.0.0.1";
                if (regIP.IsMatch(conn))
                {
                    Match mt = regIP.Match(conn);
                    if (mt.Groups.Count > 1)
                    {
                        ipsrv = mt.Groups[1].Value.ToLower();
                    }
                    if ("(local)" == ipsrv || "127.0.0.1" == ipsrv)
                    {
                        ipsrv = Dns.GetHostName();
                    }
                    ipsrv = Dns.GetHostAddresses(ipsrv)[0].ToString();
                }
                CmdFileTrans cmd = new CmdFileTrans(false);
                cmd.ExtRefreshDevice();
                CommiTarget target = new CommiTarget(ipsrv, port, CommiType.TCP);
                CommiManager.GlobalManager.SendCommand(target, cmd);
            }
            if (!isSuccess)
            {
                MessageBox.Show(msg, "保存提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else
            {
                MessageBox.Show("保存成功!", "保存提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }