为什么使用NB-IoT模块返回的时间不准?

该问题来自社区帖: https://bbs.csdn.net/topics/615570636.为符合问答规范, 该问题经过ChatGPT优化
请问NB-IoT模块返回的时间不准的原因是什么,如何解决?需要保留以下图片链接:

时区是+32?

  • 这篇博客: 华为IoT平台NB编解码插件开发详细教程【上篇】中的 一、环境搭建 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 开发编解码插件使用的IDE是eclipse,语言是Java。本文尽量以简单的方式告诉你如何将华为提供的编解码样例修改为适合自己的编解码插件。即使你没有什么Java基础,只要懂得编程逻辑就好。跟着一起来吧!

  • 以下回答由chatgpt基于相关博客总结生成:

    针对NB-IoT模块返回的时间不准确,可以有以下几个方案:

    1. 确认模块是否有实时钟且时间同步正常。如果模块没有实时钟,则需要在程序中加入时间同步的功能,一般可以通过与网络服务器进行通信获取时间,或通过GPS等定位模块获取时间信息。

    2. 检查程序中时间处理的方法是否正确,比如是否考虑时区差异、夏令时等因素。

    3. 调用模块提供的AT指令获取时间信息并进行修正,比如使用AT+CCLK指令获取模块当前时间,然后和本地时间进行对比,如果有偏差则进行修正。

    4. 在传输数据时加上时间戳,并在服务器端进行时间校准。这种方法需要确保服务器时间准确,还需要将时间戳与设备返回的时间进行校准,以获取准确的时间信息。

    示例代码:

    // 增加时间同步的功能
    #include <Time.h>
    #include <NTPClient.h>
    #include <WiFiUdp.h>
    
    WiFiUDP ntpUDP;
    NTPClient timeClient(ntpUDP, "pool.ntp.org", 3600, 60000);
    
    void setup() {
      // 连接WIFI
      ...
      // 启动时间同步
      timeClient.begin();
    }
    
    void loop() {
      // 更新时间
      timeClient.update();
      // 获取当前时间
      time_t t = now();
      // 进行时间处理
      ...
    }
    
    // 使用AT指令获取模块时间
    #include <SoftwareSerial.h>
    
    SoftwareSerial NBSerial(RX_PIN, TX_PIN); // RX_PIN为接收端口,TX_PIN为发送端口
    
    void setup() {
      // 初始化串口
      ...
      // 打开调试信息
      NBSerial.print("AT+CGMI\r\n");
      delay(500);
      while(NBSerial.available()){
        Serial.write(NBSerial.read());
      }
      NBSerial.print("AT+CCLK?\r\n");
      delay(500);
      while(NBSerial.available()){
        Serial.write(NBSerial.read());
      }
    }
    
    void loop() {
      ...
    }
    
    // 在数据中添加时间戳
    #include <Time.h>
    
    void sendData() {
      time_t t = now();
      String data = "data = " + String(t) + ", value = " + String(sensorValue);
      // 发送数据
      ...
    }
    
    void processData(String data) {
      // 解析时间戳
      int pos1 = data.indexOf("data = ");
      int pos2 = data.indexOf(", value = ");
      String timeStr = data.substring(pos1 + 7, pos2);
      time_t t = atol(timeStr.c_str());
      // 处理数据
      ...
    }