2008年12月24日星期三

用NET-SNMP软件包开发客户端代理(续)-string类型实现

以下是定义string类型变量,它提供了get_XXX()和set_XXX()函数来完成数据的获取和设置,需要手工实现。
一、
1.重新建立MIBS 其中包括一个string类型的变量。
+--bvcom(26814)
|
+--ipq6800(6800)
|
+--bvcomAgentModules(1)
|
+-- -RW- Integer32 bvcomAgentModuleObject(1)
+-- -RW- Integer32 bvcomAgentSubagentObject(2)
+-- -RW- String bvcomAgentIpaddressObject(3)
Textual Convention: DisplayString
Size: 0..255

2.用mib2c.scalar.conf生成.c 和 .h文件:mib2c -c mib2c.scalar.conf bvcomAgentModules

GIVE MY
3.更改bvcomAgentModules.c文件:
(1)节点的声明:string类型是后生成的,所以需要重新声明,语句如下:
#define STRLENGTH 256
long bvcomAgentModuleObject = 4560; /* XXX: set default value */
long bvcomAgentSubagentObject = 0; /* XXX: set default value */
char bvcomAgentIpaddressObject [STRLENGTH];
bvcomAgentIpaddressObject[0] = '\0';
(2) 修改handle_bvcomAgentModuleObject():
case MODE_GET:


snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
(u_char *)&bvcomAgentModuleObject /* XXX: a pointer to the scalar's data */,
sizeof(bvcomAgentModuleObject)/* XXX: the length of the data in bytes */);
break;
其中 &bvcomAgentModuleObject 和 sizeof(bvcomAgentModuleObject) 是后面添加的语句。

case MODE_SET_ACTION:
bvcomAgentModuleObject= *(requests->requestvb->val.integer);



/* XXX: perform the value change here */
if (0/* XXX: error? */) {
netsnmp_set_request_error(reqinfo, requests,-1 /* some error */);
}
break;
其中 bvcomAgentModuleObject= *(requests->requestvb->val.integer);为后添加的语句。

其他如遇/* XXX if malloc, or whatever, failed: */或是/* XXX: error? */则添加 0。遇/* some error */添加 -1。
(3) 修改handle_bvcomAgentSubagentObject(),因是INT类型的所以同理(2)。

(4)修改handle_bvcomAgentIpaddressObject():由于是string类型的,所以修饰时候有所不同,如下:
case MODE_GET:
snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
(u_char *)&bvcomAgentIpaddressObject[0]/* XXX: a pointer to the scalar's data */,
sizeof(char) * STRLENGTH/* XXX: the length of the data in bytes */);
break;
其中&bvcomAgentIpaddressObject[0] 和 sizeof(char) * STRLENGTH 为后添加的语句。
case MODE_SET_ACTION:
/* XXX: perform the value change here */
strcpy(&bvcomAgentIpaddressObject[0], requests->requestvb->val.string);
if (0/* XXX: error? */) {
netsnmp_set_request_error(reqinfo, requests, -1/* some error */);
}
break;
其中strcpy(&bvcomAgentIpaddressObject[0], requests->requestvb->val.string);为后添加的语句。

4.编译运行:sudo makes
sudo ./agent-snmp

5.调试执行snmp语句:
slg@slg-desktop:~/snmpan/agent-snmp$ snmpget -v 1 -c public localhost bvcomAgentIpaddressObject.0
BVCOM-SYSTEMUPTIME-MIB::bvcomAgentIpaddressObject.0 = STRING
slg@slg-desktop:~/snmpan/agent-snmp$ snmpset -v 1 -c public localhost bvcomAgentIpaddressObject.0 s "zhangcl"
BVCOM-SYSTEMUPTIME-MIB::bvcomAgentIpaddressObject.0 = STRING: zhangcl
slg@slg-desktop:~/snmpan/agent-snmp$ snmpget -v 1 -c public localhost bvcomAgentIpaddressObject.0
BVCOM-SYSTEMUPTIME-MIB::bvcomAgentIpaddressObject.0 = STRING: zhangcl

没有评论:

发表评论