opcua_encodingLayer.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /*
  2. * opcua_encodingLayer.c
  3. *
  4. * Created on: Jan 14, 2014
  5. * Author: opcua
  6. */
  7. #include "opcua_encodingLayer.h"
  8. #include "opcua_binaryEncDec.h"
  9. #include "opcua_types.h"
  10. #include "opcua_builtInDatatypes.h"
  11. /**
  12. * IntegerId
  13. * Part: 4
  14. * Chapter: 7.13
  15. * Page: 118
  16. */
  17. T_IntegerId convertToIntegerId(char* buf, int pos){
  18. return convertToUInt32(buf, pos);
  19. }
  20. /**
  21. * DiagnosticInfo
  22. * Part: 4
  23. * Chapter: 7.9
  24. * Page: 116
  25. */
  26. T_DiagnosticInfo convertToDiagnosticInfo(char* buf, int pos){
  27. T_DiagnosticInfo tmpTDiagnosticInfo;
  28. int counter = 0;
  29. tmpTDiagnosticInfo.namespaceUri = convertToInt32(buf, counter);
  30. counter += sizeof(tmpTDiagnosticInfo.namespaceUri);
  31. tmpTDiagnosticInfo.symbolicId = convertToInt32(buf, counter);
  32. counter += sizeof(tmpTDiagnosticInfo.symbolicId);
  33. tmpTDiagnosticInfo.locale = convertToInt32(buf, counter);
  34. counter += sizeof(tmpTDiagnosticInfo.locale);
  35. tmpTDiagnosticInfo.localizesText = convertToInt32(buf, counter);
  36. counter += sizeof(tmpTDiagnosticInfo.localizesText);
  37. tmpTDiagnosticInfo.additionalInfo = convertToUAString(buf, counter);
  38. counter += sizeof(tmpTDiagnosticInfo.additionalInfo);
  39. tmpTDiagnosticInfo.innerStatusCode = convertToUAStatusCode(buf, pos);
  40. counter += sizeof(tmpTDiagnosticInfo.innerStatusCode);
  41. //If the Flag InnerDiagnosticInfo is set, then the DiagnosticInfo will be encoded
  42. if((tmpTDiagnosticInfo.innerStatusCode & DIEMT_INNER_DIAGNOSTIC_INFO) == 1){
  43. tmpTDiagnosticInfo.innerDiagnosticInfo = convertToTDiagnosticInfo(buf, counter);
  44. }
  45. return tmpTDiagnosticInfo;
  46. }
  47. /**
  48. * RequestHeader
  49. * Part: 4
  50. * Chapter: 7.26
  51. * Page: 132
  52. */
  53. T_RequestHeader decodeRequestHeader(char* buf)
  54. {
  55. T_RequestHeader tmpRequestHeader;
  56. int counter = 0;
  57. //ToDo: counter needs the length of the buffer,
  58. // strings have in this type just the size of the pointer not of the content
  59. tmpRequestHeader.authenticationToken = convertToUANodeId(buf, counter);
  60. if (tmpRequestHeader.authenticationToken.EncodingByte == NIEVT_STRING)
  61. {
  62. counter =
  63. sizeof(tmpRequestHeader.authenticationToken.EncodingByte)
  64. + sizeof(tmpRequestHeader.authenticationToken.Namespace)
  65. + sizeof(tmpRequestHeader.authenticationToken.Identifier.String.Length)
  66. + sizeof(tmpRequestHeader.authenticationToken.Identifier.String.Data);
  67. }
  68. else
  69. {
  70. counter = sizeof(tmpRequestHeader.authenticationToken);
  71. }
  72. tmpRequestHeader.timestamp = convertToUADateTime(buf, counter);
  73. counter += sizeof(tmpRequestHeader.timestamp);
  74. tmpRequestHeader.requestHandle = convertToTIntegerId(buf, counter);
  75. counter += sizeof(tmpRequestHeader.requestHandle);
  76. tmpRequestHeader.returnDiagnostics = convertToUInt32(buf, counter);
  77. counter += sizeof(tmpRequestHeader.returnDiagnostics);
  78. tmpRequestHeader.auditEntryId = convertToUAString(buf, counter);
  79. counter += sizeof(tmpRequestHeader.auditEntryId);
  80. tmpRequestHeader.timeoutHint = convertToUInt32(buf, counter);
  81. counter += sizeof(tmpRequestHeader.timeoutHint);
  82. // AdditionalHeader will stay empty, need to be changed if there is relevant information
  83. return tmpRequestHeader;
  84. }
  85. /**
  86. * ResponseHeader
  87. * Part: 4
  88. * Chapter: 7.27
  89. * Page: 133
  90. */
  91. decodeResponseHeader(const T_ResponseHeader *responseHeader, AD_RawMessage *buf)
  92. {
  93. int counter = 0;
  94. responseHeader->timestamp = convertToUADateTime(buf->message, counter);
  95. counter += sizeof(responseHeader->timestamp);
  96. responseHeader->requestHandle = convertToTIntegerId(buf->message, counter);
  97. counter += sizeof(responseHeader->requestHandle);
  98. responseHeader->serviceResult = convertToUAStatusCode(buf->message, counter);
  99. counter += sizeof(responseHeader->serviceResult);
  100. responseHeader->serviceDiagnostics = convertToTDiagnosticInfo(buf->message, counter);
  101. }
  102. void decodeMessage_test()
  103. {
  104. char testMessage = {01,0x20,0xbe,0x01,0x20,0x20,0xf2,0xd6,0xd6,0xc9,0x01,0x00,0xbe,0x01,0x00,0x00,0xf2,0xd6,0xd6,0xc9,0x87,0x0b,0xcf,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xe0,0x93,0x04,0x00,0x,0x};
  105. AD_RawMessage rawMessage;
  106. rawMessage.message = testMessage;
  107. rawMessage.length = 64;
  108. decodeMessage(testMessage);
  109. }
  110. /*
  111. * builds a message structure by decoding a byte stream
  112. */
  113. UA_ExtensionObject processMessage(AD_RawMessage *rawMessage)
  114. {
  115. UA_NodeId tmpNodeId = convertToUANodeId(rawMessage,0);
  116. //callServiceHandler(tmpNodeId,rawMessage);
  117. }