我正在尝试使用轻量级 Internet 协议 (LWIP) SNMP 发送适当的陷阱。
SNMP Wiki 指出,适当的陷阱应该有
- 当前的 sysUpTime 值绑定
- 标识陷阱绑定类型的 OID
- 一个可选的变量绑定
然而,vb->value != NULL
当第二个snmp_varbind_alloc
被调用时它会出错。
当只发送变量绑定,没有其他的时候,陷阱发送到网络管理站ok。
如果结构在 RAM 中定义并填充字段,有效地手动分配,那么我可以获得两个绑定。它将单步执行但不会运行。所以,现在我需要确保在发送 RAM 结构时存在,然后再销毁它们。所以,我可以添加一个不理想的延迟,或者找到一个函数来告诉我何时发送了陷阱,这样我就可以继续前进了。我对发布不起作用的代码犹豫不决。当(如果)我让它工作时,我会显示代码。
以下是 opt.h 的 3 个绑定的代码:
#define MEMP_NUM_SNMP_VALUE 3
至:
#define MEMP_NUM_SNMP_VALUE 9
struct snmp_obj_id sysupid = {9,{1,3,6,1,2,1,1,3,0}};
struct snmp_obj_id trapoid = {11,{1,3,6,1,6,3,1,1,4,1,0}};
struct snmp_obj_id pttnotifyoid = {8,{1,3,6,1,4,SNMP_ENTERPRISE_ID,3,18}};
static unsigned char trapOID[10] = { 0x2b, 6, 1, 4, 1, 0x82, 0xe4, 0x3d, 3, 18};
struct snmp_varbind *vb1, *vb2, *vb3;
u32_t *u32ptr, sysuptime;
void vSendTrapTaskDemo( void ){
snmp_varbind_list_free(&trap_msg.outvb);
vb1 = snmp_varbind_alloc(&sysupid,SNMP_ASN1_TIMETICKS, 4);
snmp_get_sysuptime(&sysuptime);
vb1->value_len=4;
vb1->value_type=0x43; //Timerticks
u32ptr=vb1->value;
*u32ptr=sysuptime;
snmp_varbind_tail_add(&trap_msg.outvb,vb1);
vb2 = snmp_varbind_alloc(&trapoid,SNMP_ASN1_OBJ_ID, 11);
memcpy (vb2->value, trapOID, 10);
snmp_varbind_tail_add(&trap_msg.outvb,vb2);
vb3 = snmp_varbind_alloc(&pttnotifyoid, SNMP_ASN1_COUNTER, 4);
vb3->value_len=4;
vb3->value_type=0x02; //Integer32
u32ptr=vb3->value;
*u32ptr=1;
snmp_varbind_tail_add(&trap_msg.outvb,vb3);
snmp_send_trap(SNMP_GENTRAP_ENTERPRISESPC, &sysupid,18);
snmp_varbind_list_free(&trap_msg.outvb);
}
第二个绑定有问题。OID 的值应为 0 (itu-t):1.3.6.1.4.1.45629.3.18
但是,由于级别 1 只需要一个绑定,我现在将忘记 3 绑定方法,直到被告知需要级别 2。
您的问题已在不久前发布,但我遇到了与您相同的问题,但找不到答案...我在 STM32F107 上使用 LWIP,并且完全无法在我的陷阱中添加第二个 varbind。 ..
解决方案是增加我的 µcontroller 的 HEAP 大小。使用 STM32CubeMX 时,它位于(对我而言)startup_stm32f107xc.s 文件的第 61 行,默认值为 0x200(512 字节),我只是将其加倍为 0x400。
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x400
我希望这对尝试使用 LWIP 的人有所帮助!