snmp有android代理端吗,Android实现snmp协议(1)

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");

}

}

运行结果如下:

105139855.png

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

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

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

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

105139856.png

private void buttonFun() {

noNull();

new Thread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

api = new SnmpAPI();

session = new SnmpSession(api);

SnmpPDU pdu = new SnmpPDU();

UDPProtocolOptions protocol = new UDPProtocolOptions();

protocol.setRemoteHost(getText(target));

protocol.setRemotePort(Integer.parseInt(getText(port)));

pdu.setProtocolOptions(protocol);

// Build Get request PDU

pdu.setCommand(SnmpAPI.GET_REQ_MSG);

pdu.setCommunity(getText(community));

if(version.getSelectedItemPosition()==0){

pdu.setVersion(SnmpAPI.SNMP_VERSION_1);

}else if(version.getSelectedItemPosition()==1){

pdu.setVersion(SnmpAPI.SNMP_VERSION_2C);

}else if(version.getSelectedItemPosition()==2){

//还需设置MD5 SHA认证密码等

pdu.setVersion(SnmpAPI.SNMP_VERSION_3);

}

pdu.setTimeout(Integer.parseInt(getText(timeout)));

pdu.setRetries(Integer.parseInt(getText(retries)));

// SnmpOID oid = new SnmpOID("1.3.6.1.2.1.1.1.0");

// SnmpOID oid = new SnmpOID((SnmpOID)(getText(oid)));

// pdu.addNull(oid);

String oidstr = getText(oid);

String str[] = oidstr.split("\\.");

int a[] = new int[9];

for(int i=0; i

a[i] = Integer.parseInt(str[i]);

}

//int a[] = { 1, 3, 6, 1, 2, 1, 1, 1, 0 };

SnmpOID oid = new SnmpOID(a);

pdu.addNull(oid);

SnmpPDU resp = null;

try {

session.open();

resp = session.syncSend(pdu);

} catch (SnmpException e) {

// TODO Auto-generated catch block

e.printStackTrace();

System.out.println(e);

}

if (resp != null) {

// return varBinds string

UDPProtocolOptions options = (UDPProtocolOptions) resp.getProtocolOptions();

String resultString = "Response PDU received from " + options.getRemoteAddress() + ".\n"; // No I18N

resultString = resultString + "Community = " + resp.getCommunity() + ".\n\n"; // No I18N

if (resp.getErrstat() == 0) {

resultString = resultString + "VARBINDS :\n\n"; // No I18N

resultString = resultString + resp.printVarBinds();

} else {

// Check for error in response

resultString = resultString + resp.getError();

}

Message msg = new Message();

msg.what = 1000;

msg.obj = resultString;

myHandler.sendMessage(msg);

if(session != null) {

session.close();

}

if(api != null) {

api.close();

}

} else {

String errorString = "Request timed out to: " + getText(target); // No I18N

Message msg = new Message();

msg.what = 1000;

msg.obj = errorString;

myHandler.sendMessage(msg);

if(session != null) {

session.close();

}

if(api != null) {

api.close();

}

}

}

}).start();

}

做到这份上,跟华为的老师联系上了,他们跟我说年前比较忙,拖到年后才能详谈需求业务,我也暂时搁置此项目,去做别的事了。也许有新的情况,我会写个第二篇,希望对大家有帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值