-module(tda). -export([start/0, client/1, stop/0]). -export([ext/0, co/0]). -define(TIMEOUT, 300000). -define(CONNECT_TIMEOUT, 3000). -define(HOST, "192.168.240.20"). -define(PORT, 33333). start() -> register(tdaPid, spawn(?MODULE, client, [{dial, ?HOST, ?PORT}])). stop() -> tdaPid ! logout. ext() -> tdaPid ! ext. co() -> tdaPid ! co. client({dial, Host, Port}) -> io:format("Dial ~p:~p~n", [Host, Port]), Conn = gen_tcp:connect(Host, Port, [binary, {active, once}, {packet, 2}], ?CONNECT_TIMEOUT), client(Conn); client({ok, Sock}) -> io:format("Connected~n", []), tdaPid ! login, loop(Sock); client({error, Reason}) -> io:format("Error: ~p~n", [Reason]), {error, Reason}. loop(Sock) -> inet:setopts(Sock, [{active, once}]), io:format("Loop~n", []), receive login -> io:format("Login~n", []), {ok, Hello} = acse:associate(), gen_tcp:send(Sock, Hello); logout -> io:format("Logout~n", []), {ok, Bye} = acse:release(), gen_tcp:send(Sock, Bye); ext -> io:format("Request Ext lines~n", []), {ok, Rq} = rose:invoke({present, 2}, {local, 51}, csta:ext_lines()), io:format("Send: ~p~n", [Rq]), gen_tcp:send(Sock, Rq); co -> io:format("Request CO lines~n", []), {ok, Rq} = rose:invoke({present, 2}, {local, 51}, csta:co_lines()), io:format("Send: ~p~n", [Rq]), gen_tcp:send(Sock, Rq); {tcp, Sock, Data} -> io:format("Got ~p~n", [Data]), case decode(Data) of ok -> ok; {ok, Reply} -> io:format("Reply ~p~n", [Reply]), gen_tcp:send(Sock, Reply); error -> exit(error) end; {tcp_closed, _} -> io:format("Connection closed~n", []), exit(closed) after ?TIMEOUT -> exit(timeout) end, loop(Sock). decode(Data) -> case dispatch(Data) of rose -> {ok, Rose} = rose:decode(Data), io:format("ROSE> ~p~n", [Rose]), case rose:dispatch(Rose) of {ok, Result} -> {ok, Result}; {result, Data} -> io:format("Result: ~p~n", [Data]), ok; {ok} -> ok end; acse -> {ok, Acse} = acse:decode(Data), io:format("ACSE> ~p~n", [Acse]), acse:accepted(Acse) end. dispatch(<>) -> case Head of 96 -> acse; % aarq 97 -> acse; % aare 98 -> acse; % rlrq 99 -> acse; % rlre 100 -> acse; % abrt 161 -> rose; % invoke 162 -> rose; % returnResult 163 -> rose; % returnError 164 -> rose % reject end.