Android实现snmp协议(一)

2015年一月初。接到华为一位老师的电话,让我帮忙做一款他们在北京展会上要用到的App,该App能够展示华为的网络设备运行状态并可以设置一些简单的参数,包括AP、LSW、AP、AR等。

华为老师跟我说他们是使用snmp协议v2c的版本进行管理的,这意味着我也得在Android设备实现该协议,并与他们的网络设备交互。

回去认真研究了一下并请教了一些对这块比较熟悉的小伙伴,总算对snmp有了一些粗浅的认识。

snmp是指简单网络设备管理协议,顾名思义就是对网络设备进行管理的通用标准协议,属于TCP/IP的应用层,snmp的服务器端占用的端口是161,客户端占用的是162(基于UDP协议)。

在windows上开启snmp协议可参照http://blog.csdn.net/zougangx/article/details/6977936。

需要注意的一点是:SNMP Service属性的安全选项卡中设置接受来自任何主机的snmp数据包,以便我们调试。

对已经建立了连接的两个设备之间,该协议使用了OID(对象标示符)作为查询的内容,OID的内容具体可参考http://www.cnblogs.com/aspx-net/p/3554044.html。OID有一部分是协议定义好的,有一部分设备厂商可以自己定义。

完成以上的步骤,并熟悉了基本的OID指令后,网上有写朋友说就可以使用Paessler SNMP Tester进行调试了,但是本人在实际操作中没有这么顺利,Paessler SNMP Tester一直显示noresponse,转而使用snmputil。(Paessler SNMP Tester和snmputil都是windows端测试snmp协议的工具,Paessler
SNMP Tester具有图形化界面,snmputil没有,关于snmputil的操作可以参考http://blog.chinaunix.net/uid-21857285-id-3340217.html)

在使用snmputil的时候出现error on SnmpMgrRequest
40
错误,参考以下网址得到解决:http://blog.csdn.net/wqjsir/article/details/8472006,在这篇文章中对陷阱选项卡进行了配置。至此,我的snmputil和Paessler SNMP Tester才正常的运行起来!

在计算机的服务列表中,可以看到:

其中Trap消息是需要手动去开启的,而service是自动开启。至于snmp trap服务怎么使用,snmp service的陷阱选项卡的设置原因我也不是很清楚,也希望有人知道的话不吝赐教,暂时不影响我做项目也没深入研究下去。

当两个服务都开启后,可以使用netstat -an|findstr "162"或netstat -an|findstr "161"查看端口是否开发,161开启之后就已经可以做本地测试了。

snmp协议是TCP/IP协议,是用c系语言完成的,本人以前移植过的uip1.0也是用c语言写的。而Android必须使用Java来实现,为此,本人首先使用了snmp4j这个jar包,建立了Java工程,仿造官方文档的示例,coding如下(需引入snmp4j的两个jar包):

class SnmpManager {

     private TransportMapping transportMapping = null;
     private Snmp snmp = null;
     private int version;

     public final static int version1 = SnmpConstants. version1;
     public final static int version2c = SnmpConstants.version2c;
     public final static int version3 = SnmpConstants. version3;

     /**
      * 构造方法
      * @param version
      */
     public SnmpManager( int version) {
            this. version = version;
            try {
                 // 设置成Udp协议
                 transportMapping = new DefaultUdpTransportMapping();
                 snmp = new Snmp( transportMapping);

                 if (version == version3) {
                      // 设置安全信息
                     USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
                     SecurityModels. getInstance().addSecurityModel(usm);
                }
                 transportMapping.listen();
           } catch (Exception e) {
                e.printStackTrace();
                System. out.println(e);
           }
     }

     /**
      * @param sync
      * @param bro
      * @param pdu
      * @param addr
      * 发送消息方法
      */
     public void sendMsg(boolean sync, final boolean bro, PDU pdu, String addr) {
           Address targetAddres = GenericAddress. parse(addr);
           Target target = null;
            if ( this. version == version3) {
                 snmp.getUSM().addUser( new OctetString( "MD5DES"), new UsmUser( new OctetString( "MD5DES"), AuthMD5. ID, new OctetString("MD5DESUserAuthPassword" ), PrivDES.ID, new OctetString("MD5DESUserPrivPassword" )));
                target = new UserTarget();
                 // 设置安全级别
                target.setSecurityLevel(SecurityLevel. AUTH_PRIV);
                target.setSecurityName( new OctetString("MD5DES"));
                target.setVersion(SnmpConstants. version3);
           } else {
                target = new CommunityTarget();
                 if ( this. version == version1) {
                     target.setVersion( version1);
                     ((CommunityTarget) target).setCommunity(new OctetString("public" ));
                } else {
                     target.setVersion( version2c);
                     ((CommunityTarget) target).setCommunity(new OctetString("public" ));
                }
           }

           target.setAddress(targetAddres);
           target.setRetries(2);
           target.setTimeout(1000);

            if (sync) {
                 // 发送报文 并且接受响应
                ResponseEvent response = null;
                 try {
                     response = snmp.send(pdu, target);
                } catch (IOException e) {
                      // TODO Auto-generated catch block
                     e.printStackTrace();
                     System. out.println(e);
                }
                 // 处理响应
                System. out.println( "Synchronize message from " + response.getPeerAddress() + "/nrequest:" + response.getRequest() + "/nresponse:" + response.getResponse());

           } else {
                ResponseListener listener = new ResponseListener() {
                      @Override
                      public void onResponse(ResponseEvent event) {
                            if (!bro) {
                                ((Snmp) event.getSource()).cancel(event.getRequest(), this );
                           }
                            // 处理响应
                           PDU request = event.getRequest();
                           PDU response = event.getResponse();
                           System. out.println( "Asynchronise message from " + event.getPeerAddress() + "/nrequest:" + request + "/nresponse:" + response);
                     }
                };
                 try {
                      snmp.send(pdu, target, null, listener);
                } catch (IOException e) {
                     e.printStackTrace();
                     System. out.println(e);
                }
           }
     }
}

public class SnmpTest {

     public static String myVersion = "";
     static boolean sync = false;
     static boolean bro = false;

     /**
      * 主函数
      * @param args
      */
     public static void main(String[] args) {

           SnmpManager manager = new SnmpManager(SnmpConstants.version2c );
            // 构造报文
           PDU pdu = new PDU();
            // PDU pdu = new ScopedPDU(); version3使用
            // 设置要获取的对象ID
           OID oids = new OID( "1.3.6.1.2.1.1.1.0");
//         OID oids = new OID(new int [] { 1, 3, 6, 1, 2, 1, 1, 1, 0 });
           pdu.add( new VariableBinding(oids));
            // 设置报文类型
           pdu.setType(PDU. GET);
//         ((ScopedPDU) pdu).setContextName(new OctetString("priv"));
            // 发送消息 其中最后一个是想要发送的目标地址
           manager.sendMsg( true, true, pdu, "udp:127.0.0.1/161");

     }
}

运行结果如下:

等我把这段Java代码移植到Android工程中时,却不起作用了。我百度、google、stackoverflow等一些网站都看过了,在stackoverflow上有位朋友也是遇到和我一样的问题,有人回复snmp4j无法在Android上无法使用,究竟为什么,本人也不能解释给大家听,需要更厉害的人了!

因为是华为老师的项目,我不能这样尥蹶子,就继续查找相关资料,我想应该有人做出了类似snmp4j的Android版本吧,功夫不负有心人。

https://www.webnms.com/snmpapi-android/index.html

这个网站的闭源包提供了这个功能,做snmp的开发者,不妨研读一下,我就是在使用了此网站的开发包,完成了snmp的协议。

时间: 2024-10-15 16:16:05

Android实现snmp协议(一)的相关文章

Android面向HTTP协议发送get请求

/** * 採用get请求的方式 * * @param username * @param password * @return null表示求得的路径有问题,text返回请求得到的数据 */ public static String getRequest(String username, String password) { try { String path = "http://172.22.64.156:8080/0001AndroidWebService/LoginServlet?use

SNMP协议具体解释

简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议.在1988年被制定,并被Internet体系结构委员会(IAB)採纳作为一个短期的网络管理解决方式:因为SNMP的简单性,在Internet时代得到了蓬勃的发展,1992年公布了SNMPv2版本号,以增强SNMPv1的安全性和功能.如今,已经有了SNMPv3版本号. 一套完整的SNMP系统主要包含管理信息库(MIB).管理信息结构(SMI)及SNMP报文协议. (1)管理信息库MIB:不论什么一个被管理的资源都表示成一个对象,称为

SNMP协议开发概念理解-1

SNMP协议入门 1.引言 基于TCP/IP的网络管理包含3个组成部分: 1) 一个管理信息库MIB(Management Information Base).管理信息库包含所有代理进程的所有可被查询和修改的参数.RFC1213[McCloghrie and Rose 1991]定义了第二版的MIB,叫做MIB-II. 2)  关于MIB的一套公用的结构和表示符号.叫做管理信息结构SMI(Structure of Management Information).这个在RFC 1155 [Rose

Android通过http协议POST传输方式

Android通过http协议POST传输方式如下: 方式一:HttpPost(import org.apache.http.client.methods.HttpPost) 代码如下: private Button button1,button2,button3;private TextView textView1; button1.setOnClickListener(new Button.OnClickListener(){            @Override   public vo

Android面向HTTP协议发送post请求

/** * 采用post请求的方式 * * @param username * @param password * @return null表示求得的路径有问题,text返回请求得到的数据 */ public static String postRequest(String username, String password) { try { String path = "http://172.22.64.156:8080/0001AndroidWebService/LoginServlet&q

zabbix基于SNMP 协议监控路由器

zabbix基于SNMP 协议监控路由器 步骤 步骤超级方便. 1. 路由器上开启snmp 2. 确保外网能访问到 3. 用snmpwalk测试 4. 添加zabbix主机,SNMP interfaces中添加ip,去掉默认的zabbix agent,模块选择Template SNMP Interfaces snmpwalk测试命令 [[email protected] init.d]# snmpwalk -v 2c -c public 192.168.1.253 1.3.6.1.2.1.2.2

SNMP协议总结

说明:本文仅供学习交流,转载请标明出处,欢迎转载! SNMP(Simple Network Management Protocal),简单网络管理协议,其前身是SGMP协议(简单网关监控协议),该协议的作用是对网络上的设备进行监视管理,是一种应用层协议. 基于TCP/IP的网络管理包括两个部分:网络管理器(也叫管理进程,manager)和被管设备(代理),被管设备对应的进程称为代理进程.管理器控制盒监视着一组代理,通常情况下,管理器是主机,代理是路由器或服务器.代理把相关性能信息存储在数据库中,

基于snmp协议监控华为s5720交换机

我遇到的问题: 最近在用cacti监控一台华为s5720交换机,监控模块是低版本的模板,监控高版本的交换机就不能获取数据. 根据原理找原因: 因为采用的是基于SNMP协议监控,用snmp获取数据必须获取OID(对象描述符).获取OID最精确的是联系设备厂商.s5720的OID是我联系厂商获得的,供大家参考. 类别 节点信息 对应节点的OID 备注 设备状态监控 CPU利用率 1.3.6.1.4.1.2011.5.25.31.1.1.1.1.5 盒式设备获取CPU利用率和内存利用率的大小还可以使用

基于W5500+STM32的SNMP协议应用

概述 工具: PC  W5500EVB Net-SNMP软件包 编译环境:Keil4 &IAR 功能:通过网络管理协议SNMP及基本的控制命令实现简单的LED控制 一.W5500简介 韩国WIZnet公司生产的以太网控制芯片W5500整合了五层结构中的前四层,即物理层.数据链路层.网络层和传输层,并在内部利用硬件实现了TCP/IP协议栈.开发者无需专业的网络知识,使用W5500如同控制外部存储器一样简单,为用户提供了最简单的网络接入方法.全硬件TCP/IP协议栈完全独立于主控芯片,可以降低主芯片