using HslCommunication.Enthernet;
using IMCS.Device;
using IMCS_CCS.Utils.DeviceProtocol;
using Newtonsoft.Json;
using Opc.Ua;
using Opc.Ua.Client;
using SinumerikOpcUaAPI;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using YG;
using YG.Device;
using static SinumerikOpcUaAPI.Server;
using System.Collections;
using System.Runtime.Remoting.Messaging;
using System.Reflection.Emit;
using System.Runtime.Remoting.Channels;
using System.Net.NetworkInformation;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.Tab;

namespace IMCS
{
    public partial class Form_Main : Form
    {
        //public string UPLOAD_NC_PATH = "Sinumerik/FileSystem/Work Pieces/";
        public string UPLOAD_NC_PATH = "Sinumerik/FileSystem/NCExtend/wks.dir/nc_program/";
        public string UPLOAD_TOOL_PATH = "Sinumerik/FileSystem/NCExtend/wks.dir/tool_device/";
        //public string UPLOAD_NC_PATH = "Sinumerik/FileSystem/Work Pieces/WORK_NC/";
        public string CHANNEL_NO = "1";
        public string TEMP_NC_NAME = "7999.MPF";
        private uint currentToolArea = 1;
        private ushort mNAMESPACE_INDEX = 2;

        // 作为长连接进行bean的存储， key使用ip，
        Dictionary<string, Server> opcServerMap = new Dictionary<string, Server>();
        
        public Dictionary<string, Server> deviceList { get; set; } = new Dictionary<string, Server>();

        public Form_Main()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {

            HttpListener httpListenner;
            httpListenner = new HttpListener();
            httpListenner.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
            httpListenner.Prefixes.Add("http://127.0.0.1:8010/opcua/");
            httpListenner.Start();
            label1.Text = "HttpServer已开启：http://127.0.0.1:8010/opcua/";
            new Thread(new ThreadStart(delegate
            {
                try
                {
                    loop(httpListenner);

                }
                catch (Exception ex)
                {
                    string ss = ex.ToString();
                    httpListenner.Stop();

                    /*  Application.ExitThread();
                      Application.Exit();
                      Application.Restart();
                      Process.GetCurrentProcess().Kill();*/
                }
            })).Start();

        }


        private void loop(HttpListener httpListenner)
        {

            while (true)
            {
                HttpListenerContext context = httpListenner.GetContext();
                context.Response.AppendHeader("Access-Control-Allow-Origin", "*");
                HttpListenerRequest request = context.Request;
                HttpListenerResponse response = context.Response;
                Servlet servlet = new MyServlet();
                servlet.onCreate();
                if (request.HttpMethod == "POST")
                {
                    if (!request.Url.ToString().Contains("favicon"))
                    {
                        RequestBody opcBody = null;
                        ResponseBody responseBody = new ResponseBody();
                        Server opcServer = null;
                        try
                        {
                            Stream stream = context.Request.InputStream;
                            StreamReader reader = new StreamReader(stream, Encoding.UTF8);
                            string body = reader.ReadToEnd();

                            YG.Log.Instance.WriteLogAdd(">>>===收到POST数据 : >>>>===" + body);
                            

                            opcBody = JsonConvert.DeserializeObject<RequestBody>(body);

                            AddList(DateTime.Now.ToString(), "POST", opcBody.ServerUrl + opcBody.Type, "OK");

                            /*if (deviceList == null || (deviceList.Where(m => m.Key.Equals(opcBody.ServerUrl)).Count() == 0))
                            {
                                opcServer = DeviceOPCUat.OpcUa_Connection1(opcBody.ServerUrl, opcBody.UserName, opcBody.Password);
                                if (opcServer.Session != null)
                                {
                                    deviceList.Add(opcBody.ServerUrl, opcServer);
                                }
                            }
                            else
                            {
                                opcServer = deviceList.Where(m => m.Key.Equals(opcBody.ServerUrl)).FirstOrDefault().Value;
                            }*/
                            /*if (opcServer == null || !opcServer.Session.Connected)
                            {
                                opcServer = DeviceOPCUat.OpcUa_Connection1(opcBody.ServerUrl, opcBody.UserName, opcBody.Password);
                            }*/
                            
                            // 从map中取出opcServer 判断是否存在，以及是否可用
                            opcServerMap.TryGetValue(opcBody.ServerUrl, out opcServer);

                            // 如果key不存在，或者存在单连接不上，则需要重新创建连接
                            if (!opcServerMap.ContainsKey(opcBody.ServerUrl) || !opcServer.Session.Connected)
                            {
                                Ping pingSender = new Ping();
                                PingReply reply = pingSender.Send(opcBody.Ip);
                                if (reply.Status == IPStatus.Success)
                                {
                                    opcServer = DeviceOPCUat.OpcUa_Connection1(opcBody.ServerUrl, opcBody.UserName, opcBody.Password);
                                }

                                if (opcServer != null && opcServer.Session != null && opcServer.Session.Connected) { 
                                    // 存储Server bean
                                    opcServerMap.Add(opcBody.ServerUrl, opcServer);
                                }

                            }
                            //opcServer = DeviceOPCUat.OpcUa_Connection1(opcBody.ServerUrl, opcBody.UserName, opcBody.Password);
                            //opcServer.IsOn
                            //else
                            //{
                            //    opcServer.Session.Reconnect();
                            //}

                            if (opcServer!=null && opcServer.Session!=null && opcServer.Session.Connected)
                            {
                                if (opcBody.Type == ActionTypeEnum.Connect.ToString()) //连接状态
                                {
                                    responseBody.result = true;
                                }
                                else if (opcBody.Type == ActionTypeEnum.Collect.ToString()) //采集
                                {
                                    //ETH_S7Simens s7 = new ETH_S7Simens("192.168.11.164");

                                    //responseBody.runDatasInfo = JsonConvert.SerializeObject(s7.deviceInfo);

                                    if(opcBody.check == null)
                                    {
                                        // 封装需要采集字段的数据
                                        this.addAddress(opcBody);
                                    }
                                    else
                                    {
                                        opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX626.6");//千机质检结果
                                    }
                                    List<string> values = opcServer.ReadValues(opcBody.Addresses);
                                    responseBody.values = values;
                                    /*RunDatasInfo runDatasInfo = new RunDatasInfo();
                                    for (int i = 0; i < values.Count; i++)
                                    {
                                        if (i == 0)
                                        {
                                            runDatasInfo.feedRate = values[i];
                                        }
                                        else if (i == 1)
                                        {
                                            runDatasInfo.spindleMagnification = values[i];
                                        }
                                        else if (i == 2)
                                        {
                                            runDatasInfo.spindleSpeed = values[i];
                                        }
                                        else if (i == 3)
                                        {
                                            runDatasInfo.spindleLoad = values[i];
                                        }
                                        else if (i == 4)
                                        {
                                            runDatasInfo.mainPro = values[i];
                                        }
                                        else if (i == 5)
                                        {
                                            runDatasInfo.content = values[i];
                                        }
                                    }
                                    responseBody.runDatasInfo = JsonConvert.SerializeObject(runDatasInfo);*/

                                    /*//报警 
                                    SinumerikOpcUaAPI.FilterDefinition m_filter = new SinumerikOpcUaAPI.FilterDefinition();
                                    m_filter.AreaId = new NodeId("Sinumerik", (ushort)2);
                                    m_filter.Severity = EventSeverity.Min;
                                    m_filter.IgnoreSuppressedOrShelved = true;
                                    m_filter.EventTypes = (IList<NodeId>)new NodeId[1]
                                    {
                                     ObjectTypeIds.ConditionType
                                    };
                                    m_filter.SelectClauses = m_filter.ConstructSelectClauses(opcServer.Session, ObjectTypeIds.ConditionType);
                                    for (int index = 0; index < m_filter.SelectClauses.Count<SimpleAttributeOperand>(); ++index)
                                    {
                                        responseBody.errorsInfo += m_filter.SelectClauses[index].ToString() + (object)index + " ";
                                    }*/
                                }
                                else if (opcBody.Type == ActionTypeEnum.ToolList.ToString())
                                {
                                    List<string> nums = this.readVariables(opcServer, new string[1]
                                        {
                                            "/Tool/Catalogue/numTools[u<Area index>]".Replace("<Area index>", this.currentToolArea.ToString())
                                        }
                                    );
                                    int num = int.Parse(nums[0]);
                                    List<ToolsInfo> toolInfoList = new List<ToolsInfo>();
                                    for (int index = 1; index <= num; index++)
                                    {
                                        try
                                        {
                                            List<string> stringList = this.readVariables(opcServer, new string[10]
                                       {
                                          "/Tool/Catalogue/toolNo[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
                                          "/Tool/Catalogue/toolIdent[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
                                          "/Tool/Catalogue/toolInMag[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
                                          "/Tool/Catalogue/toolInPlace[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
                                          "/Tool/Catalogue/nrDuplo[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
                                          "/Tool/Catalogue/numCuttEdges[u<Area index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Row index>", index.ToString()),
                                          "/Tool/Compensation/edgeData[u<Area index>,c<Column index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Column index>",index.ToString()).Replace("<Row index>", "3"),
                                          "/Tool/Compensation/edgeData[u<Area index>,c<Column index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Column index>",index.ToString()).Replace("<Row index>", "6"),
                                          "/Tool/Compensation/edgeData[u<Area index>,c<Column index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Column index>",index.ToString()).Replace("<Row index>", "12"),
                                          "/Tool/Compensation/edgeData[u<Area index>,c<Column index>, <Row index>]".Replace("<Area index>", this.currentToolArea.ToString()).Replace("<Column index>",index.ToString()).Replace("<Row index>", "15")
                                       }
                                       );

                                            ToolsInfo toolInfo = new ToolsInfo(); ;
                                            toolInfo.number = Convert.ToUInt16(stringList[0]) + "";
                                            toolInfo.name = stringList[1];
                                            toolInfo.length = stringList[6];
                                            toolInfo.radius = stringList[7];
                                            toolInfo.wearLength = stringList[8];
                                            toolInfo.wearRadius = stringList[9];
                                            //toolInfo.toolInMag = Convert.ToUInt16(stringList[2]);
                                            //toolInfo.toolInPlace = Convert.ToUInt16(stringList[3]);
                                            //toolInfo.nrDuplo = Convert.ToUInt16(stringList[4]);
                                            //toolInfo.numCuttEdges = Convert.ToUInt16(stringList[5]);
                                            toolInfoList.Add(toolInfo);
                                        }
                                        catch (Exception ex)
                                        {
                                            YG.Log.Instance.WriteLogAdd($"{ex.Message}"+":"+ index);
                                        }
                                        
                                    }
                                    responseBody.toolsInfo = JsonConvert.SerializeObject(toolInfoList);
                                }
                                else if (opcBody.Type == ActionTypeEnum.Read.ToString())
                                {
                                    responseBody.values = opcServer.ReadValues(opcBody.Addresses);
                                }
                                else if (opcBody.Type == ActionTypeEnum.Write.ToString())
                                {
                                    opcServer.WriteValues(opcBody.Values, opcBody.Addresses);
                                }
                                else if (opcBody.Type == ActionTypeEnum.SelectNc.ToString())
                                {
                                    string sSelectedFileName = Path.GetFileName(opcBody.Path);
                                    string status = opcServer.MethodCallSelectProgram(UPLOAD_NC_PATH + sSelectedFileName, Convert.ToUInt32(CHANNEL_NO)).status;
                                    if (status == "Good")
                                    {
                                        responseBody.msg = "选择成功";
                                    }
                                    else
                                    {
                                        responseBody.msg = "选择失败";
                                    }
                                }
                                else if (opcBody.Type == ActionTypeEnum.Upload.ToString())
                                {
                                    string file = opcBody.Path;
                                    string serverPath = "";
                                    string status = "";
                                    //选择临时文件
                                    status = opcServer.MethodCallSelectProgram(UPLOAD_NC_PATH + TEMP_NC_NAME, Convert.ToUInt32(CHANNEL_NO)).status;
                                    try
                                    {
                                        string extension = Path.GetExtension(file);
                                        if (string.IsNullOrWhiteSpace(extension))
                                        {
                                            responseBody.msg = "文件名不合法";
                                        }
                                        try
                                        {

                                            byte[] data = opcServer.ReadFile(file);

                                            serverPath = UPLOAD_NC_PATH + Path.GetFileName(file);
                                            Server.MethodCallResult methodCallResult = opcServer.MethodCallCopyFileToServer("/Methods/CopyFileToServer", serverPath, data, true);

                                            if (methodCallResult.status.ToUpper().Equals("GOOD"))
                                            {
                                                responseBody.msg = "上传文件成功";
                                                YG.Log.Instance.WriteLogAdd(file + "上传文件成功");
                                            }
                                            else
                                            {
                                                responseBody.msg = "上传文件失败";
                                                YG.Log.Instance.WriteLogAdd(file + "上传文件失败");
                                            }
                                            // } 
                                        }
                                        catch (Exception ex)
                                        {
                                            responseBody.msg = "上传文件失败===>" + ex.Message;
                                            YG.Log.Instance.WriteLogAdd($"{ex.Message}");
                                        }


                                    }
                                    catch (Exception ex)
                                    {
                                        responseBody.msg = "上传文件失败===>" + ex.Message;
                                        YG.Log.Instance.WriteLogAdd($"493-->{ex.Message}");
                                    }
                                    //设位主程序
                                    status = opcServer.MethodCallSelectProgram(serverPath, Convert.ToUInt32(CHANNEL_NO)).status;
                                }
                                else if (opcBody.Type == ActionTypeEnum.UploadFileList.ToString())
                                {
                                    //选择临时文件
                                    string status = opcServer.MethodCallSelectProgram(UPLOAD_NC_PATH + TEMP_NC_NAME, Convert.ToUInt32(CHANNEL_NO)).status;

                                    for (int i = 0; i < opcBody.subFileList.Count; i++)
                                    {
                                        string file = opcBody.subFileList[i];
                                        string serverPath = "";
                                        try
                                        {
                                            string extension = Path.GetExtension(file);
                                            if (string.IsNullOrWhiteSpace(extension))
                                            {
                                                responseBody.result = false;
                                                responseBody.msg = file + "==文件名不合法";
                                                break;
                                            }
                                            try
                                            {

                                                byte[] data = opcServer.ReadFile(file);

                                                serverPath = UPLOAD_NC_PATH + Path.GetFileName(file);
                                                Server.MethodCallResult methodCallResult = opcServer.MethodCallCopyFileToServer("/Methods/CopyFileToServer", serverPath, data, true);

                                                if (methodCallResult.status.ToUpper().Equals("GOOD"))
                                                {
                                                    responseBody.msg = "上传文件成功";
                                                    YG.Log.Instance.WriteLogAdd(file + "上传文件成功");
                                                }
                                                else
                                                {
                                                    responseBody.msg = "上传文件失败";
                                                    responseBody.result = false;
                                                    YG.Log.Instance.WriteLogAdd(file + "上传文件失败");
                                                    break;
                                                }
                                            }
                                            catch (Exception ex)
                                            {
                                                responseBody.msg = "上传文件失败===>" + ex.Message;
                                                YG.Log.Instance.WriteLogAdd($"{ex.Message}");
                                                break;
                                            }


                                        }
                                        catch (Exception ex)
                                        {
                                            responseBody.msg = "上传文件失败===>" + ex.Message;
                                            responseBody.result = false;
                                            YG.Log.Instance.WriteLogAdd($"493-->{ex.Message}");
                                        }
                                    }

                                    //设为主程序
                                    status = opcServer.MethodCallSelectProgram(UPLOAD_NC_PATH + opcBody.prgName, Convert.ToUInt32(CHANNEL_NO)).status;
                                    if (status != "Good")
                                    {
                                        responseBody.msg = "选择失败";
                                        responseBody.result = false;
                                    }

                                    for (int i = 0; i < opcBody.toolFileList.Count; i++)
                                    {
                                        string file = opcBody.toolFileList[i];
                                        string serverPath = "";
                                        try
                                        {
                                            string extension = Path.GetExtension(file);
                                            if (string.IsNullOrWhiteSpace(extension))
                                            {
                                                responseBody.result = false;
                                                responseBody.msg = file + "==文件名不合法";
                                                break;
                                            }
                                            try
                                            {

                                                byte[] data = opcServer.ReadFile(file);

                                                serverPath = UPLOAD_TOOL_PATH + Path.GetFileName(file);
                                                Server.MethodCallResult methodCallResult = opcServer.MethodCallCopyFileToServer("/Methods/CopyFileToServer", serverPath, data, true);

                                                if (methodCallResult.status.ToUpper().Equals("GOOD"))
                                                {

                                                    YG.Log.Instance.WriteLogAdd(file + "对刀仪上传文件成功");
                                                }
                                                else
                                                {
                                                   
                                                    YG.Log.Instance.WriteLogAdd(file + "对刀仪上传文件失败");
                                                    break;
                                                }
                                            }
                                            catch (Exception ex)
                                            {
                                               
                                                YG.Log.Instance.WriteLogAdd($"{ex.Message}");
                                                break;
                                            }


                                        }
                                        catch (Exception ex)
                                        {

                                            YG.Log.Instance.WriteLogAdd($"对刀仪493-->{ex.Message}");
                                        }
                                    }


                                    
                                }
                                else if (opcBody.Type == ActionTypeEnum.DownLoad.ToString())
                                {
                                    string file = opcBody.Path;
                                    string serverPath = "";
                                    try
                                    {
                                        string extension = Path.GetExtension(file);
                                        if (string.IsNullOrWhiteSpace(extension))
                                        {
                                            responseBody.msg = "文件名不合法";
                                        }
                                        try
                                        {

                                            //byte[] data = opcServer.ReadFile(file);

                                            serverPath = UPLOAD_NC_PATH + Path.GetFileName(file);
                                            // Server.MethodCallResult methodCallResult = opcServer.MethodCallCopyFileFromServer("/Methods/CopyFileFromServer", serverPath);

                                            //

                                            byte[] op = opcServer.ReadFile(serverPath);

                                            DiagnosticInfoCollection diagnosticInfos = null;
                                            CallMethodRequestCollection callMethodRequestCollection = new CallMethodRequestCollection();
                                            CallMethodResultCollection results = new CallMethodResultCollection();
                                            CallMethodRequest callMethodRequest = new CallMethodRequest();
                                            callMethodRequest.MethodId = new NodeId("/Methods/CopyFileFromServer", mNAMESPACE_INDEX);
                                            callMethodRequest.ObjectId = new NodeId("/Methods", mNAMESPACE_INDEX);
                                            callMethodRequest.InputArguments.Add(serverPath);
                                            //callMethodRequest.InputArguments.Add(data);
                                            callMethodRequestCollection.Add(callMethodRequest);
                                            RequestHeader requestHeader = new RequestHeader();
                                            ResponseHeader responseHeader = opcServer.Session.Call(null, callMethodRequestCollection, out results, out diagnosticInfos);
                                            Server.MethodCallResult methodCallResult = new MethodCallResult(results);

                                            if (methodCallResult.status.ToUpper().Equals("GOOD"))
                                            {
                                                responseBody.msg = "上传文件成功";
                                                YG.Log.Instance.WriteLogAdd(file + "上传文件成功");
                                                Variant result3 = methodCallResult.results;

                                                byte[] buff;
                                                using (MemoryStream ms = new MemoryStream())
                                                {
                                                    IFormatter iFormatter = new BinaryFormatter();
                                                    iFormatter.Serialize(ms, result3.Value);
                                                    buff = ms.GetBuffer();
                                                }
                                                // 将byte[]写入文件
                                                File.WriteAllBytes(file, buff);

                                                // 读取文件内容到字符串
                                                string fileContent = File.ReadAllText(file);
                                                fileContent = fileContent.Trim();

                                                // 去除字符串中的空格
                                                //string trimmedContent = fileContent.Trim(); // 使用Trim去除字符串首尾的空格
                                                // 或者使用Replace去除所有空格
                                                string trimmedContent = fileContent.Replace(" ", "");

                                                // 将处理过的字符串写回文件
                                                File.WriteAllText(file, trimmedContent);


                                                string aa = result3.ToString();




                                            }
                                            else
                                            {
                                                responseBody.msg = "上传文件失败";
                                                YG.Log.Instance.WriteLogAdd(file + "上传文件失败");
                                            }
                                            // } 
                                        }
                                        catch (Exception ex)
                                        {
                                            responseBody.msg = "上传文件失败===>" + ex.Message;
                                            YG.Log.Instance.WriteLogAdd($"{ex.Message}");
                                        }


                                    }
                                    catch (Exception ex)
                                    {
                                        responseBody.msg = "上传文件失败===>" + ex.Message;
                                        YG.Log.Instance.WriteLogAdd($"493-->{ex.Message}");
                                    }
                                }
                                else if (opcBody.Type == ActionTypeEnum.Delete.ToString())
                                {
                                    string file = opcBody.Path;
                                    string serverPath = "";
                                    try
                                    {
                                        string extension = Path.GetExtension(file);
                                        if (string.IsNullOrWhiteSpace(extension))
                                        {
                                            responseBody.msg = "文件名不合法";
                                        }
                                        else
                                        {
                                            try
                                            {

                                                //byte[] data = opcServer.ReadFile(file);

                                                serverPath = UPLOAD_NC_PATH + Path.GetFileName(file);
                                                Server.MethodCallResult methodCallResult = opcServer.MethodCallDeleteFile(serverPath);



                                                if (methodCallResult.status.ToUpper().Equals("GOOD"))
                                                {

                                                    responseBody.msg = "删除文件成功";
                                                    YG.Log.Instance.WriteLogAdd(file + "删除文件成功");
                                                }
                                                else
                                                {
                                                    responseBody.msg = "上传文件失败";
                                                    YG.Log.Instance.WriteLogAdd(file + "上传文件失败");
                                                }
                                                // } 
                                            }
                                            catch (Exception ex)
                                            {
                                                responseBody.msg = "上传文件失败===>" + ex.Message;
                                                YG.Log.Instance.WriteLogAdd($"{ex.Message}");
                                            }
                                        }

                                    }
                                    catch (Exception ex)
                                    {
                                        responseBody.msg = "上传文件失败===>" + ex.Message;
                                        YG.Log.Instance.WriteLogAdd($"493-->{ex.Message}");
                                    }
                                }
                                else if (opcBody.Type == ActionTypeEnum.SynFile.ToString())
                                {

                                    try
                                    {
                                        Server.MethodCallResult methodCallResult = opcServer.MethodCall("GetAllFiles", UPLOAD_NC_PATH);
                                        if (methodCallResult.status.ToUpper().Equals("GOOD"))
                                        {

                                            responseBody.msg = "同步文件成功";
                                        }
                                        else
                                        {
                                            responseBody.msg = "同步文件失败";
                                        }
                                        // } 
                                    }
                                    catch (Exception ex)
                                    {
                                        responseBody.msg = "同步文件失败===>" + ex.Message;
                                        YG.Log.Instance.WriteLogAdd($"{ex.Message}");
                                    }

                                }
                            }
                            else
                            {
                                responseBody.code = 0;
                                responseBody.msg = "服务器离线，连不上opcUa";
                                responseBody.result = false;
                            }
                            YG.Log.Instance.WriteLogAdd("Disconnect!");

                            response.ContentType = "application/json;charset=UTF-8";
                            response.ContentEncoding = Encoding.UTF8;
                            response.AppendHeader("Content-Type", "application/json;charset=UTF-8");
                            string retJsonData = JsonConvert.SerializeObject(responseBody);

                            YG.Log.Instance.WriteLogAdd($"WMS--->>{responseBody.Json_SerializeObject()}--->>{body}\r\n");


                        }
                        catch (Exception opcex)
                        {
                            // 删除map中对应的bean
                            opcServerMap.Remove(opcBody.ServerUrl);
                            // 断开连接
                            if (opcServer!=null && opcServer.Session != null)
                            {
                                opcServer.Disconnect();
                            }
                            responseBody.msg = opcex.Message;
                            responseBody.result = false;

                            AddList(DateTime.Now.ToString(), "POST", request.Url.ToString(), opcex.Message);
                            YG.Log.Instance.WriteLogAdd(opcex.StackTrace);
                        }
                        finally
                        {
                            using (StreamWriter writer = new StreamWriter(response.OutputStream, Encoding.UTF8))
                            {
                                
                                writer.Write(responseBody.Json_SerializeObject());
                                writer.Close();
                                //response.Close();
                            }
                        }
                    }
                }
                else if (request.HttpMethod == "GET")
                {
                    if (!request.Url.ToString().Contains("favicon"))
                    {
                        string ip = request.QueryString["ip"];
                        string port = request.QueryString["port"];
                        string fun = request.QueryString["fun"];

                        AddList(DateTime.Now.ToString(), "GET", ip + port + fun, "OK");

                    }
                }
                response.Close();
            }


        }
        private List<string> readVariables(Server server, string[] variables)
        {
            List<string> nodeIdStrings = new List<string>();
            foreach (string variable in variables)
            {
                NodeId nodeId = new NodeId(variable, (ushort)2);
                nodeIdStrings.Add(nodeId.ToString());
            }
            return server.ReadValues(nodeIdStrings);
        }

        private void addAddress(RequestBody opcBody)
        {

            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX310.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX311.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX311.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX311.2");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX312.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX312.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX313.7");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX314.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX314.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX314.2");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX316.7");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX326.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX326.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX326.2");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX326.3");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX491.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX493.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX493.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX495.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX497.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX497.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX499.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX501.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX501.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX554.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX554.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX554.2");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX554.3");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX554.4");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX554.5");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX554.6");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX554.7");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX555.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX555.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX555.2");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX555.3");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX555.4");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX555.5");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX555.6");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX555.7");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX556.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX556.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX556.3");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX556.4");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX556.6");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX556.7");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX557.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX557.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX557.2");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX557.3");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX557.4");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX557.5");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX558.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX558.2");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX559.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX559.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX559.2");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX559.3");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX560.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX560.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX560.2");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX560.3");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX560.4");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX560.5");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX570.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX574.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX574.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX574.2");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX574.3");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX574.4");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX574.5");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX574.6");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX574.7");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX575.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX575.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX578.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX578.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX578.2");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX579.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX579.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX579.2");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX579.3");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX590.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX590.2");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX590.3");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX624.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX624.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX626.0");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX626.1");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX626.2");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX626.3");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX626.4");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX626.5");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX626.6");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB2.DBX626.7");
            opcBody.Addresses.Add("ns=2;s=/Plc/DB10.DBX106.1");
            
            

            /*opcBody.Addresses.Add("ns=2;s=/Nck/SequencedAlarms/timeBCD");
            opcBody.Addresses.Add("ns=2;s=/Nck/SequencedAlarms/textIndex");*/
            opcBody.Addresses.Add("ns=2;s=/Channel/GeometricAxis/feedRateOvr");
            opcBody.Addresses.Add("ns=2;s=/Channel/Spindle/speedOvr");
            opcBody.Addresses.Add("ns=2;s=/Channel/Spindle/actSpeed");
            opcBody.Addresses.Add("ns=2;s=/Channel/MachineAxis/vaLoad");
            opcBody.Addresses.Add("ns=2;s=/Nck/ChannelDiagnose/setupTime");
            opcBody.Addresses.Add("ns=2;s=/Channel/ChannelDiagnose/operatingTime");
            opcBody.Addresses.Add("ns=2;s=/Channel/ProgramInfo/selectedWorkPProg");



        }


        public class DeviceInfo
        {
            public string ConnectMsg
            { get; set; }
            public string ConnectErrorMsg
            { get; set; }
            public string CncSoftVersion
            { get; set; }
            public string CncType
            { get; set; }
            public string CncId
            { get; set; }
            public string CncMode
            { get; set; }
            public string RunStatus
            { get; set; }
            public string Products
            { get; set; }
            public string CycleTime
            { get; set; }
            public string RemainTime
            { get; set; }
            public string MainProg
            { get; set; }
            public string SetFeedSpeed
            { get; set; }
            public string ActFeedSpeed
            { get; set; }
            public string SetSpSpeed
            { get; set; }

            public string ActSpSpeed
            { get; set; }
            public string AxisName
            { get; set; }
            public string FeedRate
            { get; set; }
            public string SpRate
            { get; set; }
            public string MaxPos1
            { get; set; }
            public string MaxPos2
            { get; set; }
            public string MaxPos3
            { get; set; }
            public string RelPos1
            { get; set; }
            public string RelPos2
            { get; set; }
            public string RelPos3
            { get; set; }
            public string RemainPos1
            { get; set; }
            public string RemainPos2
            { get; set; }
            public string RemainPos3
            { get; set; }
            public string ToolNo
            { get; set; }
            public string LenthX
            { get; set; }
            public string LenthZ
            { get; set; }
            public string RadiusCompenNum
            { get; set; }
            public string LengthCompenNum
            { get; set; }
            public string ToolAbradeRadius
            { get; set; }
            public string ToolEdgePos
            { get; set; }
            public string IsAlarm
            { get; set; }
            public List<AlmInfo> AlmMsg { get; set; } = new List<AlmInfo>();

            public string ToolLife
            { get; set; }


        }
        public class AlmInfo
        {
            public string no { get; set; }
            public string msg { get; set; }

        }
        public class Servlet
        {
            public virtual void onGet(System.Net.HttpListenerRequest request, System.Net.HttpListenerResponse response, string info) { }
            public virtual void onPost(System.Net.HttpListenerRequest request, System.Net.HttpListenerResponse response) { }

            public virtual void onCreate()
            {

            }
        }


        public void AddList(string dtime, string type, string url, string res)
        {
            this.Invoke(new Action(delegate ()
            {
                listView1.BeginUpdate();   //数据更新，UI暂时挂起，直到EndUpdate绘制控件，可以有效避免闪烁并大大提高加载速度
                ListViewItem lvi = new ListViewItem();
                lvi.Text = dtime;
                lvi.SubItems.Add(type);
                lvi.SubItems.Add(url);
                lvi.SubItems.Add(res);
                this.listView1.Items.Insert(0, lvi);
                if (this.listView1.Items.Count > 100)
                {
                    this.listView1.Items.Clear();
                }

                this.listView1.EndUpdate();  //结束数据处理，UI界面一次性绘制。}

            }));

        }


        public class MyServlet : Servlet
        {
            public override void onCreate()
            {
                base.onCreate();
            }

            public override void onGet(HttpListenerRequest request, HttpListenerResponse response, string info)
            {
                Console.WriteLine("GET:" + request.Url);


                byte[] buffer = Encoding.UTF8.GetBytes(info);
                //string sss = request.QueryString["ty"];
                System.IO.Stream output = response.OutputStream;
                output.Write(buffer, 0, buffer.Length);
                // You must close the output stream.
                output.Close();
                //listener.Stop();
            }

            public override void onPost(HttpListenerRequest request, HttpListenerResponse response)
            {
                Console.WriteLine("POST:" + request.Url);
                byte[] res = Encoding.UTF8.GetBytes("OK");
                response.OutputStream.Write(res, 0, res.Length);
            }
        }

    }
}
