收藏官网首页
查看: 31277|回复: 20

关于SNTP获取网络时间的问题

13

主题

81

帖子

1241

积分

金牌会员

Rank: 6Rank: 6

积分
1241
跳转到指定楼层
楼主
发表于 2017-7-4 17:06:50 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
免费使用STM32、APP自动代码生成工具
请问机智云SDK中是否有获取网络时间的函数,我现在用的是 sntp_get_real_time ,此函数返回的是包含年、月、日、时、分、秒、星期的一串字符,有没有返回单个“时”或“分”的函数?是不是需要自己转换?

7

主题

92

帖子

1587

积分

金牌会员

Rank: 6Rank: 6

积分
1587
沙发
发表于 2017-7-4 21:53:59 | 只看该作者
可以使用gagentGetNTP()函数,选择自己需要的即可。
  1. void gagentGetNTP(_tm *time)
复制代码
  1. typedef struct
  2. {
  3.    unsigned short year;
  4.    unsigned char month;
  5.    unsigned char day;
  6.    unsigned char hour;
  7.    unsigned char minute;
  8.    unsigned char second;
  9.    unsigned int ntp;
  10. }_tm;
复制代码


13

主题

81

帖子

1241

积分

金牌会员

Rank: 6Rank: 6

积分
1241
板凳
 楼主| 发表于 2017-7-5 07:12:41 | 只看该作者
多谢,我试一下,有不懂的再来向你们请教。

2

主题

22

帖子

903

积分

高级会员

Rank: 4

积分
903
地板
发表于 2017-7-8 12:10:02 | 只看该作者

请您帮我修改一下这个时间打印格式,由于初学不懂格式定义方法,请帮忙!
void Timing_control(void)
{
_tm *ptime;        //这个如何正确定义这个时间打印

gagentGetNTP(&ptime);

os_printf("WIFI_NTP : [%02d:%02d] \n",ptime->hour,ptime->minute);

13

主题

81

帖子

1241

积分

金牌会员

Rank: 6Rank: 6

积分
1241
5#
 楼主| 发表于 2017-7-8 15:31:22 | 只看该作者
校园创客福利
把 _tm *ptime;  改为 _tm ptime; 应该就行了

2

主题

22

帖子

903

积分

高级会员

Rank: 4

积分
903
6#
发表于 2017-7-11 09:10:06 | 只看该作者
海底沙,你好,sntp已解决,不但解决您说的地方,还要解决“->"这个符号问题。谢谢!
再请您帮我分析一下flash读写问题。

请问,如何正确设置SoC ESP8266 12F FLASH读写操作,
就是下面这个是机智云自动生成数据结构体,我要求实现(断电记忆)保护,我用下面的读写方法不成功,只要执行数据写入、

程序就被破坏,必须重新烧写ESP8266程序,有几朋友都说是地址有误,可是所有地址都试了,不是破坏程序,就是没有任何结

果反应,请帮忙解决。

/** 用户区设备状态结构体*/
typedef_t struct {
  bool valueLED_OnOff_0;
  bool valueLED_OnOff_1;
  bool valueLED_OnOff_2;
  bool valueLED_OnOff_3;
  bool valueTime_OnOff;
  bool valueCountDown_OnOff;
  uint32_t valueLED_Color;
  uint32_t valueLED_R;
  uint32_t valueLED_G;
  uint32_t valueLED_B;
  int32_t valueMotor_reversal;
  uint32_t valueWeek_Repeat;
  uint32_t valueMotor_is;
  uint32_t valueTime_On_Minute;
  uint32_t valueTime_Off_Minute;
  uint32_t valueCountDown_Minute;
  bool valueInfrared;
  int32_t valueTemperature;
  uint32_t valueHumidity;
  uint32_t valuePower_Consumption;
  uint32_t valuePower_Consumption1;
  bool valueAlert_1;
  bool valueAlert_2;
  bool valueFault_LED;
  bool valueFault_Motor;
  bool valueFault_TemHum;
  bool valueFault_IR;
} dataPoint_t;

/** 用户区当前设备状态结构体*/
extern dataPoint_t currentDataPoint;

ESP8266读写地址测试结果
#define ESP_PARAM_START_SEC 0x3D //设这个地址,只要执行数据写入,程序就被破坏,必须重新烧写ESP8266。
#define ESP_PARAM_START_SEC 0x7D
#define ESP_PARAM_START_SEC 0xFD //设0X7D,0XFD这两个地址,读写操作没有任何结果出现。

#define ESP_PARAM_START_SEC 0x3C //设这个地址,只要执行数据写入,程序就被破坏,必须重新烧写ESP8266。
#define ESP_PARAM_START_SEC 0x7C
#define ESP_PARAM_START_SEC 0xFC //设0X7D,0XFD这两个地址,读写操作没有任何结果出现。

写设备状态结构体数据
system_param_save_with_protect(ESP_PARAM_START_SEC, &currentDataPoint, sizeof(currentDataPoint));

读设备状态结构体数据
system_param_load(ESP_PARAM_START_SEC, 0, &currentDataPoint, sizeof(currentDataPoint));



下面这个是根据上面的结构体,重新自定义结构体,可是只要上电启动初始化执行读数据,程序就被破坏,必须重新烧写

ESP8266 12F。而使用上面的那个结构体只有写操作才破坏程序,这到底是怎么回事,请指教。

/** 用户区设备状态结构体*/
typedef_t struct {
  bool valueTime_OnOff;
  bool valueCountDown_OnOff;
  uint32_t valueLED_Color;
  uint32_t valueLED_R;
  uint32_t valueLED_G;
  uint32_t valueLED_B;
  uint32_t valueMotor_is;
  int32_t valueMotor_reversal;
  uint32_t valueWeek_Repeat;
  uint32_t valueTime_On_Minute;
  uint32_t valueTime_Off_Minute;
  uint32_t valueCountDown_Minute;
} espdataPoint_t;

/** 用户区当前设备状态结构体*/
extern espdataPoint_t esp_flash;

ESP8266读写地址测试结果
#define ESP_PARAM_START_SEC 0x3D //设各个地址都一样,只要启动读操作,程序就被破坏,必须重新烧写ESP8266。
#define ESP_PARAM_START_SEC 0x7D
#define ESP_PARAM_START_SEC 0xFD

#define ESP_PARAM_START_SEC 0x3C
#define ESP_PARAM_START_SEC 0x7C
#define ESP_PARAM_START_SEC 0xFC

写设备状态结构体数据
system_param_save_with_protect(ESP_PARAM_START_SEC, &esp_flash, sizeof(esp_flash));

读设备状态结构体数据
system_param_load(ESP_PARAM_START_SEC, 0, &cesp_flash, sizeof(esp_flash));

点评

设0X7D,0XFD这两个地址应该没错,但读写数据到flash必须是4字节对齐,好象你的数据不是4字节的倍数,可能你写入就失败了,所以就读不到数据了。  详情 回复 发表于 2017-7-12 08:40

13

主题

81

帖子

1241

积分

金牌会员

Rank: 6Rank: 6

积分
1241
7#
 楼主| 发表于 2017-7-12 08:40:42 | 只看该作者
hydyguo 发表于 2017-7-11 09:10
海底沙,你好,sntp已解决,不但解决您说的地方,还要解决“->"这个符号问题。谢谢!
再请您帮我分析一下fl ...

设0X7D,0XFD这两个地址应该没错,但读写数据到flash必须是4字节对齐,好象你的数据不是4字节的倍数,可能你写入就失败了,所以就读不到数据了。

2

主题

22

帖子

903

积分

高级会员

Rank: 4

积分
903
8#
发表于 2017-7-12 09:21:25 | 只看该作者
这个4字节的倍数应该怎么处理,您能给我一个例子吗,谢谢你!

点评

我也是个新手,没用过这,你试一下改成这样行不行: system_param_save_with_protect(ESP_PARAM_START_SEC,(uint32 *)esp_flash, sizeof(esp_flash));  详情 回复 发表于 2017-7-12 09:45

13

主题

81

帖子

1241

积分

金牌会员

Rank: 6Rank: 6

积分
1241
9#
 楼主| 发表于 2017-7-12 09:45:01 | 只看该作者
hydyguo 发表于 2017-7-12 09:21
这个4字节的倍数应该怎么处理,您能给我一个例子吗,谢谢你!

我也是个新手,没用过这,你试一下改成这样行不行:
system_param_save_with_protect(ESP_PARAM_START_SEC,(uint32 *)esp_flash, sizeof(esp_flash));

2

主题

22

帖子

903

积分

高级会员

Rank: 4

积分
903
10#
发表于 2017-7-12 10:31:43 | 只看该作者
注册成为机智云开发者,手机加虚拟设备快速开发
还是没有结果,看来机智云大神都躲庙里修仙去了,让我们两个新手在这里瞎折腾了。谢谢你!

点评

不知你解决没有?今天有空试了一下。 如果 system_param_save_with_protect 放在有 ICACHE_FLASH_ATTR 的回调函数里,就出现重启现象, [attachimg]12671[/attachimg] 如果没有 ICACHE_FLASH_ATTR 的回调函数里,  详情 回复 发表于 2017-7-15 17:34

13

主题

81

帖子

1241

积分

金牌会员

Rank: 6Rank: 6

积分
1241
11#
 楼主| 发表于 2017-7-15 17:34:52 | 只看该作者
本帖最后由 海底沙 于 2017-7-15 17:36 编辑
hydyguo 发表于 2017-7-12 10:31
还是没有结果,看来机智云大神都躲庙里修仙去了,让我们两个新手在这里瞎折腾了。谢谢你! ...

不知你解决没有?今天有空试了一下。
如果 system_param_save_with_protect 放在有 ICACHE_FLASH_ATTR 的回调函数里,就出现重启现象,



如果没有 ICACHE_FLASH_ATTR 的回调函数里,就可行。不知为什么,有大神解答吗?

2

主题

22

帖子

903

积分

高级会员

Rank: 4

积分
903
12#
发表于 2017-7-17 12:25:23 | 只看该作者
你好!这两天在画PCB板,没有看消息,我的问题还没解决,前几天问了机智云工程师,第一回复怀疑程序烧写地址不对,我将烧写地址载图给他看,说没错,要我把编译器里的Makefile里面的SPI_SIZE_MAP?=4改为6,还是没有结果,我又将出错时的串口打印数据载图给他看,至今没有回应。前天又给安信可工程师联系,今天给我回复意思还是地址问题,给我sdk文档查看,还是不知错在那。一个星期前我给乐鑫技术支持联系至今没有任何回复,看样这是死症了。
      另外我看你测试的方法,把数据写入代码放到这个void ICACHE_FLASH_ATTR userTimerFunc(void)函数里可能不对,这样会造成不停在写入。
      我是放在这个函数里int8_t ICACHE_FLASH_ATTR gizwitsEventProcess(、、、)只有数据发生变化时才执行写入。读数据我是放在main里面void ICACHE_FLASH_ATTR user_init(void)初始化时读取数据。如有好结果请分享我,谢谢你!

点评

我的测试只是随便找的2个地方放读写函数,实际不是这样做的。 你测试一下:把 int8_t ICACHE_FLASH_ATTR gizwitsEventProcess(、、、)改为 int8_t gizwitsEventProcess(、、、)试一下。  详情 回复 发表于 2017-7-17 16:04

52

主题

66

帖子

528

积分

版主

Rank: 7Rank: 7Rank: 7

积分
528
13#
发表于 2017-7-17 12:37:55 | 只看该作者
在定时器函数中不要处理耗时较长的任务,如果要处理的话,发消息出来,在应用层中处理。
flash是慢速器件,最好不要在定时器中进行读写

2

主题

22

帖子

903

积分

高级会员

Rank: 4

积分
903
14#
发表于 2017-7-17 14:01:58 | 只看该作者
请问,版主,我这个结构体数据读写代码格式到底有没有错,为什么就没有结果反应。

/** 用户区设备状态结构体*/
typedef_t struct {
  bool valueLED_OnOff_0;
  bool valueLED_OnOff_1;
                ......       
  uint32_t valuePower_Consumption;
  uint32_t valuePower_Consumption1;
} dataPoint_t;

/** 用户区当前设备状态结构体*/
extern dataPoint_t  currentDataPoint;

ESP8266读写地址测试结果
#define ESP_PARAM_START_SEC 0x3D //设这个地址,只要执行数据写入,程序就被破坏,必须重新烧写ESP8266。
#define ESP_PARAM_START_SEC 0x7D
#define ESP_PARAM_START_SEC 0xFD //设0X7D,0XFD这两个地址,读写操作没有任何结果出现。

#define ESP_PARAM_START_SEC 0x3C //设这个地址,只要执行数据写入,程序就被破坏,必须重新烧写ESP8266。
#define ESP_PARAM_START_SEC 0x7C
#define ESP_PARAM_START_SEC 0xFC //设0X7C,0XFC这两个地址,读写操作没有任何结果出现。

写设备状态结构体数据
system_param_save_with_protect(ESP_PARAM_START_SEC, &currentDataPoint, sizeof(currentDataPoint));

读设备状态结构体数据
system_param_load(ESP_PARAM_START_SEC, 0, &currentDataPoint, sizeof(currentDataPoint));

13

主题

81

帖子

1241

积分

金牌会员

Rank: 6Rank: 6

积分
1241
15#
 楼主| 发表于 2017-7-17 16:04:43 | 只看该作者
校园创客福利
本帖最后由 海底沙 于 2017-7-17 16:17 编辑
hydyguo 发表于 2017-7-17 12:25
你好!这两天在画PCB板,没有看消息,我的问题还没解决,前几天问了机智云工程师,第一回复怀疑程序烧写地 ...

我的测试只是随便找的2个地方放读写函数,实际不是这样做的。

我也是放在这个函数里 int8_t ICACHE_FLASH_ATTR gizwitsEventProcess 数据一改变写flash就出现重启


你测试一下:把  int8_t ICACHE_FLASH_ATTR gizwitsEventProcess(、、、)改为 int8_t   gizwitsEventProcess(、、、)试一下。

2

主题

22

帖子

903

积分

高级会员

Rank: 4

积分
903
16#
发表于 2017-7-17 16:50:19 | 只看该作者
不行,不加这个“ICACHE_FLASH_ATTR”在我这系统里编译通不过,我用的是安信可ESP8266 IDE,

点评

因为我也要保存当前状态,所以今晚又测试了一下,既然可以了,真是莫明其妙,不知问题出在哪?请高手解答一下。 下面代码给你参考一下: gizwits_product.c /** 用户区当前设备状态结构体*/ extern dataPoint_t cur  详情 回复 发表于 2017-7-17 20:04

13

主题

81

帖子

1241

积分

金牌会员

Rank: 6Rank: 6

积分
1241
17#
 楼主| 发表于 2017-7-17 20:04:32 | 只看该作者
hydyguo 发表于 2017-7-17 16:50
不行,不加这个“ICACHE_FLASH_ATTR”在我这系统里编译通不过,我用的是安信可ESP8266 IDE, ...

因为我也要保存当前状态,所以今晚又测试了一下,既然可以了,真是莫明其妙,不知问题出在哪?请高手解答一下。
下面代码给你参考一下:

gizwits_product.c
/** 用户区当前设备状态结构体*/
extern dataPoint_t currentDataPoint;
   
[url=]/**@name[/url] Gizwits 用户API接口
* @{
*/
/**
* @brief 事件处理接口
* 说明:
* 1.用户可以对WiFi模组状态的变化进行自定义的处理
* 2.用户可以在该函数内添加数据点事件处理逻辑,如调用相关硬件外设的操作接口
* @param[in] info : 事件队列
* @param[in] data : 协议数据
* @param[in] len : 协议数据长度
* @return NULL
* @ref gizwits_protocol.h
*/
int8_t ICACHE_FLASH_ATTR gizwitsEventProcess(eventInfo_t *info, uint8_t *data, uint32_t len)
{
  uint8_t i = 0;
  dataPoint_t *dataPointPtr = (dataPoint_t *)data;
  moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)data;
  if((NULL == info) || (NULL == data))
  {
    return -1;
  }
  for(i=0; i<info->num; i++)
  {
    switch(info->event)
    {
      case EVENT_SOCKET_ONOFF_A:
        currentDataPoint.valuesocket_OnOff_a = dataPointPtr->valuesocket_OnOff_a;
        os_printf("Evt: EVENT_SOCKET_ONOFF_A %d \n", currentDataPoint.valuesocket_OnOff_a);
        if(0x01 == currentDataPoint.valuesocket_OnOff_a)
        {
        //user handle
     
        }
        break;
      case EVENT_TIMING_START:
        currentDataPoint.valuetiming_start = dataPointPtr->valuetiming_start;
        os_printf("Evt: EVENT_TIMING_START %d \n", currentDataPoint.valuetiming_start);
        if(0x01 == currentDataPoint.valuetiming_start)
        {
           //user handle

         }
        break;
      case EVENT_TIMED_TASK:
        currentDataPoint.valuetimed_task = dataPointPtr->valuetimed_task;
        os_printf("Evt: EVENT_TIMED_TASK %d\n", currentDataPoint.valuetimed_task);
        switch(currentDataPoint.valuetimed_task)
        {
          case TIMED_TASK_VALUE0:
            //user handle

        break;
      case EVENT_TIMING_HOUR:
        currentDataPoint.valuetiming_hour = dataPointPtr->valuetiming_hour;
        os_printf("Evt:EVENT_TIMING_HOUR %d\n",currentDataPoint.valuetiming_hour);
        //user handle
     
   }
        break;
      case EVENT_TIMING_MINUTE:
        currentDataPoint.valuetiming_minute = dataPointPtr->valuetiming_minute;
        os_printf("Evt:EVENT_TIMING_MINUTE %d\n",currentDataPoint.valuetiming_minute);
        //user handle
     
   }
        break;

      case WIFI_SOFTAP:
        break;
      case WIFI_AIRLINK:
        break;
      case WIFI_STATION:
        break;
      case WIFI_CON_ROUTER:
        break;
      case WIFI_DISCON_ROUTER:
        break;
      case WIFI_CON_M2M:
        break;
      case WIFI_DISCON_M2M:
        break;
      case WIFI_RSSI:
        os_printf("RSSI %d\n", wifiData->rssi);
        break;
      case TRANSPARENT_DATA:
        os_printf("TRANSPARENT_DATA \n");
        //user handle , Fetch data from [data] , size is [len]
        break;
      default:
        break;
    }
  }
  system_os_post(USER_TASK_PRIO_0, SIG_UPGRADE_DATA, 0);
  
  system_param_save_with_protect(0x7D, (uint32 *)&currentDataPoint, sizeof(currentDataPoint));
  
os_printf("### save timing ### \n");  
  
  return 0;


读函数:(临时位置)
user_main.c

/** 用户区当前设备状态结构体*/
dataPoint_t currentDataPoint;
dataPoint_t currentDataPoint_my;   //新定义一个结构体保存从flash读出的数据

void ICACHE_FLASH_ATTR userTimerFunc(void)
{

system_param_load(0x7D, 0, (uint32 *)&currentDataPoint_my,sizeof(currentDataPoint_my));
os_printf("### timing : %d \n",currentDataPoint_my.valuetiming_minute);
        
    system_os_post(USER_TASK_PRIO_0, SIG_UPGRADE_DATA, 0);
}

2

主题

22

帖子

903

积分

高级会员

Rank: 4

积分
903
18#
发表于 2017-7-18 10:48:12 | 只看该作者
如果你那边能读写,采用你的方法和我前面试的一样,不知怎么回事,只要是自定义结构体,一执行读数据程序就被破坏,必须重新烧写,
刚才我做了几个试验,在0X7D,0XFDl加上参数,就是0X7D*4*4096,读数据没有反应,执行写数据时串口一直显示如下图。如果用0X7C,0XFC加这个参数,程序直接破坏、死file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\539384885\QQ\WinTemp\RichOle\2_8{4]9_OZSKQ(_L@L`J5SL.png机。上一种方法还能复位正常,这个问题真是可笑。就怎么两行代码真是别死人,三大运营商没有一家给个说法。

点评

不知你的代码是否很大,我昨晚把add改到第三个1k的最后,直接把地址写成 0x2FD ,测试也通过。  详情 回复 发表于 2017-7-18 11:27

13

主题

81

帖子

1241

积分

金牌会员

Rank: 6Rank: 6

积分
1241
19#
 楼主| 发表于 2017-7-18 11:27:28 | 只看该作者
本帖最后由 海底沙 于 2017-7-18 11:36 编辑
hydyguo 发表于 2017-7-18 10:48
如果你那边能读写,采用你的方法和我前面试的一样,不知怎么回事,只要是自定义结构体,一执行读数据程序就 ...

不知你的代码是否很大,我昨晚把add改到第三个1k的最后,直接把地址写成 0x27D ,测试也通过。

不要“在0X7D,0XFDl加上参数,就是0X7D*4*4096”,直接写地址  0x27D

另外,你在  &currentDataPoint  前面加上 (uint32 *) 没有?

2

主题

22

帖子

903

积分

高级会员

Rank: 4

积分
903
20#
发表于 2017-7-19 14:58:48 | 只看该作者
校园创客福利
你好!您昨天中午发的信息,今天上午才看到,昨天一直没有信息提示,不知为什么。
      同样的方法在你那边能用,我这里就不行,我想请您帮忙,把我在机智云生成的一套架构只加入这两个读写代码,请在你那边测试一下,看是什么情况。不过,要在APP和SoC中加入你的APP ID和Product Key才能通信,不知现在可不可以,以前我测试过还行,现在机智云不一段升级,只要不是注册用户自己生成的数据点,都很难使用。要不给你的QQ发到我消息里,帮我试试看,谢谢你!

点评

不好意思,在外面出差。 你发给我,我星期六回去帮你测试一下,我的QQ1758054922  详情 回复 发表于 2017-7-20 22:03
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表