海底沙 发表于 2017-7-4 17:06:50

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

请问机智云SDK中是否有获取网络时间的函数,我现在用的是 sntp_get_real_time ,此函数返回的是包含年、月、日、时、分、秒、星期的一串字符,有没有返回单个“时”或“分”的函数?是不是需要自己转换?

iDea 发表于 2017-7-4 21:53:59

可以使用gagentGetNTP()函数,选择自己需要的即可。void gagentGetNTP(_tm *time)typedef struct
{
   unsigned short year;
   unsigned char month;
   unsigned char day;
   unsigned char hour;
   unsigned char minute;
   unsigned char second;
   unsigned int ntp;
}_tm;

海底沙 发表于 2017-7-5 07:12:41

多谢,我试一下,有不懂的再来向你们请教。

hydyguo 发表于 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);

海底沙 发表于 2017-7-8 15:31:22

把 _tm *ptime;  改为 _tm ptime; 应该就行了

hydyguo 发表于 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));

海底沙 发表于 2017-7-12 08:40:42

hydyguo 发表于 2017-7-11 09:10
海底沙,你好,sntp已解决,不但解决您说的地方,还要解决“->"这个符号问题。谢谢!
再请您帮我分析一下fl ...

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

hydyguo 发表于 2017-7-12 09:21:25

这个4字节的倍数应该怎么处理,您能给我一个例子吗,谢谢你!

海底沙 发表于 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));

hydyguo 发表于 2017-7-12 10:31:43

还是没有结果,看来机智云大神都躲庙里修仙去了,让我们两个新手在这里瞎折腾了。谢谢你!

海底沙 发表于 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 的回调函数里,就可行。不知为什么,有大神解答吗?

hydyguo 发表于 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)初始化时读取数据。如有好结果请分享我,谢谢你!

will 发表于 2017-7-17 12:37:55

在定时器函数中不要处理耗时较长的任务,如果要处理的话,发消息出来,在应用层中处理。
flash是慢速器件,最好不要在定时器中进行读写

hydyguo 发表于 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_tcurrentDataPoint;

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));

海底沙 发表于 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(、、、)试一下。

hydyguo 发表于 2017-7-17 16:50:19

不行,不加这个“ICACHE_FLASH_ATTR”在我这系统里编译通不过,我用的是安信可ESP8266 IDE,

海底沙 发表于 2017-7-17 20:04:32

hydyguo 发表于 2017-7-17 16:50
不行,不加这个“ICACHE_FLASH_ATTR”在我这系统里编译通不过,我用的是安信可ESP8266 IDE, ...

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

gizwits_product.c
/** 用户区当前设备状态结构体*/
extern dataPoint_t currentDataPoint;
   
/**@name Gizwits 用户API接口
* @{
*/
/**
* @brief 事件处理接口
* 说明:
* 1.用户可以对WiFi模组状态的变化进行自定义的处理
* 2.用户可以在该函数内添加数据点事件处理逻辑,如调用相关硬件外设的操作接口
* @param info : 事件队列
* @param data : 协议数据
* @param 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 , size is
      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);
}

hydyguo 发表于 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机。上一种方法还能复位正常,这个问题真是可笑。就怎么两行代码真是别死人,三大运营商没有一家给个说法。

海底沙 发表于 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 *) 没有?

hydyguo 发表于 2017-7-19 14:58:48

你好!您昨天中午发的信息,今天上午才看到,昨天一直没有信息提示,不知为什么。
      同样的方法在你那边能用,我这里就不行,我想请您帮忙,把我在机智云生成的一套架构只加入这两个读写代码,请在你那边测试一下,看是什么情况。不过,要在APP和SoC中加入你的APP ID和Product Key才能通信,不知现在可不可以,以前我测试过还行,现在机智云不一段升级,只要不是注册用户自己生成的数据点,都很难使用。要不给你的QQ发到我消息里,帮我试试看,谢谢你!
页: [1] 2
查看完整版本: 关于SNTP获取网络时间的问题