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.

[参考译文] CC3220S:在时区中正确使用 ClockSync 和 mktime

Guru**** 2528010 points
Other Parts Discussed in Thread: CC3220S

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1082741/cc3220s-proper-use-of-clocksync-and-mktime-with-timezones

部件号:CC3220S

你好

我们正在使用 CC3220S 作为产品。

产品启动时应获得通过代码定义的时间。  

是否可以用以下代码行以外的其他方式执行此操作?

sl_DeviceSet(SL_DEVICE_GENERAL, SL_DEVICE_GENERAL_DATE_TIME, sizeof(SlDateTime_t), (uint8_t *)(&nwpTime));

为了在1970年以后以秒为单位检索 UNIX 时间戳,添加了以下定义__TI_Time_Uses_64 =1

struct tm local_time;
ClockSync_get(&local_time);
unit64_t unix_time = mktime(&local_time);

但是,时区似乎有问题,因此使用了此代码

// _tz is defined somewhere at time.h
_tz.timezone = 0;
_tz.daylight = 0;

问题是,现在是否有设置时区的包装程序?  或者如何正确完成?

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

    嗨 Peter,

    您是否已经了解 了 CC32XX SDK 中的 local_time 示例?

    它显示了如何使用 ClockSync-get(),ClockSync-updat(),ClockSync-setTimeZone()和 ClockSync-getTimeZone()来获取时间,更新时间,设置时区和获取时区。

    此致,

    杰西

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

    你(们)好,Jesse

    是的,这些例子很好。 但是,仍然存在的问题是从 ClockSync-Get()返回的 TM 对象获取基于 UNIX 时间戳1970

    将其直接输入 mktime 会迫使我决定如何处理时区和夏令时。 自1970年以来,是否有办法在不需要手动设置时区和 DST 的情况下获得秒数?  我担心的是,在欧盟永远退出 DST 的一年里,我开发出了一些现在和以后都能正常工作的产品,我们所有的产品都有错误的时间戳。

    ClockSync 能不能以某种方式从1970年起获得传感器吗?

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

    您好,

    对于时间同步,使用 SNTP 协议。 SNTP 协议不实施时区。 如果没有 GPS 或 DHCP 选项100 (RFC4833),就无法自动设置时区。 CC32xx 设备不支持 DHCP 选项100。 但可以使用此选项实现自己的 DHCP 客户端。 但此选项取决于网络上使用的 DHCP 服务器。

    1月

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

     在调用 ClockSync_update()后,我刚尝试将 Tim(NULL)与__TI_TIME_USS_64 =1组合使用。

    这将使 UNIX 时间从1970年恢复,似乎是有效的。 这是安全的吗?

    如果是,我是否需要以下选项?

    ClockSync-config (CLOCKSYNC_PARAM_UPDATE_NWP,1)

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

    您好,

    很抱歉,我不熟悉此 API,请等待 TI 的回答。

    1月

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

    嗨 Peter,

    如果 Tim()正在为您服务,那么您可以使用它从1970年开始获得 UNIX 时间。 它是否仅在定义 __TI_Time_Uses_64 =1时有效,或者如果删除该定义,它是否仍然有效?

    或者,您可以编写应用程序代码,将从 ClockSync-Get()返回的 TM 对象的日期和时间转换为 UNIX 时间戳。 遗憾的是,无法以不同的格式从网络子系统中回读时间

    如 Jan 所述,用户负责实施时区和夏令时。

    如果要在调用 ClockSync_update()时更新 NWP 时钟,则应调用 ClockSync-config(CLOCKSYNC_PARAM_UPDATE_NWP)。

    此致,

    杰西

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

    再看,时间(NULL)似乎有编译器给出的引用。 如果我更改计算机的系统时钟,它还会影响闪存芯片上的时间功能。 这是意料之中的吗?

    使用 TI-RTOS 在 CC3220芯片上同步时间并获取自1970年以来的 UNIX 时间的建议方法是什么?

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

    嗨 Peter,

    我知道,我们没有这样做的推荐方法, 但我 在  local_time 示例中添加了下面显示的最下面的两行代码,自1970年以来,它似乎正在打印 UNIX 时间。 我只是减去1900到1970的秒数。 您需要在自己的系统上对此进行验证。

                    status = ClockSync_get(&netTime);
                    if((status == 0) || (status == CLOCKSYNC_ERROR_INTERVAL))
                    {
                        UART_PRINT("Local time = %s\n\r",asctime(&netTime));
                        UART_PRINT("NTP TIME (since Jan 1 1900) = %jd\n\r", (intmax_t)mktime(&netTime));
                        UART_PRINT("UNIX TIME (since Jan 1 1970) = %jd\n\r", (intmax_t)(mktime(&netTime)-2208988800));

    此致,

    杰西

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="490734" url="~ë/support/wireless-connectivity /wi-fi-group/wi-fi -forum/1082741/cc3220s-正确使用时钟同步和 mktime-with 时区/4010611#40106116]1970至1900之间的秒数。 您需要在自己的系统上验证此问题。

    感谢您的回复!  

    如果使用了 ClockSync-setTimeZone,建议如何在 GMT 时间内获得 UNIX 时间戳?

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

    嗨,彼得,

    您可以使用 ClockSync-getTimeZone()以 分钟为单位从 UTC 返回偏移量,乘以60转换为秒,然后再添加到上述时间。

    此致,

    杰西

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

    嗨 Peter,

    对我先前的答复有一个澄清:

    [引用 userid="490734" url="~/support/wireless-connectivity /wi-fi-group/wi-fi -forum/1082741/cc3220s- proge-use-docksync 和 mktime-with -timezones/4010845#40108455"],您可以使用 ClockSync-getTimeZone ( 以60秒为单位转换),然后将时间乘以从上述时间转换为60秒[,并从上述时间转换为单位]。

    如果使用 ClockSync-setTimeZone()设置时区,则当您调用 ClockSync-Get()并使用 mktime()转换为 UNIX 时间戳时,该时区将被反映。 如果要返回到 GMT 时间,您需要 撤消 已应用的时区偏移。

    因此,您需要 减去 ClockSync-getTimeZone()*60才能获得 GMT 时间,而不是添加 ClockSync-getTimeZone()*60。

    此致,

    杰西

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

    很棒的反馈! 这是我对未来读者的实施。

    #include <ti/net/utils/clock_sync.h>
    #include <time.h>
    
    void epoch_init(int16_t timezone) {
      // Make clocksync modify the NWP
      ClockSync_config(CLOCKSYNC_PARAM_UPDATE_NWP, 1);
      ClockSync_setTimeZone(timezone);
    
      // Fun fact:
      // The device gets a time from the compiler during debugging.
      // Therefore, time(NULL) might be correct when developing.
      // It is however essential to sync the clock, when deployed.
    
      // Conversion settings for mktime
      _tz.timezone = -timezone * 60;
      _tz.daylight = 0;
    }
    
    void epoch_setTimeZone(int16_t timezone) {
      // Clocksync has its own built in range protection.
      ClockSync_setTimeZone(timezone);
      _tz.timezone = -ClockSync_getTimeZone() * 60;
    }
    
    uint32_t epoch(void) {
      struct tm local_time;
      ClockSync_get(&local_time);
    
      return mktime(&local_time);
    }