DataSecurityRequest.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using Core.Communication.Transport;
  2. using Core.Util.Extension;
  3. using PLC.Siemens.Protocol.Common;
  4. namespace PLC.Siemens.Protocol.Security
  5. {
  6. public class DataSecurityRequest
  7. {
  8. public byte Ret; // 0xFF for request
  9. public byte Ts; // 0x09 Transport size
  10. public ushort DLen; // Data len : 8 bytes
  11. public char[] Pwd; // Password encoded into "AG" format 8
  12. public ushort PacketLength { get{return 0x0C; } }
  13. public void Build(params char[] value)
  14. {
  15. if (value.IsNotEmpty())
  16. {
  17. Ts = (byte)TsType.TsResOctet;
  18. Ret = 0xFF;
  19. Pwd = value;
  20. DLen = 0x0008;
  21. }
  22. else
  23. {
  24. Ts = 0x00;
  25. Ret = 0x0A;
  26. DLen = 0x0000;
  27. }
  28. }
  29. public void GetByteBuffer(ByteBuffer buffer)
  30. {
  31. buffer.Push(Ret);
  32. buffer.Push(Ts);
  33. buffer.Push(DLen);
  34. if (DLen == 0) return;
  35. Pwd[0] = (char) (Pwd[0] ^ 0x55);
  36. Pwd[1] = (char) (Pwd[1] ^ 0x55);
  37. for (var i = 2; i < 8; i++)
  38. {
  39. Pwd[i] = (char) (Pwd[i] ^ 0x55 ^ Pwd[i - 2]);
  40. }
  41. ;
  42. Pwd.ForEach(t => buffer.Push((byte) t));
  43. }
  44. }
  45. }