Ejemplo n.º 1
0
        /// <summary>
        /// 设置门禁IP地址端口号及网关;无IP地址忽略操作,无其它则默认保持原来的值
        /// </summary>
        /// <param name="station">站址序列号</param>
        /// <param name="ipaddr">IP地址</param>
        /// <param name="maskcode">掩码,默认255.255.255.0</param>
        /// <param name="gateway">网关</param>
        /// <param name="macaddr">物理地址</param>
        public static bool SetTCPIPDoor(int station, string ipaddr, string maskcode, string gateway, string macaddr)
        {
            //校验参数格式
            if (station < 0 || station > 65534 || string.IsNullOrEmpty(ipaddr) || !regIPaddr.IsMatch(ipaddr))
                return false;
            if (!string.IsNullOrEmpty(maskcode) && !regIPaddr.IsMatch(maskcode))
                return false;
            if (!string.IsNullOrEmpty(gateway) && !regIPaddr.IsMatch(gateway))
                return false;
            if (!string.IsNullOrEmpty(macaddr) && !regMacaddr.IsMatch(macaddr))
                return false;
            //网关、掩码或物理地址为空时,使用1102功能码,都需要设置时使用11F2功能码
            string funcode = "F211";
            if (string.IsNullOrEmpty(maskcode) && string.IsNullOrEmpty(gateway) && string.IsNullOrEmpty(macaddr))
                funcode = "0211";
            if (string.IsNullOrEmpty(macaddr))
                macaddr = "00-00-00-00-00-00";
            if (string.IsNullOrEmpty(gateway))
                gateway = "00.00.00.00";
            if (string.IsNullOrEmpty(maskcode))
                maskcode = "00.00.00.00";
            if (maskcode.Contains(":") || gateway.Contains(":"))
                return false;
            string port = "60000";
            int idxp = ipaddr.IndexOf(":");
            if (idxp>0)
            {
                port = ipaddr.Substring(idxp + 1, ipaddr.Length - idxp - 1);
                ipaddr = ipaddr.Substring(0, idxp);
            }
            //转换16进制值
            string stcode = Convert.ToString(station, 16).PadLeft(4, '0');
            port = Convert.ToString(Convert.ToUInt32(port), 16).PadLeft(4, '0').Substring(0, 4);
            ipaddr = convertHEX(ipaddr, ".", false);
            gateway = convertHEX(gateway, ".", false);
            maskcode = convertHEX(maskcode, ".", false);
            macaddr = convertHEX(macaddr, "-", true);
            //计算校验码
            string codevali = sumValiHex(string.Format("{0} {1} {2} {3} {4} {5} {6}", stcode, funcode, macaddr, ipaddr, maskcode, gateway, port));
            codevali = codevali.PadLeft(4, '0');
            codevali = codevali.Substring(codevali.Length - 4, 4);
            string strcmd = string.Format("7E {0} {1} {2} {3} {4} {5} {6} 00 00 00 00 00 00 {7} 0D", 
                                          stcode, funcode, macaddr, ipaddr, maskcode, gateway, port, codevali);
            //设置执行指令
            IPEndPoint srv = new IPEndPoint(IPAddress.Broadcast, searport);
            CommiTarget target = new CommiTarget(srv, CommiType.UDP);
            target.setProtocol(Protocol.PTLDoor);

            CommandBase cmd = new CommandBase(false);
            cmd.TimeOut = new TimeSpan(0, 0, 0, 0, 500);
            cmd.TimeFailLimit = new TimeSpan(0, 0, 3);
            cmd.TimeLimit = new TimeSpan(0, 0, 5);
            cmd.IsResposeHandle = isRpsDoor;
            cmd.setCommand(strcmd, true);
            CommiManager.GlobalManager.SendCommand(target, cmd);
            if (cmd.EventWh.WaitOne(cmd.TimeFailLimit, false))
                return 1 == cmd.ResponseData[5];
            return false;
        }
Ejemplo n.º 2
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();
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 设置通讯ZNetCom模块端口好,及串口波特率
        /// </summary>
        /// <param name="macaddr">物理地址,为空则忽略操作</param>
        /// <param name="netport">网络端口</param>
        /// <param name="baudRate">波特率</param>
        /// <param name="parity">奇偶校验</param>
        /// <param name="dataBits">数据位</param>
        /// <param name="stopBits">停止位</param>
        /// <returns>修改是否成功</returns>
        public static bool SetSerialZnet(string macaddr, int netport, int baudRate, Parity parity, int dataBits, StopBits stopBits)
        {
            if (string.IsNullOrEmpty(macaddr) || netport < 0 || netport > 0xFFFF || baudRate < 0 || baudRate > 0xFFFFFF || dataBits < 5 || dataBits > 8)
                return false;
            //读取串口通讯
            string strcmd = string.Format(infocmd, macaddr.Replace("-", " "), "A114010202");

            IPEndPoint srv = new IPEndPoint(IPAddress.Broadcast, infoport);
            CommiTarget target = new CommiTarget(srv, CommiType.UDP);
            target.setProtocol(ptlznet);
            CommandBase cmd = new CommandBase(false);
            cmd.TimeOut = new TimeSpan(0, 0, 0, 0, 300);
            cmd.TimeFailLimit = new TimeSpan(0, 0, 1);
            cmd.TimeLimit = new TimeSpan(0, 0, 3);
            cmd.IsResposeHandle = isResponseCmd;
            cmd.setCommand(strcmd, true);
            CommiManager.GlobalManager.SendCommand(target, cmd);
            if (!cmd.EventWh.WaitOne(cmd.TimeFailLimit, false))
                return false;
            //修改设备信息
            string response = CommandBase.Parse(cmd.ResponseData, true);
            string funcode = "A1FE01030200";
            string strport = Convert.ToString(netport, 16).PadLeft(4, '0');
            string strbaud = Convert.ToString(baudRate, 16).PadLeft(6, '0');
            string strdata = Convert.ToString(dataBits, 16).PadLeft(2, '0');
            string strstop = StopBits.None == stopBits ? "00" : StopBits.One == stopBits ? "01" : "02";
            string strpartity = Parity.None == parity ? "00" : Parity.Even == parity ? "01" : Parity.Odd == parity ? "02" : Parity.Mark == parity ? "03" : "04";
            string[] cmdfun ={ funcode, strport, strbaud, strdata, strstop, strpartity };
            int[,] cmdpos ={ { 10, 5 }, { 16, 2 }, { 26, 3 }, { 29, 1 }, { 30, 1 }, { 31, 1 } };
            int leninv = 0;
            for (int i = 0; i < cmdfun.Length; i++)
            {
                if (string.IsNullOrEmpty(cmdfun[i]) || string.IsNullOrEmpty(cmdfun[i].Replace("0", "")))
                    continue;
                response = response.Substring(0, cmdpos[i, 0] * 2 + leninv) + cmdfun[i]
                           + response.Substring(cmdpos[i, 0] * 2 + leninv + cmdpos[i, 1] * 2, response.Length);
                leninv += cmdfun[i].Length - cmdpos[i, 1] * 2;
            }
            //发送修改指令,再发送确认指令
            cmd.setCommand(response, true);
            cmd.ResetState();
            CommiManager.GlobalManager.SendCommand(target, cmd);
            cmd.EventWh.WaitOne(cmd.TimeFailLimit, false);
            strcmd = string.Format(infomdi, macaddr.Replace("-", ""));
            cmd.setCommand(strcmd, true);
            cmd.ResetState();
            CommiManager.GlobalManager.SendCommand(target, cmd);
            cmd.EventWh.WaitOne(cmd.TimeFailLimit, false);
            return true;
        }
Ejemplo n.º 4
0
 /// <summary>
 /// 设置通讯ZNetCom模块IP地址端口号及网关
 /// </summary>
 /// <param name="macaddr">物理地址,为空则忽略操作</param>
 /// <param name="ipaddr">IP地址,为空则忽略操作</param>
 /// <param name="maskcode">子网掩码,为空保持原值</param>
 /// <param name="gateway">网关,为空保持原值</param>
 /// <returns>修改是否成功</returns>
 public static bool SetTCPIPZnet(string macaddr, string ipaddr, string maskcode, string gateway)
 {
     if (string.IsNullOrEmpty(macaddr) || string.IsNullOrEmpty(ipaddr) || !regMacaddr.IsMatch(macaddr) || !regIPaddr.IsMatch(ipaddr))
         return false;
     //读取IP地址
     string strcmd = string.Format(infocmd, macaddr.Replace("-", " "), "A114000200");
     
     IPEndPoint srv = new IPEndPoint(IPAddress.Broadcast, infoport);
     CommiTarget target = new CommiTarget(srv, CommiType.UDP);
     target.setProtocol(ptlznet);
     CommandBase cmd = new CommandBase(false);
     cmd.TimeOut = new TimeSpan(0, 0, 0, 0, 300);
     cmd.TimeFailLimit = new TimeSpan(0, 0, 1);
     cmd.TimeLimit = new TimeSpan(0, 0, 3);
     cmd.IsResposeHandle = isResponseCmd;
     cmd.setCommand(strcmd, true);
     CommiManager.GlobalManager.SendCommand(target, cmd);
     if (!cmd.EventWh.WaitOne(cmd.TimeFailLimit, false))
         return false;
     //修改设备信息
     string response = CommandBase.Parse(cmd.ResponseData, true);
     if (ipaddr.Contains(":"))
         ipaddr = ipaddr.Substring(0, ipaddr.IndexOf(":"));
     ipaddr = convertHEX(ipaddr, ".", false);
     maskcode = convertHEX(maskcode, ".", false);
     gateway = convertHEX(gateway, ".", false);
     string funcode = "A1FE01030000";
     string[] cmdfun ={ funcode, ipaddr, maskcode, gateway };
     int[,] cmdpos ={ { 10, 5 }, { 47, 4 }, { 51, 4 }, { 55, 4 } };
     int leninv = 0;
     for (int i = 0; i < cmdfun.Length; i++)
     {
         if (string.IsNullOrEmpty(cmdfun[i]))
             continue;
         response = response.Substring(0, cmdpos[i, 0] * 2 + leninv) + cmdfun[i] 
                    + response.Substring(cmdpos[i, 0] * 2 + leninv + cmdpos[i, 1] * 2, response.Length);
         leninv += cmdfun[i].Length - cmdpos[i, 1] * 2;
     }
     //发送修改指令,再发送确认指令
     cmd.setCommand(response, true);
     cmd.ResetState();
     CommiManager.GlobalManager.SendCommand(target, cmd);
     cmd.EventWh.WaitOne(cmd.TimeFailLimit, false);
     strcmd = string.Format(infomdi, macaddr.Replace("-", ""));
     cmd.setCommand(strcmd, true);
     cmd.ResetState();
     CommiManager.GlobalManager.SendCommand(target, cmd);
     cmd.EventWh.WaitOne(cmd.TimeFailLimit, false);
     return true;
 }
Ejemplo n.º 5
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();
        }
Ejemplo n.º 6
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,5;", "物理地址,4,6", "IP地址,17,4;", "", "" };
            string[] formatdtlA ={"功能码,10,5;", "物理地址,4,6",
                                    "IP地址,47,4;子网掩码,51,4;网关IP,55,4;DNS服务器,59,4;",
                                    "设备名称,15,16;密码,31,5;",
                                    "网页端口,71,1;命令端口,72,2;"};
            string[] formatdtlB ={ "功能码,10,5;", "物理地址,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);
        }
Ejemplo n.º 7
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);
        }