1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039 |
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Net;
- using System.Net.Sockets;
- using System.IO;
- using System.Threading;
- using System.Runtime.Serialization.Formatters.Binary;
- using System.Runtime.InteropServices;
- using System.Reflection;
- using System.Diagnostics;
- namespace FPER
- {
- public class TSocket
- {// 소켓 클래스
- private TcpClient cmd_tcpclient;
- private TcpClient event_tcpclient;
- private Tprotocol tprotocol;
- private String DestIP;
- private int commandPort;
- private int eventPort;
- private Thread cmd_rcv_th;
- private int cmd_rcv_th_state = 0;
- private NetworkStream cmd_sendStm, cmd_recvStm;
- private NetworkStream event_sendStm, event_recvStm;
- private Thread event_rcv_th;
- private int event_rcv_th_state;
- byte[] CMD_RcvBuffer = new byte[2048];
- int CMD_RcvBufferPos = 0;
- LogFileCreate LFC = new LogFileCreate();
- private bool cmdConnected = false;
- private bool eventConnected = false;
- public delegate int dRcvProcess(byte[] buffer, int size);
- private event dRcvProcess CMDRcvProcess;
- private event dRcvProcess EVENTRcvProcess;
- public TSocket(String Dest_ip, int commandPort, int eventPort, int Demon_ID, Tprotocol tp)
- {
- try
- {
- this.DestIP = Dest_ip;
- // LCH 2018.02.27 : 데몬을 다른 PC에 둔다
- //this.DestIP = "192.168.100.218";
- this.commandPort = commandPort;
- this.eventPort = eventPort;
- this.tprotocol = tp;
- CMDRcvProcess += new dRcvProcess(this.tprotocol.CMDResponceFunc);
- EVENTRcvProcess += new dRcvProcess(this.tprotocol.EVENTCallFunc);
- this.cmd_tcpclient = new TcpClient();
- this.event_tcpclient = new TcpClient();
- }
- catch (Exception ex)
- {
- Util.UErrorMessage(ex, 0, 0);
- }
- }
- public int ConnectSocket()
- {// 소켓 연결 함수
- int iret = 0;
- try
- {
- iret = this.Start_Connection();
- if (iret == 1)
- {// 연결 성공시
- this.cmdConnected = true;
- this.eventConnected = true;
- iret = this.cmd_tcpclient.Connected ? 1 : 0;
- }
- }
- catch (Exception ex)
- {
- iret = -1;
- Util.UErrorMessage(ex, 0, 0);
- }
- return iret;
- }
- public int DisconnectToDemon(int Own_ID, int Demon_ID)
- {// 데몬 연결 해제
- try
- {
- Stop_Connection();
- this.cmdConnected = false;
- this.eventConnected = false;
- }
- catch (Exception ex)
- {
- Util.UErrorMessage(ex, 0, 0);
- }
- return 0;
- }
- IPEndPoint CommandEndPoint { get { return new IPEndPoint(IPAddress.Parse(this.DestIP), this.commandPort); } }
- IPEndPoint EventEndPoint { get { return new IPEndPoint(IPAddress.Parse(this.DestIP), this.eventPort); } }
- //cmd연결정보
- public Boolean cmd_Connected
- {//2010,11,22, k.s.d , demon connection status check routine rollback , ( 탁은임 과장이 중간에 바꿨음. 왜 바꾼지는 모름 )
- get
- {
- Boolean TcpConnected = false;
- try
- {
- //if (this.cmd_tcpclient != null) {
- // TcpConnected = this.cmd_tcpclient.Connected;
- // if (TcpConnected) {
- // TcpConnected = this.cmdConnected;
- // }
- //}
- ////
- if (this.cmd_tcpclient != null) TcpConnected = this.cmdConnected;
- }
- catch (Exception ex)
- {
- Util.UErrorMessage(ex, 0, 0);
- }
- return TcpConnected;
- }
- }
- //이벤트연결정보
- public Boolean event_Connected
- {//2010,11,22, k.s.d , demon connection status check routine rollback , ( 탁은임 과장이 중간에 바꿨음. 왜 바꾼지는 모름 )
- get
- {
- Boolean TcpConnected = false;
- try
- {
- //if (this.event_tcpclient != null) {
- // TcpConnected = this.event_tcpclient.Connected;
- // if (TcpConnected) {
- // TcpConnected = this.eventConnected;
- // }
- //}
- ////
- if (this.event_tcpclient != null) TcpConnected = this.eventConnected;
- }
- catch (Exception ex)
- {
- Util.UErrorMessage(ex, 0, 0);
- }
- return TcpConnected;
- }
- }
- public int Start_Connection()
- {// 연결 시작 함수
- int ret = 0;
- try
- {
- ret = Start_Con_cmd();
- if (ret == 1)
- {// 연결 성공
- ret = Start_Con_event();
- }
- }
- catch (Exception ex)
- {
- ret = -1;
- Util.UErrorMessage(ex, 0, 0);
- }
- return ret;
- }
- // cyim 2016.12.29 : 화면 멈춤 문제 수정
- public delegate void Connect_Thread_Inform_Handler();
- public event Connect_Thread_Inform_Handler Connect_Thread_Inform_Event;
- public bool Connect_Thread_Inform_Event_Receive = false;
- public void Connect_Thread(TcpClient socket, int port, TimeSpan timeout)
- {
- Connect_Thread_Inform_Event_Receive = false;
- if (this.Connect_Thread_Inform_Event != null)
- this.Connect_Thread_Inform_Event -= new Connect_Thread_Inform_Handler(TSocket_Connect_Thread_Inform_Event);
- this.Connect_Thread_Inform_Event += new Connect_Thread_Inform_Handler(TSocket_Connect_Thread_Inform_Event);
- _ConnectThread ConnectThread = new _ConnectThread();
- ConnectThread.socket = socket;
- ConnectThread.port = port;
- ConnectThread.timeout = timeout;
- // 스레드로 실행
- Thread WorkingThread = new Thread(new ParameterizedThreadStart(Connect_Thread_WorkFunction));
- WorkingThread.Start(ConnectThread);
- // cyim 2017.01.02
- // 프로그램 구조를 잡은 최초 개발자의 의도와는 다르게 소방 수신반의 화면멈춤을 처리하기 위해 일부 변경해야 한다
- // 즉, 코드 루틴 중간에 접속을 위한 딜레이가 발생하는것은 어쩔수없이 이벤트 처리를 해야한다
- // 소스 루틴 중간에 접속여부를 물어보는 코드를 비동기로 처리하기 위해서 AutoResetEvent 와 같이 스레드가 무한으로 이벤트를 기다리게 할수는 있지만
- // 현재 구성된 구조를 변경해야 되므로 비동기+스레드 인 현재 상황에서는 이 방법이 최선인것같다
- while (true)
- {
- if (Connect_Thread_Inform_Event_Receive)
- break;
- }
- if (this.Connect_Thread_Inform_Event != null)
- this.Connect_Thread_Inform_Event -= new Connect_Thread_Inform_Handler(TSocket_Connect_Thread_Inform_Event);
- }
- public void TSocket_Connect_Thread_Inform_Event()
- {
- Connect_Thread_Inform_Event_Receive = true;
- }
- // 접속함수를 스레드도 대체하고 타임아웃을 발생시켜서 결과를 획득한다
- public bool Connect_Thread_Result = false;
- public void Connect_Thread_WorkFunction(object obj)
- {
- // 소켓 접속을 위한 정보
- _ConnectThread ConnectThread = (_ConnectThread)obj;
- TcpClient socket = ConnectThread.socket;
- int port = ConnectThread.port;
- TimeSpan timeout = ConnectThread.timeout;
- try
- {
- IPAddress addr = IPAddress.Parse(this.DestIP);
- var result = socket.BeginConnect(addr, port, null, null);
- bool success = result.AsyncWaitHandle.WaitOne(timeout, true);
- if (success)
- {
- socket.EndConnect(result);
- Connect_Thread_Result = true;
- }
- else
- {
- socket.Close();
- Connect_Thread_Result = false;
- Console.WriteLine(this.DestIP);
- }
- }
- catch
- {
- socket.Close();
- Connect_Thread_Result = false;
- }
- TSocket_Connect_Thread_Inform_Event();
- }
- // 2010,11,25, k.s.d , return value add .
- int Start_Con_cmd()
- {
- int ret = 0;
- try
- {
- // cyim 2016.12.29 : 화면 멈춤 문제 수정
- if (_Data.FireDeskMode == true)
- {
- Connect_Thread(this.cmd_tcpclient, this.commandPort, new TimeSpan(0, 0, 1));
- }
- else
- {
- this.cmd_tcpclient.Connect(this.CommandEndPoint);
- }
- this.cmd_sendStm = new NetworkStream(this.cmd_tcpclient.Client);
- this.cmd_recvStm = new NetworkStream(this.cmd_tcpclient.Client);
- this.cmd_rcv_th = new Thread(this.Cmd_ReceiveThread);
- this.cmd_rcv_th_state = 1;
- if (this.cmd_rcv_th != null) // 쓰레드 할당 여부 확인후 동작시킴.
- {
- this.cmd_rcv_th.Start();
- }
- ret = 1;
- }
- catch (Exception ex)
- {
- ret = -1;
- Util.UErrorMessage(ex, 0, 0);
- }
- return ret;
- }
- // 2010,11,25, k.s.d , return value add .
- int Start_Con_event()
- {
- int ret = 0;
- try
- {
- // cyim 2016.12.29 : 화면 멈춤 문제 수정
- if (_Data.FireDeskMode == true)
- {
- Connect_Thread(this.event_tcpclient, this.eventPort, new TimeSpan(0, 0, 1));
- }
- else
- {
- this.event_tcpclient.Connect(this.EventEndPoint);
- }
- this.event_sendStm = new NetworkStream(this.event_tcpclient.Client);
- if (this.event_sendStm == null)
- {
- ret = -1;
- return ret;
- }
- this.event_recvStm = new NetworkStream(this.event_tcpclient.Client);
- if (this.event_recvStm == null)
- {
- ret = -1;
- return ret;
- }
- this.event_rcv_th = new Thread(this.Event_ReceiveThread);
- if (this.event_rcv_th != null)
- {
- //===============================================
- // 에러 발견 수정 2013-06-05 CSW
- //===============================================
- this.event_rcv_th_state = 1;
- this.event_rcv_th.Start();
- ret = 1;
- }
- else
- {
- ret = -1;
- }
- //Util.UDebugMessage("Start_Con_event Start",0,0);
- }
- catch (Exception ex)
- {
- ret = -1;
- Util.UErrorMessage(ex, 0, 0);
- }
- return ret;
- }
- public void Stop_Connection()
- {
- try
- {
- //Util.UDebugMessage("Stop",0,0);
- Stop_Con_cmd();
- Stop_Con_event();
- }
- catch (Exception ex)
- {
- Util.UErrorMessage(ex, 0, 0);
- }
- }
- void Stop_Con_cmd()
- {
- try
- {
- // if (this.cmd_rcv_th_state == 1) this.cmd_rcv_th.Abort();
- if (this.cmd_rcv_th != null) // cyim 2016.12.28 : 예외처리 추가
- if (this.cmd_rcv_th.IsAlive)
- this.cmd_rcv_th.Abort(); // 쓰레드 종료.
- if (this.cmd_tcpclient != null) this.cmd_tcpclient.Close();
- }
- catch (Exception ex)
- {
- Util.UErrorMessage(ex, 0, 0);
- }
- }
- void Stop_Con_event()
- {
- try
- {
- //if (this.event_rcv_th_state == 1) this.event_rcv_th.Abort();
- if (this.event_rcv_th != null) // cyim 2016.12.28 : 예외처리 추가
- if (this.event_rcv_th.IsAlive)
- this.event_rcv_th.Abort();
- if (this.event_tcpclient != null) this.event_tcpclient.Close();
- }
- catch (Exception ex)
- {
- Util.UErrorMessage(ex, 0, 0);
- }
- }
- //명령전송
- public int Cmd_Send(byte[] bt, int size)
- { //2010.3.12ksd ,// cmd 전송 함수
- int ret = 0;
- try
- {
- if (this.cmd_tcpclient != null)
- {
- if (this.cmd_tcpclient.Connected)
- {
- try
- {
- string Data = String.Empty;
- for (int i = 0; i < bt.Length; i++)
- {
- string value = Convert.ToString(bt[i], 16);
- if (value.Length == 1) value = "0" + value;
- Data += value + " ";
- }
- if (Data.Substring(12, 2) != "14")
- LFC.Log("[ Commo ] [전송] " + Data);
- if (_Data.Enable_Log == true)
- {
- _Event.Log_SendMessage_Write("[ Commo ] [전송] " + Data);
- }
- this.cmd_sendStm.Write(bt, 0, size);
- this.cmd_sendStm.Flush();
- ret = 1;
- }
- catch (Exception ex)
- {
- Util.UErrorMessage(ex, 0, 0);
- ret = -3;
- }
- }
- else
- {
- ret = -2;
- }
- }
- else
- {
- ret = -1;
- }
- }
- catch (Exception ex)
- {
- ret = -1;
- Util.UErrorMessage(ex, 0, 0);
- }
- return ret;
- }
- void Cmd_ReceiveThread()
- {//cmd listen thread
- byte[] ReadBuffer = new byte[1024];
- int offset = 0;
- while (this.cmd_rcv_th_state == 1)
- {
- try
- {
- if (this.cmd_tcpclient.Connected)
- {
- // cyim 2013.7.19 속도개선작업
- //for (int i = 0; i < 1024; i++)
- //{
- // ReadBuffer[i] = 0x00;
- //}
- Array.Clear(ReadBuffer, 0, 1024);
- offset = 0;
- if (this.cmd_recvStm.CanRead)
- {
- offset = this.cmd_recvStm.Read(ReadBuffer, 0, ReadBuffer.Length);
- //Debug.WriteLine("Receive Read : " + offset.ToString());
- if (offset > 0)
- {
- //Debug.WriteLine(ToHex(ReadBuffer, offset));
- string Data = String.Empty;
- for (int i = 0; i < offset; i++) // for (int i = 0; i < ReadBuffer.Length; i++)
- {
- string value = Convert.ToString(ReadBuffer[i], 16);
- if (value.Length == 1) value = "0" + value;
- Data += value + " ";
- }
- if (Data.Substring(12, 2) != "80" && Data.Substring(12, 2) != "94")
- LFC.Log("[ Commo ] [응답] " + Data);
- if (_Data.Enable_Log == true)
- {
- _Event.Log_SendMessage_Write("[ Commo ] [응답] " + Data);
- System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + " 응답 " + Data + "\r\n");
- }
- CMDReceiveMSGProc(ReadBuffer, offset);
- }
- else
- {
- if (cmd_recvStm.DataAvailable)
- {
- //Debug.WriteLine("cmd_recvStm.DataAvailable");
- }
- else
- {
- //Debug.WriteLine("Error");
- this.cmd_rcv_th_state = 0;
- this.cmdConnected = false;
- break;
- }
- }
- }
- else
- {
- //Debug.WriteLine("Error");
- this.cmd_rcv_th_state = 0;
- this.cmdConnected = false;
- break;
- }
- this.cmd_recvStm.Flush();
- }
- else
- {
- // don't connected
- //Debug.WriteLine("Error");
- this.cmd_rcv_th_state = 0;
- this.cmdConnected = false;
- break;
- }
- }
- catch (Exception ex)
- {
- Util.UErrorMessage(ex, 0, 0);
- //Debug.WriteLine(e.ToString());
- //Debug.WriteLine("Error");
- this.cmd_rcv_th_state = 0;
- this.cmdConnected = false;
- break;
- }
- }
- this.cmd_rcv_th_state = 0;
- }
- //void Cmd_ReceiveThread()
- //{
- // try
- // {
- // byte[] ReadBuffer = new byte[1024];
- // int offset = 0;
- // while (this.cmd_rcv_th_state == 1)
- // {
- // if (this.cmd_tcpclient.Connected)
- // {
- // //Debug.WriteLine("Receive Connected");
- // for (int i = 0; i < 1024; i++)
- // {
- // ReadBuffer[i] = 0x00;
- // }
- // offset = 0;
- // if (this.cmd_recvStm.CanRead)
- // {
- // //Debug.WriteLine("Receive CanRead");
- // offset = this.cmd_recvStm.Read(ReadBuffer, 0, ReadBuffer.Length);
- // //Debug.WriteLine("Receive Read");
- // if (offset > 0)
- // {
- // Debug.WriteLine(ToHex(ReadBuffer, offset));
- // CMDReceiveMSGProc(ReadBuffer, offset);
- // }
- // else
- // {
- // //데몬이 죽었다..
- // this.cmd_rcv_th_state = 0;
- // Stop_Con_cmd();
- // break;
- // }
- // }
- // //데몬이 끊기면 무한루프 돈다..
- // //if (!this.cmd_recvStm.DataAvailable) this.cmd_rcv_th_state = 0;
- // this.cmd_recvStm.Flush();
- // }
- // else
- // {
- // // don't connected
- // break;
- // }
- // }
- // this.cmd_rcv_th_state = 0;
- // }
- // catch (Exception ex)
- // {
- // MessageBox.Show(string.Format("[{0}]\r\n{1}",ex.Message,ex.Source),Application.ProductName);
- // }
- //}
- void CMDReceiveMSGProc(byte[] ReadBuffer, int size)
- {
- // cmd message processing function
- // cyim 2013.7.19 속도개선작업
- //init buffer
- //for (int i = 0; i < 2048; i++)
- //{
- // CMD_RcvBuffer[i] = 0x00;
- //}
- Array.Clear(CMD_RcvBuffer, 0, 2048);
- CMD_RcvBufferPos = 0;
- for (int i = 0; i < size; i++)
- {
- //copy buffer
- CMD_RcvBuffer[CMD_RcvBufferPos + i] = ReadBuffer[i];
- }
- CMD_RcvBufferPos += size;
- int datasize = CMD_RcvBuffer[3];
- if (datasize == 0)
- {
- datasize = (CMD_RcvBuffer[5] & 0xff | (CMD_RcvBuffer[6] << 8) & 0xff00) & 0xffff;
- }
- //CMDResponceFunc(datasize);
- byte[] cmdbuffer = new byte[datasize + 1];
- Array.Copy(CMD_RcvBuffer, 0, cmdbuffer, 0, datasize + 1);
- //for (int i = 0; i < rcvSize + 1; i++)
- //{//copy data
- // cmdbuffer[i] = rcvBuff[i];
- //}
- for (int i = 0; i < 2048; i++)
- {//rcv buffer compress
- if (i < CMD_RcvBufferPos)
- {
- CMD_RcvBuffer[i] = CMD_RcvBuffer[i + datasize + 1];
- }
- else
- {
- CMD_RcvBuffer[i] = 0x00;
- }
- CMD_RcvBufferPos -= datasize + 1;
- }
- //명령처리 이벤트
- CMDRcvProcess(cmdbuffer, datasize);
- }
- public void Event_Send(byte[] bt, int size)
- { //2010.3.17_moon //don't using
- try
- {
- if (this.event_tcpclient != null)
- {
- if (this.event_tcpclient.Connected)
- {
- this.event_sendStm.Write(bt, 0, size);
- this.event_sendStm.Flush();
- }
- }
- }
- catch (Exception ex)
- {
- Util.UErrorMessage(ex, 0, 0);
- }
- }
- //void Event_ReceiveThread()
- //{
- // byte[] ReadBuffer = new byte[1024];
- // int offset = 0;
- // while (this.event_rcv_th_state == 1)
- // {
- // if (this.event_tcpclient.Connected)
- // {
- // // Debug.WriteLine("Event_ReceiveThread");
- // try
- // {
- // if (this.event_recvStm.CanRead)
- // {
- // for (int i = 0; i < 1024; i++)
- // {
- // ReadBuffer[i] = 0x00;
- // }
- // offset = this.event_recvStm.Read(ReadBuffer, 0, ReadBuffer.Length);
- // if (offset > 0)
- // {
- // string str;
- // str = ToHex(ReadBuffer, offset);
- // Debug.WriteLine("Event_ReceiveThread size : " + offset.ToString() + "//data : " + str);
- // // Debug.WriteLine(string.Format("0x{0:x2} ", ReadBuffer[offset-1]));
- // EVENTReceiveMSGFunc(ReadBuffer, offset);
- // }
- // else
- // {
- // //데몬이 죽었다..
- // this.event_rcv_th_state = 0;
- // Stop_Con_event();
- // break;
- // }
- // }
- // this.event_recvStm.Flush();
- // // call main func -> case by case
- // }
- // catch (Exception e)
- // {
- // //error
- // Debug.WriteLine(e.Message);
- // }
- // }
- // else
- // {
- // break;
- // }
- // }
- // this.event_rcv_th_state = 0;
- //}
- void Event_ReceiveThread()
- {// event listen thread
- byte[] ReadBuffer = new byte[3072];//2048
- int offset = 0;
- while (this.event_rcv_th_state == 1)
- {
- if (this.event_tcpclient.Connected)
- {
- // //Debug.WriteLine("Event_ReceiveThread");
- try
- {
- if (this.event_recvStm.CanRead)
- {
- // cyim 2013.7.19 속도개선작업
- //for (int i = 0; i < 3072; i++)
- //{
- // ReadBuffer[i] = 0x00;
- //}
- Array.Clear(ReadBuffer, 0, 3072);//2048
- offset = this.event_recvStm.Read(ReadBuffer, 0, ReadBuffer.Length);
- if (offset > 0)
- {
- string str;
- str = ToHex(ReadBuffer, offset);
- //Debug.WriteLine("Event_ReceiveThread size : " + offset.ToString() + "//data : " + str);3072
- // //Debug.WriteLine(string.Format("0x{0:x2} ", ReadBuffer[offset-1]));
- //Util.LogBineryWrite(ReadBuffer, offset); //데몬에서 보내온 패킷을 파일에 저장한다.. --임시
- EVENTReceiveMSGFunc(ReadBuffer, offset);
- // LCH 2018.02.27 : 이벤트 로그
- /*
- if (_Data.Enable_Log == true)
- {
- string Data = String.Empty;
- for (int i = 0; i < offset; i++) // for (int i = 0; i < ReadBuffer.Length; i++)
- {
- string value = Convert.ToString(ReadBuffer[i], 16);
- if (value.Length == 1) value = "0" + value;
- Data += value + " ";
- }
- _Event.Log_SendMessage_Write("[ Event ] [응답] " + Data);
- LFC.Log("[ Event ] [응답] " + Data);
- //System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + " 응답 " + Data + "\r\n");
- }
- else
- {
- string Data = String.Empty;
- for (int i = 0; i < offset; i++) // for (int i = 0; i < ReadBuffer.Length; i++)
- {
- string value = Convert.ToString(ReadBuffer[i], 16);
- if (value.Length == 1) value = "0" + value;
- Data += value + " ";
- }
- LFC.Log("[ Event ] [응답] " + Data);
- }*/
- }
- else
- {
- if (event_recvStm.DataAvailable)
- {
- //Debug.WriteLine("cmd_recvStm.DataAvailable");
- }
- else
- {
- //Debug.WriteLine("Error");
- this.event_rcv_th_state = 0;
- this.eventConnected = false;
- break;
- }
- }
- }
- else
- {
- //Debug.WriteLine("Error");
- this.cmd_rcv_th_state = 0;
- this.cmdConnected = false;
- break;
- }
- this.event_recvStm.Flush();
- // call main func -> case by case
- }
- catch (Exception ex)
- {
- Util.UErrorMessage(ex, 0, 0);
- //Debug.WriteLine(e.Message);
- //Debug.WriteLine("Error");
- this.cmd_rcv_th_state = 0;
- this.cmdConnected = false;
- break;
- }
- }
- else
- {
- //Debug.WriteLine("Error");
- this.cmd_rcv_th_state = 0;
- this.cmdConnected = false;
- break;
- }
- }
- this.event_rcv_th_state = 0;
- }
- byte[] EVENT_RcvBuffer = new byte[6144];
- int EVENT_RcvBufferPos = 0;
- void EVENTReceiveMSGFunc(byte[] ReadBuffer, int size)
- {
- // event data processing functin
- //Util.LogWrite(string.Format("EVENTReceiveMSGFunc() ReadBuffer:{0},size:{1}", Util.ToHex(ReadBuffer), size));
- if ((EVENT_RcvBufferPos < 0) && (EVENT_RcvBufferPos > 3072))
- {
- // cyim 2013.7.19 버퍼 초과 경고창
- //Util.LogWrite(string.Format("버퍼사이즈 초과!! 에러 EVENT_RcvBufferPos:{0}", EVENT_RcvBufferPos));
- // cyim 2015.8.4 수신반을 위한 static 클래스 정리 : 불필요한 루틴 제거
- //mdi.Event.SocketBufferError_Inform_Write(string.Format("버퍼사이즈 초과!! 에러 EVENT_RcvBufferPos:{0}", EVENT_RcvBufferPos));
- // cyim 2013.7.19 속도개선작업
- //init buffer
- //for (int i = 0; i < 3072; i++)
- //{
- // EVENT_RcvBuffer[i] = 0x00;
- //}
- Array.Clear(EVENT_RcvBuffer, 0, 3072);
- EVENT_RcvBufferPos = 0;
- }
- for (int i = 0; i < size; i++)
- {
- //copy buffer
- EVENT_RcvBuffer[EVENT_RcvBufferPos + i] = ReadBuffer[i];
- }
- EVENT_RcvBufferPos += size;
- while (EVENT_RcvBufferPos > 7)
- {
- // data minimum size
- if (EVENT_RcvBuffer[0] == 0x02)
- {
- // stx
- if (EVENT_RcvBuffer[3] == 0x00)
- {
- //extend size
- int extendsize = (EVENT_RcvBuffer[5] & 0xff | (EVENT_RcvBuffer[6] << 8) & 0xff00) & 0xffff;
- //Util.UDebugMessage("EVENTReceiveMSGFunc: extend size : " + extendsize.ToString(),0,0);
- if (extendsize + 1 > EVENT_RcvBufferPos)
- {
- //short , next
- //Util.UDebugMessage("EVENTReceiveMSGFunc: short , next ",0,0);
- break;
- }
- else
- {
- //processing
- //처리할 패킷만큼 보낸다..
- byte[] cmdbuffer = new byte[extendsize + 1];
- Array.Copy(EVENT_RcvBuffer, cmdbuffer, extendsize + 1);
- EVENTRcvProcess(cmdbuffer, extendsize); //패킷처리
- //로그 처리 cmdbuffer, extendsiz
- if (_Data.Enable_Log == true)
- {
- string Data = String.Empty;
- for (int i = 0; i < extendsize; i++) // for (int i = 0; i < ReadBuffer.Length; i++)
- {
- string value = Convert.ToString(cmdbuffer[i], 16);
- if (value.Length == 1) value = "0" + value;
- Data += value + " ";
- }
- _Event.Log_SendMessage_Write("[ Event ] [응답] " + Data);
- LFC.Log("[ Event ] [응답] " + Data);
- }
- else
- {
- string Data = String.Empty;
- for (int i = 0; i < extendsize; i++) // for (int i = 0; i < ReadBuffer.Length; i++)
- {
- string value = Convert.ToString(cmdbuffer[i], 16);
- if (value.Length == 1) value = "0" + value;
- Data += value + " ";
- }
- LFC.Log("[ Event ] [응답] " + Data);
- }
- //처리한 패킷을 제거한다.
- Array.Copy(EVENT_RcvBuffer, extendsize + 1, EVENT_RcvBuffer, 0, EVENT_RcvBuffer.Length - extendsize - 1);
- EVENT_RcvBufferPos -= extendsize + 1;
- //Debug.WriteLine("EVENTReceiveMSGFunc: processing ");
- //EVENTRcvProcess(EVENT_RcvBuffer,extendsize);
- //Util.LogWrite(string.Format("EVENT_RcvBuffer:{0},Length:{1}", Util.ToHex(EVENT_RcvBuffer), extendsize));
- //EVENT_RcvBufferPos -= extendsize + 1;
- }
- }
- else if (EVENT_RcvBuffer[3] + 1 > EVENT_RcvBufferPos)
- {
- //short , next
- //Util.UDebugMessage("EVENTReceiveMSGFunc: short , next",0,0);
- break;
- }
- else
- {
- int extendsize = EVENT_RcvBuffer[3];
- //처리할 패킷만큼 보낸다..
- byte[] cmdbuffer = new byte[extendsize + 1];
- Array.Copy(EVENT_RcvBuffer, cmdbuffer, extendsize + 1);
- EVENTRcvProcess(cmdbuffer, extendsize); //패킷처리
- //로그 처리 cmdbuffer, extendsiz
- if (_Data.Enable_Log == true)
- {
- string Data = String.Empty;
- for (int i = 0; i < extendsize; i++) // for (int i = 0; i < ReadBuffer.Length; i++)
- {
- string value = Convert.ToString(cmdbuffer[i], 16);
- if (value.Length == 1) value = "0" + value;
- Data += value + " ";
- }
- _Event.Log_SendMessage_Write("[ Event ] [응답] " + Data);
- LFC.Log("[ Event ] [응답] " + Data);
- }
- else
- {
- string Data = String.Empty;
- for (int i = 0; i < extendsize; i++) // for (int i = 0; i < ReadBuffer.Length; i++)
- {
- string value = Convert.ToString(cmdbuffer[i], 16);
- if (value.Length == 1) value = "0" + value;
- Data += value + " ";
- }
- LFC.Log("[ Event ] [응답] " + Data);
- }
- //처리한 패킷을 제거한다.
- Array.Copy(EVENT_RcvBuffer, extendsize + 1, EVENT_RcvBuffer, 0, EVENT_RcvBuffer.Length - extendsize - 1);
- EVENT_RcvBufferPos -= extendsize + 1;
- ////processing
- //Debug.WriteLine("EVENTReceiveMSGFunc: size : " + EVENT_RcvBuffer[3].ToString());
- //Debug.WriteLine("EVENTReceiveMSGFunc: processing" + EVENT_RcvBuffer[3].ToString());
- //int extendsize = EVENT_RcvBuffer[3];
- //EVENTRcvProcess(EVENT_RcvBuffer, extendsize);
- //Util.LogWrite(string.Format("EVENT_RcvBuffer:{0},Length:{1}", Util.ToHex(EVENT_RcvBuffer), extendsize));
- //EVENT_RcvBufferPos -= extendsize + 1;
- }
- }
- else
- {
- // header error
- Util.LogWrite(string.Format("EVENTReceiveMSGFunc header error {0}", Util.ToHex(EVENT_RcvBuffer))); //명령 로그에 저장
- //Debug.WriteLine("EVENTReceiveMSGFunc: header error : " + EVENT_RcvBuffer[0].ToString());
- for (int i = 0; i < 3072; i++)
- {
- //init buffer
- //EVENT_RcvBuffer[i] = 0x00;
- //다음 헤더를 찾는다..
- if (EVENT_RcvBuffer[i] == 0x02)
- {
- //헤더를 찾은위치 이전까지 버린다.
- int extendsize = i - 1;
- //처리한 패킷을 제거한다.
- Array.Copy(EVENT_RcvBuffer, extendsize + 1, EVENT_RcvBuffer, 0, EVENT_RcvBuffer.Length - extendsize - 1);
- EVENT_RcvBufferPos -= extendsize + 1;
- break;
- }
- }
- //for (int i = 0; i < 3072; i++)
- //{//init buffer
- // EVENT_RcvBuffer[i] = 0x00;
- //}
- //EVENT_RcvBufferPos = 0;
- break;
- }
- }
- }
- string ToHex(byte[] bin_data)
- {// byte to hex function
- string result = "";
- try
- {
- foreach (byte ch in bin_data)
- {
- result += string.Format("{0:x2} ", ch);
- }
- }
- catch (Exception ex)
- {
- Util.UErrorMessage(ex, 0, 0);
- }
- return result;
- }
- string ToHex(byte[] bin_data, int len)
- {// multiple byte to hex
- string result = "";
- try
- {
- for (int i = 0; i < len; i++)
- {
- result += string.Format("{0:x2} ", bin_data[i]);
- }
- }
- catch (Exception ex)
- {
- Util.UErrorMessage(ex, 0, 0);
- }
- return result;
- }
- }
- }
|