/
pingeragent.erl
114 lines (102 loc) · 3.27 KB
/
pingeragent.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
%%
%%pingeragent.erl
%%
%%----------------------------------------------------------------------
%%
%% eXAT, an erlang eXperimental Agent Tool
%% Copyright (C) 2005-07 Corrado Santoro (csanto@diit.unict.it)
%%
%% This program is free software: you can redistribute it and/or modify
%% it under the terms of the GNU General Public License as published by
%% the Free Software Foundation, either version 3 of the License, or
%% (at your option) any later version.
%%
%% This program is distributed in the hope that it will be useful,
%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%% GNU General Public License for more details.
%%
%% You should have received a copy of the GNU General Public License
%% along with this program. If not, see <http://www.gnu.org/licenses/>
%%
%%
%%
%%-------------------------------------------
%%THIS IS THE AGENTCITIES PINGER AGENT
%%-------------------------------------------
%%
-module(pingeragent).
-export([action/2, event/2, extends/0, on_starting/1,
pattern/2, send_ping_proc/4, start/0,
wait_pong_proc/4]).
-include("acl.hrl").
-include("fipa_ontology.hrl").
extends() -> nil.
action(Self, start) ->
[{timeout_event, send_ping_proc}];
action(Self, wait_pong) ->
[{acl_event, wait_pong_proc}].
event(Self, timeout_event) -> {timeout, to_value};
event(Self, acl_event) -> {acl, all_pattern}.
pattern(Self, to_value) -> 1000;
pattern(Self, all_pattern) -> [#aclmessage{}].
%%
%%
%%
on_starting(Self) ->
logger:start('PINGER'),
case exat:get_argument(destagent) of
{ok, [PingedAgent]} ->
{ID, ADR} = lists:splitwith(fun (X) -> X =/= $, end,
PingedAgent),
AgentID = case ADR of
[] -> PingedAgent;
[$, | ADDR] ->
#'agent-identifier'{name = ID, addresses = [ADDR]}
end,
object:set(Self, destagent, AgentID);
_ ->
logger:log('PINGER',
{"Invalid destination agent. Use '-destagent "
"name,mtp_address",
[]}),
object:set(Self, destagent, none)
end.
%%
%% get the ping message
%%
send_ping_proc(Self, Event, _, Action) ->
Dest = object:get(Self, destagent),
if Dest == none -> object:stop(Self);
true ->
object:set(Self, timestamp, erlang:now()),
acl:query_ref(#aclmessage{sender = Self,
receiver = Dest, content = "ping"}),
object:do(Self, wait_pong)
end.
%%
%%
%%
%%
%% wait the 'alive' message
%%
wait_pong_proc(Self, Event,
Msg = #aclmessage{speechact = 'INFORM'}, Action) ->
T1 = erlang:now(),
T0 = object:get(Self, timestamp),
Diff = timer:now_diff(T1, T0) / 1.0e+3,
logger:log('PINGER',
{"Received MESSAGE ~p, Elapsed ~p ms",
[Msg#aclmessage.content, Diff]}),
object:do(Self, start);
%%
%%
%%
wait_pong_proc(Self, Event, Msg, Action) ->
logger:log('PINGER',
{"BAD MESSAGE ~p", [Msg#aclmessage.content]}),
object:do(Self, start).%%
%%
%%
start() ->
agent:new(pingeragent, [{behaviour, pingeragent}]).