之前搞erlang的snmp例子死活搞不通,后来放弃了.
经过坛友的指点,再逐渐尝试一下.
%% coding: latin-1
-module(snmpcl).
-behaviour(application).
%% application callbacks
-export([main/1,start/0,start/1,start/2, stop/1]).
%% API
-export([walk/2, walk/3, walk/4]).
main(_)->
start(["localhost"]).
start()->
start(["localhost"]).
start([Addr])->
start(normal,[]),
walk(Addr,[1,3,6,1,2,1,1,5,0]),
stop(normal).
start(normal, _StartArgs) ->
snmpm:start(),
%%snmpm:register_user(snmpcl_user, snmpcl_user, undefined),
{ok, self()}.
stop(_State) ->
%%snmpm:unregister_agent(snmpcl_user, "snmpcl_user"),
snmpm:stop(),
timer:sleep(100),
%%snmpm_config:stop(),
init:stop().
%%ok.
walk(Address, Oid) ->
walk(v2, Address, "public", Oid).
walk(Address, Community, Oid) ->
walk(v2, Address, Community, Oid).
walk(Version, Address, Community, Oid) ->
Options =
[{engine_id, "the engine"},
{community, Community},
{version, Version}
| case Address of
{Host, Port} ->
[{address, Host},
{port, Port}
];
Host ->
[{address, Host}]
end
],
snmpm:register_user(snmpcl_user, snmpcl_user, undefined),
case snmpm:which_agents(snmpcl_user) of
[] -> ok;
_ ->
snmpm:unregister_agent(snmpcl_user, "snmpcl_user")
end,
snmpm:register_agent(snmpcl_user, "snmpcl_user", Options),
case snmpm:sync_get(snmpcl_user, "snmpcl_user", [Oid]) of
{ok, {_, _, Result}, _Remaining} ->
[{_, Oid, Type, Value, _}] = Result,
io:format("~p~n",[Result]),
%%snmpm:unregister_agent(snmpcl_user, "snmpcl_user"),
{Oid, Type, Value};
{error, Reason} ->
error_logger:error_msg("Can't send request to ~s due to ~p~n",
[Address, Reason])
end.
初步可以跑通
4> c("snmpcl.erl").
{ok,snmpcl}
5> c("snmpcl_user.erl").
{ok,snmpcl_user}
6> snmpcl:start(normal, []),
7> snmpcl:walk("localhost",[1,3,6,1,2,1,1,5,0]).
{[1,3,6,1,2,1,1,5,0],'OCTET STRING',"nb0411"}
erlang的snmp是基于gen_server框架.使用时会启动不少内部进程.
使用比较复杂.
还需要细致学习。