Helper.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace StressClient
  7. {
  8. class Helper
  9. {
  10. // 字符串转16进制字符串 AB-->4142
  11. public static string StrToHexStr(string src, Encoding encode)
  12. {
  13. byte[] b = encode.GetBytes(src);
  14. string result = string.Empty;
  15. foreach (var t in b)
  16. {
  17. result += Convert.ToString(t, 16);
  18. }
  19. return result;
  20. }
  21. // 将16进制字符串转换到byte[]
  22. public static byte[] HexStrToArrary(string src)
  23. {
  24. int count = src.Length / 2;
  25. byte[] b = new byte[count];
  26. for (int i = 0; i < count; i++)
  27. {
  28. string val = "0x" + src.Substring(i * 2, 2);
  29. b[i] = Convert.ToByte(val, 16); // '0x41'->65
  30. }
  31. return b;
  32. }
  33. public static string do_CRC(byte[] data)
  34. {
  35. byte check = 0;
  36. uint crc = 0xFFFF;
  37. for (int idx = 0; idx < data.Length; idx++)
  38. {
  39. byte pos = data[idx];
  40. crc = (crc >> 8) ^ pos;
  41. for (int i = 0; i < 8; i++)
  42. {
  43. check = (byte)(crc & 0x0001);
  44. crc >>= 1;
  45. if (check == 0x0001)
  46. crc ^= 0xA001;
  47. }
  48. }
  49. //string ret_str = Convert.ToString(crc, 16);
  50. string ret_str = crc.ToString("X4"); ;
  51. return ret_str.ToUpper();
  52. }
  53. public static string do_CRC16(byte[] data)
  54. {
  55. byte[] returnVal = new byte[2];
  56. byte CRC16Lo, CRC16Hi, CL, CH, SaveHi, SaveLo;
  57. int i, Flag;
  58. CRC16Lo = 0xFF;
  59. CRC16Hi = 0xFF;
  60. CL = 0x86;
  61. CH = 0x68;
  62. for (i = 0; i < data.Length; i++)
  63. {
  64. CRC16Lo = (byte)(CRC16Lo ^ data[i]);//每一个数据与CRC寄存器进行异或
  65. for (Flag = 0; Flag <= 7; Flag++)
  66. {
  67. SaveHi = CRC16Hi;
  68. SaveLo = CRC16Lo;
  69. CRC16Hi = (byte)(CRC16Hi >> 1);//高位右移一位
  70. CRC16Lo = (byte)(CRC16Lo >> 1);//低位右移一位
  71. if ((SaveHi & 0x01) == 0x01)//如果高位字节最后一位为
  72. {
  73. CRC16Lo = (byte)(CRC16Lo | 0x80);//则低位字节右移后前面补 否则自动补0
  74. }
  75. if ((SaveLo & 0x01) == 0x01)//如果LSB为1,则与多项式码进行异或
  76. {
  77. CRC16Hi = (byte)(CRC16Hi ^ CH);
  78. CRC16Lo = (byte)(CRC16Lo ^ CL);
  79. }
  80. }
  81. }
  82. returnVal[0] = CRC16Hi;//CRC高位
  83. returnVal[1] = CRC16Lo;//CRC低位
  84. return Encoding.UTF8.GetString(returnVal);
  85. }
  86. private static float GenRandom(int minVal, int maxVal)
  87. {
  88. Random rdm = new Random();
  89. int val = rdm.Next(minVal, maxVal);
  90. return (float)(val / 100.0);
  91. }
  92. public static string MakeReqStr1(string MN_id, DateTime curTime)
  93. {
  94. // 时间戳QN , 格式YYYYMMDDhhmmsszzz
  95. string ts_str = curTime.ToString("yyyyMMddHHmmssffff");
  96. string QN_val = ts_str.Substring(0, 14);
  97. // 分钟填5的倍数,秒填00
  98. int minute = curTime.Minute - curTime.Minute % 5;
  99. Object[] param = new Object[] { curTime.Year, curTime.Month, curTime.Day, curTime.Hour, minute, 0 };
  100. string cur_dt = string.Format("{0:D4}{1:D2}{2:D2}{3:D2}{4:D2}{5:D2}", param);
  101. // 其他各参数
  102. string ST_val = "80";
  103. string CN_val = "2011";
  104. string PW_val = "123456";
  105. string Flag_val = "5";
  106. string DateTime_val = cur_dt;
  107. float S20006_Rtd = GenRandom(200, 500);
  108. float S30004_Rtd = GenRandom(3, 9);
  109. float S30005_Rtd = GenRandom(100, 300);
  110. float S10006_Rtd = GenRandom(200, 600);
  111. float S30003_Rtd = GenRandom(100, 500);
  112. Object[] param2 = new Object[] { QN_val, ST_val, CN_val, PW_val, MN_id, Flag_val, DateTime_val, S20006_Rtd, S30005_Rtd, S30004_Rtd, S10006_Rtd, S30003_Rtd };
  113. string req_str = string.Format("QN={0};ST={1};CN={2};PW={3};MN={4};Flag={5:G};CP=&&DataTime={6};S20006-Rtd={7};S30005-Rtd={8};S30004-Rtd={9};S10006-Rtd={10};S30003-Rtd={11}", param2);
  114. string str = StrToHexStr(req_str, Encoding.Default);
  115. byte[] src = Helper.HexStrToArrary(str);
  116. string CRC_val = Helper.do_CRC(src);
  117. // 数据包总长度
  118. string seg_str = $"##{req_str.Length:D4}";
  119. // 拼装请求
  120. req_str = seg_str + req_str + CRC_val + "\r\n";
  121. return req_str;
  122. }
  123. }
  124. }