/// <summary> /// 设置TCP/UDP通讯端点,类型使用串口触发异常 /// </summary> /// <param name="ipaddress">IP地址</param> /// <param name="port">端口号</param> /// <param name="ptype">协议类型</param> public void SetProtocolParam(string ipaddress, int port, CommiType ptype) { IPAddress ad = null; if (!IPAddress.TryParse(ipaddress, out ad)) { throw new Exception("目标地址不是有效IP地址:" + ipaddress); } SetProtocolParam(new IPEndPoint(ad, port), ptype); }
/// <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); }
/// <summary> /// 设置TCP/UDP通讯端点,类型使用串口触发异常 /// </summary> /// <param name="ep">通讯端点,包含地址和端口号</param> /// <param name="ptype">协议类型</param> public void SetProtocolParam(IPEndPoint ep, CommiType ptype) { if (CommiType.SerialPort == ptype) { throw new Exception("串口通讯请设置串口名称和波特率等参数"); } if (null == ep) { throw new Exception("通讯目标地址不能为空"); } if (ep.Port < 1024 || ep.Port > 65535) { throw new Exception("目标端口号不在[1024~65535]范围内"); } this.srvEndPoint = ep; this.protocolType = ptype; }
/// <summary> /// 设置串口通讯参数 /// </summary> /// <param name="portName">串口名称</param> /// <param name="baudRate">波特率(默认9600)</param> /// <param name="parity">奇偶校验位(默认None)</param> /// <param name="dataBits">数据位(默认8)</param> /// <param name="stopBits">停止位(默认1)</param> public void SetProtocolParam(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits) { if (string.IsNullOrEmpty(portName)) { throw new Exception("串口端口不能为空"); } if (dataBits < 5 || dataBits > 8) { throw new Exception("数据位范围是从 5 到 8"); } this.portName = portName; this.baudRate = baudRate; this.parity = parity; this.dataBits = dataBits; this.stopBits = stopBits; this.srvEndPoint = null; this.protocolType = CommiType.SerialPort; }
/// <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); }
/// <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); }
/// <summary> /// 接收传递通讯 /// 包含参数: len,dir=request/response,cmd=TransFile.trans,source,target, /// CommiType,addr=ipaddr/COM1,port,baudRate,parity,dataBits,stopBits /// </summary> /// <param name="sender">触发事件的实例</param> /// <param name="e">响应参数</param> private static void onCommiTransHandle(object sender, ResponseEventArgs e) { CmdFileTrans trans = sender as CmdFileTrans; if (null == trans || null == e || null == e.Target) { return; } NameValueCollection ps = trans.FileHeader; byte[] data = trans.FileContext; if ("TransFile.trans" != ps["cmd"] || "request" != ps["dir"]) { return; } if (string.IsNullOrEmpty(ps["CommiType"]) || string.IsNullOrEmpty(ps["addr"])) { return; } CommiType commitype = CommiType.SerialPort; string addr = ps["addr"]; int port = -1; //检测地址 try { addr = addr.ToUpper(); if (!addr.StartsWith("COM")) { commitype = (CommiType)Enum.Parse(typeof(CommiType), ps["CommiType"], true); } if (!string.IsNullOrEmpty(ps["port"])) { port = Convert.ToInt32(ps["port"]); } } catch { return; } //检测通讯参数 if (CommiType.SerialPort != commitype && port < 0) { return; } if (CommiType.SerialPort == commitype && (string.IsNullOrEmpty(ps["baudRate"]) || string.IsNullOrEmpty(ps["parity"]) || string.IsNullOrEmpty(ps["dataBits"]) || string.IsNullOrEmpty(ps["stopBits"]))) { return; } //创建通讯目标 CommiTarget target = null; if (CommiType.SerialPort != commitype) { target = new CommiTarget(addr, port, commitype); } else { try { int baudRate = Convert.ToInt32(ps["baudRate"]); Parity parity = (Parity)Enum.Parse(typeof(Parity), ps["parity"], true); int databits = Convert.ToInt16(ps["dataBits"]); StopBits stopBits = (StopBits)Enum.Parse(typeof(StopBits), ps["stopBits"], true); target = new CommiTarget(addr, baudRate, parity, databits, stopBits); } catch { return; } } target.setProtocol(Protocol.PTLCard); switch (ps["dtpl"]) { case "停车场": target.setProtocol(Protocol.PTLPark); break; case "门禁": target.setProtocol(Protocol.PTLDoor); break; case "消费": target.setProtocol(Protocol.PTLEatery); break; } //执行传递的指令 CmdProtocol cmd = new CmdProtocol(false); cmd.setCommand(data); ps["dir"] = "response"; CommiManager.GlobalManager.SendCommand(target, cmd); if (!cmd.EventWh.WaitOne(800, false)) { ps["msg"] = "目标通讯超时失败"; } data = cmd.ResponseData; ps["len"] = data.LongLength.ToString(); byte[] fh = SvrFileTrans.ParseInfo(ps); byte[] response = new byte[fh.LongLength + data.LongLength]; Array.Copy(fh, response, fh.LongLength); if (data.Length > 0) { Array.Copy(data, 0, response, fh.LongLength, data.LongLength); } cmd.setCommand(response); CommiManager.GlobalManager.SendCommand(e.Target, cmd, true); }
/// <summary> /// 构建通讯参数,并以UDP/TCP参数初始值 /// </summary> /// <param name="ipaddress">IP地址</param> /// <param name="port">端口号</param> /// <param name="ptype">协议类型UDP/TCP,设置SerialPort触发异常</param> public CommiTarget(string ipaddress, int port, CommiType ptype) { SetProtocolParam(ipaddress, port, ptype); }
/// <summary> /// 构建通讯参数,并以UDP/TCP参数初始值 /// </summary> /// <param name="ep">通讯另一端IP地址和端口号</param> /// <param name="ptype">通讯类别UDP/TCP,设置SerialPort触发异常</param> public CommiTarget(IPEndPoint ep, CommiType ptype) { SetProtocolParam(ep, ptype); }
/// <summary> /// 设置串口通讯参数 /// </summary> /// <param name="portName">串口名称</param> /// <param name="baudRate">波特率(默认9600)</param> /// <param name="parity">奇偶校验位(默认None)</param> /// <param name="dataBits">数据位(默认8)</param> /// <param name="stopBits">停止位(默认1)</param> public void SetProtocolParam(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits) { if (string.IsNullOrEmpty(portName)) throw new Exception("串口端口不能为空"); if (dataBits < 5 || dataBits > 8) throw new Exception("数据位范围是从 5 到 8"); this.portName = portName; this.baudRate = baudRate; this.parity = parity; this.dataBits = dataBits; this.stopBits = stopBits; this.srvEndPoint = null; this.protocolType = CommiType.SerialPort; }
/// <summary> /// 设置TCP/UDP通讯端点,类型使用串口触发异常 /// </summary> /// <param name="ipaddress">IP地址</param> /// <param name="port">端口号</param> /// <param name="ptype">协议类型</param> public void SetProtocolParam(string ipaddress, int port, CommiType ptype) { IPAddress ad = null; if (!IPAddress.TryParse(ipaddress, out ad)) throw new Exception("目标地址不是有效IP地址:" + ipaddress); SetProtocolParam(new IPEndPoint(ad, port), ptype); }
/// <summary> /// 设置TCP/UDP通讯端点,类型使用串口触发异常 /// </summary> /// <param name="ep">通讯端点,包含地址和端口号</param> /// <param name="ptype">协议类型</param> public void SetProtocolParam(IPEndPoint ep, CommiType ptype) { if (CommiType.SerialPort == ptype) throw new Exception("串口通讯请设置串口名称和波特率等参数"); if (null == ep) throw new Exception("通讯目标地址不能为空"); if (ep.Port < 1024 || ep.Port > 65535) throw new Exception("目标端口号不在[1024~65535]范围内"); this.srvEndPoint = ep; this.protocolType = ptype; }