From 68826376ee5f47783c644c6604f4411ec747cd7e Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Fri, 14 Nov 2025 23:52:16 +0800
Subject: [PATCH] Add UDP DNS client source code
---
project/2.socketd/socket_client.c | 263 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 263 insertions(+), 0 deletions(-)
diff --git a/project/2.socketd/socket_client.c b/project/2.socketd/socket_client.c
new file mode 100644
index 0000000..3830c28
--- /dev/null
+++ b/project/2.socketd/socket_client.c
@@ -0,0 +1,263 @@
+/*********************************************************************************
+ * Copyright: (C) 2019 LingYun IoT System Studio
+ * All rights reserved.
+ *
+ * Filename: socket_client.c
+ * Description: This is a socket client program to report RPi's temperature
+ *
+ * Version: 1.0.0(29/01/19)
+ * Author: Guo Wenxue <guowenxue@gmail.com>
+ * ChangeLog: 1, Release initial version on "29/01/19 15:34:41"
+ *
+ ********************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <time.h>
+#include <getopt.h>
+#include <libgen.h>
+#include <string.h>
+#include <errno.h>
+
+#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/.socketc.pid"
+
+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("-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 build on %s %s\n", progname, PROG_VERSION, __DATE__, __TIME__);
+ return;
+}
+
+int check_sample_time(time_t *last_time, int interval);
+
+int main (int argc, char **argv)
+{
+ char *progname=NULL;
+ int daemon = 1;
+ int rv;
+
+ char *logfile="sock_client.log";
+ int loglevel=LOG_LEVEL_INFO;
+ int logsize=10; /* logfile size max to 10K */
+
+ socket_t sock;
+ char *serverip = NULL;
+ int port = 0;
+ int interval = 60; /* default report termperature every 60 seconds */
+
+ 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 segmented string packet */
+ //pack_proc_t pack_proc = packet_json_pack; /* use JSON string packet */
+ pack_proc_t pack_proc = packet_tlv_pack; /* use TLV(Tag Length Value) 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'},
+ {NULL, 0, NULL, 0}
+ };
+
+ progname = (char *)basename(argv[0]);
+
+ /* Parser the command line parameters */
+ while( (rv=getopt_long(argc, argv, "i:p:I:dvh", opts, NULL)) != -1 )
+ {
+ switch (rv)
+ {
+ 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 */
+ printf("%s version %s\n", progname, PROG_VERSION);
+ return 0;
+
+ case 'h': /* get help information */
+ print_usage(progname);
+ return 0;
+
+ default:
+ break;
+ }
+
+ }
+
+ if( !serverip || !port )
+ {
+ print_usage(argv[0]);
+ return 0;
+ }
+
+ /* open logger system */
+ if( log_open(logfile, loglevel, logsize, THREAD_LOCK_NONE) < 0 )
+ {
+ fprintf(stderr, "Initial log system failed\n");
+ return 1;
+ }
+
+ /* install signal proc handler */
+ install_default_signal();
+
+ /* check program already running or not, if already running then exit, or set running as daemon */
+ if( check_set_program_running(daemon, DAEMON_PIDFILE) < 0 )
+ goto cleanup;
+
+ log_info("socket client start running.\n");
+
+ if( database_init("sock_client.db") < 0 )
+ {
+ return 2;
+ }
+
+ socket_init(&sock, serverip, port);
+
+ while( ! g_signal.stop )
+ {
+ /* +----------------------------------+
+ * | 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 %.2f oC\n", pack_info.temper);
+
+ get_devid(pack_info.devid, sizeof(pack_info.devid), 88);
+ get_time(&pack_info.sample_time);
+
+ pack_bytes = pack_proc(&pack_info, (uint8_t *)pack_buf, sizeof(pack_buf));
+ log_dump(LOG_LEVEL_DEBUG, NULL, pack_buf, pack_bytes);
+
+ sample_flag = 1; /* set sample flag */
+ }
+
+ /* +---------------------------------+
+ * | check and do socket connect |
+ * +---------------------------------+*/
+
+ /* start connect to server if not connected */
+ if( !socket_connected(&sock) )
+ {
+ socket_connect(&sock);
+ }
+
+ /* +-------------------------------+
+ * | socket disconnect |
+ * +-------------------------------+*/
+ if( !socket_connected(&sock) )
+ {
+ 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);
+ continue;
+ }
+ }
+
+ /* 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");
+ continue;
+ }
+ else
+ {
+ log_warn("socket send database packet okay, remove it from database now.\n");
+ database_del_packet();
+ }
+ }
+
+ msleep(5);
+ }
+
+cleanup:
+ 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( difftime(now, *last_time)>interval )
+ {
+ need = 1; /* need sample now */
+ *last_time = now;
+ }
+
+ return need;
+}
--
Gitblit v1.9.1