HandleData.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. using AntDesign;
  2. using Microsoft.AspNetCore.Components;
  3. using System.Net.Sockets;
  4. using System.Text;
  5. using static BlazorWeb1.Server.UdpListenerService;
  6. namespace BlazorWeb1.Server
  7. {
  8. public class HandleData
  9. {
  10. private Thread _thread;
  11. // [Inject] public UdpListenerService udpclient { get; set; }
  12. //public UdpListenerService udpclient { get; set; } = default!;
  13. //private readonly UdpListenerService _udpclient;
  14. public HandleData()//UdpListenerService myService)
  15. {
  16. //_udpclient = myService;
  17. // 初始化线程,但不立即启动
  18. _thread = new Thread(new ThreadStart(Loop));
  19. _thread.IsBackground = true; // 设置线程为后台线程,程序结束时自动结束
  20. _thread.Start(); // 启动线程
  21. }
  22. private void Loop()
  23. {
  24. while (true) // 无限循环
  25. {
  26. Console.WriteLine("Looping..."); // 执行一些任务
  27. try
  28. {
  29. BufferData bd = GlobalTool.g_dataQueue.TryDequeue(out BufferData result) ? result : null;
  30. if(bd==null)
  31. {
  32. continue;
  33. }
  34. //TQC dest-2;source-2;frame-1;length-2(HEX);cmd-1
  35. //VRC 包头(0xfa)+ 目标地址2+源地址2+控制/帧号1+数据长度2(BCD)+命令字1+数据 + CRC校验2
  36. if(bd.type == 0)
  37. {
  38. int datalength = bd.buffer[5] * 256 + bd.buffer[6];
  39. if (datalength + 9 == bd.buffer.Length)
  40. {
  41. // 计算crc
  42. int packlen = bd.buffer.Length;
  43. byte[] tmpbuf = bd.buffer;
  44. ushort nSum = GlobalTool.chkcrc(tmpbuf, (ushort)(packlen - 2), 0xA001);
  45. ushort newSum = nSum;
  46. newSum = (ushort)(newSum / 256 + newSum % 256 * 256);
  47. ushort oldSum = BitConverter.ToUInt16(tmpbuf, packlen - 2);
  48. if (oldSum == newSum)
  49. {
  50. Console.WriteLine("CRC校验成功");
  51. }
  52. else
  53. {
  54. Console.WriteLine("crc校验失败");
  55. continue;
  56. }
  57. }
  58. else if (datalength + 9 == bd.buffer.Length + 2)
  59. {
  60. //旧协议无crc
  61. }
  62. else
  63. {
  64. Console.WriteLine("数据长度不对");
  65. continue;
  66. }
  67. }
  68. else
  69. {
  70. int datalength = GlobalTool.ConvertBCDToDecimalSingle(bd.buffer[6]) * 100 + GlobalTool.ConvertBCDToDecimalSingle(bd.buffer[7]);
  71. if (datalength + 10 == bd.buffer.Length)
  72. {
  73. }
  74. else
  75. {
  76. Console.WriteLine("数据长度不对");
  77. continue;
  78. }
  79. }
  80. int cmdtype = bd.buffer[7];
  81. int startindex = 8;
  82. if (bd.type == 1)
  83. {
  84. cmdtype = bd.buffer[8];
  85. startindex = 9;
  86. }
  87. switch (cmdtype)
  88. {
  89. case 1:
  90. filling_nozzleup up = GlobalTool.extractFillingNozzleUP(bd.buffer, startindex);
  91. GlobalTool.g_mNozzleState[up.noz].nozzlestate = GlobalTool.NozzleState_Filling;
  92. break;
  93. case 2:
  94. filling_process process = GlobalTool.extractFillingProcess(bd.buffer, startindex);
  95. GlobalTool.g_mNozzleState[process.noz].nozzlestate = GlobalTool.NozzleState_Filling;
  96. GlobalTool.g_mNozzleState[process.noz].VLR = ((double)process.VLR / 1000).ToString("F2");
  97. break;
  98. case 3:
  99. filling_nozzledown down = GlobalTool.extractFillingNozzleDown(bd.buffer, startindex);
  100. GlobalTool.g_mNozzleState[down.noz].nozzlestate = GlobalTool.NozzleState_Idle;
  101. break;
  102. case 4:
  103. filling_record record = GlobalTool.extractFillingRecord(bd.buffer, startindex);
  104. GlobalTool.g_mNozzleState[record.noz].nozzlestate = GlobalTool.NozzleState_Idle;
  105. GlobalTool.g_mNozzleState[record.noz].VLR = ((double)record.VLR / 1000).ToString("F2");
  106. break;
  107. default:
  108. continue;
  109. }
  110. if(bd.type == 0)
  111. {
  112. var message = Encoding.UTF8.GetString(bd.buffer);
  113. //_logger.LogInformation($"接收到消息: {result.Buffer.ToString()}\r\n");
  114. byte[] responseData = Encoding.UTF8.GetBytes("Echo: " + message);
  115. bd.udpClient.SendAsync(responseData, responseData.Length, bd.endpoint);
  116. }
  117. else
  118. {
  119. var message = Encoding.UTF8.GetString(bd.buffer);
  120. //_logger.LogInformation($"接收到消息: {result.Buffer.ToString()}\r\n");
  121. byte[] responseData = Encoding.UTF8.GetBytes("Echo: " + message);
  122. bd.serialPort.Write(responseData, 0, responseData.Length);
  123. }
  124. }
  125. catch(Exception e)
  126. {
  127. }
  128. Thread.Sleep(50);
  129. }
  130. }
  131. }
  132. }