当前位置:首页 > 物联网 > 网络协议
[导读]   一、snmp编程详解   SNMP是一构建在TCP/UDP上的远程监控应用。它能监控网络中主机的各种信息,如内存使用率,CPU占用率,磁盘占用率等。它主要分为2个部分,安装在待监控主

  一、snmp编程详解

  SNMP是一构建在TCP/UDP上的远程监控应用。它能监控网络中主机的各种信息,如内存使用率,CPU占用率,磁盘占用率等。它主要分为2个部分,安装在待监控主机上的SNMP服务端,用于收集主机的信息,并按树形进行组织;安装在监控端的SNMP客户端,实时发出查询命令,获得被监控主机的运行信息。

  SNMP服务端:将主机信息按树形进行组织,有点类似windows的注册表,但是简单得多。树形结构如下图所示。

  

  其中根为空,每个子节点分配一个编号,用点号(。)连接根节点到叶节点经过

  的路径上的编号就可以定位到查询的信息。如图中.1.3.6.1.2.1.2就可以访问。 iso 。 org 。 dod 。 internet 。 mgmt 。 mib-2 。 interfaces的信息。

  SNMP客户端:向SNMP服务端发出查询请求,主要有2种请求。GET请求可以获取指定信息;GETNEXT获取下一条信息。

  另一种情况:SNMP服务端在监控到异常事件时主动向SNMP监控端发送TRAP报文,这时SNMP客户端充当服务器,对异常信息进行处理。

  二、SNMP安装

  一般linux自带。可用whereis snmpd查询检查是否安装。没有的话下载net-snmp安装。(自己搜)

  安装:1)源码安装:。/configure;make;make install

  2)包管理器安装:centos:yum install net-snmp

  yum install net-snmp-devel(开发环境需要)

  yum install net-snmp-uTIls(测试环境需要)

  三、SNMP配置

  SNMP服务端配置:源码里有个EXAMPLE.conf,将其拷贝到自己选定的一个配置文件目录中(假设为/usr/local/etc/snmp/),并重命名为snmpd.conf.

  修改里面的配置参数:

  1)找到view systemonly included .1.3.6.1.2.1.1,在上面插入一行view systemonly included .1

  表示能查看根下面的所有信息

  2)将agentAddress udp:127.0.0.1:161中的127.0.0.1改为该机器的外网IP地址,这样就可以远程访问。

  四、测试及问题

  1)用包管理器安装的运行service snmpd start;源码安装的运行 [snmpd的绝对路径] -c /usr/local/etc/snmp/snmpd.conf

  2)在被监控的机器上运行snmpwalk -v 1 localhost -c public .1看是否有输出。

  3)在监控主机上运行snmpwalk -v 1 [被监控机器的IP地址] -c public .1看是否有输出

  如果无法远程访问,则关闭被监控主机的防火墙:service iptables stop

  改变selinux模式:set enforce 0

  五、SNMP C编程

  NET-SNMP提供了灵活的接口。在被监控主机的snmpd.conf文件中可以添加外部程序,当监控主机发出查询命令时,该程序就执行一次。这样就可以灵活地开发各种监控程序。

  如在snmpd.conf添加一行

  extend .1.3.6.1.4.1.2021.50 monitor /bin/sh /tmp/monitor.sh

  就可以监控主机在每次查询被监控主机的 .1.3.6.1.4.1.2021.50值时执行monitor.sh脚本。

  monitor.sh中可以这样写:

  #!/bin/bash

  echo “my snmp test”

  在监控主机端,需要对查询到的结果进行处理。用C语言编程如下:

  #include 《net-snmp/net-snmp-config.h》

  #include 《net-snmp/net-snmp-includes.h》

  #include 《string.h》

  int find_last_oid (netsnmp_session * ss,oid *base,int base_length){

  netsnmp_pdu *response;

  netsnmp_pdu *pdu;

  int running = 1;

  int status;

  int length=0;

  pdu = snmp_pdu_create (SNMP_MSG_GETNEXT);

  snmp_add_null_var (pdu, base, base_length);

  while (running){

  status = snmp_synch_response (ss, pdu, &response);

  if (status != STAT_SUCCESS || !response){

  snmp_sess_perror (“snmp_synch_response”, ss);

  exit (1);

  }

  if (response-》errstat != SNMP_ERR_NOERROR){

  fprintf (stderr, “snmp: Error in packet: %s ”,snmp_errstring (response-》errstat));

  exit (1);

  }

  if (response &&snmp_oid_compare (response-》variables-》name,SNMP_MIN (base_length,response-》variables-》name_length),base, base_length) != 0)

  running = 0;

  else{

  memcpy(base,response-》variables-》name,response-》variables-》name_length*sizeof(oid));

  length=response-》variables-》name_length;

  pdu = snmp_pdu_create (SNMP_MSG_GETNEXT);

  snmp_add_null_var (pdu, response-》variables-》name, response-》variables-》name_length);

  }

  snmp_free_pdu (response);

  }

  return length;

  }

  int main(){

  netsnmp_session session, *ss;

  netsnmp_pdu *pdu;

  netsnmp_pdu *response;

  struct variable_list *vars;

  oid base[128]={1,3,6,1,4,1,2021,50};

  size_t base_length=8;

  int status;

  init_snmp (“APC Check”);

  snmp_sess_init (&session);

  session.version = SNMP_VERSION_1;

  session.community = (u_char*)“public”;

  session.community_len = strlen ((const char*)session.community);

  session.peername = “10.0.1.3”;//被监控主机的IP地址

  ss = snmp_open (&session);

  if (ss == NULL){

  snmp_sess_perror (“snmp_open”, &session);

  exit (1);

  }

  int new_length=find_last_oid (ss, base, base_length);

  pdu = snmp_pdu_create (SNMP_MSG_GET);

  snmp_add_null_var (pdu, base, new_length);

  status = snmp_synch_response (ss, pdu, &response);

  if (status != STAT_SUCCESS || !response){

  snmp_sess_perror (“snmp_synch_response”, ss);

  exit (1);

  }

  for(vars = response-》variables; vars; vars = vars-》next_variable){

  int i;

  for(i=0;i《vars-》name_length;i++){

  printf(“%d ”,vars-》name[i]);

  }

  print_value(vars-》name, vars-》name_length, vars);

  }

  snmp_free_pdu (response);

  snmp_close (ss);

  return 0;

  }

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭