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.

[参考译文] RTOS/DK-TM4C129X:访问 DHCP 客户端信息

Guru**** 2487425 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/731122/rtos-dk-tm4c129x-get-access-to-dhcp-client-information

器件型号:DK-TM4C129X

工具/软件:TI-RTOS

我正在开发一个应用程序、需要从网络的 DHCP 服务器获取 IP 地址、主机名和名称服务器信息。

是否有方法可以访问 DHCP 客户端正在使用的信息?  我可以通过某种方式获得指向它正在处理的 DHCPLEASE 结构的指针?

稍后-

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

    当然、您正在寻找适合这种情况的 TI-RTOS 解决方案? 不仅仅使用基本 TivaWare?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、这是使用 tirtos_tivac_2_16_01_14。

    不确定这是否是唯一受支持的平台、TivaWare 或 SYSBIOS 是否支持多线程应用?

    我的应用程序通常有大约五六个同步线程(在 Linux 和 Windows 上已经运行)。

    稍后-

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

    我更希望将您的问题发送给正确的工程师以获得支持、我自己不在 TI-RTOS 上工作、因此我联系了 TI-RTOS 专家、他们可以为您提供帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 David:

    遗憾的是、现在可以获取 DHCPLEASE 本身的指针。

    您应该能够通过 Cfg* API 访问所需的信息。 我必须返回到您查找名称服务器、但您可以在平均时间开始使用此代码:

    1) 1) IP 地址


    字符 IPString[50];
    CI_IPNet   NA;

    CfgGetImmadiate( 0, CFGTAG _IPNet, if_req.index,1, sizeof (NA), (uint8 *)&nA);

    NtIPN2Str (na.ipaddr、IPString);
    DbgPrintf (DBG_INFO、"IP Address   :%s\n"、IPString);

    // na.Domain =域名字符串

    2) 2)主机名


    您应该已经在应用中设置了此项、但是您可以按如下方式获得:

    字符主机名[HOSTNAME_LENG];// HOSTNAME_LENGTH = 256

    CfgGetImmediation (0、CFGTAG _SYSINFO、CFGITEM_DHCP_HOSTNAME、1、HOSTNAME_LENGTH - 1、 (uint8_t *)主机名);

    // hostname[]现在具有主机名字符串

    Steve

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

    网络配置由网络上的 DHCP 服务器设置。  我不提供主机名、我被提供了我应该使用的主机名。

    与其他项目相同。  我得到了一个 IP 地址和域名、但我不提供它们。

    我不能完全确定 为什么 需要 DNS 服务器或网关、但出于某种原因、它是我支持的协议的一部分。

    稍后-

    David

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

    嗯、我越来越接近降低我可以加载和测试某些东西的位置(不是它将会起作用...)。

    首先、BSD/sys/socket.h 和 nettools/inc/netcfg.h 中的函数之间存在重大冲突 、我通过添加一组条件块来解决这一问题、但这不应该是我要做的事情。

    基本上、我的17.9.0.STS 版本不再是出厂版本。  主要问题是对几个结构的定义。

    现在、根据您提供的代码:

    在第1)节中、我可以从何处获取 if_req.index?  我在任何地方都看不到这种定义。

    下一个项目。  我不能在我的生命周期内确定如何在 EMACSnow_NIMUInit 中进行链接。  它的定义在哪里、如何将其包括在内?

    稍后-

    David

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

    David、

    [引用 user="David Dudley"] BSD/sys/socket.h 和 nettools/inc/netcfg.h中的函数之间存在重大冲突

    您是否在同一源文件中同时包含了 sys/socket.h 和(netmain.h 或 stkmain.h)?

    如果是、这可能是您看到碰撞的原因。 您使用的 NDK 版本中的 BSD 支持层限制是 BSD 套接字 API 代码必须与您的"标准 NDK API"代码位于单独的编译单元中。

    (通常、如果您需要包含 netmain.h 或 stkmain.h 才能获取特定的 API、则这将是"标准 NDK API")。

    我建议重新调整代码、以便一个文件(例如"file A")包含 sys/socket.h 并具有 BSD 调用、而另一个文件("file B")包含 netmain.h 和 stkmain.h、并调用"NDK 标准函数"。

    例如、您可能具有以下类似内容:

    文件 A:

    #include 
    
    extern void findIpInfo();
    
    myFxn()
    
    {
    
    findIpInfo();//此函数将调用 Cfg* API 和其他非 BSD NDK 函数
    
    int s =套接字(...);
    
    发送,...);
    
    Recv(s);
    
    关闭;
    
    }
    

    文件 B:

    #include 
    
    #include 
    
    void findIpInfo()
    
    {
    
    字符 IPString[50];
    CI_IPNet NA;
    
    CfgGetImmadiate( 0, CFGTAG _IPNet, if_req.index,1, sizeof (NA), (uint8 *)&nA);
    
    NtIPN2Str (na.ipaddr、IPString);
    DbgPrintf (DBG_INFO、"IP Address:%s\n"、IPString);
    
    //等
    
    } 

    更多信息、请参阅 NDK 用户指南

    C:\tirtos_tivac_2_16_01_14\products\NDK_2_25_00_09\docs\spru524j.pdf

    3.3.1.1节关于 BSD 兼容性需要注意的事项
    ->文件分隔

    [引用 user="David Dudley"]我已经通过添加一组条件块来解决它,但这不应该是我要做的事情。

    通过上述更改、您应该能够撤消此操作。

    [引用 user="David Dudley">从哪里可以获得 if_req.index?  我在任何地方都看不到这种定义。

    我以前给你的差分是不完整的。 您可以通过如下方式获得:

    NIMU_IF_REQ IF_REQ;

    memset (&if_req、0、sizeof (Nimu_if_Req));

    NIMUIoctl (Nimu_get_device_index、&if_req、/dev/index、sizeof (dev_index);

    请参阅 NDK Telnet 控制台代码、了解您尝试执行的操作的更多示例:

    C:\tirtos_tivac_2_16_01_14\products\NDK_2_25_00_09/ti/NDK/tools/console/conipaddr.c

    [引用 user="David Dudley"]我不能为自己的一生而在 EMACSnow_NIMUInit 中确定如何链接。  它的定义在哪里、如何将其包括在内?[/quot]

    此函数来自驱动程序库。 您能否将以下代码添加到项目的*。cfg 文件中? 然后全部重建。

    /*========================= TI-RTOS 驱动程序的配置==== //
    var driversConfig = xdc.useModule('ti.drivers.Config');
    //
    *包含 TI-RTOS 驱动程序
    *
    选择一个:
    *- driversConfig.LibType_nonInstrumented (默认)
    * 使用针对封装和性能进行优化
    的 TI-RTOS 驱动程序库* 而不使用断言或日志。
    *- driversConfig.LibType_Instrumented
    * 使用 TI-RTOS 驱动程序库在启用断言和日志的情况下进行调试。
    //
    driversConfig.libType = driversConfig.LibType_noniced;
    //driversConfig.libType = driversConfig.LibType_Instrumented;
    

    Steve

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

    沿着这条路走…

    我知道我在某个地方看到过这个  如何在 DHCP 客户端收到 IP 地址之前阻止主程序启动?

    我还记得、有一个报告函数、您可以用来告诉您何时安全运行?

    稍后-

    David

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

    下一个问题....

    CFGImm调解 例程是否支持获取 CFGITEM_DHCP_DMAINNAMESERVER 以获取 DHCP 服务器提供的 DNS 记录?

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

    [引用用户="David Dudley"]

    我知道我在某个地方看到过这个  如何在 DHCP 客户端收到 IP 地址之前阻止主程序启动?

    我还记得、有一个报告函数、您可以用来告诉您何时安全运行?

    [/报价]

    是的、没错、有一个 IP 地址回调函数。 每当从系统中添加或删除 IP 地址时、都会调用它。 因此、这是您应该添加代码以执行所需操作的位置、我只想注意带下划线的部分的重要性。 该函数采用一个参数"fAdd"、这是一个布尔值、如果添加了 IP 地址、则为 true、如果删除了 IP 地址、则为 false。 因此、只需检查 fAdd 参数即可了解发生的情况。

    无论如何、您可以通过使用以下设置更新*。cfg 文件将其添加到您的应用中:

    Global.networkOpenHook ="&ipAddressHook";

    然后、在 C 源代码中(例如、请参阅 tcpEcho 示例应用程序中的示例文件 tcpEchoHooks.c)、添加具有上述指定名称的函数。 在该函数内、您可以发布全局共享信标:

    空 ipAddressHook (uint32_t ipaddr、uint32_t IfIdx、uint32_t fADD)

       如果(fADD){

         //例如

           Semaphore_post (ipAddrSem);

       }

    然后、在您的网络线程中、首先要做的是阻止 ipAddrSem 信标。 这样、在从 IP 地址挂钩函数内发布信号量之前、代码不会运行:

    空 networkAppThread()

       //例如

       Semaphore_pend (ipAddrSem);

       //后跟其余的网络代码

    Steve

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    传递给此例程的 ipaddr 是否是发出的 IP 地址? 它似乎与 DHCP 客户端显示的已接收的完全不同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    所以... 仅仅是不能留下足够好的东西。

    我需要在此计算机上实施 SNTP 客户端、以获得正确的时间。

    我是否可以通过任何方式获取 DHCP 提供的 SNTP 服务器的 IP?

    它作为条目#4提供、但不确定如何检索它、或者我是否可以。

    稍后-

    David

    PS:不知为何、此页面上的标题设置为仅显示中文。  如何将它们改回、或者我可以更改吗?

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

    尊敬的 David:

    是的、IP 地址从 DHCP 服务器接收(由 DHCP 服务器发出)、设置为嵌入式器件的 IP 地址、然后调用此回调函数、传递与 arg 相同的 IP 地址。

    我猜您缺少用于处理字节排序的代码。 请参见下面的。

    Steve

    void ipAddressHook (uint32_t ipaddr、uint32_t IfIdx、uint32_t fADD)
    {
    uint32_t iptmp;
    
    ...
    /*打印添加/删除的 IP 地址*/
    IPTmp = ntohl (ipaddr);//如果您具有较新的 NDK、则可能是 NDK_ntohl ()
    DbgPrintf (DBG_INFO、"如果-%d:%d.%d.%d.%d\n"、IfIdx、
    (uint8_t)(IPTmp>>>24)&0xFF、(uint8_t)(IPTmp>16)&0xFF、
    (uint8_t)(IPTmp>>8)&0xFF,(uint8_t) IPTmp&0xFF);
    ...
    }
    

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

    [引用用户="David Dudley"]

    我需要在此计算机上实施 SNTP 客户端、以获得正确的时间。

    我是否可以通过任何方式获取 DHCP 提供的 SNTP 服务器的 IP?

    [/报价]

    是否可以为此问题打开新主题?

    谢谢、

    Steve