ua2json: Add PubSub encoding/decoding

This commit is contained in:
Julius Pfrommer 2019-01-22 19:02:32 +01:00 committed by Julius Pfrommer
parent f594409d77
commit e5e18b99b5
3 changed files with 111 additions and 11 deletions

Binary file not shown.

View File

@ -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"
}
}
}
]
}

View File

@ -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,6 +239,9 @@ int main(int argc, char **argv) {
/* Find the data type */
const UA_DataType *type = NULL;
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];
@ -182,6 +252,7 @@ int main(int argc, char **argv) {
fprintf(stderr, "Error: Datatype not found\n");
return -1;
}
}
/* Open files */
if(input_option) {
@ -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));