SIM800C通过NTP同步本地时间

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ysgjiangsu/article/details/80310295

时间仓促,大概记录一下,以后详细贴上C程序

 ----------------------------------简单查询--------------------------------
AT+CSQ                          //查看信号质量
    +CSQ: 25,0
    OK
AT+CREG?                        //查看GSM是否注册成功
    +CREG: 0,1
    OK
AT+CGREG?                       //查看GPRS是否注册成功
    +CGREG: 0,1
    OK
AT+CGATT?                       //查看GPRS附着状态
    +CGATT: 1
    OK
 ----------------------------------以下是重点-----------------------------
AT+SAPBR=3,1,"CONTYPE","GPRS"   //设置网络参数
    OK
AT+SAPBR=3,1,"APN","UNIWAP"     //设置APN
    OK
AT+SAPBR=1,1                    //激活网络场景
    OK
AT+SAPBR=2,1                    //获取分配IP地址
    +SAPBR: 1,1,"10.97.109.220"
    OK
AT+CNTP="ntp1.aliyun.com",32    //设置NTP服务器地址,时区
    OK
AT+CNTP                         //开启网络同步
    OK
    +CNTP: 1
AT+CCLK?                        //查询本地时间
    +CCLK: "18/05/14,13:00:33+00"
    OK

题外话,原本选的是交大NTP,发现没连上。。。。。。换成阿里云的就OK了,给阿里点个赞
另外,北京时区是东八区,我觉得应该是AT+CNTP="ntp1.aliyun.com",8,可实际相差6小时,补加24后,得到正确时间,即AT+CNTP="ntp1.aliyun.com",32,这里比较迷,路过的大哥指点一下,或者以后我明白了,再补充
C代码

extern u8 ABT_SyncTime(void)
{
        if(sim900a_send_cmd((u8 *)"AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"",(u8 *)"OK",100))   
            return 1;

      if(sim900a_send_cmd((u8 *)"AT+SAPBR=3,1,\"APN\",\"UNIWAP\"",(u8 *)"OK",500))  
            return 2;

        sim900a_send_cmd((u8 *)"AT+SAPBR=1,1",(u8 *)"OK",200);

        if(sim900a_send_cmd((u8 *)"AT+SAPBR=2,1",(u8 *)"OK",600))   
            return 4;

        if(sim900a_send_cmd((u8 *)"AT+CNTP=\"ntp1.aliyun.com\",32",(u8 *)"OK",200)) 
            return 5;       

        if(sim900a_send_cmd((u8 *)"AT+CNTP",(u8 *)"CNTP: 1",2000))  
            return 6;       

        return 0;
}

extern void ABT_GetLocalTime(void)
{
    char *timePtr = NULL;
/*  
    if(sim900a_send_cmd((u8 *)"AT+CCLK?",(u8 *)"CCLK:",2000))
        timePtr = strstr(USART2_RX_BUF,(const char *)"CCLK:");
*/
    sim900a_send_cmd((u8 *)"AT+CCLK?",(u8 *)"CCLK:",2000);
    timePtr = strstr((const char*)USART2_RX_BUF,(const char*)"CCLK:");

    G_LocalTime.ALT_year    = 2000 + 10*(timePtr[7] - '0') + timePtr[8] - '0';
    G_LocalTime.ALT_month   = 10*(timePtr[10] - '0') + timePtr[11] - '0';
    G_LocalTime.ALT_day     = 10*(timePtr[13] - '0') + timePtr[14] - '0';
    G_LocalTime.ALT_hour    = 10*(timePtr[16] - '0') + timePtr[17] - '0';
    G_LocalTime.ALT_minute  = 10*(timePtr[19] - '0') + timePtr[20] - '0';
    G_LocalTime.ALT_second  = 10*(timePtr[22] - '0') + timePtr[23] - '0';
}

注释部分也比较迷,真的没道理啊,试了不下于20次,还是不行。时间紧,就暂时用注释后的代码了。
结构体定义部分

struct ABT_LocalTime_TypeDef{
    u16 ALT_year;
    u8  ALT_month;
    u8  ALT_day;
    u8  ALT_hour;
    u8  ALT_minute;
    u8  ALT_second;
};

RX2_BUF收到的数据
这里写图片描述
图1

timePtr指针指向RX2_BUF的子串位置
这里写图片描述
图2

USART2_RX_BUF : 0X20000448,
timePtr:0X20000454,
相差12,

在图1可见,CCLK:起始位置正是12,以后通过timePtr指针索引数据内容即可

猜你喜欢

转载自blog.csdn.net/ysgjiangsu/article/details/80310295