mirror of
https://github.com/open62541/open62541.git
synced 2025-06-03 04:00:21 +00:00
ua2json: Add PubSub encoding/decoding
This commit is contained in:
parent
f594409d77
commit
e5e18b99b5
BIN
tools/ua2json/examples/pubsub.bin
Normal file
BIN
tools/ua2json/examples/pubsub.bin
Normal file
Binary file not shown.
20
tools/ua2json/examples/pubsub.json
Normal file
20
tools/ua2json/examples/pubsub.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user