void RunServer() { //First setup our server const bool debug = true; OpcUa::UaServer server(debug); server.SetEndpoint("opc.tcp://localhost:4841/freeopcua/server"); server.SetServerURI("urn://exampleserver.freeopcua.github.io"); server.Start(); //then register our server namespace and get its index in server uint32_t idx = server.RegisterNamespace("http://examples.freeopcua.github.io"); //Create our address space using different methods Node objects = server.GetObjectsNode(); //Add a custom object with specific nodeid NodeId nid(99, idx); QualifiedName qn("NewObject", idx); Node newobject = objects.AddObject(nid, qn); //Add a variable and a property with auto-generated nodeid to our custom object Node myvar = newobject.AddVariable(idx, "MyVariable", Variant(8)); Node myprop = newobject.AddVariable(idx, "MyProperty", Variant(8.8)); //browse root node on server side Node root = server.GetRootNode(); std::cout << "Root node is: " << root << std::endl; std::cout << "Childs are: " << std::endl; for (Node node : root.GetChildren()) { std::cout << " " << node << std::endl; } //Uncomment following to subscribe to datachange events inside server /* SubClient clt; std::unique_ptr<Subscription> sub = server.CreateSubscription(100, clt); sub->SubscribeDataChange(myvar); */ //Now write values to address space and send events so clients can have some fun uint32_t counter = 0; myvar.SetValue(Variant(counter)); //will change value and trigger datachange event //Create event server.EnableEventNotification(); Event ev(ObjectId::BaseEventType); //you should create your own type ev.Severity = 2; ev.SourceNode = ObjectId::Server; ev.SourceName = "Event from FreeOpcUA"; ev.Time = DateTime::Current(); std::cout << "Ctrl-C to exit" << std::endl; for (;;) { myvar.SetValue(Variant(++counter)); //will change value and trigger datachange event std::stringstream ss; ss << "This is event number: " << counter; ev.Message = LocalizedText(ss.str()); server.TriggerEvent(ev); std::this_thread::sleep_for(std::chrono::milliseconds(5000)); } server.Stop(); }