Embedded 使用LWIP SNMP,调用第二个SNMP_vabind_alloc时会发生错误

Embedded 使用LWIP SNMP,调用第二个SNMP_vabind_alloc时会发生错误,embedded,snmp,lwip,Embedded,Snmp,Lwip,我正在尝试使用轻量级互联网协议(LWIP)SNMP发送一个正确的陷阱 SNMP Wiki声明,应具有适当的陷阱 当前系统正常运行时间值绑定 标识陷阱绑定类型的OID 可选的变量绑定 但是它在vb->value!=调用第二个snmp\u varbind\u alloc时为空 当仅发送变量绑定而不发送其他绑定时,陷阱被发送到网络管理站ok 如果在RAM中定义结构并填充字段,有效地手动执行分配,那么我可以得到两个绑定。它将单步运行,但不会运行。所以,现在我需要确保RAM结构在发送时存在,在我销毁它们之

我正在尝试使用轻量级互联网协议(LWIP)SNMP发送一个正确的陷阱

SNMP Wiki声明,应具有适当的陷阱

  • 当前系统正常运行时间值绑定
  • 标识陷阱绑定类型的OID
  • 可选的变量绑定
  • 但是它在
    vb->value!=调用第二个
    snmp\u varbind\u alloc
    时为空


    当仅发送变量绑定而不发送其他绑定时,陷阱被发送到网络管理站ok

    如果在RAM中定义结构并填充字段,有效地手动执行分配,那么我可以得到两个绑定。它将单步运行,但不会运行。所以,现在我需要确保RAM结构在发送时存在,在我销毁它们之前。因此,我可以添加一个不理想的延迟,或者找到一个函数来告诉我陷阱何时被发送,这样我就可以继续了。我在发布不起作用的代码时犹豫不决。当(如果)我让它工作时,我将显示代码。

    下面是3个绑定的代码,其中opt.h从:

    #定义MEMP_NUM_SNMP_值3

    致:

    #定义MEMP_NUM_SNMP_值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

    解决方案是增加我的µ控制器的堆大小。 使用STM32CubeMX时,它位于(对我来说)startup_stm32f107xc.s文件的第61行,默认值为0x200(512字节),我只是将其加倍为0x400

    ; <h> Heap Configuration
    ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
    ; </h>
    
    Heap_Size      EQU     0x400
    
    ;堆配置
    ;     堆大小(字节)
    ; 
    堆大小等于0x400
    

    我希望这将帮助任何试图使用LWIP的人

    建议您添加一个SSCCE。请参见.In opt.h,将#define MEMP_NUM_SNMP_值从3增加到9,可以再分配2个绑定。然而,我发现一个绑定对于一个1级陷阱来说已经足够了。2级陷阱需要3个绑定。