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/TM4C129XNCZAD:获取时间服务器信息

Guru**** 2394095 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/737596/rtos-tm4c129xnczad-getting-time-server-information

器件型号:TM4C129XNCZAD

工具/软件:TI-RTOS

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

我现在让我的设备从 DHCP 获取它的 IP 和域。

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

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

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

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

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

    已指派一名工程师回答 SNTP 问题。 关于中文 characters...can、请附上此内容的快照。

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

    David、

    很抱歉耽误你的时间。 我一直在建立一个测试台来调查此问题。 我会随时向您发布。

    ~Ramsey

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

     至少有一些标签已自行更正。  当我写这个问题时、"+问一个相关的问题"和"+问一个新问题"是中文字符。  另外、当我打开一个页面进行编辑时、所有文本都是中文。  如果我不知道按钮的含义、我就会丢失。

    现在、我在右上角有中文字符。

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

    David、

    我最后给你一个答复,但这不是一个简单的答复。

    要从 DHCP 服务器获取 NTP 服务器地址、需要执行以下三个步骤:

    1.使用 DHCP 选项请求 NTP 服务器地址
    2.解析 DHCP 响应并解压缩选项 Reply (回复)
    3.等待 NDK IP 地址挂钩,然后获取 NTP 地址

    第一步是要启用 DHCP 选项的配置设置。 步骤2将由 NDK 堆栈线程处理。 您可以通过调用 NDK API 来检索 NTP 服务器地址来执行步骤3。

    遗憾的是、我们在 NDK 中发现了与步骤1相关的错误;NDK 未实现步骤2;并且没有支持步骤3的 API。 但如果你如此倾向、我可以为你提供一个解决方案。

    步骤1. 从 DHCP 服务器请求 NTP 服务器地址

    有两个选项与时间服务器有关。 我不确定您想要哪一个。 如果需要、您可以参考 RFC2132来确定您需要哪一个。

    启用这些选项的常规方法是将以下内容之一添加到应用程序配置脚本中。

    时间服务器选项(RFC 代码#4)

    VAR IP = xdc.useModule('ti.ndk.config.Ip');
    ip.DHCPPT_TIME_Server = true;

    网络时间协议服务器选项(RFC 代码#42)

    VAR IP = xdc.useModule('ti.ndk.config.Ip');
    ip.DHCPPT_NIS_TIME_Protocol_servers = true;

    请注意、上面的名称拼写错误;它应该是 NTP 而不是 NIS。 但我们必须按照定义使用它。

    但是、由于 NDK 中存在错误、这将不起作用。 另一种方法是在 NDK 中定义的 DHCPYPECode 数组中设置该选项的默认位,以启用该选项。 编辑以下文件:

    /ti/ndk/nettools/dhcp/dhcptag.c

    将标志 FlG_DEFAULT 添加到选项中。 这将默认启用该选项、并将包含在 DHCP Discover 数据包中。 例如,要启用 NTP 服务器选项,请按如下方式修改选项42:

    4 | FLG_ISADDRESS | FLG_DEFAULT、// 42 - NIS 时间协议服务器*/

    您需要重新构建 NDK 库才能使此更改生效(请参阅下文)。

    步骤2. 解析 DHCP 响应并解压缩选项 Reply (回复)

    当 NDK 收到 DHCP 响应时,将在函数 dhcpVerifyMessage()中解析数据包。 此函数已处理两个选项、但不处理时间服务器选项。 您可以添加以下将解析 NTP 服务器选项的 case 语句。 我已将第一个 IP 地址的值存储在全局变量中、因此您可以稍后访问它。 请注意,此选项可能会返回服务器地址列表。 我只保存第一个。 您需要修改代码以保存整个列表。 编辑以下文件:

    /ti/ndk/nettools/dhcp/dhcppkt.c

    在 dhcpVerifyMessage()函数之前定义全局变量:

    IPN NDK_NTPServer = 0;

    在 dhcpVerifyMessage()函数中添加以下 case 语句。

    案例 DHCPPT_NIS_TIME_PROTOCOL_SERVERS:
       TagLength =* PV++;
       if (TagLength == 4)
           bcopy( PV,&NDK_NTPServer,4 );
       PV +=标志长度;
       buffersize-= TagLength + 2;
       中断;

    您需要重新构建 NDK 库才能使此更改生效。

    3.等待 NDK IP 地址挂钩,然后获取 NTP 地址

    DHCP 服务器将在响应数据包中向您发送 NTP 服务器地址。 因此、NDK IP 地址挂钩是一个获取它的好地方。

    外部 IPN NDK_NTPServer;

    空 netAddrHook (uint32_t addr、uint32_t IfIdx、uint32_t fADD)

       字符 IPString[50];

       NtIPN2Str (NDK_NTPServer、IPString);
       System_printf ("NTP 服务器:%s\n"、IPString);

    要重建 NDK 库、请使用以下链接上的指令:

    您的 TI-RTOS TivaC 安装中会随附 NDK 产品。 您可以在产品文件夹中找到它:

    /tirtos_tivac_2_16_01_14/products/NDK_2_25_00_09

    如果您有任何疑问、请告诉我。

    ~Ramsey

    电源 关于论坛上的中文字体。 右上角的按钮将带您进入中国网站。 如果您误去了那里,同一个按钮会返回到美国网站。 也许您是偶然去的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经被下拉到另一个项目了一段时间。 我会尽快实施此更改、看看它是否提供了我所需的解决方案。 DHCP 选项4是我认为要查找的内容,一旦提供了它,我将实例化提供的 ntpd 守护程序。

    现在、这已解决