Current section
Files
Jump to
Current section
Files
src/opcua_server_discovery.erl
-module(opcua_server_discovery).
%%% INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-include_lib("kernel/include/logger.hrl").
-include_lib("stdlib/include/assert.hrl").
-include("opcua.hrl").
-include("opcua_internal.hrl").
%%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% API Functions
-export([handle_request/2]).
% Utility functions
-export([format_endopoints/1]).
%%% API FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
handle_request(Conn, #uacp_message{node_id = #opcua_node_id{value = 426}} = Req) ->
#uacp_message{payload = #{
endpoint_url := EndpointUrl,
locale_ids := _LocalIds,
profile_uris := _ProfileUris
}} = Req,
%TODO: Maybe check the request header,
% validate that the EndpointUrl is correct...
Endpoints = format_endopoints(
opcua_security:supported_endpoints(EndpointUrl)),
Resp = opcua_connection:response(Conn, Req, 429, #{
endpoints => Endpoints
}),
{reply, Resp, Conn};
handle_request(_Conn, _Req) ->
{error, bad_not_implemented}.
format_endopoints(EndpointSettings) ->
lists:map(fun endpoint_description/1, EndpointSettings).
endpoint_description({Url, ServerCert, SecurityLevel, SecurityMode, Policy, Tokens}) ->
#{
endpoint_url => Url,
server => #{
application_uri => <<"urn:stritzinger:opcua:erlang:server">>,
product_uri => <<"urn:stritzinger.com:opcua:erlang:server">>,
application_name => <<"Stritzinger GmbH OPCUA Server">>,
application_type => server,
gateway_server_uri => undefined,
discovery_profile_uri => undefined,
discovery_urls => [
<<"opc.tcp://0.0.0.0:4840">>
]
},
server_certificate => ServerCert,
security_mode => SecurityMode,
security_policy_uri => opcua_util:policy_uri(Policy),
user_identity_tokens => [format_token(Type, SecurityMode, Policy)
|| Type <- Tokens],
transport_profile_uri => ?TRANSPORT_PROFILE_BINARY,
security_level => SecurityLevel
}.
format_token(TokenType, SecurityMode, Policy) ->
#{
policy_id => list_to_binary(
string:join([
atom_to_list(TokenType),
atom_to_list(SecurityMode),
atom_to_list(Policy)], "-")),
token_type => TokenType,
issued_token_type => undefined,
issuer_endpoint_url => undefined,
security_policy_uri => opcua_util:policy_uri(Policy)
}.