This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP432E411Y:NDK -正在尝试获取网关 IP 地址

Guru**** 2589245 points
Other Parts Discussed in Thread: MSP432E411Y

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/866576/msp432e411y-ndk---trying-to-obtain-gateway-ip-address

器件型号:MSP432E411Y

我们使用的是最新的 NDK 堆栈、从路由表中获取正确的网关地址时遇到问题。

当我检查这些标志时、 FLG_RTE_GATEWAY 永远不会置1。 如果我忽略标志测试并仅循环、

我从以下代码中获得两个 IP 地址、即当前 IP 地址、以及一个看起来像主机地址但以零点结尾的 IP 地址。  

是否有任何想法或是否有更好的方法来获取网关?

//从路由表获取网关
void * HRT = 0;
uint32_t wFlags = 0;

ACTIVE_GATEWAY = 0;

llEnter ();

HRT = RtWalkBegin ();

while (HRT)

  wFlags = RtGetFlags (HRT);

  IF (wFlags & FLG_RTE_GATEWAY)

  {

    ACTIVE_GATEWAY = RtGetGateIP (HRT);

  }

  HRT = RtWalkNext (HRT);

llExit ();

trace_printf ("Active_gateway:%s\r\n、Network_IP_TO_string (Active_gateway));

感谢您的帮助!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Joe、您好!

    工程师将立即了解这一点。

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您拥有的代码应该起作用。 您是否使用 DHCP 获取 IP 地址? 或者、您是否配置了静态 IP 地址?

    如果要配置静态 IP、则必须手动输入 g/w IP。

    Steve

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们正在使用 DHCP。 如果我使用办公桌的 ipconfig、该接口插入到与 MSP432E411Y 相同的交换机中、我将获得 xx.1.116.1作为网关、但通过 NDK、我们看不到网关。 如果我将 RtGetGateIP 函数更改为 RtGetIPAddr 并在忽略标志的情况下运行循环、我将在表中看到两个 IP 地址、我的地址为 xx.1.116.55、另一个地址为 xx.1.116.0。  

    Joe

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Joe、

    您可以尝试以下调试步骤吗? 它将需要在调试模式下重建 NDK、这将改善单步执行和断点设置、此外、我还将要求您启用 DHCP 调试宏以获取一些其他信息:

    1. 在修改任何文件之前、请确保备份 NDK 的副本
    2. 文件中的 DEBUGON 宏设置为1 " / <"packages" or "source">/ti/ndk/nettools/dhcp/dhcp.h
      1. define DEBUGON            1 // 0
    3. 在调试模式下重建 NDK
      1. 请参阅此处的步骤
    4. 如上所示重建库后、您需要根据这些重建版本重新构建/重新链接应用程序
    5. 加载程序
    6. 在 ti/ndk/nettools/dhcpkt.c 中的以下情况下放置一个断点(大约220行)
    7. 案例 DHCPPT_ROUTER:
      TagLength =* PV++;
      if (TagLength >= 4)
      memmove (&please ->IPGate、PV、4);
      dhcpDecodeType( Tag, TagLength,PV );
      PV +=标志长度;
      buffersize-= TagLength + 2;
      中断; 

    8. 在 dhcpIPAdd() fxn (ti/ndk/nettools/dhcp/sm.c,第338行)中的 if 语句处放置另一个断点
    9. if (请->IPGate)
      {
      /*添加默认网关。 因为它是默认值、所以是*/
      /*目标地址和掩码都为零(我们继续操作*/
      /*并为清晰起见显示分配)。 *
      memset(&rt, 0, sizeof(RT));
      rt.IPDestAddr = 0;
      rt.IPDestMask = 0;
      rt.IPGateAddr =请->IPGate;
      
      /*添加路由*/
      RC = CfgAddEntry (0、CFGTAG _route、0、0、sizeof (CI_route)、
      (unsigned char *)&RT,&please ->HCE_IPGate);
      if (rc < 0)
      {
      /*如果这是服务错误,则仍添加了该条目*/
      if (RC <= CFGERROR_SERVICE)
      CfgRemoveEntry (0,请->HCE_IPGate);
      请->HCE_IPGate = 0;
      }
      } 

    10. 运行应用程序
    11. 您是否达到了步骤7中详述的上述 b/p? 如果是,请将 g/w IP 复制到 please ->IPGate 中吗?
    12. 您是否达到了步骤9中详述的 b/p? 请->IPGate NULL 或有效吗?
    13. 最后、DHCP 调试跟踪输出显示什么?

    Steve

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Steve、

    感谢您提供详细信息。 我确实遇到了步骤7中的断点、可以看到正确的网关 IP 地址。 我在第9步中单击断点、通过 CfgAddEntry 函数添加正确的网关 IP 地址。 遗憾的是、我无法使调试跟踪正常工作。 我们将 FreeRTOS 与堆栈一起使用、FreeRTOS 的调试输出具有 ifdef。

    Joe

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Steve、

    另一个问题-是否有方法使用 CfgGetImmadi()来获取网关 IP 地址? 基本上、我需要拥有与在 PC 上通过命令提示符执行"ipconfig"类似的信息。 谢谢!

    Joe

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Joe、

    由于节假日,答复将被推迟。

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Joe、您好!

    我想知道您打印 g/w 信息的时间有多早? 例如、如果您通过网络 IP 地址挂钩函数执行此操作、可能太早(即尚未添加路由)。 请注意、我在尝试重现您的问题时遇到了这个问题、因此您可能会看到同样的情况。 在这种情况下、当从 DHCP 服务器接收到的 IP 地址绑定时、堆栈会调用网络 IP 地址(用户)挂钩函数_Before _、它实际上会将路由添加到配置中。 因此、在本例中、我没有看到 IP g/w 条目。

    无论如何、请在尝试获取 IP g/w 信息之前仔细检查您等待的时间是否足够长。 对于我来说,我使用 udpEcho 示例来重现问题,在调用 TaskSleep (5000)之后,通过调用回显线程中的以下 printRoute()函数来实现“足够长”。

    在给定所有这些信息的情况下、请尝试以下函数:

    #include 
    #include 
    
    void printRoute()
    {
    字符 IPString[16];
    CI_route ip_route;
    
    memset (&IP_route、0、sizeof (CI_route));
    
    RetVal = CfgGetImmass调和(0、CFGTAG _route、0、1、sizeof (CI_route)、 (unsigned char *)&IP_route);
    if (RetVal!= sizeof (CI_route)){
    trace_printf ("错误、错误大小的 retd (%d)\n"、RetVal);
    }
    
    NtIPN2Str (IP_route.IPDestAddr,IPString );
    trace_printf ("IP dst addr =%s\n"、IPString);
    
    NtIPN2Str (IP_route.IPDestMask, IPString );
    trace_printf ("IP DST 掩码=%s\n"、IPString);
    
    NtIPN2Str (IP_route.IPGateAddr,IPString );
    trace_printf ("ip g/w =%s\n"、IPString);
    
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Joe Beingeritz1]不幸 的是我无法使用调试跟踪。 我们将 FreeRTOS 与堆栈一起使用、FreeRTOS 的调试输出具有 ifdef。

    我可以通过两种方法来解决这一问题。

    1.编辑 DbgPrintf()的代码以使用 Trace_print()函数,而不是 System_printf()。

    2.编辑 DHCP 代码中的 print 语句以使用 Trace_printf()而不是 DbgPrintf()

    由于您已经在重建 NDK、因此其中的任何一项都不应该为您带来过多的额外工作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Steven、

    这正是问题所在! 非常感谢您的帮助!

    Joe

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Joe、您好!

    好消息! 很高兴您终于遇到了这个问题。

    我提交了以下文件、以确保更新文档以提及此计时问题:

    NDK-519 -更新与网关相关的文档以通知用户计时问题

    Steve