From 3bf9c3022530179e1c396d346c41e6638155acfb Mon Sep 17 00:00:00 2001 From: jkpete <1031139173@qq.com> Date: Thu, 24 Apr 2025 16:44:59 +0800 Subject: [PATCH] add protocolTools EGProcess --- addons/EGFramework/Module/EGMessage.cs | 3 +- .../Module/ProtocolTools/EGProcess.cs | 91 +++++++++++++++++++ 2 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 addons/EGFramework/Module/ProtocolTools/EGProcess.cs diff --git a/addons/EGFramework/Module/EGMessage.cs b/addons/EGFramework/Module/EGMessage.cs index de9b7dc..cf49a1a 100644 --- a/addons/EGFramework/Module/EGMessage.cs +++ b/addons/EGFramework/Module/EGMessage.cs @@ -328,7 +328,8 @@ namespace EGFramework MemoryStream = 0x60, MQTTClient = 0x70, Bacnet = 0x80, - SSHClient = 0x90 + SSHClient = 0x90, + Process = 0xA0, //MQTT,SSH,etc... } } \ No newline at end of file diff --git a/addons/EGFramework/Module/ProtocolTools/EGProcess.cs b/addons/EGFramework/Module/ProtocolTools/EGProcess.cs new file mode 100644 index 0000000..5a6302a --- /dev/null +++ b/addons/EGFramework/Module/ProtocolTools/EGProcess.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using System.Threading.Tasks; + +namespace EGFramework{ + public class EGProcess : IEGFramework, IModule, IProtocolSend, IProtocolReceived + { + public Dictionary Processes { set; get; } = new Dictionary(); + + public string ErrorLogs { set; get; } + + public Encoding StringEncoding { set; get; } = Encoding.UTF8; + + public ConcurrentQueue ResponseMsgs { set; get; } = new ConcurrentQueue(); + + public void Init() + { + this.EGRegisterSendAction(request=>{ + if(request.protocolType == ProtocolType.Process){ + if(request.req.ToProtocolData() != null && request.req.ToProtocolData() != ""){ + this.SendStringData(request.sender,request.req.ToProtocolData()); + } + if(request.req.ToProtocolByteData() != null && request.req.ToProtocolByteData().Length > 0){ + this.SendByteData(request.sender,request.req.ToProtocolByteData()); + } + } + }); + } + + /// + /// Connect process program with check if target program is exist. + /// + public void InitProcess(string processName){ + try{ + if(!Processes.ContainsKey(processName)){ + Process process = new Process(); + process.StartInfo.FileName = processName.GetStrFrontSymbol(' '); + process.StartInfo.Arguments = processName.GetStrBehindSymbol(' ');; // Add any arguments if needed + process.StartInfo.UseShellExecute = false; + process.StartInfo.RedirectStandardInput = true; + process.StartInfo.RedirectStandardOutput = true; + process.StartInfo.RedirectStandardError = true; + process.StartInfo.CreateNoWindow = true; + process.EnableRaisingEvents = true; + process.OutputDataReceived += (sender, e) => { + if (!string.IsNullOrEmpty(e.Data)) { + ResponseMsgs.Enqueue(new ResponseMsg { sender = processName, stringData = e.Data }); + } + }; + process.Exited += (sender, e) => { + Processes.Remove(processName); + }; + Processes.Add(processName,process); + process.Start(); + } + } + catch(Exception e){ + ErrorLogs = "[open port error]" + e.ToString(); + } + } + + public void SetEncoding(Encoding textEncoding) + { + this.StringEncoding = textEncoding; + } + + public ConcurrentQueue GetReceivedMsg() + { + return this.ResponseMsgs; + } + + public void SendByteData(string destination, byte[] data) + { + Processes[destination].StandardInput.WriteLine(data); + } + + public void SendStringData(string destination, string data) + { + Processes[destination].StandardInput.WriteLine(data); + } + + + public IArchitecture GetArchitecture() + { + return EGArchitectureImplement.Interface; + } + } +} \ No newline at end of file