public bool Open(uint port) { bool res = ComPort.OpenComPort(port, _Baudrate); if (res) { this.port = (int)port; return(true); } else { this.port = -1; return(false); } }
public byte[] Recive(uint size, uint timeout) { if (port >= 0) { byte[] res = new byte[size]; int n = ComPort.Recive((uint)port, res, (uint)res.Length, timeout); // if (n > 0) // System.Diagnostics.Trace.WriteLine("Serial GetData : " + Program.bin_to_asc(res, n)); if (n == size) { return(res); } else if (n > 0) { byte[] ss = new byte[n]; for (int i = 0; i < n; i++) { ss[i] = res[i]; } return(ss); } } return(null); }
static NicType TransMode = NicType.Direct; //默认为AT static void Main(string[] args) { foreach (string sss in args) { if (sss == "all") { _serial_info = false; _pack_head_info = false; } else if (sss == "ser") { _serial_info = false; } else if (sss == "packet") { _pack_head_info = false; } } EnsureOnlyOneInstance(); string conf_file = AppDomain.CurrentDomain.BaseDirectory + "config.ini"; config.LoadIniFile(conf_file); config.SaveIniFile(); string fileName = (args.Length > 0) ? args[0] : Assembly.GetExecutingAssembly().Location; string buildtime = System.IO.File.GetLastWriteTime(fileName).ToString(); string version = "V0.4.0"; string app_title = "HX Net Module (Universal) Emulate " + version + " build [" + buildtime + "]"; ConsoleLogWriteLine(app_title); ConsoleLogWriteLine("=========================================================="); FixRemoteIP = config.应用参数.使用固定IP.Trim() == "" ? false : true; if (FixRemoteIP) { Console.WriteLine("使用固定IP:" + config.应用参数.使用固定IP); rm_ip_fix = config.应用参数.使用固定IP; } else { Console.WriteLine("使用命令指定的IP, 如果没有指定便使用默认的:" + config.应用参数.使用固定IP); } //--------------------------------------------------------------------- ser = new ComPort(); ser.RecvTimeoutInMs = 1000; ConsoleLogWriteLine("Communication Configs:"); //ConsoleLogWriteLine("Protocol : " + ser.DialogProcoto); // (ser.DialogProcoto == hxSerialProtocol.DialogProtocolType.SIMPLE?"SIMPLE":"UNIVERSAL") ); ConsoleLogWriteLine("Baudrate : " + ser.Baudrate); ConsoleLogWriteLine("Recive Timeout : " + ser.RecvTimeoutInMs + "ms"); //ConsoleLogWriteLine("Retry Times : " + ser.RetryTimes); ConsoleLogWriteLine("Alive Serial Ports:"); List <uint> ap = new List <uint>(); for (uint i = 0; i < 40; i++) { if (ser.Open(i)) { ser.Close(); ConsoleLogWriteLine("COM" + i); ap.Add(i); } } cfg_port_nr: ConsoleLogWrite("Please Select A Port :"); string s = Console.ReadLine(); uint n; try { n = uint.Parse(s); } catch { ConsoleLogWriteLine("input error."); goto cfg_port_nr; } if (!ap.Contains(n)) { ConsoleLogWriteLine("unalivable port."); goto cfg_port_nr; } if (!ser.Open(n)) { ConsoleLogWriteLine("cannot open port."); goto cfg_port_nr; } ser.ShowData = _serial_info; ser.puts(app_title); try { reset: ConsoleLogWriteLine("====================================================================="); ConsoleLogWriteLine("->Net Module Reset"); Thread.Sleep(1000); ser.puts("+ZEND"); for (;;) { s = ser.gets(); s = s.Trim(); if (s.StartsWith("AT")) { bool dellf = false; { try { string ss1 = config.应用参数.AT指令扩展匹配字符串; if (ss1.Trim() == "") { throw new System.Exception(); } string[] sss1 = ss1.Split(new char[] { '|' }); if (sss1.Length < 2) { throw new System.Exception(); } for (int i = 0; i < sss1.Length; i += 2) { if (s == sss1[i]) { ser.puts(sss1[i + 1]); dellf = true; } } } catch { } try { string ss1 = config.应用参数.AT指令扩展起始指令匹配字符串; if (ss1.Trim() == "") { throw new System.Exception(); } string[] sss1 = ss1.Split(new char[] { '|' }); if (sss1.Length < 2) { throw new System.Exception(); } for (int i = 0; i < sss1.Length; i += 2) { if (s.StartsWith(sss1[i])) { dellf = true; ser.puts(sss1[i + 1]); } } } catch { } try { string ss1 = config.应用参数.透传建立AT指令匹配起始; if (ss1.Trim() == "") { throw new System.Exception(); } string[] sss1 = ss1.Split(new char[] { '|' }); if (sss1.Length < 1) { throw new System.Exception(); } if (s.StartsWith(sss1[0])) { IPAddress ip = IPAddress.Parse(rm_ip_fix); string port = config.应用参数.使用固定端口; try { sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sock.Connect(new IPEndPoint(ip, int.Parse(port))); ser.puts("CONNECT"); sock.BeginReceive(new byte[2048], 0, 2048, SocketFlags.None, new AsyncCallback(sock_recv_directly), ser); List <byte> buf = new List <byte>(); List <byte> buf9 = new List <byte>(); buf.Clear(); dellf = true; int tickcount = 0; for (;;) { try { //byte[] bs = ser.Recive(1024,100); //sock.Send(bs); //WriteLine("Dev->Server : (" + bs.Length + ") " + bin_to_asc(bs, bs.Length)); //log.log("TX PACKET : " + bs.Length + " " + bin_to_asc(bs, bs.Length)); byte[] bs = ser.Recive(1); if (bs != null && bs.Length == 1) { byte b0 = bs[0]; if (b0 == '@') { tickcount = System.Environment.TickCount; buf9.Clear(); buf.Clear(); buf.Add(b0); } else if (bs[0] == '#') { buf.Add(b0); if (sock != null) { int nsend = sock.Send(buf.ToArray()); WriteLine("Dev->Server : (" + buf.Count + ") " + bin_to_asc(buf.ToArray(), buf.Count)); log.log("TX PACKET : " + buf.Count + " " + bin_to_asc(buf.ToArray(), buf.Count)); } else { ser.puts("ERROR"); } buf.Clear(); } else { if (System.Environment.TickCount - tickcount > 500) { buf9.Add(b0); } if (buf9.Count > 2) { string sss = System.Text.Encoding.ASCII.GetString(buf9.ToArray()); string[] sas = sss.Split(new string[] { "AT" }, StringSplitOptions.None); string[] sas2 = sss.Split(new string[] { "\n" }, StringSplitOptions.None); if (sas.Length > 3 && sas2.Length > 3) { try { sock.Shutdown(SocketShutdown.Both); sock.Close(); } catch { } goto reset; } } if (buf.Count > 4096) { buf.Clear(); } buf.Add(b0); } } } catch { ;;; } } } catch { } } ser.puts(sss1[1]); } catch { } } if (dellf == false) { if (s == "AT") { ser.puts("AT"); ser.puts("OK"); } else if (s == "ATE0") { ser.puts("ATE0"); ser.puts("OK"); } else if (s == "ATE1") { ser.puts("OK"); } else if (s == "AT+CSQ?") { ser.puts("OK"); ser.puts("+CSQ: 29,99"); } else if (s == "AT+CREG?") { ser.puts("OK"); ser.puts("+REG: 1,1"); } else if (s == "AT+CIPMODE=1") { ser.puts("OK"); } else if (s == "AT+CIPSHUT") { ser.puts("SHUT OK"); ser.puts("OK"); } else if (s.StartsWith("AT+CIPCSGP")) { ser.puts("OK"); } else if (s.StartsWith("AT+CGSN")) { ser.puts("012345678901234"); } else if (s.StartsWith("AT+CIMI")) { ser.puts("112233445566778"); } else if (s.StartsWith("AT+ZIPCFG=")) { ser.puts("OK"); } else if (s.StartsWith("AT+ZIPCALL=1")) { ser.puts("OK"); ser.puts("+ZIPCALL: 1,99.88.99.88"); } else if (s.StartsWith("AT+ZIPSTAT=")) { int state = sock == null ? 0 : 1; ser.puts("+ZIPSTAT: 1," + state); } else if (s.StartsWith("AT+CIPSTART")) { // "AT+CIPSTART="TCP","119.75.218.70","80" try { string v = s.Split('=')[1]; string[] ss = v.Split(','); string ip_addr = ss[1].Trim(new char[] { '\"' }); string port = ss[2].Trim(new char[] { '\"' }); if (ip_addr != null && port != null) { ser.puts("OK"); IPAddress ip; if (FixRemoteIP) { ip = IPAddress.Parse(rm_ip_fix); } else { ip = IPAddress.Parse(ip_addr); } try { sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sock.Connect(new IPEndPoint(ip, int.Parse(port))); //byte[] bbb = new byte[1024]; //int nnn = sock.Receive(bbb); ser.puts("CONNECT"); sock.BeginReceive(new byte[2048], 0, 2048, SocketFlags.None, new AsyncCallback(sock_recv_directly), ser); List <byte> buf = new List <byte>(); List <byte> buf9 = new List <byte>(); buf.Clear(); int tickcount = 0; for (;;) { try { //byte[] bs = ser.Recive(1024,100); //sock.Send(bs); //WriteLine("Dev->Server : (" + bs.Length + ") " + bin_to_asc(bs, bs.Length)); //log.log("TX PACKET : " + bs.Length + " " + bin_to_asc(bs, bs.Length)); byte[] bs = ser.Recive(1); if (bs != null && bs.Length == 1) { byte b0 = bs[0]; if (b0 == '@') { tickcount = System.Environment.TickCount; buf9.Clear(); buf.Clear(); buf.Add(b0); } else if (bs[0] == '#') { buf.Add(b0); if (sock != null) { int nsend = sock.Send(buf.ToArray()); WriteLine("Dev->Server : (" + buf.Count + ") " + bin_to_asc(buf.ToArray(), buf.Count)); log.log("TX PACKET : " + buf.Count + " " + bin_to_asc(buf.ToArray(), buf.Count)); } else { ser.puts("ERROR"); } buf.Clear(); } else { if (System.Environment.TickCount - tickcount > 500) { buf9.Add(b0); } if (buf9.Count >= 3) { if (buf9[0] == '+' && buf9[1] == '+' && buf9[2] == '+') { sock.Shutdown(SocketShutdown.Both); sock.Close(); ser.puts("OK"); WriteLine("+++ DISCONNECT"); log.log("+++ DISCONNECT"); goto reset; } } if (buf9.Count > 2) { string sss = System.Text.Encoding.ASCII.GetString(buf9.ToArray()); string[] sas = sss.Split(new string[] { "AT" }, StringSplitOptions.None); string[] sas2 = sss.Split(new string[] { "\n" }, StringSplitOptions.None); if (sas.Length > 3 && sas2.Length > 3) { try { sock.Shutdown(SocketShutdown.Both); sock.Close(); } catch { } goto reset; } } if (buf.Count > 4096) { buf.Clear(); } buf.Add(b0); } } } catch { ;;; } } } catch { } } } catch { } ser.puts("ERROR"); } else if (s.StartsWith("AT+ZIPSEND=")) { string v = s.Split('=')[1]; string[] ss = v.Split(','); string sock_id = ss[0]; string data = ss[1]; byte[] bin_data = asc_to_bin(data); AnalysPacket(1, data); ser.puts("OK"); if (sock != null) { int nsend = sock.Send(bin_data); ser.puts("+ZIPSEND:1," + nsend); log.log("TX PACKET : " + data); } else { ser.puts("ERROR"); } } else if (s.StartsWith("AT+ZIPOPEN=")) { string v = s.Split('=')[1]; string[] ss = v.Split(','); string sock_id = ss[0]; string tcp0_udp1 = ss[1]; string ip_addr = ss[2]; string port = ss[3]; string local_port = ss[4]; ser.puts("OK"); IPAddress ip; if (FixRemoteIP) { port = config.应用参数.使用固定端口; ip = IPAddress.Parse(rm_ip_fix); } else { ip = IPAddress.Parse(ip_addr); } try { sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sock.Connect(new IPEndPoint(ip, int.Parse(port))); ser.puts("+ZIPSTAT: " + sock_id + "," + 1); sock.BeginReceive(new byte[2048], 0, 2048, SocketFlags.None, new AsyncCallback(sock_recv), ser); } catch { ser.puts("+ZIPSTAT: " + sock_id + "," + 0); } } else { ser.puts("***ERROR"); } } } else if (s.StartsWith("TK")) { if (s == "TK+RESET") { ser.puts("OK"); goto reset; } } else { } } } catch { } System.Console.ReadKey(); }