1. 程式人生 > >SIM800C通過NTP同步本地時間

SIM800C通過NTP同步本地時間

時間倉促,大概記錄一下,以後詳細貼上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指標索引資料內容即可