SocketUtil.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.IO;
  9. using System.Net.Sockets;
  10. using System.Text;
  11. using System.Xml;
  12. using Microsoft.Extensions.Logging;
  13. namespace Kede.Utils
  14. {
  15. public class SocketUtil
  16. {
  17. public static void socket(string deviceIp, string ncName,ResponseBody response)
  18. {
  19. // 机床 IP
  20. //string deviceIp = "192.168.11.41";
  21. // 机床端口
  22. int devicePort = 62937;
  23. // 通过 SFTP 上传的 NC 名称
  24. //string ncName = "X1.nc";
  25. // 通过 SFTP 上传到机床 NC 的地址,注意必须使用"/" 斜杠,不能使用"\", 末尾必须加上"/"
  26. string ncPath = "D:/NCprog/testNc/";
  27. StringBuilder xmlBuffer = new StringBuilder();
  28. xmlBuffer.Append("<select>");
  29. xmlBuffer.Append("<sub>exe</sub>");
  30. xmlBuffer.Append("<level>file</level>");
  31. xmlBuffer.Append("<st>nc1</st>");
  32. xmlBuffer.Append("<name>").Append(ncName).Append("</name>");
  33. xmlBuffer.Append("<path>").Append(ncPath).Append("</path>");
  34. xmlBuffer.Append("<req>yes</req>");
  35. xmlBuffer.Append("</select>");
  36. YG.Log.Instance.WriteLogAdd($"选中nc程序请求id{deviceIp},port{devicePort},par{xmlBuffer}");
  37. string xmlResult = SocketUtil.SendSocket(deviceIp, devicePort, xmlBuffer.ToString());
  38. //<select><sub>exe</sub><level>file</level><name>X2.nc</name></select>
  39. YG.Log.Instance.WriteLogAdd($"选中nc程序请求返回结果{xmlResult}");
  40. StringBuilder checkBuffer = new StringBuilder();
  41. checkBuffer.Append("<ncda><var>prg</var></ncda>");
  42. string checkResult = SocketUtil.SendSocket(deviceIp, devicePort, checkBuffer.ToString());
  43. YG.Log.Instance.WriteLogAdd($"检查机床当前使用nc程序{checkResult}");
  44. //<ncda><prg>D:/NCprog/testNc/X.nc</prg></ncda>
  45. string xmlFileName = ExtractFileNameFromXml(xmlResult, "name");
  46. string checkFileName = ExtractFileNameFromXml(checkResult, "prg");
  47. if (xmlFileName != checkFileName)
  48. {
  49. response.msg = $"设置机床主程序nc程序{xmlFileName}失败";
  50. response.code = 0;
  51. }
  52. // 若需要对返回的 XML 结果进行解析
  53. // List<string> paramList = new List<string> { "AUTO IWO3" };
  54. // Dictionary<string, object> resultMap = SocketUtil.ResultMap(xmlResult, paramList);
  55. // log.Info($"请求结果解析{resultMap}");
  56. }
  57. public static string SendSocket(string hostName, int portNumber, string xmlBuilder)
  58. {
  59. string responseLine = null;
  60. try
  61. {
  62. using (TcpClient client = new TcpClient(hostName, portNumber))
  63. using (NetworkStream stream = client.GetStream())
  64. using (StreamWriter writer = new StreamWriter(stream, Encoding.ASCII) { AutoFlush = true })
  65. using (StreamReader reader = new StreamReader(stream, Encoding.ASCII))
  66. {
  67. // 发送 XML 到服务器
  68. writer.WriteLine(xmlBuilder);
  69. writer.WriteLine(); // 空行表示 XML 的结束
  70. // 接收服务器的响应
  71. responseLine = reader.ReadLine();
  72. YG.Log.Instance.WriteLogAdd("sendSocket - 服务器的回应XML::\n" + responseLine);
  73. }
  74. }
  75. catch (SocketException e)
  76. {
  77. YG.Log.Instance.WriteLogAdd("sendSocket - 无法连接到主机:" + hostName + " 错误原因:" + e.Message);
  78. Environment.Exit(1);
  79. }
  80. catch (IOException e)
  81. {
  82. YG.Log.Instance.WriteLogAdd("I/O 错误 " + hostName + " 错误原因:" + e.Message);
  83. }
  84. return responseLine;
  85. }
  86. public static Dictionary<string, object> ResultMap(string xmlString, List<string> paramList)
  87. {
  88. Dictionary<string, object> dataMap = new Dictionary<string, object>();
  89. try
  90. {
  91. // 加载 XML 字符串
  92. XmlDocument doc = new XmlDocument();
  93. doc.LoadXml(xmlString);
  94. // 获取根元素
  95. XmlElement rootElement = doc.DocumentElement;
  96. foreach (string param in paramList)
  97. {
  98. // 获取元素
  99. XmlNode valueElement = rootElement.GetElementsByTagName(param).Item(0);
  100. if (valueElement != null)
  101. {
  102. // 提取值
  103. string title = valueElement.InnerText;
  104. // 输出结果
  105. dataMap[param] = title;
  106. }
  107. }
  108. }
  109. catch (Exception e)
  110. {
  111. YG.Log.Instance.WriteLogAdd("XML 解析错误:" + e.Message);
  112. }
  113. return dataMap;
  114. }
  115. private static string ExtractFileNameFromXml(string xml, string tagName)
  116. {
  117. XmlDocument doc = new XmlDocument();
  118. doc.LoadXml(xml);
  119. XmlNode node = doc.GetElementsByTagName(tagName).Item(0);
  120. if (node != null)
  121. {
  122. if (tagName == "prg")
  123. {
  124. // 从完整路径中提取文件名
  125. return System.IO.Path.GetFileName(node.InnerText);
  126. }
  127. else
  128. {
  129. return node.InnerText;
  130. }
  131. }
  132. return null;
  133. }
  134. }
  135. }