Przeglądaj źródła

完善ntp接口

guohui 1 rok temu
rodzic
commit
dcf959e4d0
7 zmienionych plików z 156 dodań i 45 usunięć
  1. 7 2
      pro/src/app.c
  2. 1 1
      pro/src/appweb_handle.c
  3. 35 13
      pro/src/common.c
  4. 6 1
      pro/src/common.h
  5. 69 27
      pro/src/ntpclient.c
  6. 1 1
      pro/src/ntpclient.h
  7. 37 0
      pro/src/sqlite_handle.c

+ 7 - 2
pro/src/app.c

@@ -1792,17 +1792,22 @@ static void* ntp_thread(void *arg)
     time1 = time(NULL);
     while(h->quit==0) {
         if(pm->mode>0) {
+            if(ntp_sync_flag) {
+                destroyNTPClient(pc); pc = NULL;
+            }
+
             if(pc==NULL) {
                 pc = createNTPClient(pm->ntpaddress, pm->port);
             }
 
             if(pc) {
-                if(ntp_sync_flag || (time2==0) || ((time2-time1)>=NTP_INTERVAL_TIME)) {
+                if((time2==0) || ((time2-time1)>=NTP_INTERVAL_TIME) || ntp_sync_flag) {
                     if (getCurrentTimeFromNTP(pc, &ntp_time)==0) {
+                        log_d("getCurrentTimeFromNTP ok!");
                         time_t host_time = time(NULL);
                         if (abs(host_time - ntp_time) >= 5) {
                             struct tm *ptm = localtime(&ntp_time);
-                            set_local_timeandzone(ptm, pm->tzone);
+                            set_time(ptm);
                         }
                         time2 = time1;
                         ntp_sync_flag = 0;

+ 1 - 1
pro/src/appweb_handle.c

@@ -4095,7 +4095,7 @@ static void serviceManagement(void *conn)
             memcpy(tempstr, &p[0], 2);
             tm_new.tm_sec = atoi(tempstr);
             t = mktime(&tm_new);
-            set_local_timeandzone(&tm_new, _globalNTPManager.tzone);
+            set_time_zone(&tm_new, _globalNTPManager.tzone);
             ntp_sync_flag = 1;
         }
 

+ 35 - 13
pro/src/common.c

@@ -272,13 +272,23 @@ void get_disk_occupy(char ** reused)
     return;
 }
 
-int set_local_timeandzone(struct tm* t, int zone)
+
+int set_time(struct tm* time)
 {
-    char buf[128];
-    struct timeval tv;
+    char buf[256];
 
-    switch(zone)
-    {
+    sprintf(buf, "date -s \"%04d-%02d-%02d %02d:%02d:%02d\" && hwclock -w -f /dev/rtc0 ", time->tm_year + 1900, time->tm_mon + 1, 
+                                                  time->tm_mday, time->tm_hour, time->tm_min, time->tm_sec);
+    log_i("set_time: %s", buf);
+    return system(buf);
+}
+
+
+int set_zone(int zone)
+{
+    char buf[256];
+
+    switch(zone) {
         case -11:
             sprintf(buf, "ln -sf /usr/share/zoneinfo/Pacific/Midway /etc/localtime");
             break;
@@ -351,17 +361,29 @@ int set_local_timeandzone(struct tm* t, int zone)
         case 12:
             sprintf(buf, "ln -sf /usr/share/zoneinfo/Pacific/Fiji /etc/localtime");
             break;
+        default:
+            return -1;
     }
-    system(buf);
+    log_i("set_zone: %s", buf);
+    return system(buf);
+}
 
-    //time_t now=time(NULL)+zone*3600;
-    //struct tm* ptm = localtime(&t);
-    //memset(buf, 0, sizeof(buf));
-    sprintf(buf, "date -s \"%04d-%02d-%02d %02d:%02d:%02d\" && hwclock -w -f /dev/rtc0 ", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
-    log_i("%s",buf);
-    system(buf);
 
-    return 0;
+int set_time_zone(struct tm* time, int zone)
+{
+    int r;
+
+    r = set_zone(zone);
+    if(r) {
+        log_e("___ set_zone failed\n");
+    }
+
+    r = set_time(time);
+    if(r) {
+        log_e("___ set_time failed\n");
+    }
+
+    return r;
 }
 
 char* getUserNamebyToken(char* Token)

+ 6 - 1
pro/src/common.h

@@ -1075,7 +1075,12 @@ int getTotalMemorySize(unsigned int* totalSize);
 char* getLocalIpAddress(char* dev);
 char* get_mac_address(const char *iface_name) ;
 void get_disk_occupy(char ** reused);
-int set_local_timeandzone(struct tm* t, int zone);
+
+int set_zone(int zone);
+int set_time(struct tm* time);
+int set_time_zone(struct tm* time, int zone);
+
+
 char* getUserNamebyToken(char* Token);
 int is_process_running(const char *process_name);
 bool CheckLoginStatus(char* Token);

+ 69 - 27
pro/src/ntpclient.c

@@ -1,5 +1,6 @@
-
+#include <netdb.h>
 #include "ntpclient.h"
+
   
 #define NTP_PORT 123  
 #define NTP_PACKET_SIZE 48  
@@ -8,7 +9,7 @@
 static int sendNTPRequest(NTPClient* client) {  
     client->ntp_packet[0] = 0x1B; // LI = 0, VN = 3, Mode = 3 (client)  
     ssize_t sentBytes = sendto(client->sockfd, client->ntp_packet, NTP_PACKET_SIZE, 0,  
-                               (struct sockaddr *)&client->server_addr, sizeof(client->server_addr));  
+                               &client->server_addr, sizeof(client->server_addr));  
     if (sentBytes < 0) {  
         perror("sendto failed");  
         return -1;  
@@ -20,7 +21,7 @@ static int sendNTPRequest(NTPClient* client) {
 static int receiveNTPResponse(NTPClient* client) {  
     socklen_t len = sizeof(client->server_addr);  
     ssize_t receivedBytes = recvfrom(client->sockfd, client->ntp_packet, NTP_PACKET_SIZE, 0,  
-                              (struct sockaddr *)&client->server_addr, &len);  
+                              &client->server_addr, &len);  
     if (receivedBytes < 0) {  
         perror("recvfrom failed");  
         return -1;  
@@ -35,8 +36,31 @@ static time_t parseNTPResponse(const char* ntp_packet) {
     double frac = frac_sec * 2.0e-32;  
     return (time_t)(sec_since_1900 - 2208988800U) + (time_t)frac;  
 }  
-  #include<netdb.h>
-// 创建NTP客户端实例  
+
+static int get_addr(const char* ip, int port, struct sockaddr *saddr)
+{
+    char *p=NULL;
+    struct sockaddr_in *p4=(struct sockaddr_in*)saddr;
+    struct sockaddr_in6 *p6=(struct sockaddr_in6*)saddr;
+
+    p4->sin_family = AF_INET;
+    p4->sin_port = port;
+    p = (char*)inet_pton(AF_INET, ip, &p4->sin_addr);
+    if(p) {
+        printf("____ ipv4, %d\n", AF_INET);
+        return 0;
+    }
+
+    p6->sin6_family = AF_INET6;
+    p6->sin6_port = port;
+    p = (char*)inet_pton(AF_INET, ip, &p6->sin6_addr);
+    if(p) {
+        printf("____ ipv6, %d\n", AF_INET6);
+        return 0;
+    }
+
+    return -1;
+}
 NTPClient* createNTPClient(const char* ntp_server, int port) {  
     NTPClient* client = (NTPClient*)malloc(sizeof(NTPClient));  
     if (!client) {  
@@ -44,44 +68,62 @@ NTPClient* createNTPClient(const char* ntp_server, int port) {
         return NULL;  
     } 
 
-    int fd=-1;
+    int r,fd=-1;
     char tmp[32];
     struct addrinfo hints;
     struct addrinfo *res=NULL,*rp;
     char temp[INET6_ADDRSTRLEN];
+    struct sockaddr_in *p4=NULL;
+    struct sockaddr_in6 *p6=NULL;
 
     memset(&hints, 0, sizeof hints);
     hints.ai_family   = AF_UNSPEC;
     hints.ai_socktype = SOCK_DGRAM;
-    hints.ai_protocol = IPPROTO_UDP;
+    hints.ai_protocol = 0;//IPPROTO_UDP;
 
-    sprintf(tmp, "%d", port);
-    if(getaddrinfo(ntp_server, tmp, &hints, &res) || (res==NULL)){
-        printf(" getaddrinfo %s:%d failed\n", ntp_server, port);  
-        free(client); return NULL;
-    }
-
-    for(rp=res; rp; rp=rp->ai_next){
-        fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
+    r = get_addr(ntp_server, port, &client->server_addr);
+    if(r==0) {
+        fd = socket(client->server_addr.sa_family, SOCK_DGRAM, 0);
         if (fd>=0) {
-            break;
+            client->sockfd = fd;
         }
-        if(rp->ai_family==AF_INET) {
-            struct sockaddr_in *p4=(struct sockaddr_in*)rp->ai_addr;
-            inet_ntop(AF_INET, p4, temp, INET6_ADDRSTRLEN);
-            printf("socket to %s:%d failed\n", temp, p4->sin_port);
+        printf("socket to %s:%d %s, %d\n", ntp_server, port, (fd>=0)?"ok!":"failed!", client->server_addr.sa_family);
+    }
+    else {
+        sprintf(tmp, "%d", port);
+        if(getaddrinfo(ntp_server, tmp, &hints, &res) || (res==NULL)){
+            printf(" getaddrinfo from %s:%d failed\n", ntp_server, port);  
+            free(client); return NULL;
         }
-        else {
-            struct sockaddr_in6 *p6=(struct sockaddr_in6*)rp->ai_addr;
-            inet_ntop(AF_INET6, p6, temp, INET6_ADDRSTRLEN);
-            printf("socket to %s:%d failed\n", temp, p6->sin6_port);
+
+        for(rp=res; rp; rp=rp->ai_next){
+            if(rp->ai_family==AF_INET) {
+                p4=(struct sockaddr_in*)rp->ai_addr;
+                inet_ntop(AF_INET, p4, temp, INET6_ADDRSTRLEN);
+                printf("socket to %s:%d ", temp, p4->sin_port);
+            }
+            else {
+                p6=(struct sockaddr_in6*)rp->ai_addr;
+                inet_ntop(AF_INET6, p6, temp, INET6_ADDRSTRLEN);
+                printf("socket to %s:%d ", temp, p6->sin6_port);
+            }
+
+            fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
+            if (fd>=0) {
+                client->sockfd = fd;
+                client->server_addr = *rp->ai_addr;
+                printf("ok!\n");
+                break;
+            }
+            printf("failed!\n");
         }
+        freeaddrinfo(res);
     }
-    freeaddrinfo(res);
+
     if(fd<0) {
         free(client); return NULL;
     }
-    client->sockfd = fd;
+    printf("___createNTPClient ok!\n");
   
     return client;  
 }  
@@ -98,7 +140,7 @@ void destroyNTPClient(NTPClient* client) {
 int getCurrentTimeFromNTP(NTPClient* client, time_t* current_time) {  
     if (sendNTPRequest(client) < 0) {  
         return -1;  
-    }  
+    }
   
     if (receiveNTPResponse(client) < 0) {  
         return -1;  

+ 1 - 1
pro/src/ntpclient.h

@@ -16,7 +16,7 @@
 // 定义NTP客户端类  
 typedef struct NTPClient_s {  
     int sockfd;  
-    struct sockaddr_in server_addr;  
+    struct sockaddr server_addr;  
     char ntp_packet[NTP_PACKET_SIZE];  
 } NTPClient;  
     

+ 37 - 0
pro/src/sqlite_handle.c

@@ -4658,5 +4658,42 @@ const char *tabName[TAB_ID_MAX]={
 };
 
 
+void* dev_sql_export(int tab_id, void *data, uint32_t time_s, uint32_t time_e, int *cnt)
+{
+    char temp[1024];
+    
+    switch(tab_id) {
+        case TAB_ID_LOG_INFO:
+        {
+            //
+        }
+        break;
+
+        case TAB_ID_ALARM_INFO:
+        {
+            //
+        }
+        break;
+
+        case TAB_ID_POWER_INFO:
+        {
+            //
+        }
+        break;
+
+        case TAB_ID_POWER3_INFO:
+        {
+            //
+        }
+        break;
+
+        default:
+        return NULL;
+    }
+
+    return 0;
+}
+
+