SocketUtil.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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/";
  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. response.result = false;
  52. }
  53. // 若需要对返回的 XML 结果进行解析
  54. // List<string> paramList = new List<string> { "AUTO IWO3" };
  55. // Dictionary<string, object> resultMap = SocketUtil.ResultMap(xmlResult, paramList);
  56. // log.Info($"请求结果解析{resultMap}");
  57. }
  58. public static string SendSocket(string hostName, int portNumber, string xmlBuilder)
  59. {
  60. string responseLine = null;
  61. try
  62. {
  63. using (TcpClient client = new TcpClient(hostName, portNumber))
  64. using (NetworkStream stream = client.GetStream())
  65. using (StreamWriter writer = new StreamWriter(stream, Encoding.ASCII) { AutoFlush = true })
  66. using (StreamReader reader = new StreamReader(stream, Encoding.ASCII))
  67. {
  68. // 发送 XML 到服务器
  69. writer.WriteLine(xmlBuilder);
  70. writer.WriteLine(); // 空行表示 XML 的结束
  71. // 接收服务器的响应
  72. responseLine = reader.ReadLine();
  73. YG.Log.Instance.WriteLogAdd("sendSocket - 服务器的回应XML::\n" + responseLine);
  74. }
  75. }
  76. catch (SocketException e)
  77. {
  78. YG.Log.Instance.WriteLogAdd("sendSocket - 无法连接到主机:" + hostName + " 错误原因:" + e.Message);
  79. Environment.Exit(1);
  80. }
  81. catch (IOException e)
  82. {
  83. YG.Log.Instance.WriteLogAdd("I/O 错误 " + hostName + " 错误原因:" + e.Message);
  84. }
  85. return responseLine;
  86. }
  87. public static Dictionary<string, object> ResultMap(string xmlString, List<string> paramList)
  88. {
  89. Dictionary<string, object> dataMap = new Dictionary<string, object>();
  90. try
  91. {
  92. // 加载 XML 字符串
  93. XmlDocument doc = new XmlDocument();
  94. doc.LoadXml(xmlString);
  95. // 获取根元素
  96. XmlElement rootElement = doc.DocumentElement;
  97. foreach (string param in paramList)
  98. {
  99. // 获取元素
  100. XmlNode valueElement = rootElement.GetElementsByTagName(param).Item(0);
  101. if (valueElement != null)
  102. {
  103. // 提取值
  104. string title = valueElement.InnerText;
  105. // 输出结果
  106. dataMap[param] = title;
  107. }
  108. }
  109. }
  110. catch (Exception e)
  111. {
  112. YG.Log.Instance.WriteLogAdd("XML 解析错误:" + e.Message);
  113. }
  114. return dataMap;
  115. }
  116. private static string ExtractFileNameFromXml(string xml, string tagName)
  117. {
  118. XmlDocument doc = new XmlDocument();
  119. doc.LoadXml(xml);
  120. XmlNode node = doc.GetElementsByTagName(tagName).Item(0);
  121. if (node != null)
  122. {
  123. if (tagName == "prg")
  124. {
  125. // 从完整路径中提取文件名
  126. return System.IO.Path.GetFileName(node.InnerText);
  127. }
  128. else
  129. {
  130. return node.InnerText;
  131. }
  132. }
  133. return null;
  134. }
  135. }
  136. }