123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Net.Sockets;
- using System.Text;
- using System.Xml;
- using Microsoft.Extensions.Logging;
- namespace Kede.Utils
- {
- public class SocketUtil
- {
- public static void socket(string deviceIp, string ncName,ResponseBody response)
- {
- // 机床 IP
- //string deviceIp = "192.168.11.41";
- // 机床端口
- int devicePort = 62937;
- // 通过 SFTP 上传的 NC 名称
- //string ncName = "X1.nc";
- // 通过 SFTP 上传到机床 NC 的地址,注意必须使用"/" 斜杠,不能使用"\", 末尾必须加上"/"
- string ncPath = "D:/NCprog/";
- StringBuilder xmlBuffer = new StringBuilder();
- xmlBuffer.Append("<select>");
- xmlBuffer.Append("<sub>exe</sub>");
- xmlBuffer.Append("<level>file</level>");
- xmlBuffer.Append("<st>nc1</st>");
- xmlBuffer.Append("<name>").Append(ncName).Append("</name>");
- xmlBuffer.Append("<path>").Append(ncPath).Append("</path>");
- xmlBuffer.Append("<req>yes</req>");
- xmlBuffer.Append("</select>");
- YG.Log.Instance.WriteLogAdd($"选中nc程序请求id{deviceIp},port{devicePort},par{xmlBuffer}");
- string xmlResult = SocketUtil.SendSocket(deviceIp, devicePort, xmlBuffer.ToString());
- //<select><sub>exe</sub><level>file</level><name>X2.nc</name></select>
- YG.Log.Instance.WriteLogAdd($"选中nc程序请求返回结果{xmlResult}");
- StringBuilder checkBuffer = new StringBuilder();
- checkBuffer.Append("<ncda><var>prg</var></ncda>");
- string checkResult = SocketUtil.SendSocket(deviceIp, devicePort, checkBuffer.ToString());
- YG.Log.Instance.WriteLogAdd($"检查机床当前使用nc程序{checkResult}");
- //<ncda><prg>D:/NCprog/testNc/X.nc</prg></ncda>
- string xmlFileName = ExtractFileNameFromXml(xmlResult, "name");
- string checkFileName = ExtractFileNameFromXml(checkResult, "prg");
- if (xmlFileName != checkFileName)
- {
- response.msg = $"设置机床主程序nc程序{xmlFileName}失败";
- response.code = 0;
- response.result = false;
- }
- // 若需要对返回的 XML 结果进行解析
- // List<string> paramList = new List<string> { "AUTO IWO3" };
- // Dictionary<string, object> resultMap = SocketUtil.ResultMap(xmlResult, paramList);
- // log.Info($"请求结果解析{resultMap}");
- }
- public static string SendSocket(string hostName, int portNumber, string xmlBuilder)
- {
- string responseLine = null;
- try
- {
- using (TcpClient client = new TcpClient(hostName, portNumber))
- using (NetworkStream stream = client.GetStream())
- using (StreamWriter writer = new StreamWriter(stream, Encoding.ASCII) { AutoFlush = true })
- using (StreamReader reader = new StreamReader(stream, Encoding.ASCII))
- {
- // 发送 XML 到服务器
- writer.WriteLine(xmlBuilder);
- writer.WriteLine(); // 空行表示 XML 的结束
- // 接收服务器的响应
- responseLine = reader.ReadLine();
- YG.Log.Instance.WriteLogAdd("sendSocket - 服务器的回应XML::\n" + responseLine);
- }
- }
- catch (SocketException e)
- {
- YG.Log.Instance.WriteLogAdd("sendSocket - 无法连接到主机:" + hostName + " 错误原因:" + e.Message);
- Environment.Exit(1);
- }
- catch (IOException e)
- {
- YG.Log.Instance.WriteLogAdd("I/O 错误 " + hostName + " 错误原因:" + e.Message);
- }
- return responseLine;
- }
- public static Dictionary<string, object> ResultMap(string xmlString, List<string> paramList)
- {
- Dictionary<string, object> dataMap = new Dictionary<string, object>();
- try
- {
- // 加载 XML 字符串
- XmlDocument doc = new XmlDocument();
- doc.LoadXml(xmlString);
- // 获取根元素
- XmlElement rootElement = doc.DocumentElement;
- foreach (string param in paramList)
- {
- // 获取元素
- XmlNode valueElement = rootElement.GetElementsByTagName(param).Item(0);
- if (valueElement != null)
- {
- // 提取值
- string title = valueElement.InnerText;
- // 输出结果
- dataMap[param] = title;
- }
- }
- }
- catch (Exception e)
- {
- YG.Log.Instance.WriteLogAdd("XML 解析错误:" + e.Message);
- }
- return dataMap;
- }
- private static string ExtractFileNameFromXml(string xml, string tagName)
- {
- XmlDocument doc = new XmlDocument();
- doc.LoadXml(xml);
- XmlNode node = doc.GetElementsByTagName(tagName).Item(0);
- if (node != null)
- {
- if (tagName == "prg")
- {
- // 从完整路径中提取文件名
- return System.IO.Path.GetFileName(node.InnerText);
- }
- else
- {
- return node.InnerText;
- }
- }
- return null;
- }
- }
- }
|