移植目标:把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;
}
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.confmaster agentxrwcommunity public
2.拷贝/net-snmp-5.7.3/mibs目录到/etc/snmp/mibs这两个目录跟上面代码netsnmp_agent_init中指定的2个路径要一样。
至此,snmp就和项目的应用程序代码一起被初始化成功了。通过snmp浏览器即可获取demo板的mib信息了。
本文介绍如何将Net-SNMP软件移植到嵌入式Linux系统,并将其集成到自定义的应用程序中。主要内容包括使用交叉编译工具进行静态编译、编写初始化代码以及配置相关文件。
500

被折叠的 条评论
为什么被折叠?



