From 7fa125e56f1de17c2f6aeb9a410ff02ac4e78e85 Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Thu, 14 Mar 2024 10:44:50 +0800
Subject: [PATCH] Update at24.c to fix address page align bug

---
 project/socketd/sock_client.c |  191 +++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 175 insertions(+), 16 deletions(-)

diff --git a/project/socketd/sock_client.c b/project/socketd/sock_client.c
index c9084cd..3c3f33c 100644
--- a/project/socketd/sock_client.c
+++ b/project/socketd/sock_client.c
@@ -22,35 +22,59 @@
 #include "logger.h"
 #include "ds18b20.h"
 #include "proc.h"
+#include "packet.h"
+#include "socket.h"
+#include "database.h"
 
 #define PROG_VERSION               "v1.0.0"
 #define DAEMON_PIDFILE             "/tmp/.socketd.pid"
 
-static void program_usage(char *progname)
+static void print_usage(char *progname)
 {
-
     printf("Usage: %s [OPTION]...\n", progname);
     printf(" %s is LingYun studio temperature socket client program running on RaspberryPi\n", progname);
 
     printf("\nMandatory arguments to long options are mandatory for short options too:\n");
-    printf(" -d[debug   ]  Running in debug mode\n");
-    printf(" -h[help    ]  Display this help information\n");
-    printf(" -v[version ]  Display the program version\n");
+    printf("-i(ipaddr)    : sepcify server IP address\n");
+    printf("-p(--port)    : sepcify server port.\n");
+    printf("-I(--interval): sepcify report time interval, default 60 seconds\n");
+    printf("-d(--debug)   : running in debug mode\n");
+    printf("-h(--help)    : display this help information\n");
+    printf("-v(--version) : display the program version\n");
 
     printf("\n%s version %s\n", progname, PROG_VERSION);
     return;
 }
 
+int check_sample_time(time_t *last_time, int interval);
+
 int main (int argc, char **argv)
 {
     int                daemon = 1;
-    int                opt;
+    int                rv;
+
     char              *progname=NULL;
-    char              *logfile="client.log";
+    char              *logfile="sock_client.log";
     int                loglevel=LOG_LEVEL_INFO;
     int                logsize=10; /* logfile size max to 10K */
 
-    struct option long_options[] = {
+    char              *serverip = NULL;
+    int                port = 0;
+    int                interval = 60; /* default report termperature every 60 seconds */
+
+    socket_ctx_t         sock;
+    time_t               last_time = 0;
+    int                  sample_flag = 0;
+
+    char                 pack_buf[1024];
+    int                  pack_bytes = 0;
+    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", required_argument, NULL, 'I'},
         {"debug", no_argument, NULL, 'd'},
         {"version", no_argument, NULL, 'v'},
         {"help", no_argument, NULL, 'h'},
@@ -60,28 +84,47 @@
     progname = (char *)basename(argv[0]);
 
     /* Parser the command line parameters */
-    while ((opt = getopt_long(argc, argv, "dvh", long_options, NULL)) != -1)
+    while( (rv=getopt_long(argc, argv, "i:p:I:dvh", opts, NULL)) != -1 )
     {
-        switch (opt)
+        switch (rv)
         {
-            case 'd': /* Set debug running */
+            case 'i': /* set socket server hostname or IP address */
+                serverip=optarg;
+                break;
+
+            case 'p': /* set socket server listen port */
+                port=atoi(optarg);
+                break;
+
+            case 'I': /* set report time interval */
+                interval=atoi(optarg);
+                break;
+
+
+            case 'd': /* set debug running */
                 daemon = 0;
                 logfile="console";
                 loglevel=LOG_LEVEL_DEBUG;
                 break;
 
-            case 'v':  /* Get software version */
+            case 'v':  /* get software version */
                 printf("%s version %s\n", progname, PROG_VERSION);
                 return 0;
 
-            case 'h':  /* Get help information */
-                program_usage(progname);
+            case 'h':  /* get help information */
+                print_usage(progname);
                 return 0;
 
             default:
                 break;
         }
 
+    }
+
+    if( !serverip || !port )
+    {
+        print_usage(argv[0]);
+        return 0;
     }
 
     if( log_open(logfile, loglevel, logsize, THREAD_LOCK_NONE) < 0 )
@@ -95,14 +138,130 @@
     if( check_set_program_running(daemon, DAEMON_PIDFILE) < 0 )
         goto cleanup;
 
+    log_info("program start running.\n");
+
+    if( database_init("sock_client.db") < 0 )
+    {
+        return 2;
+    }
+
+    socket_init(&sock, serverip, port);
+
     while( ! g_signal.stop )
     {
-        msleep(1000);
+        /* +----------------------------------+
+         * |  check and sample temperature    |
+         * +----------------------------------+*/
+
+        sample_flag = 0; /* clear sample flag */
+
+        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 %.3f oC\n", pack_info.temper);
+
+            get_devid(pack_info.devid, DEVID_LEN, 40);
+            get_time(&pack_info.sample_time);
+
+            pack_bytes = pack_proc(&pack_info, pack_buf, sizeof(pack_buf));
+            sample_flag = 1; /* set sample flag */
+        }
+
+        /* +---------------------------------+
+         * |  check and do socket connect    |
+         * +---------------------------------+*/
+
+        /* 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");
+                socket_term(&sock); /* close the soket */
+            }
+        }
+
+        /* +-------------------------------+
+         * |      socket disconnect        |
+         * +-------------------------------+*/
+        if( sock.fd < 0 )
+        {
+            if( sample_flag )
+            {
+                database_push_packet(pack_buf, pack_bytes);
+            }
+
+            continue;
+        }
+
+        /* +-------------------------------+
+         * |      socket connected         |
+         * +-------------------------------+*/
+
+        /*  socket send sample packet */
+        if( sample_flag )
+        {
+            log_debug("socket send sample packet bytes[%d]: %s\n", pack_bytes, pack_buf);
+            if( socket_send(&sock, pack_buf, pack_bytes) < 0 )
+            {
+                log_warn("socket send sample packet failure, save it in database now.\n");
+                database_push_packet(pack_buf, pack_bytes);
+                socket_term(&sock); /* close the soket */
+            }
+        }
+
+        /*  socket send packet in database  */
+        if( !database_pop_packet(pack_buf, sizeof(pack_buf), &pack_bytes) )
+        {
+            log_debug("socket send database packet bytes[%d]: %s\n", pack_bytes, pack_buf);
+            if( socket_send(&sock, pack_buf, pack_bytes) < 0 )
+            {
+                log_error("socket send database packet failure");
+                socket_term(&sock); /* close the soket */
+            }
+            else
+            {
+                log_warn("socket send database packet okay, remove it from database now.\n");
+                database_del_packet();
+            }
+        }
+
+        msleep(50);
     }
 
 cleanup:
-    log_close();
+    socket_term(&sock);
+    database_term();
     unlink(DAEMON_PIDFILE);
+    log_close();
 
     return 0;
 }
+
+int check_sample_time(time_t *last_time, int interval)
+{
+    int                  need = 0; /* no need sample now */
+    time_t               now;
+
+    time(&now);
+
+    if( now >= *last_time+interval )
+    {
+        need = 1; /* need sample now  */
+        *last_time = now;
+    }
+
+    return need;
+}

--
Gitblit v1.9.1