Master-SubAgent 开发经验

合集下载

javaagent javassist方法记述

javaagent javassist方法记述

javaagent javassist方法记述(实用版3篇)目录(篇1)1.JavaAgent 简介2.Javassist 简介3.JavaAgent 中的 Javassist 方法4.示例:使用 JavaAgent 和 Javassist 实现方法拦截正文(篇1)1.JavaAgent 简介JavaAgent 是一种 Java 字节码生成技术,可以在运行时动态生成、修改或替换 Java 类的字节码。

这使得开发者可以在不修改原始源代码的情况下,对 Java 类进行增强或修改其行为。

JavaAgent 通常与 Java 类加载器(ClassLoader)一起工作,以便在类加载过程中对类进行定制。

2.Javassist 简介Javassist(Java Assistant)是一个开源的 Java 字节码生成库,它提供了简单易用的 API,让开发者可以方便地生成、修改和解析 Java 字节码。

Javassist 支持许多字节码操作,例如添加、删除或修改类、方法、字段等。

3.JavaAgent 中的 Javassist 方法在 JavaAgent 中,可以使用 Javassist API 来实现对 Java 类和方法的定制。

以下是一些常用的 Javassist 方法:- CGenProxy.getProxyMethod:用于获取代理对象的某个方法的代理实现。

- CGenProxy.setInterceptor:用于设置方法拦截器,可以在方法执行前或执行后执行自定义代码。

- CMethodInterceptor.intercept:方法拦截器的核心实现,可以在方法执行前或执行后执行自定义代码。

4.示例:使用 JavaAgent 和 Javassist 实现方法拦截以下是一个简单的示例,展示了如何使用 JavaAgent 和 Javassist 实现方法拦截:```java// 1.创建一个 JavaAgent 对象JavaAgent agent = new JavaAgent();// 2.设置代理目标类agent.setTarget("java.util.ArrayList");// 3.创建一个方法拦截器class MethodInterceptor implements CMethodInterceptor {@Overridepublic void intercept(MethodInterceptor.MethodInfo methodInfo) {System.out.println("Before method execution");// 在这里编写方法执行前的自定义代码System.out.println("After method execution");// 在这里编写方法执行后的自定义代码}}// 4.设置方法拦截器agent.setInterceptor(new MethodInterceptor());// 5.启动 JavaAgentagent.start();```在这个示例中,我们使用 JavaAgent 和 Javassist 实现了对ArrayList 类的方法拦截。

多agent结构

多agent结构

多agent结构
多agent结构介绍如下:
多agent结构系统(MAS)由多个自主或半自主的智能体组成,每个Agent或者履行自己的职责,或者与其他Agent通信获取信息互相协作完成整个问题的求解。

与单Agent相比,多agent结构有如下特点:①社会性:Agent 处于由多个Agent构成的社会环境中,通过某种Agent语言与其他Agent实施灵活多样的交互和通讯,实现与其他Agent的合作、协同、协商、竞争等。

②自制性:在多Agent系统中一个Agent发出请求后,其他Agent只有同时具备提供此服务的能力与兴趣时才能接受动作委托,即一个Agent不能强制另一个Agent提供某种服务。

这一特点最适用于学习者特征的获取。

③协作性:在多agent结构系统中,具有不同目标的各个Agent必须相互协作、协同、协商对未完成问题的求解。

agent++ 开发实例

agent++ 开发实例

agent++ 开发实例(原创实用版)目录1.agent++简介2.agent++的功能3.agent++的应用实例4.agent++的优势与不足5.agent++的未来发展前景正文一、agent++简介Agent++是一种基于 Java 语言编写的人工智能代理程序,主要用于模拟和实现多智能体系统中的代理行为。

多智能体系统是由一群具有一定自主性、协同性和学习能力的智能体组成的系统,而 Agent++正是为了解决这类问题而设计的。

二、agent++的功能Agent++具有以下几个主要功能:1.通信机制:Agent++提供了多种通信机制,如消息传递、远程调用等,以实现智能体之间的信息交流和协作。

2.学习与决策:Agent++支持多种学习算法,如强化学习、遗传算法等,以帮助智能体在不断与环境交互的过程中进行学习和优化决策。

3.感知与运动控制:Agent++提供了丰富的感知和运动控制模块,使智能体能够更好地感知环境信息并作出相应的运动决策。

三、agent++的应用实例Agent++在多智能体系统中具有广泛的应用,以下以一个简单的例子来说明其应用:假设有一个由多个机器人组成的仓库管理系统,每个机器人负责搬运不同种类的货物。

在传统的程序设计中,我们需要为每个机器人编写特定的搬运规则,当环境发生变化时,需要重新修改程序。

而使用 Agent++,我们可以将每个机器人看作一个智能体,通过学习算法让它们自主学习最佳的搬运策略。

这样,当环境发生变化时,机器人可以根据学习到的策略自主调整行为,无需修改程序。

四、agent++的优势与不足Agent++的优势主要体现在以下几个方面:1.强大的通信机制:Agent++提供了丰富的通信机制,可以满足多智能体系统中复杂多样的通信需求。

2.灵活的学习算法:Agent++支持多种学习算法,可以根据实际问题进行灵活选择,提高问题求解效率。

3.易于扩展:Agent++采用模块化设计,方便开发者根据需要进行功能扩展和定制。

GitHub的最佳实践和使用方法

GitHub的最佳实践和使用方法

GitHub的最佳实践和使用方法GitHub是一个集代码托管、版本控制、协作开发于一体的在线平台,是程序员和开发者必不可少的工具之一。

本文将从GitHub的最佳实践、分支管理、提交规范和代码审查等方面为大家详细介绍如何有效地利用GitHub进行协作开发。

一、GitHub的最佳实践1. 创建README文件README文件是每个项目的门面,通过它可以让其他人快速了解项目的目的、功能、用法等信息。

尽量使README简单明了,文字清晰,不要出现错别字和语法错误。

2. 使用IssueIssue是GitHub提供的一种问题跟踪系统,可以方便地管理和解决问题。

通过Issue,你可以记录和追踪各种问题、任务和功能需求,同时也可以回答其他人的问题。

3. 善用WikiWiki是一个开源的协作式文档平台,可以帮助开发者创建和共享文档、指南和提示等。

它可以帮助你整理项目的结构、文档和规范,方便其他人了解项目的目的和用途。

二、分支管理1. 主分支主分支通常是master分支,用于对外发布可用的代码。

在任何时候,主分支都应该是稳定、可用、高质量的代码。

尽量不要在主分支上进行实验性的修改和提交。

2. 开发分支开发分支通常是develop分支,用于进行开发和测试。

在开发分支上进行实验性的修改和提交,只有当开发完成并经过测试后才能合并到主分支。

3. 功能分支功能分支通常是feature分支,用于对开发分支上的单个功能进行开发。

每个功能都应该有一个单独的功能分支,这样可以保持代码的可维护性和可测试性。

当功能开发完成并经过测试后,可以将其合并到开发分支。

三、提交规范1. 提交信息提交信息应当简单明了,推荐使用英文,包括提交的类型、句号、描述内容。

其中,“提交类型”应该是固定的,可以是feature、fix、docs、style、refactor、test、chore等类型。

2. 提交频率提交频率应该尽量高,并保持提交的代码尽可能小。

afsim系统开发方法

afsim系统开发方法

afsim系统开发方法AFSIM(Agent-based Framework for Simulation)是一种用于开发模拟系统的方法。

它基于代理模型,旨在模拟人类行为和决策过程,以及模拟整个系统的动态演化。

AFSIM的目标是提供一种灵活、可扩展和易于使用的开发框架,以便研究人员和开发人员能够快速构建各种类型的模拟系统。

AFSIM的核心思想是将系统中的各个组成部分建模为独立的代理。

每个代理都有自己的状态、行为和决策规则。

这些代理可以相互交互,以模拟现实世界中的合作、竞争和冲突。

通过模拟代理之间的互动,AFSIM可以预测系统的行为和性能,并帮助决策者制定有效的政策和策略。

AFSIM的开发过程通常包括以下几个阶段:1.需求分析:在这个阶段,开发团队与系统的最终用户一起确定模拟系统的需求和目标。

他们将收集和分析相关数据,以了解系统的特点和行为。

这些需求将指导后续的开发工作。

2.设计和建模:在这个阶段,开发团队将使用AFSIM提供的建模工具,将系统的各个组成部分抽象为代理,并定义它们的状态、行为和决策规则。

这些代理可以是个体、组织、环境等。

3.实现和测试:在这个阶段,开发团队将根据设计和建模阶段的结果,使用编程语言和相关工具实现代理和模拟系统的其他组件。

然后,他们将对系统进行测试,以验证其正确性和性能。

4.部署和应用:在这个阶段,开发团队将把开发完成的模拟系统部署到实际环境中,并将其应用于具体的问题领域。

他们将与最终用户一起使用系统,收集反馈,进行改进和优化。

AFSIM的优点是灵活性和可扩展性。

它可以应用于各种领域,如交通、医疗、军事等。

它可以模拟复杂的系统行为,并帮助决策者制定合理的决策。

此外,AFSIM还具有友好的用户界面和易于使用的工具,使开发人员可以快速构建和测试模拟系统。

AFSIM是一种基于代理模型的开发方法,用于构建模拟系统。

它通过模拟人类行为和决策过程,以及整个系统的动态演化,帮助研究人员和开发人员理解和预测系统的行为和性能。

Master-SubAgent 开发经验

Master-SubAgent 开发经验

Master-SubAgent 开发经验1. 协议栈修改1.1 DLLAgent 句柄问题函数:ExtensionDLL::init(Mib* mib, const char* dllPath)//Modify by QYD 2004.7.23HANDLE eventHandle = 0;......if (eventHandle == INV ALID_HANDLE_V ALUE)eventHandle = 0;1.2 Set操作权限问题函数:DWORD WINAPI ServiceWorker(LPVOID threadParam)注释掉下面语句,下面语句意思是:对v1v2cWriteView这个视图,不包含 1.3.6.1.4 下的Mib就是说私有Mib不能进行V1V2的Set操作/*vacm->addNewView("v1v2cWriteView","1.3.6.1.4","", // Mask "" is same as 0xFFFFFFFFFF...view_excluded, // alternatively: view_excludedstorageType_nonVolatile);*/2. 宏说明2.1 TS_SYNCHRONIZED#define TS_SYNCHRONIZED(x) { ThreadSynchronize _ts_synchronize(*this); x })把x的内容(x一般为一个函数)定义为同步的,就是同一时间只能有一个调用,就是说在多线程的时候,同时只能有一个线程调用此函数2.2 AGENTX_SUBAGENT_TIMEOUT_SET_REQUESTS// Timeout set requests to (1) avoid deadlocks or (2) if master agent// does not properly implement SET request processing#define AGENTX_SUBAGENT_TIMEOUT_SET_REQUESTS 13. 协议栈应用3.1 MIB Table 处理流程private:unsigned long currentRequest;virtual void update(Request* req) {LOG_BEGIN(INFO_LOG | 1);LOG("DynamicTable: updating table");LOG_END;//对于table下的每一个子请求,都会调用update,所以需要用户自己判断是否执行if (currentRequest == req->get_request_id()) return;currentRequest = req->get_request_id();start_synch();int r = rand();if (r >= RAND_MAX/2) {MibTableRow* row = add_row(get_next_avail_index()); //增加一行,参数就是这一行的idxrow->get_nth(0)->replace_value(new SnmpInt32(r)); //对table里的一个元素的值进行置换//row->get_nth(1)->replace_value(new SnmpInt32(r));}else {if (!is_empty()) \\如果表不为空remove_row(content.first()->get_index());}end_synch();}3.2 删除所有的行virtual void MibTable::clear ()3.3 查找指定行MibTableRow* MibTable::find_index ( const Oidx & ) const3.4 获取下一个可用的idxReturn the next available index value for the receiver table, that can be used be a manager to create a new rowvirtual Oidx get_next_avail_index () const4. 发送Trap 流程4.1 单Agent发Trap 流程1//Vbx* vbs = 0;Vbx* vbs = new Vbx[4];int n = 0;vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.4.0.1");vbs[n++].set_value(Counter32(rand()));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.5.0.1");vbs[n++].set_value(Gauge32(rand()));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.6.0.1");vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.7.0.1");vbs[n++].set_value(SnmpInt32(rand()));coldStartOid coldOid;NotificationOriginator no;// add an example destinationUdpAddress dest("127.0.0.1/162");no.add_v1_trap_destination(dest);// send the notificationmib->notify("", coldOid, vbs, 4);4.2 单Agent发Trap 流程2-->生成Vbx对象,并设置数据(这是trap的附加数据参数) Vbx* vbs = new Vbx[4];int n = 0;vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.4.0.1");vbs[n++].set_value(Counter32(rand()));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.5.0.1");vbs[n++].set_value(Gauge32(rand()));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.6.0.1");vbs[n++].set_value(TimeTicks(rand()));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.7.0.1");vbs[n++].set_value(SnmpInt32(rand()));************************************************* Vbx* vbs = new Vbx[9];int n = 0;vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.4.0.1");vbs[n++].set_value(Counter32(rand()));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.5.0.1");vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.6.0.1");vbs[n++].set_value(TimeTicks(rand()));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.7.0.1");vbs[n++].set_value(SnmpInt32(rand()));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.8.0.1");OctetStr s;int length = rand()/(RAND_MAX/5);for (int i=0; i<length; i++) {s += (unsigned char)(rand()/(RAND_MAX/128)+64);}vbs[n++].set_value(s);vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.9.0.1");char ipaddr[30];sprintf(ipaddr, "%d.%d.%d.%d",rand()/(RAND_MAX/256),rand()/(RAND_MAX/256),rand()/(RAND_MAX/256),rand()/(RAND_MAX/256));vbs[n++].set_value(IpAddress(ipaddr));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.10.0.1");vbs[n++].set_value(Oid("1.3.6.1.2.1.340775556.0"));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.11.0.1");unsigned long low = rand();unsigned long high = rand();vbs[n++].set_value(Counter64(high, low));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.12.0.1");OpaqueStr op(s);vbs[n++].set_value(op);-->生成对应的Notify对象,如stIvrAlarmNotify no-->可以调用no.的成员函数,设置其他参数UdpAddress dest("127.0.0.1/162");no.add_v1_trap_destination(dest);-->调用对象的generate函数no.generate(vbs, NUM, ""); NUM为vbs的array数4.3 SubAgent发Trap流程1/* Do not use NotificationOriginator in a subagent!Instead use SubAgentXMib::notify(..) */ Vbx vb("1.3.6.1.2.1.2.2.1.1.1");vb.set_value(1);mib->notify("", "1.3.6.1.6.3.1.1.5.3", &vb, 1);4.4 SubAgent发Trap流程2NotifyThread notify(mib);notify.start();class NotifyThread: public Thread {public:NotifyThread(SubAgentXMib* m) { mib = m; }void run() {for (int i=0; i<100; i++) {// Send a cold start trap to the masterVbx vb("1.3.6.1.2.1.2.2.1.1.1");vb.set_value(1);mib->notify("", "1.3.6.1.6.3.1.1.5.3", &vb, 1);sleep(100);}}private:SubAgentXMib* mib;};5. 流程分析5.1 master流程master流程:(参考agent++win32\examples\agentx_master下的agentx_master.cpp)5.1.1主流程-->分析main带入的参数(-i:安装一个Server,-u:删除一个Server,-n安装并运行Server)-->启动server,MasterAgentXMibWin32::start_service()-->把Server加入到Server控制管理器里;StartServiceCtrlDispatcher(serviceTableEntries) (win SDK函数)-->初始化信号init_signals();-->运行server; MasterAgentXMibWin32::Service(argc, argv);-->MasterAgentXMibWin32* mib = new MasterAgentXMibWin32()-->MasterAgentXMibWin32::init_service()-->RegisterServiceCtrlHandlerEx(serviceTableEntries[0].lpServiceName, HandlerEx, 0) -->建立Socket连接;Snmp::socket_startup();-->新建SNMP对象;Snmpx *snmp = new Snmpx(status, port);-->Create一个EngineID; OctetStr engineId(SnmpEngineID::create_engine_id(port))-->获取Server重起次数;mib->get_boot_counter(engineId, snmpEngineBoots) (用户可替换自己函数)-->重起次数+1,再set_boot_counter(engineId, snmpEngineBoots)-->新建一个对象,v3MP *v3mp = new v3MP(engineId, snmpEngineBoots, stat)-->建立工作线程,HANDLE hWorkerThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ServiceWorker, mib, 0, NULL);-->如果Server加入到Server控制管理器里,对Server状态做些设置-->等待工作线程退出WaitForSingleObject(hWorkerThread, INFINITE);-->结束5.1.2ServiceWorker线程DWORD WINAPI ServiceWorker(LPVOID threadParam)-->reqList = new RequestList();-->reqList->set_v3mp(mib->v3mp);-->agentx = new AgentXMaster();-->agentx->set_connect_mode(AX_USE_TCP_SOCKET); (这里说在Win32里只用TCP连接,不知是指与SubAgent的链接还是与外部连接)-->mib->set_auto_context(TRUE); 允许context的自动创建,SubAgent就是作为一个Context 来注册的-->Add MIB组-->Vacm* vacm = new Vacm(*mib);-->MasterAgentXMibWin32::init();-->处理extensionDLL,就是存放在注册表里的DLL,也可以看作是SubAgent, 注册表对应位置:HKEY_LOCAL_MACHINE\SYSTEM\\CurrentControlSet\\Services\\SNMP\\ Parameters \\ExtensionAgents\\-->MasterAgentXMibWin32::init_source_addresses(); 注册表对应位置:HKEY_LOCAL_MACHINE\SYSTEM\\CurrentControlSet\\Services\\SNMP\\Parameters\\Per mittedManagers\\-->获取注册表里定义的Community name; MasterAgentXMibWin32::init_communities();注册表对应位置:HKEY_LOCAL_MACHINE\SYSTEM\\CurrentControlSet\\Services\\SNMP \\Parameters\\ValidCommunities\\-->获取注册表里定义的告警目标地址;MasterAgentXMibWin32::init_notification_targets() ;注册表对应位置:HKEY_LOCAL_MACHINE\SYSTEM\\CurrentControlSet\\Services\\SNMP\\Parameters\\Tra pConfiguration\\-->获取配置文件的路径;MasterAgentXMibWin32::get_config_path(); 注册表对应位置:HKEY_LOCAL_MACHINE\SOFTWARE\\Agentpp\\AgentConfig\\ConfigPath\\;一般路径是C:\Documents and Settings\qyd\AGENTPP\CONFIG\-->MasterAgentXMib::init();-->axThread = new ThreadPool(1);-->axRegThread = new QueuedThreadPool(1);-->axBulkThread = new QueuedThreadPool(2);-->axSetThread = new QueuedThreadPool(1);-->axRegThread->start();-->axBulkThread->start();-->axSetThread->start();-->Mib::init()-->threadPool = new ThreadPool();-->获取配置文件,读取配置文件。

xagent 实现的机制

xagent 实现的机制

xagent 实现的机制xAgent 是一种用于实现跨平台应用程序监控和管理的中间件。

它通过提供统一的接口和协议,使得应用程序可以被集中管理,并能在各种操作系统和平台上运行。

xAgent 的实现机制主要包括以下几个方面:插件化架构、代理模式、消息通信和远程命令执行。

一、插件化架构xAgent 采用插件化架构,将各项功能模块以插件的形式进行组织和管理。

这种架构带来了以下几个优势:1. 灵活性:通过插件化架构,新的功能模块可以很方便地添加或移除,使得xAgent的功能可以根据实际需求进行灵活配置和扩展。

2. 松耦合:各个功能模块之间通过接口进行交互,相互独立,降低了模块之间的依赖性,提高了系统的可维护性和可扩展性。

3. 高效性:插件化架构可以将不同功能的处理逻辑划分到不同的插件中,提高了系统的处理效率和性能。

二、代理模式xAgent 采用了代理模式,将应用程序的操作和监控通过代理进行统一管理。

代理模式的实现主要包括以下几个步骤:1. 代理的注册:应用程序启动时,xAgent 会自动注册代理,将应用程序的相关信息和接口注册到 xAgent 的管理服务器上。

2. 代理的激活:xAgent 在接收到应用程序的请求后,会根据应用程序的标识符选择合适的代理进行激活,并将请求转发给对应的代理进行处理。

3. 代理的操作:代理根据接收到的请求执行相应的操作,比如获取应用程序的状态、启动、停止或重启应用程序等。

4. 代理的监控:代理可以监控应用程序的运行状态、资源使用情况等,并将监控数据上报给 xAgent 的管理服务器,供后续处理和分析。

三、消息通信xAgent 使用消息通信机制实现代理与管理服务器之间的交互。

消息通信主要包括以下几个环节:1. 请求消息:应用程序向 xAgent 发送请求消息,请求执行特定的操作或获取相关信息。

2. 响应消息:代理收到请求消息后,执行相应的操作,并将执行结果作为响应消息返回给应用程序。

mantisbt使用方法

mantisbt使用方法

mantisbt使用方法MantisBT使用方法MantisBT是一款开源的缺陷跟踪系统,被广泛应用于软件开发和项目管理中。

本文将介绍MantisBT的使用方法,帮助用户快速上手并有效地利用该系统进行缺陷管理和问题跟踪。

一、安装和配置需要将MantisBT下载并安装在服务器上。

安装完成后,在配置文件中设置数据库连接和相关参数。

然后通过浏览器访问MantisBT的URL,在安装向导中完成基本配置。

确保配置完成后,可以正常登录MantisBT系统。

二、创建项目登录MantisBT后,点击顶部菜单中的“创建项目”按钮,填写项目名称、描述等信息。

创建项目后,可以设置访问权限、指派人员、设置缺陷的优先级等。

三、创建缺陷在项目页面中,点击“报告问题”按钮,填写缺陷的详细信息,如标题、描述、重现步骤等。

可以选择缺陷的优先级、状态、指派给哪个人员等。

填写完毕后,点击“提交”按钮,即可创建缺陷。

四、跟踪和管理缺陷在项目页面中,可以查看当前项目的缺陷列表。

可以根据不同的条件进行筛选和排序,以便更好地管理和跟踪缺陷。

点击缺陷标题,可以查看缺陷的详细信息,包括描述、状态、指派给谁等。

可以对缺陷进行编辑、指派给其他人员、添加备注等操作。

五、解决缺陷当某个缺陷被修复后,可以将其状态设置为“已解决”。

在解决缺陷时,可以选择是否需要验证该缺陷是否已经修复。

如果需要验证,可以将缺陷状态设置为“待验证”,然后由相关人员进行验证。

验证通过后,将缺陷状态设置为“已关闭”。

六、查看报表MantisBT提供了各种报表,用于统计和分析缺陷的情况。

可以查看缺陷按状态、优先级、指派给谁等进行分类的统计图表。

这些报表可以帮助项目管理人员更好地了解项目进展和缺陷情况。

七、设置通知和提醒MantisBT支持通过邮件通知用户有关缺陷的变更和更新。

在用户配置页面中,可以设置接收哪些类型的通知以及通知的频率。

这样可以及时了解缺陷的最新状态,提高沟通效率。

八、集成其他工具MantisBT可以与其他工具进行集成,如版本控制系统、测试管理工具等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Master-SubAgent 开发经验1. 协议栈修改1.1 DLLAgent 句柄问题函数:ExtensionDLL::init(Mib* mib, const char* dllPath)//Modify by QYD 2004.7.23HANDLE eventHandle = 0;......if (eventHandle == INV ALID_HANDLE_V ALUE)eventHandle = 0;1.2 Set操作权限问题函数:DWORD WINAPI ServiceWorker(LPVOID threadParam)注释掉下面语句,下面语句意思是:对v1v2cWriteView这个视图,不包含 1.3.6.1.4 下的Mib就是说私有Mib不能进行V1V2的Set操作/*vacm->addNewView("v1v2cWriteView","1.3.6.1.4","", // Mask "" is same as 0xFFFFFFFFFF...view_excluded, // alternatively: view_excludedstorageType_nonVolatile);*/2. 宏说明2.1 TS_SYNCHRONIZED#define TS_SYNCHRONIZED(x) { ThreadSynchronize _ts_synchronize(*this); x })把x的内容(x一般为一个函数)定义为同步的,就是同一时间只能有一个调用,就是说在多线程的时候,同时只能有一个线程调用此函数2.2 AGENTX_SUBAGENT_TIMEOUT_SET_REQUESTS// Timeout set requests to (1) avoid deadlocks or (2) if master agent// does not properly implement SET request processing#define AGENTX_SUBAGENT_TIMEOUT_SET_REQUESTS 13. 协议栈应用3.1 MIB Table 处理流程private:unsigned long currentRequest;virtual void update(Request* req) {LOG_BEGIN(INFO_LOG | 1);LOG("DynamicTable: updating table");LOG_END;//对于table下的每一个子请求,都会调用update,所以需要用户自己判断是否执行if (currentRequest == req->get_request_id()) return;currentRequest = req->get_request_id();start_synch();int r = rand();if (r >= RAND_MAX/2) {MibTableRow* row = add_row(get_next_avail_index()); //增加一行,参数就是这一行的idxrow->get_nth(0)->replace_value(new SnmpInt32(r)); //对table里的一个元素的值进行置换//row->get_nth(1)->replace_value(new SnmpInt32(r));}else {if (!is_empty()) \\如果表不为空remove_row(content.first()->get_index());}end_synch();}3.2 删除所有的行virtual void MibTable::clear ()3.3 查找指定行MibTableRow* MibTable::find_index ( const Oidx & ) const3.4 获取下一个可用的idxReturn the next available index value for the receiver table, that can be used be a manager to create a new rowvirtual Oidx get_next_avail_index () const4. 发送Trap 流程4.1 单Agent发Trap 流程1//Vbx* vbs = 0;Vbx* vbs = new Vbx[4];int n = 0;vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.4.0.1");vbs[n++].set_value(Counter32(rand()));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.5.0.1");vbs[n++].set_value(Gauge32(rand()));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.6.0.1");vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.7.0.1");vbs[n++].set_value(SnmpInt32(rand()));coldStartOid coldOid;NotificationOriginator no;// add an example destinationUdpAddress dest("127.0.0.1/162");no.add_v1_trap_destination(dest);// send the notificationmib->notify("", coldOid, vbs, 4);4.2 单Agent发Trap 流程2-->生成Vbx对象,并设置数据(这是trap的附加数据参数) Vbx* vbs = new Vbx[4];int n = 0;vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.4.0.1");vbs[n++].set_value(Counter32(rand()));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.5.0.1");vbs[n++].set_value(Gauge32(rand()));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.6.0.1");vbs[n++].set_value(TimeTicks(rand()));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.7.0.1");vbs[n++].set_value(SnmpInt32(rand()));************************************************* Vbx* vbs = new Vbx[9];int n = 0;vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.4.0.1");vbs[n++].set_value(Counter32(rand()));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.5.0.1");vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.6.0.1");vbs[n++].set_value(TimeTicks(rand()));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.7.0.1");vbs[n++].set_value(SnmpInt32(rand()));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.8.0.1");OctetStr s;int length = rand()/(RAND_MAX/5);for (int i=0; i<length; i++) {s += (unsigned char)(rand()/(RAND_MAX/128)+64);}vbs[n++].set_value(s);vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.9.0.1");char ipaddr[30];sprintf(ipaddr, "%d.%d.%d.%d",rand()/(RAND_MAX/256),rand()/(RAND_MAX/256),rand()/(RAND_MAX/256),rand()/(RAND_MAX/256));vbs[n++].set_value(IpAddress(ipaddr));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.10.0.1");vbs[n++].set_value(Oid("1.3.6.1.2.1.340775556.0"));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.11.0.1");unsigned long low = rand();unsigned long high = rand();vbs[n++].set_value(Counter64(high, low));vbs[n ].set_oid("1.3.6.1.2.1.92.1.3.2.1.12.0.1");OpaqueStr op(s);vbs[n++].set_value(op);-->生成对应的Notify对象,如stIvrAlarmNotify no-->可以调用no.的成员函数,设置其他参数UdpAddress dest("127.0.0.1/162");no.add_v1_trap_destination(dest);-->调用对象的generate函数no.generate(vbs, NUM, ""); NUM为vbs的array数4.3 SubAgent发Trap流程1/* Do not use NotificationOriginator in a subagent!Instead use SubAgentXMib::notify(..) */ Vbx vb("1.3.6.1.2.1.2.2.1.1.1");vb.set_value(1);mib->notify("", "1.3.6.1.6.3.1.1.5.3", &vb, 1);4.4 SubAgent发Trap流程2NotifyThread notify(mib);notify.start();class NotifyThread: public Thread {public:NotifyThread(SubAgentXMib* m) { mib = m; }void run() {for (int i=0; i<100; i++) {// Send a cold start trap to the masterVbx vb("1.3.6.1.2.1.2.2.1.1.1");vb.set_value(1);mib->notify("", "1.3.6.1.6.3.1.1.5.3", &vb, 1);sleep(100);}}private:SubAgentXMib* mib;};5. 流程分析5.1 master流程master流程:(参考agent++win32\examples\agentx_master下的agentx_master.cpp)5.1.1主流程-->分析main带入的参数(-i:安装一个Server,-u:删除一个Server,-n安装并运行Server)-->启动server,MasterAgentXMibWin32::start_service()-->把Server加入到Server控制管理器里;StartServiceCtrlDispatcher(serviceTableEntries) (win SDK函数)-->初始化信号init_signals();-->运行server; MasterAgentXMibWin32::Service(argc, argv);-->MasterAgentXMibWin32* mib = new MasterAgentXMibWin32()-->MasterAgentXMibWin32::init_service()-->RegisterServiceCtrlHandlerEx(serviceTableEntries[0].lpServiceName, HandlerEx, 0) -->建立Socket连接;Snmp::socket_startup();-->新建SNMP对象;Snmpx *snmp = new Snmpx(status, port);-->Create一个EngineID; OctetStr engineId(SnmpEngineID::create_engine_id(port))-->获取Server重起次数;mib->get_boot_counter(engineId, snmpEngineBoots) (用户可替换自己函数)-->重起次数+1,再set_boot_counter(engineId, snmpEngineBoots)-->新建一个对象,v3MP *v3mp = new v3MP(engineId, snmpEngineBoots, stat)-->建立工作线程,HANDLE hWorkerThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ServiceWorker, mib, 0, NULL);-->如果Server加入到Server控制管理器里,对Server状态做些设置-->等待工作线程退出WaitForSingleObject(hWorkerThread, INFINITE);-->结束5.1.2ServiceWorker线程DWORD WINAPI ServiceWorker(LPVOID threadParam)-->reqList = new RequestList();-->reqList->set_v3mp(mib->v3mp);-->agentx = new AgentXMaster();-->agentx->set_connect_mode(AX_USE_TCP_SOCKET); (这里说在Win32里只用TCP连接,不知是指与SubAgent的链接还是与外部连接)-->mib->set_auto_context(TRUE); 允许context的自动创建,SubAgent就是作为一个Context 来注册的-->Add MIB组-->Vacm* vacm = new Vacm(*mib);-->MasterAgentXMibWin32::init();-->处理extensionDLL,就是存放在注册表里的DLL,也可以看作是SubAgent, 注册表对应位置:HKEY_LOCAL_MACHINE\SYSTEM\\CurrentControlSet\\Services\\SNMP\\ Parameters \\ExtensionAgents\\-->MasterAgentXMibWin32::init_source_addresses(); 注册表对应位置:HKEY_LOCAL_MACHINE\SYSTEM\\CurrentControlSet\\Services\\SNMP\\Parameters\\Per mittedManagers\\-->获取注册表里定义的Community name; MasterAgentXMibWin32::init_communities();注册表对应位置:HKEY_LOCAL_MACHINE\SYSTEM\\CurrentControlSet\\Services\\SNMP \\Parameters\\ValidCommunities\\-->获取注册表里定义的告警目标地址;MasterAgentXMibWin32::init_notification_targets() ;注册表对应位置:HKEY_LOCAL_MACHINE\SYSTEM\\CurrentControlSet\\Services\\SNMP\\Parameters\\Tra pConfiguration\\-->获取配置文件的路径;MasterAgentXMibWin32::get_config_path(); 注册表对应位置:HKEY_LOCAL_MACHINE\SOFTWARE\\Agentpp\\AgentConfig\\ConfigPath\\;一般路径是C:\Documents and Settings\qyd\AGENTPP\CONFIG\-->MasterAgentXMib::init();-->axThread = new ThreadPool(1);-->axRegThread = new QueuedThreadPool(1);-->axBulkThread = new QueuedThreadPool(2);-->axSetThread = new QueuedThreadPool(1);-->axRegThread->start();-->axBulkThread->start();-->axSetThread->start();-->Mib::init()-->threadPool = new ThreadPool();-->获取配置文件,读取配置文件。

相关文档
最新文档