当前位置:
文档之家› Agent++_Snmp++概述
Agent++_Snmp++概述
Override:prepair_set_request
prepare_set_request在set之前发生。默认的实现是 检查是结点否具有写操作的权限,再检查设置值 的syntax是否与当前对象匹配,最后使用value_ok 判断是否为合法值。如果以上判断的结果都为真, 则返回set操作可继续进行。如果需要,我们可以 在这里与MO进行交互,完成set,如果操作失败, 我们直接返回错误代码即可,AGENT++ FrameWork会自动终止这次set操作(此时本地 Mib里的值没有被更改)并通知上层网管。
其它可配置宏与SNMP++的相同
Q&A
Thanks ☺
_NO_THREADS:不使用任何线程支持 AGENTPP_USE_THREAD_POOL:如果已经使 用了线程支持,是否使用线程池(对于基于 Windows等开发的Agent系统,强烈建议使用线程 和线程池,但是emb系统中的应用往往对task个 数以及任务调度的时间片有严格要求,可以不使 用线程支持,但是要注意防止重入的处理)
会生效。这个函数一般在单独任务中被循环调用。这个函数 在Snmp++3.5版本之前是脱离于任何类之外,在3.5中隶属于 Snmp::eventListHolder,请注意调用时的区别。
SNMP++ Trap发送示例
void send_trap() { int status; // return status CTarget target( (IpAddress) “10.4.8.5”); // SNMP++ v1 target Pdu pdu; // SNMP++ PDU //-------[ Construct a SNMP++ SNMP Object ]--------------------------------------Snmp snmp( status); // Create a SNMP++ session if ( status != SNMP_CLASS_SUCCESS) { // check creation status cout << snmp.error_msg( status); // if fail, print error string return; } status = snmp.trap( pdu, target,coldStart); cout << “ Trap Send Status = “ << snmp.error_msg( status); }
AGENT++类库
此处没有列出Mib类。 Mib聚和了一个或多个MibEntry; Mib的process_request方法由RequestList调用; 同时,对于一个工作中的Mib,需要使用自身的 set_request_list方法指定一个绑定的RequestList,这些在后面 的代码示例中有所表现。
SNMP++ TRAP接收示例
void my_trap_callback (int reason, Snmp* session, Pdu & pdu, TimeTicks ×tamp, void * callbackdata) { //此处进行trap的处理 } Snmp *snmp; void trap_register() { int status; TargetCollection targets; OidCollection trapids; snmp = new Snmp( status); if (( snmp == NULL) || ( status != SNMP_CLASS_SUCCESS)) return; if ( status = snmp->notify_register (trapids, targets, &my_trap_callback)) != SNMP_CLASS_SUCCESS) 注意:当SNMPProcessEvents正在被循环调用时Trap接收才 return; }
AGENT简要处理序列图
SnmpX RequestList Mib MibLeaf receive Set/Get Request PDU
process_request set/get
send Set/Get Response PDU
此处有prepair__request(或者是相应的get函数) 等多处顺序调用,为了方便表述,统一描述为set(或get).
Override:get_request
MibLeaf在响应get_request时,首先判断对 象的value是否有读的权限,如有,则使用 MibLeaf对象的当前value向Mib的 RequestList提交这次操作。如果我们各个 模块的逻辑在get操作中需要向MO索取数 据,则可以在提交操作前进行我们的操作 来修改value的值。
SNMP++同步/异步支持
支持同步的,block的set/get操作。 对于数据量大,不允许排队的情况,或者对于应答等待时间长的情 况,也可以使用异步操作。 以下以set 操作为例: 同步:int set( Pdu &pdu, SnmpTarget &target); (target中含有timeout信息) 异步:int set( Pdu &pdu, SnmpTarget &target, snmp_callback callback, void * callback_data=0); (以下是callback的原型) typedef void (*snmp_callback)( int, // reason (reason表明成功/失败/超时) Snmp*, // session handle Pdu &, // Pdu passed in SnmpTarget &, // source target void * ); // callback data
关于Sync基类和ThreadManager
以Synchronized作为父类的类是可防止重入的,但也要与 整个引擎进行配合 ThreadManager并不是管理线程的类,而是基于 Synchronized的基础,再次将防重入分为了对象实例级和 全局级 所有可重入的保证的前提是不定义NO_THREADS宏(就 是使用Agent++的线程机制),否则我们必须对所有可能 重入的函数做放重入处理 (建议大家有时间研究一下这部分代码:reentrant.h/cpp, threads.h/cpp)
Agent++/Snmp++概述
目录
SNMP++相关知识和配置
类库 示例 配置及其它
AGENT++相关知识和配置
类库 示例 配置及其它
Q&A
SNMP++/AGENT++是什么
是一个基于标准C++的SNMP管理站/代理程序开 发库(直观上来讲就是一系列的cpp/h文件) SNMP++自带协议以及PDU编解码实现,并不基 于现有的任何SNMP库(如WinSNMP等) SNMP++/AGENT++完全采用了面向对象的设计, 为开发者提供了面向对象的开发优势 开发商同时提供了针对Agent++的Mib设计工具等, 但开发者依然可以脱离这些工具单独使用 Snmp++/Agent++进行开发(不推荐)
构建最简AGENT
Snmpx snmp(status, 161); Mib* mib = new Mib(); RequestList* reqList = new RequestList(); mib->set_request_list(reqList); mib->add(new MyMibLeaf("1.3.6.1.2.1.1.1.169", READWRITE, new IpAddress("10.30.2.1"),VMODE_DEFAULT)); reqList->set_snmp(&snmp); mib->init(); Request* req; while (1) { req = reqList->receive(2);//参数表示时延 if (req) mib->process_request(req); else mib->cleanup(); } 见使用Agent++开发OM程序.ppt 描述了详细的流程。
SNMP++类库
SNMP++ Set操作示例
CTarget ctarget( (IpAddress) “10.4.8.5”); Vb vb[2]; Pdu pdu; // SNMP++ target // a vb for each object to set // SNMP++ PDU //-------[ Construct a SNMP++ SNMP Object ]--------------------------------------Snmp snmp( status); // Create a SNMP++ session //-------[ build up the vbs to get]----------------------------------------------------------------vb[0].set_oid( SYSCONTACT); vb[0].set_value(“Alan Turing”); vb[1].set_oid( SYSNAME); vb[1].set_value(“ The Turing Machine”); //----[ append all the vbs to the pdu ]----------------------------------------------------for ( int z=0;z<2;z++) pdu += vb[z]; //-------[ Invoke a SNMP++ Set ]------------------------------------------------------status = snmp.set( pdu, ctarget); cout << snmp.error_msg( status);