SIM868——通过NTP获取本地时间的方法

版权声明:本文为博主原创文章,未经博主允许不得转载,联系邮箱[email protected] https://blog.csdn.net/w464960660/article/details/83716446

【问题】SIM868可以通过GPS获取UTC时间,再通过将UTC转换为本地时间,方法可参考链接博主 ,但是在室内GPS收不到信号,这时没法获取时间了;

【解决方案】:室内应用场景,可以通过网络授时方法获取本地时间,实际设计首次上电先获取网络时间,再通过AT+CCLK? 读取RTC时间即可。这里亲测了几个可用的NTP服务器:ntp1.aliyun.comntp2.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;
}

猜你喜欢

转载自blog.csdn.net/w464960660/article/details/83716446