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