tijian_jichuang/Code/SOH.OnLine/OnLine.cs

454 lines
19 KiB
C#
Raw Normal View History

2025-02-20 11:54:48 +08:00
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace SOH.OnLine
{
public partial class OnLine : Form
{
bool _xybc2900 = false;
public OnLine()
{
InitializeComponent();
}
private void 退ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (MessageBox.Show("你确定要退出仪器通信程序吗?退出后将无法及时收到仪器的检查结果!", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk) == DialogResult.Yes)
{
if (listenSocket != null)
DestroySocket(listenSocket);
System.Environment.Exit(System.Environment.ExitCode);
}
}
private void OnLine_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
this.Hide();
sp.Close();
}
}
private static Encoding encode = Encoding.Default;
const string asb = "\x000b";
const string aeb = "\x001c";
const string acr = "\x000d";
const string enq = "\x0005";
const string ack = "\x0006";
const string stx = "\x0002";
const string eot = "\x0004";
const string lf = "\x000a";
Socket listenSocket = null;
private void OnLine_Load(object sender, EventArgs e)
{
//FileStream fs = new FileStream(Application.StartupPath + "\\lis.txt", FileMode.Open);
//byte[] bs = new byte[fs.Length];
//fs.Read(bs, 0, bs.Length);
//fs.Close();
//byte hh = bs[0];
//for (int i = 1; i < bs.Length; i++)
//{
// hh += bs[i];
//}
//string ssss = hh.ToString("X2");
/*
* <add key="PortType" value="NET"/>
<add key="netaddstr" value="127.0.0.1"/>
<add key="netaddstrport" value="5500"/>
*/
System.Configuration.Configuration conf = System.Configuration.ConfigurationManager.OpenExeConfiguration(Application.StartupPath + "\\local.ext");
string PortType = conf.AppSettings.Settings["PortType"].Value;
string yqbm = conf.AppSettings.Settings["yqbm"].Value;
if (string.IsNullOrEmpty(PortType))
{
PortType = "COM";
}
if (PortType == "NET")
{
string lisfile1 = Application.StartupPath + "\\result";
if (!Directory.Exists(lisfile1))
{
Directory.CreateDirectory(lisfile1);
}
lisfile1 += "\\lis.txt";
if (File.Exists(lisfile1))
{
File.Delete(lisfile1);
}
string netaddstr = conf.AppSettings.Settings["netaddstr"].Value;
string netaddstrport = conf.AppSettings.Settings["netaddstrport"].Value;
listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listenSocket.Bind(new IPEndPoint(IPAddress.Any, int.Parse(netaddstrport)));
listenSocket.Listen(100);
//Console.WriteLine("Listen " + port + " ...");
new Thread(() =>
{
while (true)
{
Socket acceptSocket = listenSocket.Accept();
string recStr = "";
string receiveData = "";
if (yqbm == "HT800")
{
//处理解码回HT800数据
new Thread(() =>
{
Socket writeSocket = acceptSocket;
while (true)
{
Thread.Sleep(100);
if (File.Exists(lisfile1))
{
try
{
StreamReader sr = new StreamReader(lisfile1, System.Text.Encoding.Default);
string data = sr.ReadToEnd();
sr.Close();
if (data.StartsWith(enq) && data.EndsWith(eot))
{
File.Delete(lisfile1);
string[] ss = data.Split(new string[] { "$#$" }, StringSplitOptions.None);
foreach (string s in ss)
{
writeSocket.Send(System.Text.Encoding.Default.GetBytes(s));
Thread.Sleep(100);
}
}
}
catch { }
}
}
}).Start();
new Thread(() =>
{
Socket readSocket = acceptSocket;
bool recenq = false;
while (true)
{
receiveData = Receive(readSocket, 50000); //5 seconds timeout.
if (receiveData == enq)
{
readSocket.Send(encode.GetBytes(ack));
recStr = enq;
recenq = true;
}
else if (receiveData == eot)
{
if (recenq)
{
recStr += eot;
//DestroySocket(acceptSocket); //import
string path = Application.StartupPath + "\\raw";
string datapath = path + "\\data.txt";
string rawpath = path + "\\" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
FileStream fsraw = new FileStream(rawpath, FileMode.Append, FileAccess.Write, FileShare.None);
StreamWriter rawwriter = new StreamWriter(fsraw);
FileStream data = new FileStream(datapath, FileMode.Append, FileAccess.Write, FileShare.None);
StreamWriter datawriter = new StreamWriter(data);
rawwriter.Write(recStr);
rawwriter.Close();
datawriter.Write(recStr);
datawriter.Close();
}
recenq = false;
}
else if (receiveData.StartsWith(stx) && receiveData.EndsWith(acr + lf))
{
recStr += receiveData;
acceptSocket.Send(encode.GetBytes(ack));
}
else if (receiveData == ack)
{
}
else
{
acceptSocket.Send(encode.GetBytes(ack));
}
}
}).Start();
return;
}
if (receiveData.StartsWith(asb) && receiveData.EndsWith(aeb + acr))
{
string path = Application.StartupPath + "\\raw";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string datapath = path + "\\data.txt";
string rawpath = path + "\\" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
FileStream fsraw = new FileStream(rawpath, FileMode.Append, FileAccess.Write, FileShare.None);
StreamWriter rawwriter = new StreamWriter(fsraw);
FileStream data = new FileStream(datapath, FileMode.Append, FileAccess.Write, FileShare.None);
StreamWriter datawriter = new StreamWriter(data);
rawwriter.Write(receiveData);
rawwriter.Close();
datawriter.Write(receiveData);
datawriter.Close();
receiveData = receiveData.Replace(asb, "");
receiveData = receiveData.Replace(aeb + acr, "");
string[] datas = receiveData.Split('\x001d');
string msgid = "";
string msgtype = "";
foreach (string d in datas)
{
string[] zs = d.Split('|');
if (zs[0] == "MSH")
{
msgtype = zs[8];
if (msgtype == "ORU^R01")
{
msgid = zs[9];
}
else if (msgtype == "QRY^Q02")
{
}
}
}
if (msgtype == "ORU^R01")
{
string returnstr = "";
returnstr = asb + "MSH|^~\\&|||SanCaiNet|SohLis|" + DateTime.Now.ToString("yyyyMMddHHmmss") + "||ACK^R01|" + msgid + "|P|2.3.1||||0||ASCII|||" + acr +
"MSA|AA|" + msgid + "|Message accepted|||0|" + acr +
aeb + acr;
acceptSocket.Send(encode.GetBytes(returnstr));
}
else if (msgtype == "QRY^Q02")
{
int c = 40;
int h = 0;
while (c > 0)
{
Thread.Sleep(100);
string lisfile = Application.StartupPath + "\\result";
if (!Directory.Exists(lisfile))
{
Directory.CreateDirectory(lisfile);
}
lisfile += "\\lis.txt";
if (File.Exists(lisfile))
{
StreamReader sw = new StreamReader(lisfile, Encoding.Default);
string text = sw.ReadToEnd();
sw.Close();
acceptSocket.Send(encode.GetBytes(text));
File.Delete(lisfile);
h++;
if (h == 2)
break;
}
c--;
}
}
}//Console.WriteLine("Receive" + receiveData);
DestroySocket(acceptSocket); //import
}
}).Start();
return;
}
string BaundRate = conf.AppSettings.Settings["BaundRate"].Value;
string DataBits = conf.AppSettings.Settings["DataBits"].Value;
string Parity = conf.AppSettings.Settings["Parity"].Value;
string PortName = conf.AppSettings.Settings["PortName"].Value;
string StopBits = conf.AppSettings.Settings["StopBits"].Value;
nf.Text = yqbm + nf.Text;
if (conf.AppSettings.Settings.AllKeys.Contains("XYBC2900"))
{
string z = conf.AppSettings.Settings["XYBC2900"].Value;
if (z == "1")
{
_xybc2900 = true;
}
}
try
{
sp.BaudRate = int.Parse(BaundRate);
}
catch
{
MessageBox.Show("仪器通信参数没有设置,请联系管理员设置!");
}
sp.DataBits = int.Parse(DataBits);
sp.PortName = PortName;
switch (StopBits)
{
case "None":
sp.StopBits = System.IO.Ports.StopBits.None;
break;
case "One":
sp.StopBits = System.IO.Ports.StopBits.One;
break;
case "OnePointFive":
sp.StopBits = System.IO.Ports.StopBits.OnePointFive;
break;
case "Two":
sp.StopBits = System.IO.Ports.StopBits.Two;
break;
}
switch (Parity)
{
case "Even":
sp.Parity = System.IO.Ports.Parity.Even;
break;
case "Mark":
sp.Parity = System.IO.Ports.Parity.Mark;
break;
case "None":
sp.Parity = System.IO.Ports.Parity.None;
break;
case "Odd":
sp.Parity = System.IO.Ports.Parity.Odd;
break;
case "Space":
sp.Parity = System.IO.Ports.Parity.Space;
break;
}
try
{
sp.Open();
}
catch (Exception ex)
{
MessageBox.Show("打开串口" + PortName + "失败" + ex.Message);
}
}
/// <summary>
/// 发送数据
/// </summary>
/// <param name="host"></param>
/// <param name="port"></param>
/// <param name="data"></param>
/// <returns></returns>
public static string Send(string host, int port, string data)
{
string result = string.Empty;
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(host, port);
clientSocket.Send(encode.GetBytes(data));
Console.WriteLine("Send" + data);
result = Receive(clientSocket, 5000 * 2); //5*2 seconds timeout.
Console.WriteLine("Receive" + result);
DestroySocket(clientSocket);
return result;
}
/// <summary>
/// 接收数据
/// </summary>
/// <param name="socket"></param>
/// <param name="timeout"></param>
/// <returns></returns>
private static string Receive(Socket socket, int timeout)
{
string result = string.Empty;
socket.ReceiveTimeout = timeout;
List<byte> data = new List<byte>();
byte[] buffer = new byte[1024];
int length = 0;
try
{
while ((length = socket.Receive(buffer)) > 0)
{
for (int j = 0; j < length; j++)
{
data.Add(buffer[j]);
}
if (length < buffer.Length)
{
break;
}
}
}
catch { }
if (data.Count > 0)
{
result = encode.GetString(data.ToArray(), 0, data.Count);
}
return result;
}
/// <summary>
/// 销毁Socket对象
/// </summary>
/// <param name="socket"></param>
private static void DestroySocket(Socket socket)
{
if (socket.Connected)
{
socket.Shutdown(SocketShutdown.Both);
}
socket.Close();
}
private void sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
int readcount = sp.BytesToRead;
string path = Application.StartupPath + "\\raw";
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string datapath = path + "\\data.txt";
string rawpath = path + "\\" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
FileStream fsraw = new FileStream(rawpath, FileMode.Append, FileAccess.Write, FileShare.None);
BinaryWriter rawwriter = new BinaryWriter(fsraw);
FileStream data = new FileStream(datapath, FileMode.Append, FileAccess.Write, FileShare.None);
BinaryWriter datawriter = new BinaryWriter(data);
while (readcount > 0)
{
byte[] bs = new byte[readcount];
sp.Read(bs, 0, readcount);
if (_xybc2900)
{
if (bs[0] == 0x10)
{
byte[] b = new byte[1];
b[0] = 0x06;
sp.Write(b, 0, 1);
}
if (bs[bs.Length - 1] == 0x0f)
{
byte[] b = new byte[1];
b[0] = 0x06;
sp.Write(b, 0, 1);
}
}
datawriter.Write(bs);
rawwriter.Write(bs);
readcount = sp.BytesToRead;
}
rawwriter.Close();
datawriter.Close();
}
}
}