版权声明:本文为博主原创文章,未经博主允许不得转载,联系邮箱[email protected] https://blog.csdn.net/w464960660/article/details/83716446
【问题】SIM868可以通过GPS获取UTC时间,再通过将UTC转换为本地时间,方法可参考链接博主 ,但是在室内GPS收不到信号,这时没法获取时间了;
【解决方案】:室内应用场景,可以通过网络授时方法获取本地时间,实际设计首次上电先获取网络时间,再通过AT+CCLK? 读取RTC时间即可。这里亲测了几个可用的NTP服务器:ntp1.aliyun.com、ntp2.aliyun.com、210.72.145.44(国家授时服务中心)。操作AT指令如下:
【讨论】:
1、SIM868 的VRTC PIN不单独加后备电源,是不是也能工作?手册中没有介绍~
2、SIM868_Send_Cmd((u8 *)“AT+CNTP=“ntp1.aliyun.com”,32”,(u8 *)“OK”,200),这个指令后面按理说应该是8(中国横跨5个区,时间统一按照北京东8区处理),而不是32(另一位博主 江东风又起 那借鉴的,感谢!),写8的话测试时间慢了6h,网上没查到更多信息,路过的兄弟明白的请赐教,感谢!
ABT_GetLocalTime((u8 *)LocalTime); //获取本地时间
LocalTime[19]='\0'; //共19个字符,末尾加结束符
//NTP获取网络时间设置
u8 NTP_SyncTime(void)
{
if(SIM868_Send_Cmd((u8 *)"AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"",(u8 *)"OK",100)) //设置网络参数
return 1;
if(SIM868_Send_Cmd((u8 *)"AT+SAPBR=3,1,\"APN\",\"UNIWAP\"",(u8 *)"OK",500)) //设置APN
return 2;
if(SIM868_Send_Cmd((u8 *)"AT+SAPBR=1,1",(u8 *)"OK",200)) //激活网络场景
return 3;
if(SIM868_Send_Cmd((u8 *)"AT+SAPBR=2,1",(u8 *)"OK",600)) //获取分配IP地址
return 4;
if(SIM868_Send_Cmd((u8 *)"AT+CNTP=\"ntp1.aliyun.com\",32",(u8 *)"OK",200)) //设置NTP服务器地址,时区
return 5;
if(SIM868_Send_Cmd((u8 *)"AT+CNTP",(u8 *)"CNTP: 1",2000)) //开启网络同步
return 6;
return 0;
}
//获取本地时间
u8 ABT_GetLocalTime(u8 *LocalTime)
{
char *timePtr,*p2 = NULL;
u8 sta;
if(!SIM868_Send_Cmd((u8 *)"AT+CCLK?",(u8 *)"OK",2000))
{
timePtr = strstr((const char*)USART2_RX_BUF,(const char*)"CCLK:"); //重定位至起始位置
sprintf((char*)LocalTime,"20%s",&timePtr[7]); //本地时间,19个字符
sta=0; //获取有效时间
}
else
{
sta=1; //获取无效时间
}
return sta;
}