Browse Source

add protocolTools EGProcess

master
jkpete 3 months ago
parent
commit
3bf9c30225
  1. 3
      addons/EGFramework/Module/EGMessage.cs
  2. 91
      addons/EGFramework/Module/ProtocolTools/EGProcess.cs

3
addons/EGFramework/Module/EGMessage.cs

@ -328,7 +328,8 @@ namespace EGFramework @@ -328,7 +328,8 @@ namespace EGFramework
MemoryStream = 0x60,
MQTTClient = 0x70,
Bacnet = 0x80,
SSHClient = 0x90
SSHClient = 0x90,
Process = 0xA0,
//MQTT,SSH,etc...
}
}

91
addons/EGFramework/Module/ProtocolTools/EGProcess.cs

@ -0,0 +1,91 @@ @@ -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<string,Process> Processes { set; get; } = new Dictionary<string, Process>();
public string ErrorLogs { set; get; }
public Encoding StringEncoding { set; get; } = Encoding.UTF8;
public ConcurrentQueue<ResponseMsg> ResponseMsgs { set; get; } = new ConcurrentQueue<ResponseMsg>();
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());
}
}
});
}
/// <summary>
/// Connect process program with check if target program is exist.
/// </summary>
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<ResponseMsg> 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;
}
}
}
Loading…
Cancel
Save