-module(tda). -export([associate_request/0, associate_result/1]). -export([release_request/0, release_result/1]). -export([associate_abort/1]). -export([system_status/0, system_status/1]). -export([client/0, stop/1, loop/1]). -include("acse.hrl"). -include("rose.hrl"). associate_request() -> Ver = #'NewACSEUserInformationForCSTA'{cSTAVersion = [versionFive]}, {ok, Enc} = acse:encode('ACSEUserInformationForCSTA', {newDefinition, Ver}), Pdu = #'AARQ-apdu'{'application-context-name' = {1, 3, 12, 0, 218}, 'user-information' = [#'EXTERNAL'{ 'direct-reference' = {1, 3, 12, 0, 285, 200}, encoding = {'single-ASN1-type', Enc}}]}, acse:encode('AARQ-apdu', Pdu). % Accept % <<97,47,128,2,7,128,161,7,6,5,43,12,0,129,90,162,3,2,1,0,163,5,161,3,2,1,1,190,20,40,18,6,7,43,12,0,130,29,129,72,160,7,160,5,3,3,0,8,0>> % Reject % <<97,25,128,2,7,128,161,7,6,5,43,12,0,129,90,162,3,2,1,1,163,5,161,3,2,1,1>> associate_result(Bin) -> case acse:decode('AARE-apdu', Bin) of {ok, Pdu} -> Pdu#'AARE-apdu'.result; {error, Reason} -> Reason end. release_request() -> acse:encode('RLRQ-apdu', #'RLRQ-apdu'{}). release_result(Bin) -> acse:decode('RLRE-apdu', Bin). % <<100,3,128,1,0>> associate_abort(Bin) -> {ok, Pdu} = acse:decode('ABRT-apdu', Bin), Pdu#'ABRT-apdu'.'abort-source'. % <<161,12,2,1,1,2,2,0,211,48,3,10,1,2>> % <<162,11,2,1,1,48,6,2,2,0,211,5,0>> system_status(Bin) -> case rose:decode('ROS', Bin) of {ok, {invoke, Invoke}} -> {id(Invoke), opcode(Invoke), arg(Invoke)}; {error, Reason} -> Reason end. opcode(#'Invoke'{opcode = {local, Opcode}}) -> Opcode; opcode(Any) -> {local, Any}. id(#'Invoke'{invokeId = {present, Id}}) -> Id; id(Any) -> {present, Any}. arg(#'Invoke'{argument = Arg}) -> Arg. system_status() -> RR = #'ReturnResult_result'{opcode = {local, 211}, result = <<5,0>>}, R = #'ReturnResult'{invokeId = {present, 1}, result = RR}, io:format("~p~n", [R]), case rose:encode('ROS', {returnResult, R}) of {ok, Invoke} -> Invoke; {error, Reason} -> Reason end. client() -> Host = "192.168.240.20", case gen_tcp:connect(Host, 33333, [{packet, 2}]) of {ok, Sock} -> loop(Sock); {error, Reason} -> {error, Reason} end. stop(Sock) -> gen_tcp:close(Sock). loop(Sock) -> Hello = associate_request(), %{tcp, Sock} ! Hello, gen_tcp:send(Sock, Hello), receive {tcp, S, Whatever} -> io:format(">>> ~p ~p ~n", [S, Whatever]), loop(Sock); {tcp_closed, S} -> S end.