From 665e1b5cb16d058f478867d0e8a4f8632e2cb02e Mon Sep 17 00:00:00 2001
From: GuoWenxue <“guowenxue@gmail.com”>
Date: Fri, 29 Apr 2022 10:29:19 +0800
Subject: [PATCH] upate packet time to struct tm

---
 apue/project_socket/main/client_main.c |  242 ++++++++++++++++++++--------------------
 apue/project_socket/src/packet.c       |   92 ++++++++------
 apue/project_socket/src/packet.h       |   14 +-
 3 files changed, 179 insertions(+), 169 deletions(-)

diff --git a/apue/project_socket/main/client_main.c b/apue/project_socket/main/client_main.c
index 80da3ec..3637109 100644
--- a/apue/project_socket/main/client_main.c
+++ b/apue/project_socket/main/client_main.c
@@ -20,86 +20,86 @@
 
 void print_usage(char *progname)
 {
-	printf("%s usage: \n", progname);
-	printf("-i(--ipaddr)  : sepcify server IP address\n");
-	printf("-p(--port)    : sepcify server port.\n");
-	printf("-I(--interval): sepcify report interval time\n");
-	printf("-s(--sn)      : sepcify device serial number\n");
-	printf("-d(--debug)   : run as debug mode\n");
-	printf("-h(--Help)    : print this help information.\n");
+    printf("%s usage: \n", progname);
+    printf("-i(--ipaddr)  : sepcify server IP address\n");
+    printf("-p(--port)    : sepcify server port.\n");
+    printf("-I(--interval): sepcify report interval time\n");
+    printf("-s(--sn)      : sepcify device serial number\n");
+    printf("-d(--debug)   : run as debug mode\n");
+    printf("-h(--Help)    : print this help information.\n");
 
-	return ;
+    return ;
 }
 
 static int check_sample_time(time_t *last_time, int interval);
 
 int main(int argc, char **argv)
 {
-	int                  rv = -1;
-	int                  port;
-	char                *serverip;
-	int                  interval = 30; /* default report termperature every 30 seconds */
-	int                  sn = 1;        /* default serial number for device ID */
-	int                  debug = 0;     /* running in debug mode or not */
-	int                  loglevel = LOG_LEVEL_INFO;
-	char                *logfile="client.log";
+    int                  rv = -1;
+    int                  port;
+    char                *serverip;
+    int                  interval = 30; /* default report termperature every 30 seconds */
+    int                  sn = 1;        /* default serial number for device ID */
+    int                  debug = 0;     /* running in debug mode or not */
+    int                  loglevel = LOG_LEVEL_INFO;
+    char                *logfile="client.log";
 
-	socket_ctx_t         sock;
-	time_t               last_time = 0;
-	int                  sample_flag = 0;
+    socket_ctx_t         sock;
+    time_t               last_time = 0;
+    int                  sample_flag = 0;
 
-	char                 pack_buf[1024];
-	int                  pack_bytes;
-	pack_info_t          pack_info;
-	pack_proc_t          pack_proc = packet_segmented_pack; /* use string packet */
+    char                 pack_buf[1024];
+    int                  pack_bytes;
+    pack_info_t          pack_info;
+    pack_proc_t          pack_proc = packet_segmented_pack; /* use string packet */
 
-  	struct option        opts[] = {
-		{"ipaddr", required_argument, NULL, 'i'},
-		{"port", required_argument, NULL, 'p'},
-		{"interval", no_argument, NULL, 'I'},
-		{"debug", no_argument, NULL, 'd'},
-		{"sn", required_argument, NULL, 's'},
-		{"help", no_argument, NULL, 'h'},
-		{NULL, 0, NULL, 0}
-	};
+    struct option        opts[] = {
+        {"ipaddr", required_argument, NULL, 'i'},
+        {"port", required_argument, NULL, 'p'},
+        {"interval", no_argument, NULL, 'I'},
+        {"debug", no_argument, NULL, 'd'},
+        {"sn", required_argument, NULL, 's'},
+        {"help", no_argument, NULL, 'h'},
+        {NULL, 0, NULL, 0}
+    };
 
-	while( (rv=getopt_long(argc, argv, "i:p:dI:s:h", opts, NULL)) != -1 )
-	{
-		switch(rv)
-		{
-			case 'i':
-				serverip=optarg;
-				break;
+    while( (rv=getopt_long(argc, argv, "i:p:dI:s:h", opts, NULL)) != -1 )
+    {
+        switch(rv)
+        {
+            case 'i':
+                serverip=optarg;
+                break;
 
-			case 'p':
-				port=atoi(optarg);
-				break;
+            case 'p':
+                port=atoi(optarg);
+                break;
 
-			case 'd':
-				debug=1;
+            case 'd':
+                debug=1;
                 logfile="stdout";
                 loglevel=LOG_LEVEL_DEBUG;
-				break;
+                break;
 
-			case 'I':
-				interval=atoi(optarg);
-				break;
+            case 'I':
+                interval=atoi(optarg);
+                break;
 
-			case 's':
-				sn=atoi(optarg);
-				break;
+            case 's':
+                sn=atoi(optarg);
+                break;
 
-			case 'h':
-				print_usage(argv[0]);
-				return 0;
-		}
+            case 'h':
+                print_usage(argv[0]);
+                return 0;
+        }
 
-	}
+    }
 
-	if( !serverip || !port )
-	{
-		print_usage(argv[0]);
-		return 0;
+    if( !serverip || !port )
+    {
+        print_usage(argv[0]);
+        return 0;
     }
 
     /* set logger to $logfile with level info */
@@ -109,69 +109,69 @@
         return 1;
     }
 
-	if( !debug )
-	{
-		log_info("set program running on background now.\n");
-		daemon(1, 1); /* don't change work path, don't close opened file descriptor */
-	}
+    if( !debug )
+    {
+        log_info("set program running on background now.\n");
+        daemon(1, 1); /* don't change work path, don't close opened file descriptor */
+    }
 
-	install_default_signal();
+    install_default_signal();
 
-	log_info("program start running.\n");
+    log_info("program start running.\n");
 
-	if( database_init("client.db") < 0 )
-	{
-		return 2;
-	}
+    if( database_init("client.db") < 0 )
+    {
+        return 2;
+    }
 
-	socket_init(&sock, serverip, port);
+    socket_init(&sock, serverip, port);
 
-	while( !g_signal.stop )
-	{
-		/* +----------------------------------+
-		 * |  check and sample temperature    |
-		 * +----------------------------------+*/
+    while( !g_signal.stop )
+    {
+        /* +----------------------------------+
+         * |  check and sample temperature    |
+         * +----------------------------------+*/
 
-		sample_flag = 0; /* clear sample flag */
+        sample_flag = 0; /* clear sample flag */
 
-		if( check_sample_time(&last_time, interval) )
-		{
-			log_debug("start DS18B20 sample termperature\n");
+        if( check_sample_time(&last_time, interval) )
+        {
+            log_debug("start DS18B20 sample termperature\n");
 
-			if( (rv=ds18b20_get_temperature(&pack_info.temper)) < 0 )
-			{
-				log_error("DS18B20 sample temperature failure, rv=%d\n", rv);
-				continue;
-			}
-			log_info("DS18B20 sample termperature %d.%d oC\n",
-					temper_integer(pack_info.temper), temper_fract(pack_info.temper));
+            if( (rv=ds18b20_get_temperature(&pack_info.temper)) < 0 )
+            {
+                log_error("DS18B20 sample temperature failure, rv=%d\n", rv);
+                continue;
+            }
+            log_info("DS18B20 sample termperature %d.%d oC\n",
+                    temper_integer(pack_info.temper), temper_fract(pack_info.temper));
 
-			get_devid(pack_info.devid, DEVID_LEN, sn);
-			get_time(pack_info.strtime, TIME_LEN);
+            get_devid(pack_info.devid, DEVID_LEN, sn);
+            get_time(&pack_info.sample_time);
 
-			pack_bytes = pack_proc(&pack_info, pack_buf, sizeof(pack_buf));
-			sample_flag = 1; /* set sample flag */
-		}
+            pack_bytes = pack_proc(&pack_info, pack_buf, sizeof(pack_buf));
+            sample_flag = 1; /* set sample flag */
+        }
 
-		/* +---------------------------------+
-		 * |  check and do socket connect    |
-		 * +---------------------------------+*/
+        /* +---------------------------------+
+         * |  check and do socket connect    |
+         * +---------------------------------+*/
 
-		/* start connect to server if not connected */
-		if( sock.fd < 0 )
-		{
-			socket_connect(&sock);
-		}
+        /* start connect to server if not connected */
+        if( sock.fd < 0 )
+        {
+            socket_connect(&sock);
+        }
 
-		/* check socket connected or not  */
-		if( sock_check_connect(sock.fd) < 0 )
-		{
-			if( sock.fd > 0 )
-			{
-				log_error("socket got disconnected, terminate it and reconnect now.\n");
+        /* check socket connected or not  */
+        if( sock_check_connect(sock.fd) < 0 )
+        {
+            if( sock.fd > 0 )
+            {
+                log_error("socket got disconnected, terminate it and reconnect now.\n");
                 socket_term(&sock); /* close the soket */
-			}
-		}
+            }
+        }
 
         /* +-------------------------------+
          * |      socket disconnect        |
@@ -221,24 +221,24 @@
         msleep(100);
     }
 
-	socket_term(&sock);
-	database_term();
+    socket_term(&sock);
+    database_term();
 
-	return 0;
+    return 0;
 }
 
 int check_sample_time(time_t *last_time, int interval)
 {
-	int                  need = 0; /* no need sample now */
-	time_t               now;
+    int                  need = 0; /* no need sample now */
+    time_t               now;
 
-	time(&now);
+    time(&now);
 
-	if( now >= *last_time+interval )
-	{
-		need = 1; /* need sample now  */
-		*last_time = now;
-	}
+    if( now >= *last_time+interval )
+    {
+        need = 1; /* need sample now  */
+        *last_time = now;
+    }
 
-	return need;
+    return need;
 }
diff --git a/apue/project_socket/src/packet.c b/apue/project_socket/src/packet.c
index a904596..9bb680f 100644
--- a/apue/project_socket/src/packet.c
+++ b/apue/project_socket/src/packet.c
@@ -21,66 +21,76 @@
 
 int get_devid(char *devid, int size, int sn)
 {
-	if( !devid || size<DEVID_LEN )
-	{
-		log_error("Invalid input arugments\n");
-		return -1;
-	}
+    if( !devid || size<DEVID_LEN )
+    {
+        log_error("Invalid input arugments\n");
+        return -1;
+    }
 
-	memset(devid, 0, size);
-	snprintf(devid, size, "rpi#%04d", sn);
-	return 0;
+    memset(devid, 0, size);
+    snprintf(devid, size, "rpi#%04d", sn);
+    return 0;
 }
 
-int get_time(char *strtime, int size)
+int get_time(struct tm *ptm)
 {
+    if( !ptm )
+    {
+        log_error("Invalid input arugments\n");
+        return -1;
+    }
+
+
     time_t now = time(NULL);
-    struct tm *tnow = localtime(&now);
+    localtime_r(&now, ptm);
 
-	if( !strtime || size<TIME_LEN )
-	{
-		log_error("Invalid input arugments\n");
-		return -1;
-	}
-
-	snprintf(strtime, size, "%04d-%02d-%2d %02d:%02d:%02d",
-			tnow->tm_year+1900, tnow->tm_mon+1, tnow->tm_mday,
-			tnow->tm_hour, tnow->tm_min, tnow->tm_sec);
-
-	return 0;
+    return 0;
 }
 
 int packet_segmented_pack(pack_info_t *pack_info, char *pack_buf, int size)
 {
-	if( !pack_info || !pack_buf || size<=0 )
-	{
-		log_error("Invalid input arguments\n");
-		return -1;
-	}
+    char              strtime[TIME_LEN] = {'\0'};
+    struct tm        *ptm;
+
+    if( !pack_info || !pack_buf || size<=0 )
+    {
+        log_error("Invalid input arguments\n");
+        return -1;
+    }
+
+    ptm = &pack_info->sample_time;
+    snprintf(strtime, sizeof(strtime), "%04d-%02d-%2d %02d:%02d:%02d",
+            ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday,
+            ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
+
 
     memset(pack_buf, 0, size);
+    snprintf(pack_buf, size, "%s|%s|%d.%d", pack_info->devid, strtime,
+            temper_integer(pack_info->temper), temper_fract(pack_info->temper));
 
-	snprintf(pack_buf, size, "%s|%s|%d.%d", pack_info->devid, pack_info->strtime,
-			temper_integer(pack_info->temper), temper_fract(pack_info->temper));
-
-	return strlen(pack_buf);
+    return strlen(pack_buf);
 }
 
 int packet_json_pack(pack_info_t *pack_info, char *pack_buf, int size)
 {
-	if( !pack_info || !pack_buf || size<=0 )
-	{
-		log_error("Invalid input arguments\n");
-		return -1;
-	}
+    char              strtime[TIME_LEN] = {'\0'};
+    struct tm        *ptm;
+
+    if( !pack_info || !pack_buf || size<=0 )
+    {
+        log_error("Invalid input arguments\n");
+        return -1;
+    }
+
+    ptm = &pack_info->sample_time;
+    snprintf(strtime, sizeof(strtime), "%04d-%02d-%2d %02d:%02d:%02d",
+            ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday,
+            ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
 
     memset(pack_buf, 0, size);
+    snprintf(pack_buf, size, "{\"devid\":\"%s\", \"time\":\"%s\",\"temperature\":\"%d.%d\"}",
+            pack_info->devid, strtime, temper_integer(pack_info->temper), temper_fract(pack_info->temper));
 
-	snprintf(pack_buf, size, "{\"devid\":\"%s\", \"time\":\"%s\",\"temperature\":\"%d.%d\"}",
-            pack_info->devid, pack_info->strtime,
-            temper_integer(pack_info->temper), temper_fract(pack_info->temper));
-
-	return strlen(pack_buf);
+    return strlen(pack_buf);
 }
-
 
diff --git a/apue/project_socket/src/packet.h b/apue/project_socket/src/packet.h
index e70147d..d1b176e 100644
--- a/apue/project_socket/src/packet.h
+++ b/apue/project_socket/src/packet.h
@@ -16,15 +16,16 @@
 #define  _PACKET_H_
 
 #include <stdint.h>
+#include <time.h>
 
 #define DEVID_LEN          16
 #define TIME_LEN           32
 
 typedef struct pack_info_s 
 {
-	char          devid[DEVID_LEN];  /* device ID  */
-	char          strtime[TIME_LEN]; /* sample time  */
-	uint16_t      temper;            /* sample temperature */
+    char          devid[DEVID_LEN];  /* device ID  */
+    struct tm     sample_time;       /* sample time  */
+    uint16_t      temper;            /* sample temperature */
 } pack_info_t; 
 
 /* packet function pointer type */
@@ -39,13 +40,12 @@
  */
 extern int get_devid(char *devid, int size, int sn);
 
-/*  description: get current system in format "YYYY-MM-DD HH:MM:SS"
+/*  description: get current system in struct tm
  *   input args:
- *               $strtime:  time string output buf
- *               $size   :  time string output buffer size
+ *               $sample_time:  sample time in struct tm
  * return value: <0: failure   0:ok
  */
-extern int get_time(char *strtime, int size);
+extern int get_time(struct tm *sample_time);
 
 /*  description: package a string packet in format "devid|time|temper"
  *   input args:

--
Gitblit v1.9.1