Procházet zdrojové kódy

ua2json: Add PubSub encoding/decoding

Julius Pfrommer před 6 roky
rodič
revize
e5e18b99b5

binární
tools/ua2json/examples/pubsub.bin


+ 20 - 0
tools/ua2json/examples/pubsub.json

@@ -0,0 +1,20 @@
+{
+    "MessageId": "1CD777E3-9590-A4E2-6DB6-4BE40EE09EB9",
+    "MessageType": "ua-data",
+    "Messages": [
+        {
+            "DataSetWriterId": 62541,
+            "MetaDataVersion": {
+                "MajorVersion": 1708098706,
+                "MinorVersion": 0
+            },
+            "Timestamp": "2019-01-20T23:33:28.493Z",
+            "Payload": {
+                "": {
+                    "Type": 13,
+                    "Body": "2019-01-20T23:33:28.493Z"
+                }
+            }
+        }
+    ]
+}

+ 91 - 11
tools/ua2json/ua2json.c

@@ -26,6 +26,7 @@
 #include "ua_types_generated_handling.h"
 #include "ua_types_encoding_binary.h"
 #include "ua_types_encoding_json.h"
+#include "ua_pubsub_networkmessage.h"
 
 static UA_StatusCode
 encode(const UA_ByteString *buf, UA_ByteString *out,
@@ -99,6 +100,71 @@ decode(const UA_ByteString *buf, UA_ByteString *out,
     return UA_STATUSCODE_GOOD;
 }
 
+#ifdef UA_ENABLE_PUBSUB
+
+static UA_StatusCode
+encodeNetworkMessage(const UA_ByteString *buf, UA_ByteString *out) {
+    size_t offset = 0;
+    UA_NetworkMessage msg;
+    UA_StatusCode retval = UA_NetworkMessage_decodeBinary(buf, &offset, &msg);
+    if(retval != UA_STATUSCODE_GOOD)
+        return retval;
+
+    if(offset != buf->length) {
+        UA_NetworkMessage_deleteMembers(&msg);
+        fprintf(stderr, "Input buffer not completely read\n");
+        return UA_STATUSCODE_BADINTERNALERROR;
+    }
+
+    size_t jsonLength = UA_NetworkMessage_calcSizeJson(&msg, NULL, 0, NULL, 0, true);
+    retval = UA_ByteString_allocBuffer(out, jsonLength);
+    if(retval != UA_STATUSCODE_GOOD) {
+        UA_NetworkMessage_deleteMembers(&msg);
+        return retval;
+    }
+
+    uint8_t *bufPos = &out->data[0];
+    const uint8_t *bufEnd = &out->data[out->length];
+    retval = UA_NetworkMessage_encodeJson(&msg, &bufPos, &bufEnd, NULL, 0, NULL, 0, true);
+    UA_NetworkMessage_deleteMembers(&msg);
+    if(retval != UA_STATUSCODE_GOOD) {
+        UA_ByteString_deleteMembers(out);
+        return retval;
+    }
+
+    out->length = (size_t)((uintptr_t)bufPos - (uintptr_t)out->data);
+    return UA_STATUSCODE_GOOD;
+}
+
+static UA_StatusCode
+decodeNetworkMessage(const UA_ByteString *buf, UA_ByteString *out) {
+    UA_NetworkMessage msg;
+    UA_StatusCode retval = UA_NetworkMessage_decodeJson(&msg, buf);
+    if(retval != UA_STATUSCODE_GOOD)
+        return retval;
+
+    size_t binLength = UA_NetworkMessage_calcSizeBinary(&msg);
+    retval = UA_ByteString_allocBuffer(out, binLength);
+    if(retval != UA_STATUSCODE_GOOD) {
+        UA_NetworkMessage_deleteMembers(&msg);
+        return retval;
+    }
+
+    uint8_t *bufPos = &out->data[0];
+    const uint8_t *bufEnd = &out->data[out->length];
+    retval = UA_NetworkMessage_encodeBinary(&msg, &bufPos, bufEnd);
+    UA_NetworkMessage_deleteMembers(&msg);
+    if(retval != UA_STATUSCODE_GOOD) {
+        UA_ByteString_deleteMembers(out);
+        return retval;
+    }
+
+    out->length = (size_t)((uintptr_t)bufPos - (uintptr_t)out->data);
+    return UA_STATUSCODE_GOOD;
+}
+
+#endif
+
 static void
 usage(void) {
     printf("Usage: ua2json [encode|decode] [-t dataType] [-o outputFile] [inputFile]\n"
@@ -111,6 +177,7 @@ usage(void) {
 
 int main(int argc, char **argv) {
     UA_Boolean encode_option = true;
+    UA_Boolean pubsub = false;
     const char *datatype_option = "Variant";
     const char *input_option = NULL;
     const char *output_option = NULL;
@@ -172,15 +239,19 @@ int main(int argc, char **argv) {
 
     /* Find the data type */
     const UA_DataType *type = NULL;
-    for(size_t i = 0; i < UA_TYPES_COUNT; ++i) {
-        if(strcmp(datatype_option, UA_TYPES[i].typeName) == 0) {
-            type = &UA_TYPES[i];
-            break;
+    if(strcmp(datatype_option, "PubSub") == 0) {
+        pubsub = true;
+    } else {
+        for(size_t i = 0; i < UA_TYPES_COUNT; ++i) {
+            if(strcmp(datatype_option, UA_TYPES[i].typeName) == 0) {
+                type = &UA_TYPES[i];
+                break;
+            }
+        }
+        if(!type) {
+            fprintf(stderr, "Error: Datatype not found\n");
+            return -1;
         }
-    }
-    if(!type) {
-        fprintf(stderr, "Error: Datatype not found\n");
-        return -1;
     }
 
     /* Open files */
@@ -232,11 +303,20 @@ int main(int argc, char **argv) {
     buf.length = pos;
 
     /* Convert */
-    UA_StatusCode result;
-    if(encode_option)
+    UA_StatusCode result = UA_STATUSCODE_BADNOTIMPLEMENTED;
+#ifdef UA_ENABLE_PUBSUB
+    if(pubsub && encode_option) {
+        result = encodeNetworkMessage(&buf, &outbuf);
+    } else if(pubsub) {
+        result = decodeNetworkMessage(&buf, &outbuf);
+    } else
+#endif
+    if(encode_option) {
         result = encode(&buf, &outbuf, type);
-    else
+    } else {
         result = decode(&buf, &outbuf, type);
+    }
+    
     if(result != UA_STATUSCODE_GOOD) {
         fprintf(stderr, "Error: Parsing failed with code %s\n",
                 UA_StatusCode_name(result));