使用snmp协议获取和管理摄像头设备信息

snmp协议

简单网络管理协议,专门设计用于在 IP 网络管理网络节点(服务器、工作站、路由器、交换机及HUBS等)的一种标准协议,属于应用层协议, 大部分摄像头支持snmp管理协议的1,2,3版本,本身管理也是使用cs架构,如下图所示:
在这里插入图片描述

获取摄像头基本信息

snmpwalk -v 2c -c public 192.168.0.55 1
在这里插入图片描述
图中可以看到192.168.0.55 是hik 海康摄像头,支持h264和h265

cpu获取

使用snmpwalk 获取 192.168.0.129 的 cpu利用率
snmpwalk -v 2c -c public 192.168.0.129 .1.3.6.1.2.1.25.3.3.1.2
在这里插入图片描述
可以看到 本身我的机器有16核心,每一个核心都有自己的cpu利用率

内存

snmpwalk -v 2c -c public 192.168.0.129 .1.3.6.1.2.1.25.2.2.0
在这里插入图片描述
可以看到192.168.0.129 有16G 内存

java snmp4j

package com.test;

import org.snmp4j.*;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.DefaultPDUFactory;
import org.snmp4j.util.TableEvent;
import org.snmp4j.util.TableUtils;

import java.io.IOException;
import java.util.List;

public class SnmpDemo2 {

public static void main(String[] args) {
creatSnmp();
}

public static void creatSnmp() {

TransportMapping transport = null;
Snmp snmp = null;
CommunityTarget target = null;
try {
transport = new DefaultUdpTransportMapping();
snmp = new Snmp(transport);//创建snmp
snmp.listen();//监听消息
target = new CommunityTarget();
target.setCommunity(new OctetString("public"));//社区名称
target.setRetries(3);//连接次数
target.setAddress(GenericAddress.parse("udp:172.18.12.96/161"));//监控的主机
target.setTimeout(8000);//
target.setVersion(SnmpConstants.version2c);
String memory = collectMemory(snmp, target);
System.out.println("内存使用率为:" + memory);
String cpu = collectCPU(snmp, target);
System.out.println("CPU利用率为:" + cpu);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (transport != null)
transport.close();
if (snmp != null)
snmp.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

//获取内存相关信息
public static String collectMemory(Snmp snmp, CommunityTarget target) {
String memory = null;
String[] oids = {"1.3.6.1.2.1.25.2.3.1.2", //type 存储单元类型
"1.3.6.1.2.1.25.2.3.1.3", //descr
"1.3.6.1.2.1.25.2.3.1.4", //unit 存储单元大小
"1.3.6.1.2.1.25.2.3.1.5", //size 总存储单元数
"1.3.6.1.2.1.25.2.3.1.6"}; //used 使用存储单元数;
String PHYSICAL_MEMORY_OID = "1.3.6.1.2.1.25.2.1.2";//物理存储
try {
TableUtils tableUtils = new TableUtils(snmp, new DefaultPDUFactory(PDU.GETBULK));
OID[] columns = new OID[oids.length];
for (int i = 0; i < oids.length; i++)
columns[i] = new OID(oids[i]);
List<TableEvent> list = tableUtils.getTable(target, columns, null, null);
for (TableEvent event : list) {
VariableBinding[] values = event.getColumns();
if (values == null) continue;
int unit = Integer.parseInt(values[2].getVariable().toString());//unit 存储单元大小
int totalSize = Integer.parseInt(values[3].getVariable().toString());//size 总存储单元数
int usedSize = Integer.parseInt(values[4].getVariable().toString());//used 使用存储单元数
String oid = values[0].getVariable().toString();
if (PHYSICAL_MEMORY_OID.equals(oid)) {
memory = (long) usedSize * 100 / totalSize + "%";
}
}

} catch (Exception e) {
e.printStackTrace();
}
return memory;
}

//获取cpu使用率
public static String collectCPU(Snmp snmp, CommunityTarget target) {
String cpu = null;
String[] oids = {"1.3.6.1.2.1.25.3.3.1.2"};
try {
TableUtils tableUtils = new TableUtils(snmp, new DefaultPDUFactory(PDU.GETBULK));
OID[] columns = new OID[oids.length];
for (int i = 0; i < oids.length; i++)
columns[i] = new OID(oids[i]);
List<TableEvent> list = tableUtils.getTable(target, columns, null, null);
int percentage = 0;
for (TableEvent event : list) {
VariableBinding[] values = event.getColumns();
if (values != null)
percentage += Integer.parseInt(values[0].getVariable().toString());
}
cpu = percentage / list.size() + "%";
} catch (Exception e) {
e.printStackTrace();
}
return cpu;
}


}

在vscode中写入依赖

<dependency>
<groupId>org.snmp4j</groupId>
<artifactId>snmp4j</artifactId>
<version>2.6.2</version>
</dependency>

使用nodejs

使用net-snmp模块去walk,实际上net-snmp还是c写的一套东西,以下程序使用每隔2秒探测一次,程序只是为示例,可以探测摄像头的各个参数

var os = require('os');
var snmp = require ("net-snmp");
var moment = require('moment');
const nodemon = require("nodemon");

var session = snmp.createSession ("192.168.0.129", "public");

var items = [
	//{name: 'percent', oid: '1.3.6.1.4.1.39165.1.11.0'}
	{name: 'cpu', oid: '1.3.6.1.2.1.25.3.3.1.2'}
	
];


function doneCb(error) {
    if (error)
        console.error(error.toString());
}

 
function feedCb(varbinds) {
    for (var i = 0; i < varbinds.length; i++) {
        if (snmp.isVarbindError(varbinds[i]))
            console.error(snmp.varbindError(varbinds[i]));
        else
            console.log(varbinds[i].oid + "|" + varbinds[i].value);
    }
}

setInterval(()=>{
	let nowTime = moment().format('YYYY-MM-DD HH:mm:ss');
	console.log('当前时间为:', nowTime);
	session.walk(items[0].oid, 1, feedCb, doneCb);
}, 2000);

当然也可以使用其他如python, go 语言用同样的道理去做,建议:
像这类程序最好不要用c++ 做,反而是像java, node,等这种语言比较简单,本身简单网络管理协议相对具体传输媒体协议来说,确实是比较“简单”的,简单还是要加引号的,并不涉及非常高的性能问题。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Java是一种流行的编程语言,可以通过SNMP协议获取交换机设备信息SNMP协议是一种网络管理协议,可以监视网络设备的状态、性能和配置信息SNMP协议主要由几个组成部分:管理器、被管理设备和MIB(管理信息库)。管理器通过SNMP协议向被管理设备发送请求,被管理设备则通过SNMP协议将其MIB中的信息返回给管理器。 Java提供了一些开源的SNMP库和框架,如SNMP4J和AdventNet SNMP API。这些库提供了SNMP消息的编码和解码、管理器和代理的实现、MIB的管理和解析等功能。 要使用Java获取交换机设备信息,首先需要确定被管理设备的IP地址和端口号,并确保交换机开启SNMP服务。接下来,可以使用SNMP库创建一个管理器,通过SNMP协议向交换机发送请求,请求的内容包括要获取的OID(对象标识符)和请求类型(如GET、GETNEXT、SET等)。OID是唯一标识MIB中管理对象的一组数字,每个OID对应一个特定的数据项,如端口速率、流量等等。管理器发送请求后,交换机则返回相应的MIB数据,管理器可根据需要对这些数据进行解析和处理。 Java通过SNMP协议获取交换机设备信息,可为网络管理员提供更全面、准确、及时的监视和管理工具,有助于提高网络的可靠性和性能。 ### 回答2: Java通过SNMP协议获取交换机设备信息已经成为网络管理和监控领域中非常重要的一项技术。SNMP协议是一种管理网络设备的标准协议,它使用简单而有效的方式来管理网络设备,确保网络设备处于正常运行状态,以便及时发现和纠正可能发生的问题。 Java通过SNMP协议获取交换机设备信息需要使用Java SNMP库或者第三方的SNMP库,其原理是通过发送SNMP请求来获取相应的数据。交换机设备通常会提供SNMP Agent,Java通过SNMP Agent来实现与交换机设备通信,并获取交换机设备的相关配置信息,如端口状态、MAC地址、 VLAN信息、链路聚合、流量统计、温度信息等。 Java程序通过SNMP协议获取交换机设备信息的实现过程比较复杂,需要先了解SNMP协议的基本原理以及交换机SNMP Agent的工作原理。同时需要了解交换机设备的厂商提供的SNMP OID(对象标识符)和MIB(管理信息库)信息,因为OID和MIB信息SNMP Agent对外提供的数据接口,Java通过SNMP协议获取OID和MIB信息的值,从而得知交换机设备的详细信息。 总的来说,Java通过SNMP协议获取交换机设备信息是一种有效的方式,可以提供实时的设备状态信息以及设备故障报警等功能,有助于管理员及时发现和解决网络问题。但是需要注意的是,在实际应用中需要做好网络设备的安全配置,确保只有授权的Java程序可以访问交换机设备SNMP Agent接口。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qianbo_insist

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值