net-snmp移植记录

本文介绍如何将Net-SNMP软件移植到嵌入式Linux系统,并将其集成到自定义的应用程序中。主要内容包括使用交叉编译工具进行静态编译、编写初始化代码以及配置相关文件。

移植目标:把net-snmp开源snmp软件移植到嵌入式linux系统中。

1.编译源码

net-snmp版本下载最新的net-snmp-5.7.3

我们采取静态编译,通过LDFLAGS="-static"指定编译静态库,留给应用程序调用。

CC=powerpc-e300c3-linux-musl-gcc指定交叉编译工具连。

root@ubuntu:/home/gjt/net-snmp/net-snmp-5.7.3# CC=powerpc-e300c3-linux-musl-gcc LDFLAGS="-static" ./configure --with-out-mib-modules="mibII" --disable-manuals --disable-mibs --with-default-snmp-version="2" --with-sys-contact="who@where"  --with-sys-location="location" --disable-embedded-perl --without-perl-modules  --disable-scripts  --target=powerpc-linux --host=powerpc-linux

make //编译

编译成功后我们需要3个静态库

net-snmp-5.7.3/snmplib/.libs# 目录下找到libnetsnmp.a。

net-snmp-5.7.3/agent/.libs# 目录下找到libnetsnmpagent.a,libnetsnmpmibs.a。

2.移植源码

由于我们想要在自己应用程序里面配置和操作snmp,故打算把snmpd直接编译到我们项目的应用程序里面。

需要编写自己的snmpd初始化代码。

完整代码如下:

snmp_agent.c源码:

/* generated from net-snmp-config */
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/net-snmp-features.h>
#include <net-snmp/types.h>
#ifdef HAVE_SIGNAL
#include <signal.h>
#endif /* HAVE_SIGNAL */
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include <pthread.h>
#include "sys/loader.h"
  
const char *app_name = "Test";
static int reconfig = 0;

extern int netsnmp_running;

#ifdef __GNUC__
#define UNUSED __attribute__((unused))
#else
#define UNUSED
#endif

RETSIGTYPE
stop_server(UNUSED int a) {
    netsnmp_running = 0;
}

#ifdef SIGHUP
RETSIGTYPE
hup_handler(int sig)
{
    reconfig = 1;
    signal(SIGHUP, hup_handler);
}
#endif
/* initialize your mib code */
int init_mibgroup()
{printf("%s,%d.\n", __FUNCTION__, __LINE__);
    //snmp_set_do_debugging(1);
    netsnmp_access_interface_init(); 

    if (should_init("system_mib")) init_system_mib();
    if (should_init("sysORTable")) init_sysORTable();
    if (should_init("vacm_vars")) init_vacm_vars();
    if (should_init("snmpEngine")) init_snmpEngine();
    if (should_init("usmUser")) init_usmUser();
    if (should_init("snmp_mib_5_5")) init_snmp_mib_5_5();
    if (should_init("setSerialNo")) init_setSerialNo();
    if (should_init("snmpNotifyTable")) init_snmpNotifyTable();
    if (should_init("snmpNotifyFilterProfileTable")) init_snmpNotifyFilterProfileTable();
    if (should_init("notification_log")) init_notification_log();
    if (should_init("hrSWInstalledTable")) init_hrSWInstalledTable();
    if (should_init("hrSWRunTable")) init_hrSWRunTable();
    if (should_init("hr_system")) init_hr_system();
    if (should_init("hr_device")) init_hr_device();
    if (should_init("hr_other")) init_hr_other();
    if (should_init("hr_proc")) init_hr_proc();
    if (should_init("hr_print")) init_hr_print();
    if (should_init("hr_disk")) init_hr_disk();
    if (should_init("vacm_context")) init_vacm_context();
    if (should_init("var_route")) init_var_route();
    if (should_init("tcpTable")) init_tcpTable();
    if (should_init("udpTable")) init_udpTable();
    if (should_init("ip_scalars")) init_ip_scalars();
    if (should_init("snmpNotifyFilterTable")) init_snmpNotifyFilterTable();
    if (should_init("swinst")) init_swinst();
    if (should_init("swrun")) init_swrun();
    if (should_init("hrSWRunPerfTable")) init_hrSWRunPerfTable();
    if (should_init("hw_mem")) init_hw_mem();
    if (should_init("cpu")) init_cpu();
    if (should_init("cpu_linux")) init_cpu_linux();
    if (should_init("ipAddressTable")) init_ipAddressTable();

    if (should_init("at")) init_at();
    if (should_init("ip")) init_ip();
    if (should_init("tcp")) init_tcp();
    if (should_init("icmp")) init_icmp();
    if (should_init("udp")) init_udp();

    if (should_init("ifTable")) init_ifTable();
    //snmp_set_do_debugging(0);  
    printf("%s,%d.\n", __FUNCTION__, __LINE__);
}

static void
version(void)
{
    fprintf(stderr, "NET-SNMP version: %s\n", netsnmp_get_version());
    exit(0);
}

void *netsnmp_agent_task(void *arg)
{
	/* initialize your mib code here */
    init_mibgroup();
    
 /* In case we received a request to stop (kill -TERM or kill -INT) */
    netsnmp_running = 1;
#if 0  
#ifdef SIGTERM
      signal(SIGTERM, stop_server);
#endif
#ifdef SIGINT
      signal(SIGINT, stop_server);
#endif
#ifdef SIGHUP
      signal(SIGHUP, hup_handler);
#endif
#endif
    /* main loop here... */
    while(netsnmp_running) {
    if (reconfig) {
      free_config();
      read_configs();
      reconfig = 0;
    }
    agent_check_and_process(1);
    }

    /* at shutdown time */
    snmp_shutdown(app_name);

    /* deinitialize your mib code here */

    /* shutdown the agent library */
    shutdown_agent();
    shutdown_master_agent();
    SOCK_CLEANUP;
    //exit(0);    
}
/*netsnmp初始化,调用即可初始化和启动snmp服务和注册节点*/
int netsnmp_agent_init()
//int main (int argc, char **argv)
{
    int arg;
    char* cp = NULL;
    pthread_t tid;

    netsnmp_ds_set_string(NETSNMP_DS_LIBRARY_ID,
                          NETSNMP_DS_LIB_APPTYPE, app_name);
	/*snmp 配置文件*/					  
    netsnmp_ds_set_string(NETSNMP_DS_LIBRARY_ID, 
				      NETSNMP_DS_LIB_OPTIONALCONFIG, "/etc/snmp/snmpd.conf");	
    netsnmp_ds_set_string(NETSNMP_DS_LIBRARY_ID,
        NETSNMP_DS_LIB_MIBDIRS, "/etc/snmp/mibs");
#if 0
    if (!dont_fork) {
      if (netsnmp_daemonize(1, snmp_stderrlog_status()) != 0)
        exit(1);
    }
#endif
    /* initialize tcpip, if necessary */
    SOCK_STARTUP;

    /* initialize the agent library */
    init_agent(app_name);

    /* initialize your mib code here */
    //init_mibgroup();

    /* Test will be used to read Test.conf files. */
    init_snmp(app_name);

    /*  If we're going to be a SNMP master agent...  */
    init_master_agent();  /*  Listen on default port (161).  */	

    snmp_log(LOG_INFO, "NET-SNMP version %s\n", netsnmp_get_version());

    netsnmp_addrcache_initialise();

    send_easy_trap(0, 0);

   if(pthread_create(&tid, 0, netsnmp_agent_task, 0)) {
        fprintf(stderr, "netsnmp agent init error\n");
        return -1;
   } 

   return 0;
 
}


以上这段代码和net-snmp-5.7.3/agent目录拷贝来一起编译。修改Makefile

root@ubuntu:/home/gjt/appl/snmp_agent# ls

agent  Makefile  snmp_agent.c

root@ubuntu:/home/gjt/appl/snmp_agent/agent#cat Makefile

OBJECTS-y := \
kernel.o\
agent_handler.o\
agent_index.o\
agent_read_config.o\
agent_registry.o\
agent_trap.o\
auto_nlist.o\
object_monitor.o\
snmp_agent.o\
snmp_vars.o\
agent_sysORTable.o
#snmp_perl.o
#snmpd.o
#mib_modules.o


SUBDIRS-y += mibgroup helpers


这样我们就可以把net-snmp-5.7.3/agent目录完全搬到自己项目应用程序中编译。mib库也编译到自己项目中(net-snmp-5.7.3/agent/mibgroup)
snmp_agent.c源文件中编写代码netsnmp_agent_init初始化snmp和
注册节点init_mibgroup();
编译时候链接libnetsnmp.a和libnetsnmpagent.a即可成功编译。当然如果不想把net-snmp-5.7.3/agent/mibgroup#编译到自己项目应用程序中,也可以去掉此目录,通过静态链接libnetsnmpmibs.a即可。<pre name="code" class="html">net-snmp-5.7.3/agent/mibgroup目录代码编译出来就是libnetsnmpmibs.a

编译成功下载到damo板还需要2个步骤,
1.vi /etc/snmp/snmpd.conf
master agentx
rwcommunity public



2.拷贝/net-snmp-5.7.3/mibs目录到/etc/snmp/mibs
这两个目录跟上面代码netsnmp_agent_init中指定的2个路径要一样。

至此,snmp就和项目的应用程序代码一起被初始化成功了。通过snmp浏览器即可获取demo板的mib信息了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值