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.

[参考译文] TM4C1294NCPDT:如何调用 startntp()函数

Guru**** 2478485 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/684349/tm4c1294ncpdt-how-to-call-startntp-function

器件型号:TM4C1294NCPDT

尊敬的 TI 社区:

我正在阅读使用   SNTP 协议的"https://getCC3100_EK_TM4C1294XL_TI"代码,并创建了运行 http 客户端的任务,如下所示:

/*
=== https://task ===
*/
void https://Task (UArg0、UArg0 arg1)
{
void * netif;

/*打开 WiFi 并等待连接*/
netif = socketsStartUp();

https://fxn();

/*关闭网络-如果其他任务正在使用它,请不要执行此操作*/
socketsShutDown (netIF);
} 

现在,在 httpsFxn()中  调用了函数 startntp(),在所有 NTP 服务器初始化调用 SNTP 库函数  SNTP 开始后,将调用函数 SNTP_START。

我想知道、由于 SNTP_START 函数位于线程内部、但该线程在 while 循环中没有任何无限循环、因此该 http 客户端将仅运行一次、或者它使用一些内部任务或线程来连续运行。  

我还想知道、在任何线程或任务中、需要调用一次 SNTP 函数、或者在固定时间间隔后反复调用。

此致

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

    SNTP 启动() API 创建与 NTP 服务器通信的任务。 您无需执行任何其他操作。 如果您查看 ROV、您将看到任务。 任务函数名是 synctime(),以低优先级(1)运行。

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

    您好 Todd、

    我还想告诉您,我正面临编译器的警告,函数 inet_pton()是隐式定义的, 我们都知道、函数的定义在 InetAddr.c 文件中可用、并且我在工程属性的编译器部分的包含部分中包含了用于定义函数原型的头文件的正确路径。

    下面是它的代码片段:

    ipv4addr.sin 系列= AF_iNet;
    ipv4addr.sin_port = htons(123);
    
    iNet_pton (AF_iNet、"216.239.35.4"、&(ipv4addr.sin_addr.s_addr)); // google NTP server 2. 

    这可能是什么原因。

    还有任何特定的 SNTP 端口,如 http、FTP 协议,或者我可以为此使用任何端口。

    Piyush

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

    您好、Todd 和其他 TI 社区成员、

    我还有一个查询。

    实际上、我在阅读和浏览所有 NDK 文档后实施了 SNTP 代码、在本论坛上搜索大量内容并阅读相关内容、现在我确信我实施的代码必须能够正常工作、 但不幸的是,它没有按预期工作。

    请参阅我实施了两个功能并提供了文档中所述的服务器列表。 我实现了 Get 函数来获取系统的时间,并实现了 Set 函数,下面我附加了这两者的片段。 实际上、我没有执行任何操作、只是从 TI 的参考示例中对其进行了一些修改。

    void setTime (uint32_t t)
    {
    struct tm;
    time_t ts;
    
    seconds_set (t);
    
    时间(&T);
    TM =*本地时间(&ts);
    } 

    GetTime 代码片段:

    uint32_t getTime (void)
    {
    返回(seconds_get());
    } 

    REST 部分只是将服务器添加到我的 SNTP init 函数内的列表中,并在设置所有必要的环境后调用同一函数内的 SNTP start()。

    我确信它能够正常工作的事实是、它没有任何复杂性、在文档中提到的 SNTP 超时期限之后、SNTP 客户端必须调用文档中提到的 Set and Get 函数。

    但这种情况并非我所想的那样发生。

    此外、不能忽略 NTP 服务器不回复的可能性、但我已将5台服务器添加到列表中、如下所示:

    iNet_pton (AF_iNet、"216.239.35.4"、&(ipv4addr.sin_addr.s_addr)); // google NTP server 2.
    
    //unsigned char ntpServers[size];
    //int currPos = 0;
    
    memcpy ((ntpServers + currPos)、&ipv4addr、sizeof (struct sockaddr_in));
    currPos += sizeof (struct sockaddr_in);
    
    iNet_pton (AF_iNet、"132.163.96.2"、&(ipv4addr.sin_addr.s_addr));
    
    memcpy ((ntpServers + currPos)、&ipv4addr、sizeof (struct sockaddr_in));
    currPos += sizeof (struct sockaddr_in);
    
    iNet_pton (AF_iNet、"128.138.140.44"、&(ipv4addr.sin_addr.s_addr));
    
    memcpy ((ntpServers + currPos)、&ipv4addr、sizeof (struct sockaddr_in));
    currPos += sizeof (struct sockaddr_in);
    
    iNet_pton (AF_iNet、"132.163.96.4"、&(ipv4addr.sin_addr.s_addr));
    
    memcpy ((ntpServers + currPos)、&ipv4addr、sizeof (struct sockaddr_in));
    currPos += sizeof (struct sockaddr_in);
    
    iNet_pton (AF_iNet、"216.239.35.0"、&(ipv4addr.sin addr.s_addr));
    
    memcpy ((ntpServers + currPos)、&ipv4addr、sizeof (struct sockaddr_in));
    currPos += sizeof (struct sockaddr_in);
    

    因此、这种机会也很小。

    现在 Todd 告诉我如何解决此问题、并使其成为电路板上正确运行的 SNTP 客户端。

    此致

    Piyush pandey

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

    您能否启动有关 hte inet_pton()问题的新主题? 这会使该线程变得非常杂乱、无法在单个线程中回答太多问题。

    您能否通过查看 Wireshark 来确认 TM4C 是什么? 整个 currPos 看起来像是一个等待发生的错误。 您是否可以改用数组、然后相应地进行索引?

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

    [引用 user="ToddMullanix"]

    整个 currPos 看起来像是一个等待发生的错误。 您是否可以改用数组、然后相应地进行索引?

    [/报价]

    为什么 currPos 看起来是一个错误。

    下面是我在代码中添加多个服务器的方法。

    #define NTP_SERVERS 5
    #define NTP_SERVERS_SIZE (NTP_SERVERS * sizeof (struct sockaddr_in)
    
    
    char ntpServers[NTP_SERVERS_SIZE];
    
    
    void startNTP (void)
    {
    
    int currPos = 0;
    
    
    ipv4addr.sin 系列= AF_iNet;
    ipv4addr.sin_port = htons(123);
    
    //-------- 添加 NTP 服务器地址1 -------------------------------------------------------
    
    
    iNet_pton (AF_iNet、"216.239.35.4"、&(ipv4addr.sin_addr.s_addr)); // google NTP server 2.
    
    memcpy ((ntpServers + currPos)、&ipv4addr、sizeof (struct sockaddr_in));
    currPos += sizeof (struct sockaddr_in);
    
    
    //-------- 添加 NTP 服务器地址2 -------------------------------------------------------
    
    
    iNet_pton (AF_iNet、"132.163.96.2"、&(ipv4addr.sin_addr.s_addr));
    
    memcpy ((ntpServers + currPos)、&ipv4addr、sizeof (struct sockaddr_in));
    currPos += sizeof (struct sockaddr_in);
    
    
    //-------- 添加 NTP 服务器地址3 -------------------------------------------------------
    
    
    iNet_pton (AF_iNet、"128.138.140.44"、&(ipv4addr.sin_addr.s_addr));
    
    memcpy ((ntpServers + currPos)、&ipv4addr、sizeof (struct sockaddr_in));
    currPos += sizeof (struct sockaddr_in);
    
    
    //-------- 添加 NTP 服务器地址4 -------------------------------------------------------
    
    
    iNet_pton (AF_iNet、"132.163.96.4"、&(ipv4addr.sin_addr.s_addr));
    
    memcpy ((ntpServers + currPos)、&ipv4addr、sizeof (struct sockaddr_in));
    currPos += sizeof (struct sockaddr_in);
    
    
    //-------- 添加 NTP 服务器地址5 -------------------------------------------------------
    
    
    iNet_pton (AF_iNet、"216.239.35.0"、&(ipv4addr.sin addr.s_addr));
    
    memcpy ((ntpServers + currPos)、&ipv4addr、sizeof (struct sockaddr_in));
    currPos += sizeof (struct sockaddr_in);
    
    
    
    ----------
    ------------------------------------------------------}
    
    

    在这里,您可以看到,我以连续的方式将服务器地址存储在内存中,并使用 curPos 作为内存的偏移量 ,此外,我已经为5个服务器地址分配了内存,如上所示。

    现在、请告诉我它是否有问题。

    我知道使用相同内容的克隆会有点麻烦、但我现在正在进行测试和调试、因此不会专注于提高可读性。  

    同时、我将尝试使其更加系统化、如果有数据包被传输、我将尝试在 Wireshark 上进行传输。

    但 Todd、 我想问您 Wireshark 的一个问题  、即 Wireshark 捕获我的 PC 和 Tiva 板之间的通信数据包、以及它如何捕获 Tiva 板和一些远程 NTP 服务器之间的通信数据包。

    我是说我的 PC 在 Tiva 板上不充当 NTP 服务器、因为您可以看到、上述所有 IP 地址都是来自欧洲和美洲不同地区的 NTP 服务器的合法 IP 地址。

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

    您可以使用以太网集线器将 PC 和 TM4C 连接到。 这样、您的 PC 就能看到往返 TM4C 的情况。 另一个选项是将您的 PC 添加到 NTP 列表中、以查看 TM4C 是否有任何内容。 尝试先将您的 PC 放在列表中、然后再放在列表中。 我意识到您的 PC 上没有 NTP、但 TM4C 仍应尝试与其通信。

    注意:我没有可用于测试的板(我在办公室外工作了几天)、因此我无法尝试重现问题。

    注意:您是否正在调用 SNTP 设置服务器?

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

    您好 Todd、

    正如您所说、我按照通过 Wireshark 调试项目的步骤进行操作。

    我已保存大小为43 MB 和38 MB 的 Wireshark 文件、因此我将它们上载到我的文件共享站点、现在我将在这里与您共享。 我还附加了 Tiva 板发送给我的 PC 的 NTP 查询屏幕截图的链接,我的 Tiva 板的 IP 地址为192.168.80.154,我的 PC 的 IP 地址为192.168.80.171。

    在调试会话期间注意到以下事项:

    1 -- Tiva 板在整个 Wireshark 捕获中只查询一次 NTP 包,而不是 SNTP 文档中提到的多次查询 NTP 包,在 SNTP 超时期后,它将再次 ping NTP 服务器,依此类推。 Wireshark 捕获的时间大约为1小时,因此应该至少有2个来自 Tiva 端的 SNTP 查询数据包。

    2 -- 当我启动 Wireshark 的捕获会话并启动 Tiva 板的调试会话时、我没有得到这一点、而是等待来自 Tiva 端的 NTP 查询数据包、但直到我在 Wireshark 窗口中捕获到任何内容 同时开始对 Tiva 板执行 ping 操作、并且在我对 Tiva 板执行 ping 操作时、其数据包开始出现在 Wireshark 的窗口中。 那么、这个问题到底是什么、您能解释一下吗?

    以下是捕获文件和屏幕截图的链接:

    1drv.ms/.../s!AiOYsdn8Q78GdqhzQc_smPJopwzN-


    1drv.ms/.../s!AiOYsdn8Q78Gdqhs2XNq-rDguhWjC


    另外,我还想补充一点,现在我没有 ping 任何 NTP 服务器, 我只在 NTP 服务器地址中输入了一个 IP 地址、即我的 PC IP 地址192.168.80.171、这样我就可以看到至少 Tiva 板正在查询 NTP 服务器、但在一个响应后没有任何内容、如上所述、并在 Wireshark 输出中捕获。

    此致

    Piyush Pandey

      

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

    您好、Piyush、

    您必须将服务器的套接字地址结构复制到 ntpServers 数组中的代码应该可以。 请注意,示例代码是使用 memcpy()而不是数组编写的,因为服务器列表可以同时容纳 IPv6和 IPv4服务器,因此数组在这种一般情况下不起作用。 但是,如果列表中仅使用 IPv4服务器,则可以将 ntpServers 简化 sockaddr_in 结构的数组,如 Todd 建议的那样。 但是、如果一切正常、最好为清理步骤(正如您已经在想的那样)保存这种变化。

    Piyush Pandey22 说:
    还有任何特定的 SNTP 端口,如 http、FTP 协议,或者我可以为此使用任何端口。

    NTP 服务器使用端口123。 因此,NTP 客户机必须为目标服务器的端口指定123。 您的本地端口应为任何标准用户端口号(在有效范围内)。

    [引用 user="Piyush Pandey22">我已保存大小为43 MB 和38 MB 的 Wireshark 文件,因此我将这些文件上载到我的文件共享站点,现在我将在这里与您共享。 我还附加了一个链接、指向 Tiva 板发送到我的 PC 的 NTP 查询的屏幕截图

    由于我们的安全策略、我无法访问这些文件。 由于文件大小较大、您是否无法附加这些文件?

    您不应在屏幕快照方面达到任何大小限制。 您能否将屏幕截图(2018-04-30 12_04_52-NTP_DEBUG_01.png)发布 到该主题?

    [引用 user="piyush Pandey22">此外,我还想添加,现在我不会 ping 任何 NTP 服务器, 我只在 NTP 服务器地址中输入了一个 IP 地址、即我的 PC IP 地址192.168.80.171、这样我就可以看到至少 Tiva 板在查询 NTP 服务器、但在一个响应后没有任何内容、如上所述、并在 Wireshark 输出中捕获。

    由此、您似乎能够看到从 Tiva 板发送到 PC 的 NTP 请求。 是这样吗? 如果是、您能否获取此小型场景的 Wireshark 捕获、然后将其上传到此处? (类似这样的小捕获不会导致文件大小非常大)。

    另一个要尝试的方法是将服务器列表更改为具有多个服务器、这些服务器都是同一台服务器。 为了澄清这一点、我的意思是更新服务器列表以包含您的 PC 的 IP 地址、并重复此操作、例如3次。

    预期结果是、您会看到 Tiva 板发出 n 个不同的 NTP 请求(在本示例中、n = 3、因此我希望您看到3个不同的 NTP 包)。 我不确定您使用的 TIRTOS 是哪个版本、但我可以猜测传输之间可能会有延迟(因此您可能需要给它几分钟的运行时间)。

    Steve