server_method.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /*
  2. * This work is licensed under a Creative Commons CCZero 1.0 Universal License.
  3. * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
  4. */
  5. #ifdef UA_NO_AMALGAMATION
  6. # include <time.h>
  7. # include "ua_types.h"
  8. # include "ua_server.h"
  9. # include "logger_stdout.h"
  10. # include "networklayer_tcp.h"
  11. #else
  12. # include "open62541.h"
  13. #endif
  14. #include <signal.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. UA_Boolean running = UA_TRUE;
  19. UA_Logger logger;
  20. static UA_StatusCode helloWorldMethod(const UA_NodeId objectId, const UA_Variant *input, UA_Variant *output) {
  21. UA_String *inputStr = (UA_String*)input->data;
  22. UA_String tmp = UA_STRING_ALLOC("Hello ");
  23. if(inputStr->length > 0) {
  24. tmp.data = realloc(tmp.data, tmp.length + inputStr->length);
  25. memcpy(&tmp.data[tmp.length], inputStr->data, inputStr->length);
  26. tmp.length += inputStr->length;
  27. }
  28. UA_Variant_setScalar(output, &tmp, &UA_TYPES[UA_TYPES_STRING]);
  29. UA_LOG_INFO(logger, UA_LOGCATEGORY_SERVER, "Hello World was called");
  30. return UA_STATUSCODE_GOOD;
  31. }
  32. static void stopHandler(int sign) {
  33. UA_LOG_INFO(logger, UA_LOGCATEGORY_SERVER, "Received Ctrl-C");
  34. running = 0;
  35. }
  36. int main(int argc, char** argv) {
  37. signal(SIGINT, stopHandler); /* catches ctrl-c */
  38. /* initialize the server */
  39. UA_Server *server = UA_Server_new(UA_ServerConfig_standard);
  40. logger = Logger_Stdout_new();
  41. UA_Server_setLogger(server, logger);
  42. UA_Server_addNetworkLayer(server, ServerNetworkLayerTCP_new(UA_ConnectionConfig_standard, 16664));
  43. /* add the method node with the callback */
  44. UA_Argument inputArguments;
  45. UA_Argument_init(&inputArguments);
  46. inputArguments.arrayDimensionsSize = -1;
  47. inputArguments.arrayDimensions = NULL;
  48. inputArguments.dataType = UA_TYPES[UA_TYPES_STRING].typeId;
  49. inputArguments.description = UA_LOCALIZEDTEXT("en_US", "A String");
  50. inputArguments.name = UA_STRING("MyInput");
  51. inputArguments.valueRank = -1;
  52. UA_Argument outputArguments;
  53. UA_Argument_init(&outputArguments);
  54. outputArguments.arrayDimensionsSize = -1;
  55. outputArguments.arrayDimensions = NULL;
  56. outputArguments.dataType = UA_TYPES[UA_TYPES_STRING].typeId;
  57. outputArguments.description = UA_LOCALIZEDTEXT("en_US", "A String");
  58. outputArguments.name = UA_STRING("MyOutput");
  59. outputArguments.valueRank = -1;
  60. UA_Server_addMethodNode(server, UA_QUALIFIEDNAME(1,"ping"), UA_NODEID_NUMERIC(1,62541),
  61. UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
  62. &helloWorldMethod, 1, &inputArguments, 1, &outputArguments);
  63. /* start server */
  64. UA_StatusCode retval = UA_Server_run(server, 1, &running); //blocks until running=false
  65. /* ctrl-c received -> clean up */
  66. UA_Server_delete(server);
  67. return retval;
  68. }