From 5e9d03d507aad324a803eb8795e0eed6fb671761 Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Mon, 10 Jul 2023 15:24:52 +0800 Subject: [PATCH] Merge branch 'master' of http://master.iot-yun.club:8088/r/raspberrypi --- 3rdparty/arm/libevent/build.sh | 69 apue/project_socket/makefile | 16 apue/project_socket/src/util_time.h | 186 ++ 3rdparty/x86/mosquitto/build.sh | 99 + 3rdparty/x86/appweb/web.tar.gz | 0 apue/project_socket/libs/cjson/build.sh | 42 apue/project_socket/src/makefile | 29 3rdparty/arm/cjson/build.sh | 66 3rdparty/x86/qt/hello/qml.qrc | 6 apue/project_socket/src/util_proc.c | 433 ++++ 3rdparty/x86/cjson/build.sh | 83 3rdparty/x86/qt/hello/main.cpp | 12 apue/1.File_IO/ds18b20.c | 74 apue/project_socket/src/util_proc.h | 65 modules/c/relay.c | 34 3rdparty/x86/build.sh | 77 3rdparty/x86/qt/patch/qt-everywhere-opensource-src-5.6.3.patch | 11 apue/project_socket/src/sqlite_blob.c | 266 ++ apue/project_socket/do.sh | 4 3rdparty/build.sh | 28 3rdparty/x86/appweb/build.sh | 93 3rdparty/arm/mosquitto/build.sh | 70 apue/project_socket/src/sqlite_blob.h | 60 apue/project_socket/src/list.h | 723 ++++++++ apue/project_socket/src/logger.h | 52 modules/c/gpiod.c | 5 apue/project_socket/src/logger.c | 165 + apue/project_socket/src/ds18b20.c | 113 + apue/project_socket/main/makefile | 20 apue/project_socket/src/socket.h | 100 + apue/project_socket/src/socket.c | 515 +++++ modules/c/led.c | 84 3rdparty/arm/build.sh | 45 apue/project_socket/src/ds18b20.h | 31 modules/c/sht20.c | 13 apue/project_socket/libs/sqlite/build.sh | 44 3rdparty/x86/openssl/build.sh | 104 + 3rdparty/arm/libgpiod/build.sh | 65 3rdparty/arm/paho.mqtt/build.sh | 66 3rdparty/x86/qt/hello/MainForm.ui.qml | 18 modules/c/ds18b20.c | 14 modules/c/makefile | 4 apue/project_socket/main/server_main.c | 278 +++ modules/c/tsl2561.c | 150 + 3rdparty/arm/ppp/build.sh | 70 apue/project_socket/src/packet.h | 70 /dev/null | 36 apue/project_socket/main/client_main.c | 244 ++ apue/project_socket/src/packet.c | 96 + apue/project_socket/libs/makefile | 10 3rdparty/x86/qt/build.sh | 231 ++ modules/c/pin.txt | 27 3rdparty/x86/qt/hello/build.sh | 22 3rdparty/x86/qt/hello/main.qml | 78 tools/setup_systools.sh | 71 55 files changed, 5,186 insertions(+), 201 deletions(-) diff --git a/3rdpart/appweb/appweb-3.4.2-0-src.tgz b/3rdpart/appweb/appweb-3.4.2-0-src.tgz deleted file mode 100644 index 11f7caf..0000000 --- a/3rdpart/appweb/appweb-3.4.2-0-src.tgz +++ /dev/null Binary files differ diff --git a/3rdpart/appweb/bootstrap-3.3.7-dist.zip b/3rdpart/appweb/bootstrap-3.3.7-dist.zip deleted file mode 100644 index 6fbb95e..0000000 --- a/3rdpart/appweb/bootstrap-3.3.7-dist.zip +++ /dev/null Binary files differ diff --git a/3rdpart/appweb/php-5.4.10.tar.bz2 b/3rdpart/appweb/php-5.4.10.tar.bz2 deleted file mode 100644 index 4dbf54e..0000000 --- a/3rdpart/appweb/php-5.4.10.tar.bz2 +++ /dev/null Binary files differ diff --git a/3rdpart/busybox/build.sh b/3rdpart/busybox/build.sh deleted file mode 100755 index 5de3353..0000000 --- a/3rdpart/busybox/build.sh +++ /dev/null @@ -1,109 +0,0 @@ -#!/bin/bash - -#+-------------------------------------------------------------------------------------------- -#|Description: This shell script used download and compile busybox for ARM -#| Author: GuoWenxue <guowenxue@gmail.com> -#| ChangeLog: -#| 1, Initialize 1.0.0 on 2011.04.12 -#+-------------------------------------------------------------------------------------------- - -PRJ_PATH=`pwd` -PREFIX_PATH=`pwd`/ - -if [ -z $CROSSTOOL ] ; then - CROSSTOOL=/opt/rpi/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -fi - -function msg_banner() -{ - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" -} - -function check_result() -{ - if [ $? != 0 ] ; then - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" - exit ; - fi -} - -function export_cross() -{ - # export cross toolchain - export CC=${CROSSTOOL}gcc - export AS=${CROSSTOOL}as - export AR=${CROSSTOOL}ar - export LD=${CROSSTOOL}ld - export NM=${CROSSTOOL}nm - export RANLIB=${CROSSTOOL}ranlib - export OBJDUMP=${CROSSTOOL}objdump - export STRIP=${CROSSTOOL}strip - - # export cross configure - export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux " - - # Clear LDFLAGS and CFLAGS - export LDFLAGS= - export CFLAGS= -} - - -function compile_busybox() -{ - IMG_NAME=busybox - SRC_NAME=busybox-1.27.1 - PACK_SUFIX=tar.bz2 - PATCH_FILE=${PRJ_PATH}/patch/${SRC_NAME}.patch - - if [ -f ${PREFIX_PATH}/${IMG_NAME} ] ; then - return 0; - fi - - msg_banner "Start cross compile $SRC_NAME " - - if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then - wget http://www.busybox.net/downloads/${SRC_NAME}.${PACK_SUFIX} - check_result "ERROR: download ${SRC_NAME} failure" - fi - - tar -xjf ${SRC_NAME}.${PACK_SUFIX} - cd ${SRC_NAME} - - if [ -s $PATCH_FILE ]; then - patch -p1 < $PATCH_FILE - fi - - cp `dirname ${PATCH_FILE}`/busybox.config .config - - set -x - #Modify the cross config in the configure file - sed -i -e "s|^CONFIG_CROSS_COMPILER_PREFIX=.*|CONFIG_CROSS_COMPILER_PREFIX=\"$CROSSTOOL\"|g" .config - - #Modify the install path in the configure file - sed -i -e "s|^CONFIG_PREFIX=.*|CONFIG_PREFIX=\"$INST_PATH\"|g" .config - set +x - - make - check_result "ERROR: compile ${SRC_NAME} failure" - - #install busybox - ${STRIP} ${IMG_NAME} - cp ${IMG_NAME} .. - - cd - -} - - -export_cross - -compile_busybox - - diff --git a/3rdpart/busybox/patch/busybox.config b/3rdpart/busybox/patch/busybox.config deleted file mode 100644 index 46a64ed..0000000 --- a/3rdpart/busybox/patch/busybox.config +++ /dev/null @@ -1,1138 +0,0 @@ -# -# Automatically generated make config: don't edit -# Busybox version: 1.27.1 -# Wed Nov 8 20:59:05 2017 -# -CONFIG_HAVE_DOT_CONFIG=y - -# -# Busybox Settings -# -# CONFIG_DESKTOP is not set -# CONFIG_EXTRA_COMPAT is not set -CONFIG_INCLUDE_SUSv2=y -# CONFIG_USE_PORTABLE_CODE is not set -CONFIG_SHOW_USAGE=y -CONFIG_FEATURE_VERBOSE_USAGE=y -CONFIG_FEATURE_COMPRESS_USAGE=y -CONFIG_BUSYBOX=y -CONFIG_FEATURE_INSTALLER=y -# CONFIG_INSTALL_NO_USR is not set -# CONFIG_PAM is not set -CONFIG_LONG_OPTS=y -CONFIG_FEATURE_DEVPTS=y -# CONFIG_FEATURE_CLEAN_UP is not set -CONFIG_FEATURE_UTMP=y -CONFIG_FEATURE_WTMP=y -CONFIG_FEATURE_PIDFILE=y -CONFIG_PID_FILE_PATH="/var/run" -CONFIG_FEATURE_SUID=y -CONFIG_FEATURE_SUID_CONFIG=y -CONFIG_FEATURE_SUID_CONFIG_QUIET=y -# CONFIG_SELINUX is not set -# CONFIG_FEATURE_PREFER_APPLETS is not set -CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" -CONFIG_FEATURE_SYSLOG=y -# CONFIG_FEATURE_HAVE_RPC is not set -CONFIG_PLATFORM_LINUX=y - -# -# Build Options -# -CONFIG_STATIC=y -# CONFIG_PIE is not set -# CONFIG_NOMMU is not set -# CONFIG_BUILD_LIBBUSYBOX is not set -# CONFIG_FEATURE_INDIVIDUAL is not set -# CONFIG_FEATURE_SHARED_BUSYBOX is not set -CONFIG_LFS=y -CONFIG_CROSS_COMPILER_PREFIX="/opt/xtools/arm920t/bin/arm-linux-" -CONFIG_SYSROOT="" -CONFIG_EXTRA_CFLAGS="" -CONFIG_EXTRA_LDFLAGS="" -CONFIG_EXTRA_LDLIBS="" - -# -# Installation Options ("make install" behavior) -# -CONFIG_INSTALL_APPLET_SYMLINKS=y -# CONFIG_INSTALL_APPLET_HARDLINKS is not set -# CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set -# CONFIG_INSTALL_APPLET_DONT is not set -# CONFIG_INSTALL_SH_APPLET_SYMLINK is not set -# CONFIG_INSTALL_SH_APPLET_HARDLINK is not set -# CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set -CONFIG_PREFIX="/home/guowenxue/gitee/fl2440/3rdparty/busybox/../../linux/rootfs/" - -# -# Debugging Options -# -# CONFIG_DEBUG is not set -# CONFIG_DEBUG_PESSIMIZE is not set -# CONFIG_DEBUG_SANITIZE is not set -# CONFIG_UNIT_TEST is not set -# CONFIG_WERROR is not set -CONFIG_NO_DEBUG_LIB=y -# CONFIG_DMALLOC is not set -# CONFIG_EFENCE is not set - -# -# Busybox Library Tuning -# -# CONFIG_FEATURE_USE_BSS_TAIL is not set -CONFIG_FEATURE_RTMINMAX=y -CONFIG_FEATURE_BUFFERS_USE_MALLOC=y -# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set -# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set -CONFIG_PASSWORD_MINLEN=6 -CONFIG_MD5_SMALL=1 -CONFIG_SHA3_SMALL=1 -# CONFIG_FEATURE_FAST_TOP is not set -# CONFIG_FEATURE_ETC_NETWORKS is not set -CONFIG_FEATURE_EDITING=y -CONFIG_FEATURE_EDITING_MAX_LEN=1024 -# CONFIG_FEATURE_EDITING_VI is not set -CONFIG_FEATURE_EDITING_HISTORY=255 -CONFIG_FEATURE_EDITING_SAVEHISTORY=y -# CONFIG_FEATURE_EDITING_SAVE_ON_EXIT is not set -CONFIG_FEATURE_REVERSE_SEARCH=y -CONFIG_FEATURE_TAB_COMPLETION=y -CONFIG_FEATURE_USERNAME_COMPLETION=y -CONFIG_FEATURE_EDITING_FANCY_PROMPT=y -# CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set -# CONFIG_LOCALE_SUPPORT is not set -CONFIG_UNICODE_SUPPORT=y -# CONFIG_UNICODE_USING_LOCALE is not set -# CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set -CONFIG_SUBST_WCHAR=63 -CONFIG_LAST_SUPPORTED_WCHAR=767 -# CONFIG_UNICODE_COMBINING_WCHARS is not set -# CONFIG_UNICODE_WIDE_WCHARS is not set -# CONFIG_UNICODE_BIDI_SUPPORT is not set -# CONFIG_UNICODE_NEUTRAL_TABLE is not set -# CONFIG_UNICODE_PRESERVE_BROKEN is not set -CONFIG_FEATURE_NON_POSIX_CP=y -# CONFIG_FEATURE_VERBOSE_CP_MESSAGE is not set -CONFIG_FEATURE_USE_SENDFILE=y -CONFIG_FEATURE_COPYBUF_KB=4 -CONFIG_FEATURE_SKIP_ROOTFS=y -CONFIG_MONOTONIC_SYSCALL=y -CONFIG_IOCTL_HEX2STR_ERROR=y -CONFIG_FEATURE_HWIB=y - -# -# Applets -# - -# -# Archival Utilities -# -CONFIG_FEATURE_SEAMLESS_XZ=y -CONFIG_FEATURE_SEAMLESS_LZMA=y -CONFIG_FEATURE_SEAMLESS_BZ2=y -CONFIG_FEATURE_SEAMLESS_GZ=y -# CONFIG_FEATURE_SEAMLESS_Z is not set -# CONFIG_AR is not set -# CONFIG_FEATURE_AR_LONG_FILENAMES is not set -# CONFIG_FEATURE_AR_CREATE is not set -# CONFIG_UNCOMPRESS is not set -CONFIG_GUNZIP=y -CONFIG_ZCAT=y -CONFIG_FEATURE_GUNZIP_LONG_OPTIONS=y -CONFIG_BUNZIP2=y -CONFIG_BZCAT=y -CONFIG_UNLZMA=y -CONFIG_LZCAT=y -CONFIG_LZMA=y -# CONFIG_FEATURE_LZMA_FAST is not set -CONFIG_UNXZ=y -CONFIG_XZCAT=y -CONFIG_XZ=y -CONFIG_BZIP2=y -CONFIG_FEATURE_BZIP2_DECOMPRESS=y -CONFIG_CPIO=y -CONFIG_FEATURE_CPIO_O=y -CONFIG_FEATURE_CPIO_P=y -CONFIG_DPKG=y -CONFIG_DPKG_DEB=y -CONFIG_GZIP=y -CONFIG_FEATURE_GZIP_LONG_OPTIONS=y -CONFIG_GZIP_FAST=0 -# CONFIG_FEATURE_GZIP_LEVELS is not set -CONFIG_FEATURE_GZIP_DECOMPRESS=y -CONFIG_LZOP=y -# CONFIG_UNLZOP is not set -# CONFIG_LZOPCAT is not set -# CONFIG_LZOP_COMPR_HIGH is not set -CONFIG_RPM2CPIO=y -CONFIG_RPM=y -CONFIG_TAR=y -CONFIG_FEATURE_TAR_LONG_OPTIONS=y -CONFIG_FEATURE_TAR_CREATE=y -CONFIG_FEATURE_TAR_AUTODETECT=y -CONFIG_FEATURE_TAR_FROM=y -CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY=y -CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY=y -CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y -CONFIG_FEATURE_TAR_TO_COMMAND=y -CONFIG_FEATURE_TAR_UNAME_GNAME=y -CONFIG_FEATURE_TAR_NOPRESERVE_TIME=y -# CONFIG_FEATURE_TAR_SELINUX is not set -CONFIG_UNZIP=y -CONFIG_FEATURE_UNZIP_CDF=y -# CONFIG_FEATURE_UNZIP_BZIP2 is not set -# CONFIG_FEATURE_UNZIP_LZMA is not set -# CONFIG_FEATURE_UNZIP_XZ is not set - -# -# Coreutils -# -CONFIG_BASENAME=y -CONFIG_CAT=y -CONFIG_FEATURE_CATV=y -CONFIG_CHGRP=y -CONFIG_CHMOD=y -CONFIG_CHOWN=y -CONFIG_FEATURE_CHOWN_LONG_OPTIONS=y -CONFIG_CHROOT=y -CONFIG_CKSUM=y -CONFIG_COMM=y -CONFIG_CP=y -CONFIG_FEATURE_CP_LONG_OPTIONS=y -CONFIG_CUT=y -CONFIG_DATE=y -CONFIG_FEATURE_DATE_ISOFMT=y -# CONFIG_FEATURE_DATE_NANO is not set -CONFIG_FEATURE_DATE_COMPAT=y -CONFIG_DD=y -CONFIG_FEATURE_DD_SIGNAL_HANDLING=y -CONFIG_FEATURE_DD_THIRD_STATUS_LINE=y -CONFIG_FEATURE_DD_IBS_OBS=y -CONFIG_FEATURE_DD_STATUS=y -CONFIG_DF=y -CONFIG_FEATURE_DF_FANCY=y -CONFIG_DIRNAME=y -CONFIG_DOS2UNIX=y -CONFIG_UNIX2DOS=y -CONFIG_DU=y -CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y -CONFIG_ECHO=y -CONFIG_FEATURE_FANCY_ECHO=y -CONFIG_ENV=y -CONFIG_FEATURE_ENV_LONG_OPTIONS=y -CONFIG_EXPAND=y -CONFIG_FEATURE_EXPAND_LONG_OPTIONS=y -CONFIG_UNEXPAND=y -CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS=y -CONFIG_EXPR=y -CONFIG_EXPR_MATH_SUPPORT_64=y -CONFIG_FACTOR=y -CONFIG_FALSE=y -CONFIG_FOLD=y -CONFIG_FSYNC=y -CONFIG_HEAD=y -CONFIG_FEATURE_FANCY_HEAD=y -CONFIG_HOSTID=y -CONFIG_ID=y -CONFIG_GROUPS=y -CONFIG_INSTALL=y -CONFIG_FEATURE_INSTALL_LONG_OPTIONS=y -CONFIG_LINK=y -CONFIG_LN=y -CONFIG_LOGNAME=y -CONFIG_LS=y -CONFIG_FEATURE_LS_FILETYPES=y -CONFIG_FEATURE_LS_FOLLOWLINKS=y -CONFIG_FEATURE_LS_RECURSIVE=y -CONFIG_FEATURE_LS_WIDTH=y -CONFIG_FEATURE_LS_SORTFILES=y -CONFIG_FEATURE_LS_TIMESTAMPS=y -CONFIG_FEATURE_LS_USERNAME=y -CONFIG_FEATURE_LS_COLOR=y -CONFIG_FEATURE_LS_COLOR_IS_DEFAULT=y -CONFIG_MD5SUM=y -CONFIG_SHA1SUM=y -CONFIG_SHA256SUM=y -CONFIG_SHA512SUM=y -CONFIG_SHA3SUM=y - -# -# Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum -# -CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y -CONFIG_MKDIR=y -CONFIG_FEATURE_MKDIR_LONG_OPTIONS=y -CONFIG_MKFIFO=y -CONFIG_MKNOD=y -CONFIG_MKTEMP=y -CONFIG_MV=y -CONFIG_FEATURE_MV_LONG_OPTIONS=y -CONFIG_NICE=y -CONFIG_NL=y -CONFIG_NOHUP=y -CONFIG_NPROC=y -CONFIG_OD=y -CONFIG_PASTE=y -CONFIG_PRINTENV=y -CONFIG_PRINTF=y -CONFIG_PWD=y -CONFIG_READLINK=y -CONFIG_FEATURE_READLINK_FOLLOW=y -CONFIG_REALPATH=y -CONFIG_RM=y -CONFIG_RMDIR=y -CONFIG_FEATURE_RMDIR_LONG_OPTIONS=y -CONFIG_SEQ=y -CONFIG_SHRED=y -CONFIG_SHUF=y -CONFIG_SLEEP=y -CONFIG_FEATURE_FANCY_SLEEP=y -CONFIG_FEATURE_FLOAT_SLEEP=y -CONFIG_SORT=y -CONFIG_FEATURE_SORT_BIG=y -CONFIG_SPLIT=y -CONFIG_FEATURE_SPLIT_FANCY=y -CONFIG_STAT=y -CONFIG_FEATURE_STAT_FORMAT=y -CONFIG_FEATURE_STAT_FILESYSTEM=y -CONFIG_STTY=y -CONFIG_SUM=y -CONFIG_SYNC=y -# CONFIG_FEATURE_SYNC_FANCY is not set -CONFIG_TAC=y -CONFIG_TAIL=y -CONFIG_FEATURE_FANCY_TAIL=y -CONFIG_TEE=y -CONFIG_FEATURE_TEE_USE_BLOCK_IO=y -CONFIG_TEST=y -CONFIG_TEST1=y -CONFIG_TEST2=y -CONFIG_FEATURE_TEST_64=y -CONFIG_TIMEOUT=y -CONFIG_TOUCH=y -CONFIG_FEATURE_TOUCH_NODEREF=y -CONFIG_FEATURE_TOUCH_SUSV3=y -CONFIG_TR=y -CONFIG_FEATURE_TR_CLASSES=y -CONFIG_FEATURE_TR_EQUIV=y -CONFIG_TRUE=y -CONFIG_TRUNCATE=y -CONFIG_TTY=y -CONFIG_UNAME=y -CONFIG_UNAME_OSNAME="GNU/Linux" -CONFIG_UNIQ=y -CONFIG_UNLINK=y -CONFIG_USLEEP=y -CONFIG_UUDECODE=y -CONFIG_BASE64=y -CONFIG_UUENCODE=y -CONFIG_WC=y -CONFIG_FEATURE_WC_LARGE=y -CONFIG_WHOAMI=y -CONFIG_WHO=y -CONFIG_W=y -CONFIG_USERS=y -CONFIG_YES=y - -# -# Common options -# -CONFIG_FEATURE_VERBOSE=y - -# -# Common options for cp and mv -# -CONFIG_FEATURE_PRESERVE_HARDLINKS=y - -# -# Common options for df, du, ls -# -CONFIG_FEATURE_HUMAN_READABLE=y - -# -# Console Utilities -# -CONFIG_CHVT=y -CONFIG_CLEAR=y -CONFIG_DEALLOCVT=y -CONFIG_DUMPKMAP=y -CONFIG_FGCONSOLE=y -CONFIG_KBD_MODE=y -CONFIG_LOADFONT=y -CONFIG_SETFONT=y -CONFIG_FEATURE_SETFONT_TEXTUAL_MAP=y -CONFIG_DEFAULT_SETFONT_DIR="" - -# -# Common options for loadfont and setfont -# -CONFIG_FEATURE_LOADFONT_PSF2=y -CONFIG_FEATURE_LOADFONT_RAW=y -CONFIG_LOADKMAP=y -CONFIG_OPENVT=y -CONFIG_RESET=y -CONFIG_RESIZE=y -CONFIG_FEATURE_RESIZE_PRINT=y -CONFIG_SETCONSOLE=y -CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS=y -CONFIG_SETKEYCODES=y -CONFIG_SETLOGCONS=y -CONFIG_SHOWKEY=y - -# -# Debian Utilities -# -CONFIG_PIPE_PROGRESS=y -CONFIG_RUN_PARTS=y -CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS=y -CONFIG_FEATURE_RUN_PARTS_FANCY=y -CONFIG_START_STOP_DAEMON=y -CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS=y -CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y -CONFIG_WHICH=y - -# -# Editors -# -CONFIG_AWK=y -CONFIG_FEATURE_AWK_LIBM=y -CONFIG_FEATURE_AWK_GNU_EXTENSIONS=y -CONFIG_CMP=y -CONFIG_DIFF=y -CONFIG_FEATURE_DIFF_LONG_OPTIONS=y -CONFIG_FEATURE_DIFF_DIR=y -CONFIG_ED=y -CONFIG_PATCH=y -CONFIG_SED=y -CONFIG_VI=y -CONFIG_FEATURE_VI_MAX_LEN=4096 -# CONFIG_FEATURE_VI_8BIT is not set -CONFIG_FEATURE_VI_COLON=y -CONFIG_FEATURE_VI_YANKMARK=y -CONFIG_FEATURE_VI_SEARCH=y -# CONFIG_FEATURE_VI_REGEX_SEARCH is not set -CONFIG_FEATURE_VI_USE_SIGNALS=y -CONFIG_FEATURE_VI_DOT_CMD=y -CONFIG_FEATURE_VI_READONLY=y -CONFIG_FEATURE_VI_SETOPTS=y -CONFIG_FEATURE_VI_SET=y -CONFIG_FEATURE_VI_WIN_RESIZE=y -CONFIG_FEATURE_VI_ASK_TERMINAL=y -CONFIG_FEATURE_VI_UNDO=y -CONFIG_FEATURE_VI_UNDO_QUEUE=y -CONFIG_FEATURE_VI_UNDO_QUEUE_MAX=256 -CONFIG_FEATURE_ALLOW_EXEC=y - -# -# Finding Utilities -# -CONFIG_FIND=y -CONFIG_FEATURE_FIND_PRINT0=y -CONFIG_FEATURE_FIND_MTIME=y -CONFIG_FEATURE_FIND_MMIN=y -CONFIG_FEATURE_FIND_PERM=y -CONFIG_FEATURE_FIND_TYPE=y -CONFIG_FEATURE_FIND_XDEV=y -CONFIG_FEATURE_FIND_MAXDEPTH=y -CONFIG_FEATURE_FIND_NEWER=y -CONFIG_FEATURE_FIND_INUM=y -CONFIG_FEATURE_FIND_EXEC=y -CONFIG_FEATURE_FIND_EXEC_PLUS=y -CONFIG_FEATURE_FIND_USER=y -CONFIG_FEATURE_FIND_GROUP=y -CONFIG_FEATURE_FIND_NOT=y -CONFIG_FEATURE_FIND_DEPTH=y -CONFIG_FEATURE_FIND_PAREN=y -CONFIG_FEATURE_FIND_SIZE=y -CONFIG_FEATURE_FIND_PRUNE=y -CONFIG_FEATURE_FIND_DELETE=y -CONFIG_FEATURE_FIND_PATH=y -CONFIG_FEATURE_FIND_REGEX=y -# CONFIG_FEATURE_FIND_CONTEXT is not set -CONFIG_FEATURE_FIND_LINKS=y -CONFIG_GREP=y -CONFIG_EGREP=y -CONFIG_FGREP=y -CONFIG_FEATURE_GREP_CONTEXT=y -CONFIG_XARGS=y -CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION=y -CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y -CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y -CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y -CONFIG_FEATURE_XARGS_SUPPORT_REPL_STR=y - -# -# Init Utilities -# -CONFIG_BOOTCHARTD=y -CONFIG_FEATURE_BOOTCHARTD_BLOATED_HEADER=y -CONFIG_FEATURE_BOOTCHARTD_CONFIG_FILE=y -CONFIG_HALT=y -CONFIG_POWEROFF=y -CONFIG_REBOOT=y -# CONFIG_FEATURE_CALL_TELINIT is not set -CONFIG_TELINIT_PATH="" -CONFIG_INIT=y -CONFIG_LINUXRC=y -CONFIG_FEATURE_USE_INITTAB=y -# CONFIG_FEATURE_KILL_REMOVED is not set -CONFIG_FEATURE_KILL_DELAY=0 -CONFIG_FEATURE_INIT_SCTTY=y -CONFIG_FEATURE_INIT_SYSLOG=y -CONFIG_FEATURE_INIT_QUIET=y -# CONFIG_FEATURE_INIT_COREDUMPS is not set -CONFIG_INIT_TERMINAL_TYPE="linux" -CONFIG_FEATURE_INIT_MODIFY_CMDLINE=y - -# -# Login/Password Management Utilities -# -CONFIG_FEATURE_SHADOWPASSWDS=y -CONFIG_USE_BB_PWD_GRP=y -CONFIG_USE_BB_SHADOW=y -CONFIG_USE_BB_CRYPT=y -CONFIG_USE_BB_CRYPT_SHA=y -CONFIG_ADDGROUP=y -CONFIG_FEATURE_ADDGROUP_LONG_OPTIONS=y -CONFIG_FEATURE_ADDUSER_TO_GROUP=y -# CONFIG_ADD_SHELL is not set -# CONFIG_REMOVE_SHELL is not set -CONFIG_ADDUSER=y -CONFIG_FEATURE_ADDUSER_LONG_OPTIONS=y -# CONFIG_FEATURE_CHECK_NAMES is not set -CONFIG_LAST_ID=60000 -CONFIG_FIRST_SYSTEM_ID=100 -CONFIG_LAST_SYSTEM_ID=999 -CONFIG_CHPASSWD=y -CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="des" -CONFIG_CRYPTPW=y -CONFIG_MKPASSWD=y -CONFIG_DELUSER=y -CONFIG_DELGROUP=y -CONFIG_FEATURE_DEL_USER_FROM_GROUP=y -CONFIG_GETTY=y -CONFIG_LOGIN=y -# CONFIG_LOGIN_SESSION_AS_CHILD is not set -CONFIG_LOGIN_SCRIPTS=y -CONFIG_FEATURE_NOLOGIN=y -CONFIG_FEATURE_SECURETTY=y -CONFIG_PASSWD=y -CONFIG_FEATURE_PASSWD_WEAK_CHECK=y -CONFIG_SU=y -CONFIG_FEATURE_SU_SYSLOG=y -CONFIG_FEATURE_SU_CHECKS_SHELLS=y -# CONFIG_FEATURE_SU_BLANK_PW_NEEDS_SECURE_TTY is not set -CONFIG_SULOGIN=y -CONFIG_VLOCK=y - -# -# Linux Ext2 FS Progs -# -CONFIG_CHATTR=y -CONFIG_FSCK=y -CONFIG_LSATTR=y -# CONFIG_TUNE2FS is not set - -# -# Linux Module Utilities -# -CONFIG_MODPROBE_SMALL=y -CONFIG_DEPMOD=y -CONFIG_INSMOD=y -CONFIG_LSMOD=y -# CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set -CONFIG_MODINFO=y -CONFIG_MODPROBE=y -# CONFIG_FEATURE_MODPROBE_BLACKLIST is not set -CONFIG_RMMOD=y - -# -# Options common to multiple modutils -# -CONFIG_FEATURE_CMDLINE_MODULE_OPTIONS=y -CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED=y -# CONFIG_FEATURE_2_4_MODULES is not set -# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set -# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set -# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set -# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set -# CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set -# CONFIG_FEATURE_CHECK_TAINTED_MODULE is not set -# CONFIG_FEATURE_INSMOD_TRY_MMAP is not set -# CONFIG_FEATURE_MODUTILS_ALIAS is not set -# CONFIG_FEATURE_MODUTILS_SYMBOLS is not set -CONFIG_DEFAULT_MODULES_DIR="/lib/modules" -CONFIG_DEFAULT_DEPMOD_FILE="modules.dep" - -# -# Linux System Utilities -# -CONFIG_ACPID=y -CONFIG_FEATURE_ACPID_COMPAT=y -CONFIG_BLKDISCARD=y -CONFIG_BLKID=y -# CONFIG_FEATURE_BLKID_TYPE is not set -CONFIG_BLOCKDEV=y -CONFIG_CAL=y -CONFIG_CHRT=y -CONFIG_DMESG=y -CONFIG_FEATURE_DMESG_PRETTY=y -CONFIG_EJECT=y -CONFIG_FEATURE_EJECT_SCSI=y -CONFIG_FALLOCATE=y -CONFIG_FATATTR=y -CONFIG_FBSET=y -CONFIG_FEATURE_FBSET_FANCY=y -CONFIG_FEATURE_FBSET_READMODE=y -CONFIG_FDFORMAT=y -CONFIG_FDISK=y -# CONFIG_FDISK_SUPPORT_LARGE_DISKS is not set -CONFIG_FEATURE_FDISK_WRITABLE=y -# CONFIG_FEATURE_AIX_LABEL is not set -# CONFIG_FEATURE_SGI_LABEL is not set -# CONFIG_FEATURE_SUN_LABEL is not set -# CONFIG_FEATURE_OSF_LABEL is not set -# CONFIG_FEATURE_GPT_LABEL is not set -CONFIG_FEATURE_FDISK_ADVANCED=y -CONFIG_FINDFS=y -CONFIG_FLOCK=y -CONFIG_FDFLUSH=y -CONFIG_FREERAMDISK=y -CONFIG_FSCK_MINIX=y -CONFIG_FSFREEZE=y -CONFIG_FSTRIM=y -CONFIG_GETOPT=y -CONFIG_FEATURE_GETOPT_LONG=y -CONFIG_HEXDUMP=y -CONFIG_FEATURE_HEXDUMP_REVERSE=y -CONFIG_HD=y -CONFIG_XXD=y -CONFIG_HWCLOCK=y -CONFIG_FEATURE_HWCLOCK_LONG_OPTIONS=y -# CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS is not set -CONFIG_IONICE=y -CONFIG_IPCRM=y -CONFIG_IPCS=y -CONFIG_LAST=y -CONFIG_FEATURE_LAST_FANCY=y -CONFIG_LOSETUP=y -CONFIG_LSPCI=y -CONFIG_LSUSB=y -CONFIG_MDEV=y -CONFIG_FEATURE_MDEV_CONF=y -CONFIG_FEATURE_MDEV_RENAME=y -CONFIG_FEATURE_MDEV_RENAME_REGEXP=y -CONFIG_FEATURE_MDEV_EXEC=y -CONFIG_FEATURE_MDEV_LOAD_FIRMWARE=y -CONFIG_MESG=y -CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP=y -CONFIG_MKE2FS=y -CONFIG_MKFS_EXT2=y -CONFIG_MKFS_MINIX=y -CONFIG_FEATURE_MINIX2=y -# CONFIG_MKFS_REISER is not set -CONFIG_MKDOSFS=y -CONFIG_MKFS_VFAT=y -CONFIG_MKSWAP=y -CONFIG_FEATURE_MKSWAP_UUID=y -CONFIG_MORE=y -CONFIG_MOUNT=y -CONFIG_FEATURE_MOUNT_FAKE=y -CONFIG_FEATURE_MOUNT_VERBOSE=y -# CONFIG_FEATURE_MOUNT_HELPERS is not set -CONFIG_FEATURE_MOUNT_LABEL=y -# CONFIG_FEATURE_MOUNT_NFS is not set -CONFIG_FEATURE_MOUNT_CIFS=y -CONFIG_FEATURE_MOUNT_FLAGS=y -CONFIG_FEATURE_MOUNT_FSTAB=y -CONFIG_FEATURE_MOUNT_OTHERTAB=y -CONFIG_MOUNTPOINT=y -# CONFIG_NSENTER is not set -# CONFIG_FEATURE_NSENTER_LONG_OPTS is not set -CONFIG_PIVOT_ROOT=y -CONFIG_RDATE=y -CONFIG_RDEV=y -CONFIG_READPROFILE=y -CONFIG_RENICE=y -CONFIG_REV=y -CONFIG_RTCWAKE=y -CONFIG_SCRIPT=y -CONFIG_SCRIPTREPLAY=y -CONFIG_SETARCH=y -CONFIG_LINUX32=y -CONFIG_LINUX64=y -CONFIG_SETPRIV=y -CONFIG_SETSID=y -CONFIG_SWAPON=y -CONFIG_FEATURE_SWAPON_DISCARD=y -CONFIG_FEATURE_SWAPON_PRI=y -CONFIG_SWAPOFF=y -CONFIG_SWITCH_ROOT=y -CONFIG_TASKSET=y -CONFIG_FEATURE_TASKSET_FANCY=y -CONFIG_UEVENT=y -CONFIG_UMOUNT=y -CONFIG_FEATURE_UMOUNT_ALL=y -CONFIG_UNSHARE=y -CONFIG_WALL=y - -# -# Common options for mount/umount -# -CONFIG_FEATURE_MOUNT_LOOP=y -CONFIG_FEATURE_MOUNT_LOOP_CREATE=y -# CONFIG_FEATURE_MTAB_SUPPORT is not set -CONFIG_VOLUMEID=y - -# -# Filesystem/Volume identification -# -CONFIG_FEATURE_VOLUMEID_BCACHE=y -CONFIG_FEATURE_VOLUMEID_BTRFS=y -CONFIG_FEATURE_VOLUMEID_CRAMFS=y -CONFIG_FEATURE_VOLUMEID_EXFAT=y -CONFIG_FEATURE_VOLUMEID_EXT=y -CONFIG_FEATURE_VOLUMEID_F2FS=y -CONFIG_FEATURE_VOLUMEID_FAT=y -CONFIG_FEATURE_VOLUMEID_HFS=y -CONFIG_FEATURE_VOLUMEID_ISO9660=y -CONFIG_FEATURE_VOLUMEID_JFS=y -CONFIG_FEATURE_VOLUMEID_LINUXRAID=y -CONFIG_FEATURE_VOLUMEID_LINUXSWAP=y -CONFIG_FEATURE_VOLUMEID_LUKS=y -CONFIG_FEATURE_VOLUMEID_NILFS=y -CONFIG_FEATURE_VOLUMEID_NTFS=y -CONFIG_FEATURE_VOLUMEID_OCFS2=y -CONFIG_FEATURE_VOLUMEID_REISERFS=y -CONFIG_FEATURE_VOLUMEID_ROMFS=y -# CONFIG_FEATURE_VOLUMEID_SQUASHFS is not set -CONFIG_FEATURE_VOLUMEID_SYSV=y -CONFIG_FEATURE_VOLUMEID_UBIFS=y -CONFIG_FEATURE_VOLUMEID_UDF=y -CONFIG_FEATURE_VOLUMEID_XFS=y - -# -# Miscellaneous Utilities -# -CONFIG_ADJTIMEX=y -# CONFIG_BBCONFIG is not set -# CONFIG_FEATURE_COMPRESS_BBCONFIG is not set -CONFIG_BEEP=y -CONFIG_FEATURE_BEEP_FREQ=4000 -CONFIG_FEATURE_BEEP_LENGTH_MS=30 -CONFIG_CHAT=y -CONFIG_FEATURE_CHAT_NOFAIL=y -# CONFIG_FEATURE_CHAT_TTY_HIFI is not set -CONFIG_FEATURE_CHAT_IMPLICIT_CR=y -CONFIG_FEATURE_CHAT_SWALLOW_OPTS=y -CONFIG_FEATURE_CHAT_SEND_ESCAPES=y -CONFIG_FEATURE_CHAT_VAR_ABORT_LEN=y -CONFIG_FEATURE_CHAT_CLR_ABORT=y -CONFIG_CONSPY=y -CONFIG_CROND=y -CONFIG_FEATURE_CROND_D=y -CONFIG_FEATURE_CROND_CALL_SENDMAIL=y -CONFIG_FEATURE_CROND_DIR="/var/spool/cron" -CONFIG_CRONTAB=y -CONFIG_DC=y -CONFIG_FEATURE_DC_LIBM=y -# CONFIG_DEVFSD is not set -# CONFIG_DEVFSD_MODLOAD is not set -# CONFIG_DEVFSD_FG_NP is not set -# CONFIG_DEVFSD_VERBOSE is not set -# CONFIG_FEATURE_DEVFS is not set -CONFIG_DEVMEM=y -CONFIG_FBSPLASH=y -CONFIG_FLASHCP=y -CONFIG_FLASH_ERASEALL=y -CONFIG_FLASH_LOCK=y -CONFIG_FLASH_UNLOCK=y -CONFIG_HDPARM=y -CONFIG_FEATURE_HDPARM_GET_IDENTITY=y -CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF=y -CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF=y -CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET=y -CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF=y -CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA=y -CONFIG_I2CGET=y -CONFIG_I2CSET=y -CONFIG_I2CDUMP=y -CONFIG_I2CDETECT=y -# CONFIG_INOTIFYD is not set -CONFIG_LESS=y -CONFIG_FEATURE_LESS_MAXLINES=9999999 -CONFIG_FEATURE_LESS_BRACKETS=y -CONFIG_FEATURE_LESS_FLAGS=y -CONFIG_FEATURE_LESS_TRUNCATE=y -CONFIG_FEATURE_LESS_MARKS=y -CONFIG_FEATURE_LESS_REGEXP=y -CONFIG_FEATURE_LESS_WINCH=y -CONFIG_FEATURE_LESS_ASK_TERMINAL=y -CONFIG_FEATURE_LESS_DASHCMD=y -CONFIG_FEATURE_LESS_LINENUMS=y -CONFIG_LSSCSI=y -CONFIG_MAKEDEVS=y -# CONFIG_FEATURE_MAKEDEVS_LEAF is not set -CONFIG_FEATURE_MAKEDEVS_TABLE=y -CONFIG_MAN=y -CONFIG_MICROCOM=y -CONFIG_MT=y -CONFIG_NANDWRITE=y -CONFIG_NANDDUMP=y -CONFIG_PARTPROBE=y -CONFIG_RAIDAUTORUN=y -CONFIG_READAHEAD=y -# CONFIG_RFKILL is not set -CONFIG_RUNLEVEL=y -CONFIG_RX=y -CONFIG_SETSERIAL=y -CONFIG_STRINGS=y -CONFIG_TIME=y -CONFIG_TTYSIZE=y -CONFIG_UBIRENAME=y -CONFIG_UBIATTACH=y -CONFIG_UBIDETACH=y -CONFIG_UBIMKVOL=y -CONFIG_UBIRMVOL=y -CONFIG_UBIRSVOL=y -CONFIG_UBIUPDATEVOL=y -CONFIG_VOLNAME=y -CONFIG_WATCHDOG=y - -# -# Networking Utilities -# -CONFIG_FEATURE_IPV6=y -# CONFIG_FEATURE_UNIX_LOCAL is not set -CONFIG_FEATURE_PREFER_IPV4_ADDRESS=y -# CONFIG_VERBOSE_RESOLUTION_ERRORS is not set -CONFIG_ARP=y -CONFIG_ARPING=y -CONFIG_BRCTL=y -CONFIG_FEATURE_BRCTL_FANCY=y -CONFIG_FEATURE_BRCTL_SHOW=y -CONFIG_DNSD=y -CONFIG_ETHER_WAKE=y -CONFIG_FTPD=y -CONFIG_FEATURE_FTPD_WRITE=y -CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST=y -CONFIG_FEATURE_FTPD_AUTHENTICATION=y -CONFIG_FTPGET=y -CONFIG_FTPPUT=y -CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS=y -CONFIG_HOSTNAME=y -CONFIG_DNSDOMAINNAME=y -CONFIG_HTTPD=y -CONFIG_FEATURE_HTTPD_RANGES=y -CONFIG_FEATURE_HTTPD_SETUID=y -CONFIG_FEATURE_HTTPD_BASIC_AUTH=y -CONFIG_FEATURE_HTTPD_AUTH_MD5=y -CONFIG_FEATURE_HTTPD_CGI=y -CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR=y -CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV=y -CONFIG_FEATURE_HTTPD_ENCODE_URL_STR=y -CONFIG_FEATURE_HTTPD_ERROR_PAGES=y -CONFIG_FEATURE_HTTPD_PROXY=y -CONFIG_FEATURE_HTTPD_GZIP=y -CONFIG_IFCONFIG=y -CONFIG_FEATURE_IFCONFIG_STATUS=y -CONFIG_FEATURE_IFCONFIG_SLIP=y -CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ=y -CONFIG_FEATURE_IFCONFIG_HW=y -CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS=y -CONFIG_IFENSLAVE=y -CONFIG_IFPLUGD=y -CONFIG_IFUP=y -CONFIG_IFDOWN=y -CONFIG_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate" -CONFIG_FEATURE_IFUPDOWN_IP=y -CONFIG_FEATURE_IFUPDOWN_IPV4=y -CONFIG_FEATURE_IFUPDOWN_IPV6=y -CONFIG_FEATURE_IFUPDOWN_MAPPING=y -# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set -CONFIG_INETD=y -CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO=y -CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD=y -CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME=y -CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME=y -CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN=y -# CONFIG_FEATURE_INETD_RPC is not set -CONFIG_IP=y -CONFIG_IPADDR=y -CONFIG_IPLINK=y -CONFIG_IPROUTE=y -CONFIG_IPTUNNEL=y -CONFIG_IPRULE=y -CONFIG_IPNEIGH=y -CONFIG_FEATURE_IP_ADDRESS=y -CONFIG_FEATURE_IP_LINK=y -CONFIG_FEATURE_IP_ROUTE=y -CONFIG_FEATURE_IP_ROUTE_DIR="/etc/iproute2" -CONFIG_FEATURE_IP_TUNNEL=y -CONFIG_FEATURE_IP_RULE=y -CONFIG_FEATURE_IP_NEIGH=y -# CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set -CONFIG_IPCALC=y -CONFIG_FEATURE_IPCALC_LONG_OPTIONS=y -CONFIG_FEATURE_IPCALC_FANCY=y -CONFIG_FAKEIDENTD=y -CONFIG_NAMEIF=y -CONFIG_FEATURE_NAMEIF_EXTENDED=y -CONFIG_NBDCLIENT=y -CONFIG_NC=y -CONFIG_NC_SERVER=y -CONFIG_NC_EXTRA=y -# CONFIG_NC_110_COMPAT is not set -CONFIG_NETSTAT=y -CONFIG_FEATURE_NETSTAT_WIDE=y -CONFIG_FEATURE_NETSTAT_PRG=y -CONFIG_NSLOOKUP=y -CONFIG_NTPD=y -CONFIG_FEATURE_NTPD_SERVER=y -CONFIG_FEATURE_NTPD_CONF=y -CONFIG_PING=y -CONFIG_PING6=y -CONFIG_FEATURE_FANCY_PING=y -CONFIG_PSCAN=y -CONFIG_ROUTE=y -CONFIG_SLATTACH=y -CONFIG_SSL_CLIENT=y -CONFIG_TCPSVD=y -CONFIG_UDPSVD=y -CONFIG_TELNET=y -CONFIG_FEATURE_TELNET_TTYPE=y -CONFIG_FEATURE_TELNET_AUTOLOGIN=y -CONFIG_FEATURE_TELNET_WIDTH=y -CONFIG_TELNETD=y -CONFIG_FEATURE_TELNETD_STANDALONE=y -CONFIG_FEATURE_TELNETD_INETD_WAIT=y -CONFIG_TFTP=y -CONFIG_TFTPD=y - -# -# Common options for tftp/tftpd -# -CONFIG_FEATURE_TFTP_GET=y -CONFIG_FEATURE_TFTP_PUT=y -CONFIG_FEATURE_TFTP_BLOCKSIZE=y -CONFIG_FEATURE_TFTP_PROGRESS_BAR=y -# CONFIG_TFTP_DEBUG is not set -CONFIG_TLS=y -CONFIG_TRACEROUTE=y -CONFIG_TRACEROUTE6=y -CONFIG_FEATURE_TRACEROUTE_VERBOSE=y -CONFIG_FEATURE_TRACEROUTE_USE_ICMP=y -CONFIG_TUNCTL=y -CONFIG_FEATURE_TUNCTL_UG=y -CONFIG_VCONFIG=y -CONFIG_WGET=y -CONFIG_FEATURE_WGET_LONG_OPTIONS=y -CONFIG_FEATURE_WGET_STATUSBAR=y -CONFIG_FEATURE_WGET_AUTHENTICATION=y -CONFIG_FEATURE_WGET_TIMEOUT=y -CONFIG_FEATURE_WGET_HTTPS=y -CONFIG_FEATURE_WGET_OPENSSL=y -CONFIG_WHOIS=y -CONFIG_ZCIP=y -# CONFIG_UDHCPC6 is not set -# CONFIG_FEATURE_UDHCPC6_RFC3646 is not set -# CONFIG_FEATURE_UDHCPC6_RFC4704 is not set -# CONFIG_FEATURE_UDHCPC6_RFC4833 is not set -CONFIG_UDHCPD=y -CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY=y -# CONFIG_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set -CONFIG_DHCPD_LEASES_FILE="/var/lib/misc/udhcpd.leases" -CONFIG_DUMPLEASES=y -CONFIG_DHCPRELAY=y -CONFIG_UDHCPC=y -CONFIG_FEATURE_UDHCPC_ARPING=y -CONFIG_FEATURE_UDHCPC_SANITIZEOPT=y -CONFIG_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script" -# CONFIG_FEATURE_UDHCP_PORT is not set -CONFIG_UDHCP_DEBUG=9 -CONFIG_FEATURE_UDHCP_RFC3397=y -CONFIG_FEATURE_UDHCP_8021Q=y -CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80 -CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -n" - -# -# Print Utilities -# -# CONFIG_LPD is not set -# CONFIG_LPR is not set -# CONFIG_LPQ is not set - -# -# Mail Utilities -# -# CONFIG_MAKEMIME is not set -# CONFIG_POPMAILDIR is not set -# CONFIG_FEATURE_POPMAILDIR_DELIVERY is not set -# CONFIG_REFORMIME is not set -# CONFIG_FEATURE_REFORMIME_COMPAT is not set -# CONFIG_SENDMAIL is not set -CONFIG_FEATURE_MIME_CHARSET="" - -# -# Process Utilities -# -CONFIG_FREE=y -CONFIG_FUSER=y -CONFIG_IOSTAT=y -CONFIG_KILL=y -CONFIG_KILLALL=y -CONFIG_KILLALL5=y -CONFIG_LSOF=y -CONFIG_MPSTAT=y -CONFIG_NMETER=y -CONFIG_PGREP=y -CONFIG_PKILL=y -CONFIG_PIDOF=y -CONFIG_FEATURE_PIDOF_SINGLE=y -CONFIG_FEATURE_PIDOF_OMIT=y -CONFIG_PMAP=y -CONFIG_POWERTOP=y -CONFIG_FEATURE_POWERTOP_INTERACTIVE=y -CONFIG_PS=y -CONFIG_FEATURE_PS_WIDE=y -CONFIG_FEATURE_PS_LONG=y -# CONFIG_FEATURE_PS_TIME is not set -# CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set -# CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS is not set -CONFIG_PSTREE=y -CONFIG_PWDX=y -CONFIG_SMEMCAP=y -CONFIG_BB_SYSCTL=y -CONFIG_TOP=y -CONFIG_FEATURE_TOP_INTERACTIVE=y -CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y -CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y -CONFIG_FEATURE_TOP_SMP_CPU=y -CONFIG_FEATURE_TOP_DECIMALS=y -CONFIG_FEATURE_TOP_SMP_PROCESS=y -CONFIG_FEATURE_TOPMEM=y -CONFIG_UPTIME=y -CONFIG_FEATURE_UPTIME_UTMP_SUPPORT=y -CONFIG_WATCH=y -CONFIG_FEATURE_SHOW_THREADS=y - -# -# Runit Utilities -# -CONFIG_CHPST=y -CONFIG_SETUIDGID=y -CONFIG_ENVUIDGID=y -CONFIG_ENVDIR=y -CONFIG_SOFTLIMIT=y -CONFIG_RUNSV=y -CONFIG_RUNSVDIR=y -# CONFIG_FEATURE_RUNSVDIR_LOG is not set -CONFIG_SV=y -CONFIG_SV_DEFAULT_SERVICE_DIR="/var/service" -CONFIG_SVC=y -CONFIG_SVLOGD=y -# CONFIG_CHCON is not set -# CONFIG_FEATURE_CHCON_LONG_OPTIONS is not set -# CONFIG_GETENFORCE is not set -# CONFIG_GETSEBOOL is not set -# CONFIG_LOAD_POLICY is not set -# CONFIG_MATCHPATHCON is not set -# CONFIG_RUNCON is not set -# CONFIG_FEATURE_RUNCON_LONG_OPTIONS is not set -# CONFIG_SELINUXENABLED is not set -# CONFIG_SESTATUS is not set -# CONFIG_SETENFORCE is not set -# CONFIG_SETFILES is not set -# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set -# CONFIG_RESTORECON is not set -# CONFIG_SETSEBOOL is not set - -# -# Shells -# -CONFIG_SH_IS_ASH=y -# CONFIG_SH_IS_HUSH is not set -# CONFIG_SH_IS_NONE is not set -# CONFIG_BASH_IS_ASH is not set -# CONFIG_BASH_IS_HUSH is not set -CONFIG_BASH_IS_NONE=y -CONFIG_ASH=y -CONFIG_ASH_OPTIMIZE_FOR_SIZE=y -CONFIG_ASH_INTERNAL_GLOB=y -CONFIG_ASH_BASH_COMPAT=y -CONFIG_ASH_JOB_CONTROL=y -CONFIG_ASH_ALIAS=y -CONFIG_ASH_RANDOM_SUPPORT=y -CONFIG_ASH_EXPAND_PRMT=y -CONFIG_ASH_IDLE_TIMEOUT=y -CONFIG_ASH_MAIL=y -CONFIG_ASH_ECHO=y -CONFIG_ASH_PRINTF=y -CONFIG_ASH_TEST=y -CONFIG_ASH_HELP=y -CONFIG_ASH_GETOPTS=y -CONFIG_ASH_CMDCMD=y -CONFIG_CTTYHACK=y -CONFIG_HUSH=y -CONFIG_HUSH_BASH_COMPAT=y -CONFIG_HUSH_BRACE_EXPANSION=y -CONFIG_HUSH_INTERACTIVE=y -CONFIG_HUSH_SAVEHISTORY=y -CONFIG_HUSH_JOB=y -CONFIG_HUSH_TICK=y -CONFIG_HUSH_IF=y -CONFIG_HUSH_LOOPS=y -CONFIG_HUSH_CASE=y -CONFIG_HUSH_FUNCTIONS=y -CONFIG_HUSH_LOCAL=y -CONFIG_HUSH_RANDOM_SUPPORT=y -CONFIG_HUSH_MODE_X=y -CONFIG_HUSH_ECHO=y -CONFIG_HUSH_PRINTF=y -CONFIG_HUSH_TEST=y -CONFIG_HUSH_HELP=y -CONFIG_HUSH_EXPORT=y -CONFIG_HUSH_EXPORT_N=y -CONFIG_HUSH_KILL=y -CONFIG_HUSH_WAIT=y -CONFIG_HUSH_TRAP=y -CONFIG_HUSH_TYPE=y -CONFIG_HUSH_READ=y -CONFIG_HUSH_SET=y -CONFIG_HUSH_UNSET=y -CONFIG_HUSH_ULIMIT=y -CONFIG_HUSH_UMASK=y -# CONFIG_HUSH_MEMLEAK is not set -# CONFIG_MSH is not set - -# -# Options common to all shells -# -CONFIG_FEATURE_SH_MATH=y -CONFIG_FEATURE_SH_MATH_64=y -CONFIG_FEATURE_SH_EXTRA_QUIET=y -# CONFIG_FEATURE_SH_STANDALONE is not set -# CONFIG_FEATURE_SH_NOFORK is not set -CONFIG_FEATURE_SH_HISTFILESIZE=y - -# -# System Logging Utilities -# -CONFIG_KLOGD=y - -# -# klogd should not be used together with syslog to kernel printk buffer -# -CONFIG_FEATURE_KLOGD_KLOGCTL=y -CONFIG_LOGGER=y -CONFIG_LOGREAD=y -CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y -CONFIG_SYSLOGD=y -CONFIG_FEATURE_ROTATE_LOGFILE=y -CONFIG_FEATURE_REMOTE_LOG=y -CONFIG_FEATURE_SYSLOGD_DUP=y -CONFIG_FEATURE_SYSLOGD_CFG=y -CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256 -CONFIG_FEATURE_IPC_SYSLOG=y -CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16 -CONFIG_FEATURE_KMSG_SYSLOG=y diff --git a/3rdpart/libevent/build.sh b/3rdpart/libevent/build.sh deleted file mode 100755 index f358a02..0000000 --- a/3rdpart/libevent/build.sh +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash - -#+-------------------------------------------------------------------------------------------- -#|Description: This shell script used download and compile libevent for ARM -#| Author: GuoWenxue <guowenxue@gmail.com> -#| ChangeLog: -#| 1, Initialize 1.0.0 on 2011.04.12 -#+-------------------------------------------------------------------------------------------- - -PREFIX_PATH=`pwd`/install - -if [ -z $CROSSTOOL ] ; then - CROSSTOOL=/opt/rpi/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -fi - -function msg_banner() -{ - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" -} - -function check_result() -{ - if [ $? != 0 ] ; then - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" - exit ; - fi -} - -function export_cross() -{ - # export cross toolchain - export CC=${CROSSTOOL}gcc - export AS=${CROSSTOOL}as - export AR=${CROSSTOOL}ar - export LD=${CROSSTOOL}ld - export NM=${CROSSTOOL}nm - export RANLIB=${CROSSTOOL}ranlib - export OBJDUMP=${CROSSTOOL}objdump - export STRIP=${CROSSTOOL}strip - - # export cross configure - export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux " - - # Clear LDFLAGS and CFLAGS - export LDFLAGS= - export CFLAGS= -} - -function compile_libevent() -{ - SRC_NAME=libevent-2.0.21-stable - PACK_SUFIX=tar.gz - IMG_NAME=ipt - - if [ -f ${PREFIX_PATH}/${IMG_NAME} ] ; then - return 0; - fi - - msg_banner "Start cross compile $SRC_NAME " - - if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then - wget https://github.com/downloads/libevent/libevent/${SRC_NAME}.${PACK_SUFIX} - check_result "ERROR: download ${SRC_NAME} failure" - fi - - tar -xzf ${SRC_NAME}.${PACK_SUFIX} - cd ${SRC_NAME} - - ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --enable-thread-support --enable-openssl --enable-function-sections - check_result "ERROR: configure ${SRC_NAME} failure" - - make && make install - check_result "ERROR: compile ${SRC_NAME} failure" - - cd - -} - - -export_cross - -compile_libevent - - diff --git a/3rdpart/mqtt/mosquitto/build.sh b/3rdpart/mqtt/mosquitto/build.sh deleted file mode 100755 index 928d556..0000000 --- a/3rdpart/mqtt/mosquitto/build.sh +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/bash - -#+-------------------------------------------------------------------------------------------- -#|Description: This shell script used download and compile MQTT C library mosquitto for ARM -#| Author: GuoWenxue <guowenxue@gmail.com> -#| ChangeLog: -#| 1, Initialize 1.0.0 on 2011.04.12 -#+-------------------------------------------------------------------------------------------- - -PREFIX_PATH=`pwd`/install -OPENSSL_PATH=`pwd`/../openssl/install/ - -if [ -z $CROSSTOOL ] ; then - CROSSTOOL=/opt/rpi/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -fi - -function msg_banner() -{ - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" -} - -function check_result() -{ - if [ $? != 0 ] ; then - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" - exit ; - fi -} - -function export_cross() -{ - # export cross toolchain - export CC=${CROSSTOOL}gcc - export CXX=${CROSSTOOL}g++ - export AS=${CROSSTOOL}as - export AR=${CROSSTOOL}ar - export LD=${CROSSTOOL}ld - export NM=${CROSSTOOL}nm - export RANLIB=${CROSSTOOL}ranlib - export OBJDUMP=${CROSSTOOL}objdump - export STRIP=${CROSSTOOL}strip - - # export cross configure - export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux " - - # Clear LDFLAGS and CFLAGS - export LDFLAGS= - export CFLAGS= -} - -function compile_mosquitto() -{ - SRC_NAME=mosquitto-1.4.15 - PACK_SUFIX=tar.gz - - if [ -d ${PREFIX_PATH}/lib ] ; then - return 0; - fi - - msg_banner "Start cross compile $SRC_NAME " - - if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then - wget https://mosquitto.org/files/source//${SRC_NAME}.${PACK_SUFIX} - check_result "ERROR: download ${SRC_NAME} failure" - fi - - tar -xzf ${SRC_NAME}.${PACK_SUFIX} - cd ${SRC_NAME} - - export CFLAGS=-I${OPENSSL_PATH}/include - export LDFLAGS=-L${OPENSSL_PATH}/lib - - export DESTDIR=${PREFIX_PATH} - make WITH_SRV=no WITH_UUID=no - check_result "ERROR: compile ${SRC_NAME} failure" - - mkdir -p ${PREFIX_PATH}/{lib,bin} - cp lib/libmosquitto.so.1 ${PREFIX_PATH}/lib - cp src/mosquitto src/mosquitto_passwd client/mosquitto_pub client/mosquitto_sub ${PREFIX_PATH}/bin - cd - -} - - -export_cross - -if [ ! -d ${OPENSSL_PATH}/include ] ; then - cd ../openssl - ./build.sh - cd - -fi - -compile_mosquitto - - diff --git a/3rdpart/mqtt/openssl/build.sh b/3rdpart/mqtt/openssl/build.sh deleted file mode 100755 index 05ab986..0000000 --- a/3rdpart/mqtt/openssl/build.sh +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/bash - -#+-------------------------------------------------------------------------------------------- -#|Description: This shell script used download and compile openssl for ARM -#| Author: GuoWenxue <guowenxue@gmail.com> -#| ChangeLog: -#| 1, Initialize 1.0.0 on 2011.04.12 -#+-------------------------------------------------------------------------------------------- - -PREFIX_PATH=`pwd`/install - -if [ -z $CROSSTOOL ] ; then - CROSSTOOL=/opt/rpi/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -fi - -function msg_banner() -{ - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" -} - -function check_result() -{ - if [ $? != 0 ] ; then - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" - exit ; - fi -} - -function export_cross() -{ - # export cross toolchain - export CC=${CROSSTOOL}gcc - export AS=${CROSSTOOL}as - export AR=${CROSSTOOL}ar - export LD=${CROSSTOOL}ld - export NM=${CROSSTOOL}nm - export RANLIB=${CROSSTOOL}ranlib - export OBJDUMP=${CROSSTOOL}objdump - export STRIP=${CROSSTOOL}strip - - # export cross configure - export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux " - - # Clear LDFLAGS and CFLAGS - export LDFLAGS= - export CFLAGS= -} - -function compile_openssl() -{ - SRC_NAME=openssl-0.9.8zf - PACK_SUFIX=tar.gz - - if [ -f ${PREFIX_PATH}/${IMG_NAME} ] ; then - return 0; - fi - - msg_banner "Start cross compile $SRC_NAME " - - if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then - wget ftp://ftp.openssl.org/source/old/0.9.x//${SRC_NAME}.${PACK_SUFIX} - check_result "ERROR: download ${SRC_NAME} failure" - fi - - tar -xzf ${SRC_NAME}.${PACK_SUFIX} - cd ${SRC_NAME} - - - patch -p1 < ../patch/openssl-0.9.8zf-tls-extensions.patch - - FILE=Makefile - sed -i -e "s|^INSTALLTOP=.*|INSTALLTOP= $PREFIX_PATH|g" ${FILE} - sed -i -e "s|^OPENSSLDIR=.*|OPENSSLDIR= $PREFIX_PATH|g" ${FILE} - sed -i -e "s|^CC=.*|CC= ${CROSSTOOL}gcc|g" ${FILE} - sed -i -e "s|^AR=.*|AR= ar \$(ARFLAGS) r|g" ${FILE} - sed -i -e "s|^ARD=.*|ARD= ar \$(ARFLAGS) d|g" ${FILE} - sed -i -e "s|^RANLIB=.*|RANLIB= ${CROSSTOOL}ranlib|g" ${FILE} - sed -i -e "s|^OPTIONS=.*|CC= ${CROSSTOOL}gcc|g" ${FILE} - - make && make install - check_result "ERROR: compile ${SRC_NAME} failure" - - cd - -} - - -export_cross - -compile_openssl - - diff --git a/3rdpart/mqtt/openssl/patch/openssl-0.9.8zf-tls-extensions.patch b/3rdpart/mqtt/openssl/patch/openssl-0.9.8zf-tls-extensions.patch deleted file mode 100644 index 3a8f90e..0000000 --- a/3rdpart/mqtt/openssl/patch/openssl-0.9.8zf-tls-extensions.patch +++ /dev/null @@ -1,398 +0,0 @@ -This patch adds support for TLS SessionTicket extension (RFC 5077) for -the parts used by EAP-FAST (RFC 4851). - -This is based on the patch from Alexey Kobozev <akobozev@cisco.com> -(sent to openssl-dev mailing list on Tue, 07 Jun 2005 15:40:58 +0300). - -OpenSSL 0.9.8zf does not enable TLS extension support by default, so it -will need to be enabled by adding enable-tlsext to config script -command line. - - -diff -upr openssl-0.9.8zf.orig/ssl/s3_clnt.c openssl-0.9.8zf/ssl/s3_clnt.c ---- openssl-0.9.8zf.orig/ssl/s3_clnt.c 2015-03-19 15:46:46.000000000 +0200 -+++ openssl-0.9.8zf/ssl/s3_clnt.c 2015-03-24 16:19:14.043911769 +0200 -@@ -760,6 +760,23 @@ int ssl3_get_server_hello(SSL *s) - goto f_err; - } - -+#ifndef OPENSSL_NO_TLSEXT -+ /* check if we want to resume the session based on external pre-shared secret */ -+ if (s->version >= TLS1_VERSION && s->tls_session_secret_cb) { -+ SSL_CIPHER *pref_cipher = NULL; -+ -+ s->session->master_key_length = sizeof(s->session->master_key); -+ if (s->tls_session_secret_cb(s, s->session->master_key, -+ &s->session->master_key_length, -+ NULL, &pref_cipher, -+ s->tls_session_secret_cb_arg)) { -+ s->session->cipher = pref_cipher ? -+ pref_cipher : ssl_get_cipher_by_char(s, p + j); -+ s->s3->flags |= SSL3_FLAGS_CCS_OK; -+ } -+ } -+#endif /* OPENSSL_NO_TLSEXT */ -+ - if (j != 0 && j == s->session->session_id_length - && memcmp(p, s->session->session_id, j) == 0) { - if (s->sid_ctx_length != s->session->sid_ctx_length -@@ -2684,12 +2701,8 @@ int ssl3_check_finished(SSL *s) - { - int ok; - long n; -- /* -- * If we have no ticket or session ID is non-zero length (a match of a -- * non-zero session length would never reach here) it cannot be a resumed -- * session. -- */ -- if (!s->session->tlsext_tick || s->session->session_id_length) -+ /* If we have no ticket it cannot be a resumed session. */ -+ if (!s->session->tlsext_tick) - return 1; - /* - * this function is called when we really expect a Certificate message, -diff -upr openssl-0.9.8zf.orig/ssl/s3_srvr.c openssl-0.9.8zf/ssl/s3_srvr.c ---- openssl-0.9.8zf.orig/ssl/s3_srvr.c 2015-03-19 15:46:46.000000000 +0200 -+++ openssl-0.9.8zf/ssl/s3_srvr.c 2015-03-24 16:23:34.567909681 +0200 -@@ -999,6 +999,59 @@ int ssl3_get_client_hello(SSL *s) - SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_CLIENTHELLO_TLSEXT); - goto err; - } -+ -+ /* Check if we want to use external pre-shared secret for this -+ * handshake for not reused session only. We need to generate -+ * server_random before calling tls_session_secret_cb in order to allow -+ * SessionTicket processing to use it in key derivation. */ -+ { -+ unsigned long Time; -+ unsigned char *pos; -+ Time = (unsigned long)time(NULL); /* Time */ -+ pos = s->s3->server_random; -+ l2n(Time, pos); -+ if (RAND_pseudo_bytes(pos, SSL3_RANDOM_SIZE - 4) <= 0) { -+ al = SSL_AD_INTERNAL_ERROR; -+ goto f_err; -+ } -+ } -+ -+ if (!s->hit && s->version >= TLS1_VERSION && s->tls_session_secret_cb) { -+ SSL_CIPHER *pref_cipher = NULL; -+ -+ s->session->master_key_length = sizeof(s->session->master_key); -+ if (s->tls_session_secret_cb(s, s->session->master_key, -+ &s->session->master_key_length, -+ ciphers, &pref_cipher, -+ s->tls_session_secret_cb_arg)) { -+ s->hit = 1; -+ s->session->ciphers = ciphers; -+ s->session->verify_result = X509_V_OK; -+ -+ ciphers = NULL; -+ -+ /* check if some cipher was preferred by call back */ -+ pref_cipher = pref_cipher ? pref_cipher : -+ ssl3_choose_cipher(s, s->session->ciphers, -+ SSL_get_ciphers(s)); -+ if (pref_cipher == NULL) { -+ al = SSL_AD_HANDSHAKE_FAILURE; -+ SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_NO_SHARED_CIPHER); -+ goto f_err; -+ } -+ -+ s->session->cipher = pref_cipher; -+ -+ if (s->cipher_list) -+ sk_SSL_CIPHER_free(s->cipher_list); -+ -+ if (s->cipher_list_by_id) -+ sk_SSL_CIPHER_free(s->cipher_list_by_id); -+ -+ s->cipher_list = sk_SSL_CIPHER_dup(s->session->ciphers); -+ s->cipher_list_by_id = sk_SSL_CIPHER_dup(s->session->ciphers); -+ } -+ } - #endif - /* - * Worst case, we will use the NULL compression, but if we have other -@@ -1143,15 +1196,21 @@ int ssl3_send_server_hello(SSL *s) - unsigned char *buf; - unsigned char *p, *d; - int i, sl; -- unsigned long l, Time; -+ unsigned long l; -+#ifdef OPENSSL_NO_TLSEXT -+ unsigned long Time; -+#endif - - if (s->state == SSL3_ST_SW_SRVR_HELLO_A) { - buf = (unsigned char *)s->init_buf->data; -+#ifdef OPENSSL_NO_TLSEXT - p = s->s3->server_random; -+ /* Generate server_random if it was not needed previously */ - Time = (unsigned long)time(NULL); /* Time */ - l2n(Time, p); - if (RAND_pseudo_bytes(p, SSL3_RANDOM_SIZE - 4) <= 0) - return -1; -+#endif - /* Do the message type and length last */ - d = p = &(buf[4]); - -diff -upr openssl-0.9.8zf.orig/ssl/ssl_err.c openssl-0.9.8zf/ssl/ssl_err.c ---- openssl-0.9.8zf.orig/ssl/ssl_err.c 2015-03-19 15:46:46.000000000 +0200 -+++ openssl-0.9.8zf/ssl/ssl_err.c 2015-03-24 16:35:58.627903717 +0200 -@@ -316,6 +316,7 @@ static ERR_STRING_DATA SSL_str_functs[] - {ERR_FUNC(SSL_F_TLS1_ENC), "TLS1_ENC"}, - {ERR_FUNC(SSL_F_TLS1_SETUP_KEY_BLOCK), "TLS1_SETUP_KEY_BLOCK"}, - {ERR_FUNC(SSL_F_WRITE_PENDING), "WRITE_PENDING"}, -+ {ERR_FUNC(SSL_F_SSL_SET_SESSION_TICKET_EXT), "SSL_set_session_ticket_ext"}, - {0, NULL} - }; - -diff -upr openssl-0.9.8zf.orig/ssl/ssl.h openssl-0.9.8zf/ssl/ssl.h ---- openssl-0.9.8zf.orig/ssl/ssl.h 2015-03-19 15:46:46.000000000 +0200 -+++ openssl-0.9.8zf/ssl/ssl.h 2015-03-24 16:25:44.339908641 +0200 -@@ -349,6 +349,7 @@ extern "C" { - * function parameters used to prototype callbacks in SSL_CTX. - */ - typedef struct ssl_st *ssl_crock_st; -+typedef struct tls_session_ticket_ext_st TLS_SESSION_TICKET_EXT; - - /* used to hold info on the particular ciphers used */ - typedef struct ssl_cipher_st { -@@ -366,6 +367,12 @@ typedef struct ssl_cipher_st { - - DECLARE_STACK_OF(SSL_CIPHER) - -+typedef int (*tls_session_ticket_ext_cb_fn)(SSL *s, const unsigned char *data, -+ int len, void *arg); -+typedef int (*tls_session_secret_cb_fn)(SSL *s, void *secret, int *secret_len, -+ STACK_OF(SSL_CIPHER) *peer_ciphers, -+ SSL_CIPHER **cipher, void *arg); -+ - /* Used to hold functions for SSLv2 or SSLv3/TLSv1 functions */ - typedef struct ssl_method_st { - int version; -@@ -1116,6 +1123,18 @@ struct ssl_st { - int tlsext_ocsp_resplen; - /* RFC4507 session ticket expected to be received or sent */ - int tlsext_ticket_expected; -+ -+ /* TLS Session Ticket extension override */ -+ TLS_SESSION_TICKET_EXT *tlsext_session_ticket; -+ -+ /* TLS Session Ticket extension callback */ -+ tls_session_ticket_ext_cb_fn tls_session_ticket_ext_cb; -+ void *tls_session_ticket_ext_cb_arg; -+ -+ /* TLS pre-shared secret session resumption */ -+ tls_session_secret_cb_fn tls_session_secret_cb; -+ void *tls_session_secret_cb_arg; -+ - SSL_CTX *initial_ctx; /* initial ctx, used to store sessions */ - # define session_ctx initial_ctx - # else -@@ -1772,6 +1791,17 @@ void *SSL_COMP_get_compression_methods(v - int SSL_COMP_add_compression_method(int id, void *cm); - # endif - -+/* TLS extensions functions */ -+int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len); -+ -+int SSL_set_session_ticket_ext_cb(SSL *s, tls_session_ticket_ext_cb_fn cb, -+ void *arg); -+ -+/* Pre-shared secret session resumption functions */ -+int SSL_set_session_secret_cb(SSL *s, -+ tls_session_secret_cb_fn tls_session_secret_cb, -+ void *arg); -+ - /* BEGIN ERROR CODES */ - /* - * The following lines are auto generated by the script mkerr.pl. Any changes -@@ -1977,6 +2007,7 @@ void ERR_load_SSL_strings(void); - # define SSL_F_TLS1_ENC 210 - # define SSL_F_TLS1_SETUP_KEY_BLOCK 211 - # define SSL_F_WRITE_PENDING 212 -+#define SSL_F_SSL_SET_SESSION_TICKET_EXT 213 - - /* Reason codes. */ - # define SSL_R_APP_DATA_IN_HANDSHAKE 100 -diff -upr openssl-0.9.8zf.orig/ssl/ssl_sess.c openssl-0.9.8zf/ssl/ssl_sess.c ---- openssl-0.9.8zf.orig/ssl/ssl_sess.c 2015-03-19 15:46:46.000000000 +0200 -+++ openssl-0.9.8zf/ssl/ssl_sess.c 2015-03-24 16:28:04.819907515 +0200 -@@ -716,6 +716,61 @@ long SSL_CTX_get_timeout(const SSL_CTX * - return (s->session_timeout); - } - -+#ifndef OPENSSL_NO_TLSEXT -+int SSL_set_session_secret_cb( -+ SSL *s, -+ int (*tls_session_secret_cb)(SSL *s, void *secret, int *secret_len, -+ STACK_OF(SSL_CIPHER) *peer_ciphers, -+ SSL_CIPHER **cipher, void *arg), void *arg) -+{ -+ if (s == NULL) -+ return 0; -+ s->tls_session_secret_cb = tls_session_secret_cb; -+ s->tls_session_secret_cb_arg = arg; -+ return 1; -+} -+ -+int SSL_set_session_ticket_ext_cb(SSL *s, tls_session_ticket_ext_cb_fn cb, -+ void *arg) -+{ -+ if (s == NULL) -+ return 0; -+ s->tls_session_ticket_ext_cb = cb; -+ s->tls_session_ticket_ext_cb_arg = arg; -+ return 1; -+} -+ -+int SSL_set_session_ticket_ext(SSL *s, void *ext_data, int ext_len) -+{ -+ if (s->version >= TLS1_VERSION) { -+ if (s->tlsext_session_ticket) { -+ OPENSSL_free(s->tlsext_session_ticket); -+ s->tlsext_session_ticket = NULL; -+ } -+ -+ s->tlsext_session_ticket = OPENSSL_malloc( -+ sizeof(TLS_SESSION_TICKET_EXT) + ext_len); -+ if (!s->tlsext_session_ticket) { -+ SSLerr(SSL_F_SSL_SET_SESSION_TICKET_EXT, ERR_R_MALLOC_FAILURE); -+ return 0; -+ } -+ -+ if (ext_data) { -+ s->tlsext_session_ticket->length = ext_len; -+ s->tlsext_session_ticket->data = s->tlsext_session_ticket + 1; -+ memcpy(s->tlsext_session_ticket->data, ext_data, ext_len); -+ } else { -+ s->tlsext_session_ticket->length = 0; -+ s->tlsext_session_ticket->data = NULL; -+ } -+ -+ return 1; -+ } -+ -+ return 0; -+} -+#endif /* OPENSSL_NO_TLSEXT */ -+ - typedef struct timeout_param_st { - SSL_CTX *ctx; - long time; -diff -upr openssl-0.9.8zf.orig/ssl/t1_lib.c openssl-0.9.8zf/ssl/t1_lib.c ---- openssl-0.9.8zf.orig/ssl/t1_lib.c 2015-03-19 15:46:46.000000000 +0200 -+++ openssl-0.9.8zf/ssl/t1_lib.c 2015-03-24 16:32:46.923905254 +0200 -@@ -108,6 +108,11 @@ int tls1_new(SSL *s) - - void tls1_free(SSL *s) - { -+#ifndef OPENSSL_NO_TLSEXT -+ if (s->tlsext_session_ticket) { -+ OPENSSL_free(s->tlsext_session_ticket); -+ } -+#endif - ssl3_free(s); - } - -@@ -206,8 +211,20 @@ unsigned char *ssl_add_clienthello_tlsex - int ticklen; - if (!s->new_session && s->session && s->session->tlsext_tick) - ticklen = s->session->tlsext_ticklen; -- else -+ else if (s->session && s->tlsext_session_ticket && -+ s->tlsext_session_ticket->data) { -+ ticklen = s->tlsext_session_ticket->length; -+ s->session->tlsext_tick = OPENSSL_malloc(ticklen); -+ if (!s->session->tlsext_tick) -+ return NULL; -+ memcpy(s->session->tlsext_tick, s->tlsext_session_ticket->data, -+ ticklen); -+ s->session->tlsext_ticklen = ticklen; -+ } else - ticklen = 0; -+ if (ticklen == 0 && s->tlsext_session_ticket && -+ s->tlsext_session_ticket->data == NULL) -+ goto skip_ext; - /* - * Check for enough room 2 for extension type, 2 for len rest for - * ticket -@@ -221,6 +238,7 @@ unsigned char *ssl_add_clienthello_tlsex - ret += ticklen; - } - } -+skip_ext: - - if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp && - s->version != DTLS1_VERSION) { -@@ -560,6 +578,14 @@ int ssl_parse_clienthello_tlsext(SSL *s, - if (!ssl_parse_clienthello_renegotiate_ext(s, data, size, al)) - return 0; - renegotiate_seen = 1; -+ } else if (type == TLSEXT_TYPE_session_ticket) { -+ if (s->tls_session_ticket_ext_cb && -+ !s->tls_session_ticket_ext_cb(s, data, size, -+ s->tls_session_ticket_ext_cb_arg)) -+ { -+ *al = TLS1_AD_INTERNAL_ERROR; -+ return 0; -+ } - } else if (type == TLSEXT_TYPE_status_request && - s->version != DTLS1_VERSION && s->ctx->tlsext_status_cb) { - -@@ -710,6 +736,13 @@ int ssl_parse_serverhello_tlsext(SSL *s, - } - tlsext_servername = 1; - } else if (type == TLSEXT_TYPE_session_ticket) { -+ if (s->tls_session_ticket_ext_cb && -+ !s->tls_session_ticket_ext_cb( -+ s, data, size, -+ s->tls_session_ticket_ext_cb_arg)) { -+ *al = TLS1_AD_INTERNAL_ERROR; -+ return 0; -+ } - if ((SSL_get_options(s) & SSL_OP_NO_TICKET) - || (size > 0)) { - *al = TLS1_AD_UNSUPPORTED_EXTENSION; -@@ -993,6 +1026,14 @@ int tls1_process_ticket(SSL *s, unsigned - s->tlsext_ticket_expected = 1; - return 0; /* Cache miss */ - } -+ if (s->tls_session_secret_cb) { -+ /* Indicate cache miss here and instead of -+ * generating the session from ticket now, -+ * trigger abbreviated handshake based on -+ * external mechanism to calculate the master -+ * secret later. */ -+ return 0; -+ } - return tls_decrypt_ticket(s, p, size, session_id, len, ret); - } - p += size; -diff -upr openssl-0.9.8zf.orig/ssl/tls1.h openssl-0.9.8zf/ssl/tls1.h ---- openssl-0.9.8zf.orig/ssl/tls1.h 2015-03-19 15:46:46.000000000 +0200 -+++ openssl-0.9.8zf/ssl/tls1.h 2015-03-24 16:33:31.855904894 +0200 -@@ -460,6 +460,12 @@ SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_T - # define TLS_MD_MASTER_SECRET_CONST "\x6d\x61\x73\x74\x65\x72\x20\x73\x65\x63\x72\x65\x74" - # endif - -+/* TLS extension struct */ -+struct tls_session_ticket_ext_st { -+ unsigned short length; -+ void *data; -+}; -+ - #ifdef __cplusplus - } - #endif -diff -upr openssl-0.9.8zf.orig/util/ssleay.num openssl-0.9.8zf/util/ssleay.num ---- openssl-0.9.8zf.orig/util/ssleay.num 2015-03-19 15:47:15.000000000 +0200 -+++ openssl-0.9.8zf/util/ssleay.num 2015-03-24 16:33:51.127904739 +0200 -@@ -242,3 +242,5 @@ SSL_set_SSL_CTX - SSL_get_servername 291 EXIST::FUNCTION:TLSEXT - SSL_get_servername_type 292 EXIST::FUNCTION:TLSEXT - SSL_CTX_set_client_cert_engine 293 EXIST::FUNCTION:ENGINE -+SSL_set_session_ticket_ext 306 EXIST::FUNCTION:TLSEXT -+SSL_set_session_secret_cb 307 EXIST::FUNCTION:TLSEXT diff --git a/3rdpart/mqtt/paho.mqtt/build.sh b/3rdpart/mqtt/paho.mqtt/build.sh deleted file mode 100755 index 7fb3625..0000000 --- a/3rdpart/mqtt/paho.mqtt/build.sh +++ /dev/null @@ -1,111 +0,0 @@ -#!/bin/bash - -#+-------------------------------------------------------------------------------------------- -#|Description: This shell script used download and compile paho.mqtt for ARM -#| Author: GuoWenxue <guowenxue@gmail.com> -#| ChangeLog: -#| 1, Initialize 1.0.0 on 2011.04.12 -#+-------------------------------------------------------------------------------------------- - -PREFIX_PATH=`pwd`/install -OPENSSL_PATH=`pwd`/../openssl/install/ - -if [ -z $CROSSTOOL ] ; then - CROSSTOOL=/opt/rpi/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -fi - -function msg_banner() -{ - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" -} - -function check_result() -{ - if [ $? != 0 ] ; then - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" - exit ; - fi -} - -function export_cross() -{ - # export cross toolchain - export CC=${CROSSTOOL}gcc - export AS=${CROSSTOOL}as - export AR=${CROSSTOOL}ar - export LD=${CROSSTOOL}ld - export NM=${CROSSTOOL}nm - export RANLIB=${CROSSTOOL}ranlib - export OBJDUMP=${CROSSTOOL}objdump - export STRIP=${CROSSTOOL}strip - - # export cross configure - export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux " - - # Clear LDFLAGS and CFLAGS - export LDFLAGS= - export CFLAGS= -} - -function compile_paho() -{ - SRC_NAME=paho.mqtt.c-1.2.1 - PACK_SUFIX=tar.gz - - if [ -f ${PREFIX_PATH}/ethtool ] ; then - return 0; - fi - - msg_banner "Start cross compile $SRC_NAME " - - if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then - wget https://github.com/eclipse/paho.mqtt.c/archive/v1.2.1.tar.gz -O ${SRC_NAME}.${PACK_SUFIX} - check_result "ERROR: download ${SRC_NAME} failure" - fi - - tar -xzf ${SRC_NAME}.${PACK_SUFIX} - cd ${SRC_NAME} - - export CFLAGS=-I${OPENSSL_PATH}/include - export LDFLAGS=-L${OPENSSL_PATH}/lib - - mkdir -p ${PREFIX_PATH}/usr/local/{bin,include,lib} - make && make install DESTDIR=${PREFIX_PATH} - - cp -af build/output/samples/ ${PREFIX_PATH}/ - - cd ${PREFIX_PATH}/usr/local/lib - ln -s libpaho-mqtt3a.so.1.0 libpaho-mqtt3a.so.1 - ln -s libpaho-mqtt3as.so.1.0 libpaho-mqtt3as.so.1 - ln -s libpaho-mqtt3c.so.1.0 libpaho-mqtt3c.so.1 - ln -s libpaho-mqtt3cs.so.1.0 libpaho-mqtt3cs.so.1 - tar -cf libpaho-mqtt.tar * - mv libpaho-mqtt.tar ${PREFIX_PATH} - cd - - - - check_result "ERROR: compile ${SRC_NAME} failure" - - cd - -} - - -export_cross - -if [ ! -d ${OPENSSL_PATH}/include ] ; then - cd ../openssl - ./build.sh - cd - -fi - -compile_paho - - diff --git a/3rdpart/qt/build.sh b/3rdpart/qt/build.sh deleted file mode 100755 index 2eb9daa..0000000 --- a/3rdpart/qt/build.sh +++ /dev/null @@ -1,95 +0,0 @@ -#!/bin/bash - -#+-------------------------------------------------------------------------------------------- -#|Description: This shell script used download and compile QT5 for ARM -#| Author: GuoWenxue <guowenxue@gmail.com> -#| ChangeLog: -#| 1, Initialize 1.0.0 on 2011.04.12 -#+-------------------------------------------------------------------------------------------- - -PREFIX_PATH=`pwd`/ -QT_INST_PATH=/apps/qt5/ - -if [ -z $CROSSTOOL ] ; then - CROSSTOOL=/opt/rpi/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -fi - -function msg_banner() -{ - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" -} - -function check_result() -{ - if [ $? != 0 ] ; then - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" - exit ; - fi -} - -function export_cross() -{ - # export cross toolchain - export CC=${CROSSTOOL}gcc - export AS=${CROSSTOOL}as - export AR=${CROSSTOOL}ar - export LD=${CROSSTOOL}ld - export NM=${CROSSTOOL}nm - export RANLIB=${CROSSTOOL}ranlib - export OBJDUMP=${CROSSTOOL}objdump - export STRIP=${CROSSTOOL}strip - - # export cross configure - export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux " - - # Clear LDFLAGS and CFLAGS - export LDFLAGS= - export CFLAGS= -} - -function compile_qt() -{ - SRC_NAME=qt-everywhere-opensource-src-5.6.1 - PACK_SUFIX=tar.xz - - if [ -f ${PREFIX_PATH}/ethtool ] ; then - return 0; - fi - - msg_banner "Start cross compile $SRC_NAME " - - if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then - wget http://mirrors.ustc.edu.cn/qtproject/archive/qt/5.6/5.6.1/single/${SRC_NAME}.${PACK_SUFIX} - check_result "ERROR: download ${SRC_NAME} failure" - fi - - xz -dk ${SRC_NAME}.${PACK_SUFIX} && tar -xf ${SRC_NAME}.tar && rm -f ${SRC_NAME}.tar - cd ${SRC_NAME} - - sed -i "s|arm-linux-gnueabi-|$CROSSTOOL|" qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf - - ./configure -opensource -confirm-license -release -shared -strip -prefix ${QT_INST_PATH} -no-c++11 \ --xplatform linux-arm-gnueabi-g++ -no-opengl -qt-freetype -no-avx -make libs -optimized-qmake \ --qt-zlib -no-gif -qt-libpng -qt-libjpeg -no-openssl -no-cups -no-dbus -linuxfb -pch -qt-sql-sqlite \ --no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-rpath -no-glib -qreal float -no-xcb \ --no-xcursor -no-xfixes -no-xrandr -no-xrender -no-separate-debug-info -nomake tools -nomake examples - check_result "ERROR: configure ${SRC_NAME} failure" - - make -j8 && make install - check_result "ERROR: compile ${SRC_NAME} failure" - - cd - -} - - -compile_qt - - diff --git a/3rdparty/arm/build.sh b/3rdparty/arm/build.sh new file mode 100755 index 0000000..5b982b5 --- /dev/null +++ b/3rdparty/arm/build.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +ARCH=`uname -m` + +echo ${ARCH} | grep "arm" > /dev/null +if [ $? != 0 ] ; then + echo "+---------------------------------------------------+" + echo "| ERROR: This folder must compile on RaspberryPi |"; + echo "+---------------------------------------------------+" + exit 1; +fi + + +function do_compile +{ + for dir in `ls` + do + if [ -f $dir/build*.sh ] ; then + cd $dir + ./build*.sh + cd - + fi + done +} + +function do_clean +{ + for dir in `ls` + do + if [ -f $dir/build*.sh ] ; then + rm -rf ${dir}/${dir}* + fi + done + + rm -rf install +} + +if [[ $# == 1 ]] && [[ $1 == "clean" ]] ; then + do_clean + exit; +fi + +do_compile + + diff --git a/3rdparty/arm/cjson/build.sh b/3rdparty/arm/cjson/build.sh new file mode 100755 index 0000000..5edf8f4 --- /dev/null +++ b/3rdparty/arm/cjson/build.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +#+-------------------------------------------------------------------------------------------- +#|Description: This shell script used download and compile cJSON for RaspberryPi +#| Author: GuoWenxue <guowenxue@gmail.com> +#| ChangeLog: +#| 1, Initialize 1.0.0 on 2021.04.12 +#+-------------------------------------------------------------------------------------------- + +PREFIX_PATH=/usr +LYFTP_SRC=ftp://master.iot-yun.club/src/ + +function msg_banner() +{ + echo "" + echo "+-----------------------------------------------------------------------" + echo "| $1 " + echo "+-----------------------------------------------------------------------" + echo "" +} + +function check_result() +{ + if [ $? != 0 ] ; then + echo "" + echo "+-----------------------------------------------------------------------" + echo "| $1 " + echo "+-----------------------------------------------------------------------" + echo "" + exit ; + fi +} + +function compile_cJSON() +{ + SRC_NAME=cJSON-1.7.15 + PACK_SUFIX=tar.gz + IMG_NAME=ipt + + if [ -f ${PREFIX_PATH}/lib/libcjson.so ] ; then + msg_banner "$SRC_NAME already compile and installed" + return 0; + fi + + msg_banner "Start compile $SRC_NAME " + + if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then + #wget https://github.com/downloads/libevent/libevent/${SRC_NAME}.${PACK_SUFIX} + wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX} + check_result "ERROR: download ${SRC_NAME} failure" + fi + + tar -xzf ${SRC_NAME}.${PACK_SUFIX} + check_result "ERROR: decompress ${SRC_NAME} failure" + + cd ${SRC_NAME} + + make && sudo make install + check_result "ERROR: compile ${SRC_NAME} failure" + + cd - +} + +compile_cJSON + + diff --git a/3rdparty/arm/libevent/build.sh b/3rdparty/arm/libevent/build.sh new file mode 100755 index 0000000..d34ab70 --- /dev/null +++ b/3rdparty/arm/libevent/build.sh @@ -0,0 +1,69 @@ +#!/bin/bash + +#+-------------------------------------------------------------------------------------------- +#|Description: This shell script used download and compile libevent for RaspberryPi +#| Author: GuoWenxue <guowenxue@gmail.com> +#| ChangeLog: +#| 1, Initialize 1.0.0 on 2021.04.12 +#+-------------------------------------------------------------------------------------------- + +PREFIX_PATH=/usr +LYFTP_SRC=ftp://master.iot-yun.club/src/ + +function msg_banner() +{ + echo "" + echo "+-----------------------------------------------------------------------" + echo "| $1 " + echo "+-----------------------------------------------------------------------" + echo "" +} + +function check_result() +{ + if [ $? != 0 ] ; then + echo "" + echo "+-----------------------------------------------------------------------" + echo "| $1 " + echo "+-----------------------------------------------------------------------" + echo "" + exit ; + fi +} + +function compile_libevent() +{ + SRC_NAME=libevent-2.1.11-stable + PACK_SUFIX=tar.gz + IMG_NAME=ipt + + if [ -f ${PREFIX_PATH}/lib/libevent.so ] ; then + msg_banner "$SRC_NAME already compile and installed" + return 0; + fi + + msg_banner "Start compile $SRC_NAME " + + if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then + #wget https://github.com/downloads/libevent/libevent/${SRC_NAME}.${PACK_SUFIX} + wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX} + check_result "ERROR: download ${SRC_NAME} failure" + fi + + tar -xzf ${SRC_NAME}.${PACK_SUFIX} + check_result "ERROR: decompress ${SRC_NAME} failure" + + cd ${SRC_NAME} + + ./configure --prefix=${PREFIX_PATH} --enable-thread-support --enable-openssl --enable-function-sections + check_result "ERROR: configure ${SRC_NAME} failure" + + make && sudo make install + check_result "ERROR: compile ${SRC_NAME} failure" + + cd - +} + +compile_libevent + + diff --git a/3rdparty/arm/libgpiod/build.sh b/3rdparty/arm/libgpiod/build.sh new file mode 100755 index 0000000..3d265f4 --- /dev/null +++ b/3rdparty/arm/libgpiod/build.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +#+-------------------------------------------------------------------------------------------- +#|Description: This shell script used download and compile libgpiod for RaspberryPi +#| Author: GuoWenxue <guowenxue@gmail.com> +#| ChangeLog: +#| 1, Initialize 1.0.0 on 2021.04.12 +#+-------------------------------------------------------------------------------------------- + +PREFIX_PATH=/usr +LYFTP_SRC=ftp://master.iot-yun.club/src/ + +function msg_banner() +{ + echo "" + echo "+-----------------------------------------------------------------------" + echo "| $1 " + echo "+-----------------------------------------------------------------------" + echo "" +} + +function check_result() +{ + if [ $? != 0 ] ; then + echo "" + echo "+-----------------------------------------------------------------------" + echo "| $1 " + echo "+-----------------------------------------------------------------------" + echo "" + exit ; + fi +} + +function compile_libgpiod() +{ + SRC_NAME=libgpiod-1.6.3 + PACK_SUFIX=tar.gz + + if [ -f ${PREFIX_PATH}/lib/libgpiod.so ] ; then + msg_banner "$SRC_NAME already compile and installed" + return 0; + fi + + msg_banner "Start compile $SRC_NAME " + + if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then + #official site: https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git + wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX} + + check_result "ERROR: download ${SRC_NAME} failure" + fi + + tar -xzf ${SRC_NAME}.${PACK_SUFIX} + cd ${SRC_NAME} + + ./autogen.sh && sudo ./configure --prefix=${PREFIX_PATH} --enable-tools + + make && sudo make install + + cd - +} + +compile_libgpiod + + diff --git a/3rdparty/arm/mosquitto/build.sh b/3rdparty/arm/mosquitto/build.sh new file mode 100755 index 0000000..efc334b --- /dev/null +++ b/3rdparty/arm/mosquitto/build.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +#+-------------------------------------------------------------------------------------------- +#|Description: This shell script used download and compile mosquitto for RaspberryPi +#| Author: GuoWenxue <guowenxue@gmail.com> +#| ChangeLog: +#| 1, Initialize 1.0.0 on 2011.04.12 +#+-------------------------------------------------------------------------------------------- + +PREFIX_PATH=/usr/ +LYFTP_SRC=ftp://master.iot-yun.club/src/ + +function msg_banner() +{ + echo "" + echo "+-----------------------------------------------------------------------" + echo "| $1 " + echo "+-----------------------------------------------------------------------" + echo "" +} + +function check_result() +{ + if [ $? != 0 ] ; then + echo "" + echo "+-----------------------------------------------------------------------" + echo "| $1 " + echo "+-----------------------------------------------------------------------" + echo "" + exit ; + fi +} + +function compile_mosquitto() +{ + SRC_NAME=mosquitto-2.0.10 + PACK_SUFIX=tar.gz + + if [ -f ${PREFIX_PATH}/lib/libmosquitto.so ] ; then + msg_banner "$SRC_NAME already compile and installed" + return 0; + fi + + msg_banner "Start compile $SRC_NAME " + + if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then + #wget https://mosquitto.org/files/source//${SRC_NAME}.${PACK_SUFIX} + wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX} + + check_result "ERROR: download ${SRC_NAME} failure" + fi + + tar -xzf ${SRC_NAME}.${PACK_SUFIX} + check_result "ERROR: decompress ${SRC_NAME} failure" + + cd ${SRC_NAME} + + sudo apt install -y libssl1.0-dev + + export DESTDIR=${PREFIX_PATH} + make WITH_SRV=no WITH_UUID=no + check_result "ERROR: compile ${SRC_NAME} failure" + + sudo make prefix=${PREFIX_PATH} install +} + + +compile_mosquitto + + diff --git a/3rdparty/arm/paho.mqtt/build.sh b/3rdparty/arm/paho.mqtt/build.sh new file mode 100755 index 0000000..b3a4c56 --- /dev/null +++ b/3rdparty/arm/paho.mqtt/build.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +#+-------------------------------------------------------------------------------------------- +#|Description: This shell script used download and compile paho.mqtt for RaspberryPi +#| Author: GuoWenxue <guowenxue@gmail.com> +#| ChangeLog: +#| 1, Initialize 1.0.0 on 2011.04.12 +#+-------------------------------------------------------------------------------------------- + +PREFIX_PATH=/usr +LYFTP_SRC=ftp://master.iot-yun.club/src/ + +function msg_banner() +{ + echo "" + echo "+-----------------------------------------------------------------------" + echo "| $1 " + echo "+-----------------------------------------------------------------------" + echo "" +} + +function check_result() +{ + if [ $? != 0 ] ; then + echo "" + echo "+-----------------------------------------------------------------------" + echo "| $1 " + echo "+-----------------------------------------------------------------------" + echo "" + exit ; + fi +} + +function compile_paho() +{ + SRC_NAME=paho.mqtt.c-1.3.9 + PACK_SUFIX=tar.gz + + if [ -f ${PREFIX_PATH}/lib/libpaho-mqtt3a.so ] ; then + msg_banner "$SRC_NAME already compile and installed" + return 0; + fi + + msg_banner "Start compile $SRC_NAME " + + if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then + #wget https://github.com/eclipse/paho.mqtt.c/archive/v1.3.9.tar.gz -O ${SRC_NAME}.${PACK_SUFIX} + wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX} + check_result "ERROR: download ${SRC_NAME} failure" + fi + + tar -xzf ${SRC_NAME}.${PACK_SUFIX} + check_result "ERROR: decompress ${SRC_NAME} failure" + + cd ${SRC_NAME} + + make && sudo make prefix=${PREFIX_PATH} install + + check_result "ERROR: compile ${SRC_NAME} failure" + + cd - +} + +compile_paho + + diff --git a/3rdparty/arm/ppp/build.sh b/3rdparty/arm/ppp/build.sh new file mode 100755 index 0000000..5dda0d9 --- /dev/null +++ b/3rdparty/arm/ppp/build.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +#+-------------------------------------------------------------------------------------------- +#|Description: This shell script used download and compile pppd for RaspberryPi +#| Author: GuoWenxue <guowenxue@gmail.com> +#| ChangeLog: +#| 1, Initialize 1.0.0 on 2011.04.12 +#+-------------------------------------------------------------------------------------------- + +PREFIX_PATH=`pwd`/../install +LYFTP_SRC=ftp://master.iot-yun.club/src/ + +function msg_banner() +{ + echo "" + echo "+-----------------------------------------------------------------------" + echo "| $1 " + echo "+-----------------------------------------------------------------------" + echo "" +} + +function check_result() +{ + if [ $? != 0 ] ; then + echo "" + echo "+-----------------------------------------------------------------------" + echo "| $1 " + echo "+-----------------------------------------------------------------------" + echo "" + exit ; + fi +} + +function compile_pppd() +{ + SRC_NAME=ppp-2.4.9 + PACK_SUFIX=tar.gz + + if [ -f ${PREFIX_PATH}//usr/local/sbin/pppd ] ; then + msg_banner "$SRC_NAME already compile and installed" + return 0; + fi + + msg_banner "Start cross compile $SRC_NAME " + + if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then + #wget https://download.samba.org/pub/ppp/${SRC_NAME}.${PACK_SUFIX} + wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX} + check_result "ERROR: download ${SRC_NAME} failure" + fi + + rm -rf ${SRC_NAME} + tar -xzf ${SRC_NAME}.${PACK_SUFIX} + check_result "ERROR: decompress ${SRC_NAME} failure" + + cd ${SRC_NAME} + + ./configure + sed -i -e 's|^FILTER=y.*|#FILTER=y|' pppd/Makefile + make && make install INSTROOT=${PREFIX_PATH} + + check_result "ERROR: compile ${SRC_NAME} failure" + + cd - +} + + +compile_pppd + + diff --git a/3rdparty/build.sh b/3rdparty/build.sh new file mode 100755 index 0000000..210ca38 --- /dev/null +++ b/3rdparty/build.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +ARCH=`uname -m` + +function msg_banner() +{ + echo "" + echo "+-----------------------------------------------------------------------" + echo "| $1 " + echo "+-----------------------------------------------------------------------" + echo "" +} + +echo ${ARCH} | grep "arm" > /dev/null +if [ $? == 0 ] ; then + msg_banner "Start local compile on RaspberryPi..." + cd arm && bash build.sh + exit 0; +fi + +echo ${ARCH} | grep "x86" > /dev/null +if [ $? == 0 ] ; then + msg_banner "Start cross compile on x86 server..." + cd x86 && bash build.sh + exit 0; +fi + + diff --git a/3rdpart/appweb/build.sh b/3rdparty/x86/appweb/build.sh similarity index 70% rename from 3rdpart/appweb/build.sh rename to 3rdparty/x86/appweb/build.sh index dd4c8d6..933a892 100755 --- a/3rdpart/appweb/build.sh +++ b/3rdparty/x86/appweb/build.sh @@ -7,15 +7,17 @@ #| 1, Initialize 1.0.0 on 2011.04.12 #+-------------------------------------------------------------------------------------------- +CROSS_COMPILE=yes +LYFTP_SRC=ftp://master.iot-yun.club/src/ + PRJ_PATH=`pwd` -PREFIX_PATH=`pwd`/appweb -BOARD=RPI +PREFIX_PATH=${PRJ_PATH}/appweb + +BOARD=RPi mkdir -p $PREFIX_PATH/{bin,modules} -if [ -z $CROSSTOOL ] ; then - CROSSTOOL=/opt/rpi/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -fi +CROSSTOOL=arm-linux-gnueabihf- function msg_banner() { @@ -51,7 +53,9 @@ export STRIP=${CROSSTOOL}strip # export cross configure - export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux " + if [ "$CROSS_COMPILE" = "yes" ] ; then + export CONFIG_CROSS=" --build=x86_64-pc-linux --host=arm-linux " + fi # Clear LDFLAGS and CFLAGS export LDFLAGS= @@ -71,7 +75,8 @@ msg_banner "Start cross compile $SRC_NAME " if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then - wget http://museum.php.net/php5/${SRC_NAME}.${PACK_SUFIX} + #wget http://museum.php.net/php5/${SRC_NAME}.${PACK_SUFIX} + wget $LYFTP_SRC/$SRC_NAME.$PACK_SUFIX check_result "ERROR: download ${SRC_NAME} failure" fi @@ -111,7 +116,7 @@ function compile_appweb() { SRC_NAME=appweb-3.4.2 - PACK_SUFIX=-0-src.tgz + PACK_SUFIX=tar.gz if [ -f ${PREFIX_PATH}/bin/appweb ] ; then return 0; @@ -119,12 +124,13 @@ msg_banner "Start cross compile $SRC_NAME " - if [ ! -f ${SRC_NAME}${PACK_SUFIX} ] ; then - wget https://embedthis.com/software/${SRC_NAME}${PACK_SUFIX} + if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then + #wget https://embedthis.com/software/${SRC_NAME}${PACK_SUFIX} + wget $LYFTP_SRC/$SRC_NAME.$PACK_SUFIX check_result "ERROR: download ${SRC_NAME} failure" fi - tar -xzf ${SRC_NAME}${PACK_SUFIX} + tar -xzf ${SRC_NAME}.${PACK_SUFIX} cd ${SRC_NAME} ./configure --prefix=${PREFIX_PATH} ${CONFIG_CROSS} --type=RELEASE --static --port=80 --enable-assert \ @@ -146,35 +152,78 @@ function install_appweb() { + SCRIPTS=s80Appweb msg_banner "Start install webserver appweb " cd ${PRJ_PATH} # install web page rm -rf $PREFIX_PATH/web - cp -rf web $PREFIX_PATH + if [ -f web.tar.gz ] ; then + tar -xzf web.tar.gz -C $PREFIX_PATH + fi - sed -i -e "s|^Listen 4100|Listen 80|g" $PREFIX_PATH/appweb.conf + sed -i -e "s|^Listen 4100|Listen 5000|g" $PREFIX_PATH/appweb.conf + sed -i -e "s|^DirectoryIndex.*|DirectoryIndex index.php|g" $PREFIX_PATH/appweb.conf sed -i -e 's|^LoadModulePath "../modules"|LoadModulePath "./modules"|g' $PREFIX_PATH/appweb.conf set -x - cat << EOF > run.sh +cat << 'EOF' > ${SCRIPTS} #!/bin/sh -APPWEB_PATH=/apps/appweb -export LD_LIBRARY_PATH=\${LD_LIBRARY_PATH}:\${APPWEB_PATH}/modules -cd \${APPWEB_PATH} -./bin/appweb --config appweb.conf & +# +# Start/stop appweb +# + +APP_NAME=appweb + +WORK_PATH=/apps/appweb + +DAEMON=${WORK_PATH}/bin/appweb +CONFIG=${WORK_PATH}/appweb.conf +PIDFILE=/tmp/${APP_NAME}.pid + +export PATH=${PATH}:${WORK_PATH}/bin +export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${WORK_PATH}/modules +cd ${WORK_PATH} + +[ -f $CONFIG ] || exit 0 + +case "$1" in + start) + echo "Starting ${APP_NAME}..." + start-stop-daemon -S -b -m -x "$DAEMON" -p "$PIDFILE" -- --config "$CONFIG" + ;; + stop) + echo "Stopping ${APP_NAME}..." + start-stop-daemon -K -x "$DAEMON" -p "$PIDFILE" -o + ;; + restart) + "$0" stop + sleep 1 # Prevent race condition: ensure dhcpcd stops before start. + "$0" start + ;; + *) + echo "Usage: $0 {start|stop|restart}" + exit 1 +esac + EOF - chmod 755 run.sh - mv run.sh $PREFIX_PATH/ + chmod 755 ${SCRIPTS} + mv ${SCRIPTS} $PREFIX_PATH/ - tar -czf appweb_${BOARD}.tar.gz `basename $PREFIX_PATH` - ls -l appweb_${BOARD}.tar.gz + tar -czf appweb-${BOARD}.tar.gz `basename $PREFIX_PATH` + ls -l appweb-${BOARD}.tar.gz } +if [[ $# == 1 ]] && [[ $1 == "clean" ]] ; then + rm -rf appweb* + rm -rf php* + exit; +fi + export_cross compile_php diff --git a/3rdparty/x86/appweb/web.tar.gz b/3rdparty/x86/appweb/web.tar.gz new file mode 100644 index 0000000..cfb8e18 --- /dev/null +++ b/3rdparty/x86/appweb/web.tar.gz Binary files differ diff --git a/3rdparty/x86/build.sh b/3rdparty/x86/build.sh new file mode 100755 index 0000000..b65b4b5 --- /dev/null +++ b/3rdparty/x86/build.sh @@ -0,0 +1,77 @@ +#!/bin/bash + +CROSSTOOL=arm-linux-gnueabihf- + +# display in red +function pr_error() { + echo "" + echo -e "\033[40;31m --E-- $1 \033[0m" + echo "" +} + +# display in yellow +function pr_warn() { + echo "" + echo -e "\033[40;33m --W-- $1 \033[0m" + echo "" +} + +# display in green +function pr_info() { + echo -e "\033[40;32m --I-- $1 \033[0m" +} + +function check_depend() +{ + ARCH=`uname -m` + echo ${ARCH} | grep "x86" > /dev/null + if [ $? != 0 ] ; then + pr_error "This folder must compile on X86 server "; + exit 1; + fi + + + ${CROSSTOOL}g++ -v > /dev/null 2>&1 + if [ $? != 0 ] ; then + pr_error "Crosstool not installed, please install it by follow command:" + pr_info "sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf" + exit 1; + fi +} + +function do_compile +{ + for dir in `ls` + do + if [ -f $dir/build*.sh ] ; then + cd $dir + bash ./build*.sh + cd - + fi + done +} + +function do_clean +{ + for dir in `ls` + do + if [ -f $dir/build*.sh ] ; then + cd $dir + bash ./build*.sh clean + cd - + fi + done + + rm -rf install +} + +if [[ $# == 1 ]] && [[ $1 == "clean" ]] ; then + do_clean + exit; +fi + +check_depend + +do_compile + + diff --git a/3rdparty/x86/cjson/build.sh b/3rdparty/x86/cjson/build.sh new file mode 100755 index 0000000..503b2bd --- /dev/null +++ b/3rdparty/x86/cjson/build.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +#+-------------------------------------------------------------------------------------------- +#|Description: This shell script used download and compile cJSON for RaspberryPi +#| Author: GuoWenxue <guowenxue@gmail.com> +#| ChangeLog: +#| 1, Initialize 1.0.0 on 2022.04.10 +#+-------------------------------------------------------------------------------------------- + +JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l` + +PRJ_PATH=`pwd` +LIBS_PATH=$PRJ_PATH/../install + +LYFTP_SRC=ftp://master.iot-yun.club/src/ +CROSSTOOL=arm-linux-gnueabihf- + +# display in red +function pr_error() { + echo -e "\033[40;31m --E-- $1 \033[0m" +} + +# display in yellow +function pr_warn() { + echo -e "\033[40;33m --W-- $1 \033[0m" +} + +# display in green +function pr_info() { + echo -e "\033[40;32m --I-- $1 \033[0m" +} + + +function msg_banner() +{ + echo "" + echo "+-----------------------------------------------------------------------" + echo -e "|\033[40;33m $1 \033[0m" + echo "+-----------------------------------------------------------------------" + echo "" +} + +function check_result() +{ + if [ $? != 0 ] ; then + pr_error $1 + fi +} + + +function compile_cjson() +{ + SRC_NAME=cJSON-1.7.15 + PACK_SUFIX=tar.gz + + if [ -f ${LIBS_PATH}/lib/libcjson.so ] ; then + msg_banner "$SRC_NAME already compile and installed" + return 0; + fi + + msg_banner "Start compile $SRC_NAME " + + if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then + #wget https://mosquitto.org/files/source//${SRC_NAME}.${PACK_SUFIX} + wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX} + + check_result "ERROR: download ${SRC_NAME} failure" + fi + + tar -xzf ${SRC_NAME}.${PACK_SUFIX} + check_result "ERROR: decompress ${SRC_NAME} failure" + + cd ${SRC_NAME} + + sed -i "s|^CC =.*|CC = ${CROSSTOOL}gcc -std=c89|" Makefile + + make && make PREFIX=${LIBS_PATH} install +} + + +compile_cjson + + diff --git a/3rdparty/x86/mosquitto/build.sh b/3rdparty/x86/mosquitto/build.sh new file mode 100755 index 0000000..ce5ae91 --- /dev/null +++ b/3rdparty/x86/mosquitto/build.sh @@ -0,0 +1,99 @@ +#!/bin/bash + +#+-------------------------------------------------------------------------------------------- +#|Description: This shell script used download and compile mosquitto for RaspberryPi +#| Author: GuoWenxue <guowenxue@gmail.com> +#| ChangeLog: +#| 1, Initialize 1.0.0 on 2011.04.12 +#+-------------------------------------------------------------------------------------------- + +JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l` + +PRJ_PATH=`pwd` +LIBS_PATH=$PRJ_PATH/../install + +LYFTP_SRC=ftp://master.iot-yun.club/src/ + + +CROSSTOOL=arm-linux-gnueabihf- + +# display in red +function pr_error() { + echo -e "\033[40;31m --E-- $1 \033[0m" +} + +# display in yellow +function pr_warn() { + echo -e "\033[40;33m --W-- $1 \033[0m" +} + +# display in green +function pr_info() { + echo -e "\033[40;32m --I-- $1 \033[0m" +} + +function msg_banner() +{ + echo "" + echo "+-----------------------------------------------------------------------" + echo -e "|\033[40;33m $1 \033[0m" + echo "+-----------------------------------------------------------------------" + echo "" +} + +function check_result() +{ + if [ $? != 0 ] ; then + pr_error $1 + fi +} + + +function compile_mosquitto() +{ + SRC_NAME=mosquitto-2.0.14 + PACK_SUFIX=tar.gz + + if [ -f ${LIBS_PATH}/lib/libmosquitto.so ] ; then + msg_banner "$SRC_NAME already compile and installed" + return 0; + fi + + msg_banner "Start compile $SRC_NAME " + + if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then + #wget https://mosquitto.org/files/source//${SRC_NAME}.${PACK_SUFIX} + wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX} + check_result "ERROR: download ${SRC_NAME} failure" + fi + + tar -xzf ${SRC_NAME}.${PACK_SUFIX} + check_result "ERROR: decompress ${SRC_NAME} failure" + + cd ${SRC_NAME} + SRC_PATH=`pwd` + + export CROSS_COMPILE=${CROSSTOOL} + export CC=gcc + + make -j ${JOBS} LIB_LDFLAGS="-L${LIBS_PATH}/lib" LOCAL_LDFLAGS+="-L${LIBS_PATH}/lib" \ + LIB_CPPFLAGS+="-I ${LIBS_PATH}/include -I${SRC_PATH} -I${SRC_PATH}/src -I${SRC_PATH}/include" \ + LIB_CPPFLAGS+="-I${SRC_PATH}/lib -I${SRC_PATH}/lib/cpp -I${SRC_PATH}/deps" \ + LOCAL_CPPFLAGS+="-I ${LIBS_PATH}/include -I${SRC_PATH}/src -I${SRC_PATH}/apps/mosquitto_passwd/ -DVERSION=\\\"\"2.0.14\\\"\" " \ + APP_CFLAGS+="-I ${LIBS_PATH}/include -I${SRC_PATH}/src" APP_LDFLAGS="-L ${LIBS_PATH}/lib" \ + CLIENT_CFLAGS="-I ${LIBS_PATH}/include -I${SRC_PATH} -I${SRC_PATH}/include -DVERSION=\\\"\"2.0.14\\\"\" " \ + CLIENT_LDFLAGS="-L ${LIBS_PATH}/lib" PLUGIN_LDFLAGS="-L ${LIBS_PATH}/lib" BROKER_LDFLAGS="-L ${LIBS_PATH}/lib" + + check_result "ERROR: compile ${SRC_NAME} failure" + + make DESTDIR=${LIBS_PATH} install + check_result "ERROR: install ${SRC_NAME} failure" +} + +# compile cjson first +cd ../cjson && ./build.sh && cd ${PRJ_PATH} +cd ../openssl && ./build.sh && cd ${PRJ_PATH} + +compile_mosquitto + + diff --git a/3rdparty/x86/openssl/build.sh b/3rdparty/x86/openssl/build.sh new file mode 100755 index 0000000..3237910 --- /dev/null +++ b/3rdparty/x86/openssl/build.sh @@ -0,0 +1,104 @@ +#!/bin/bash + +#+-------------------------------------------------------------------------------------------- +#|Description: This shell script used download and compile openssl for ARM +#| Author: GuoWenxue <guowenxue@gmail.com> +#| ChangeLog: +#| 1, Initialize 1.0.0 on 2011.04.12 +#+-------------------------------------------------------------------------------------------- + +JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l` + +PRJ_PATH=`pwd` +PREFIX_PATH=`pwd`/../install + +LYFTP_SRC=ftp://master.iot-yun.club/src/ + +CROSSTOOL=arm-linux-gnueabihf- + +# display in red +function pr_error() { + echo -e "\033[40;31m --E-- $1 \033[0m" +} + +# display in yellow +function pr_warn() { + echo -e "\033[40;33m --W-- $1 \033[0m" +} + +# display in green +function pr_info() { + echo -e "\033[40;32m --I-- $1 \033[0m" +} + + +function msg_banner() +{ + echo "" + echo "+-----------------------------------------------------------------------" + echo -e "|\033[40;33m $1 \033[0m" + echo "+-----------------------------------------------------------------------" + echo "" +} + +function check_result() +{ + if [ $? != 0 ] ; then + pr_error $1 + fi +} + + +function export_cross() +{ + # export cross toolchain + export CC=${CROSSTOOL}gcc + export AS=${CROSSTOOL}as + export AR=${CROSSTOOL}ar + export LD=${CROSSTOOL}ld + export NM=${CROSSTOOL}nm + export RANLIB=${CROSSTOOL}ranlib + export OBJDUMP=${CROSSTOOL}objdump + export STRIP=${CROSSTOOL}strip + + # export cross configure + export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux " + + # Clear LDFLAGS and CFLAGS + export LDFLAGS= + export CFLAGS= +} + +function compile_openssl() +{ + SRC_NAME=openssl-1.1.1n + PACK_SUFIX=tar.gz + + if [ -f ${PREFIX_PATH}/lib/libcrypto.a ] ; then + msg_banner "$SRC_NAME already compile and installed" + return 0; + fi + + msg_banner "Start cross compile $SRC_NAME " + if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then + #wget https://www.openssl.org/source/${SRC_NAME}.${PACK_SUFIX} + wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX} + check_result "ERROR: download ${SRC_NAME} failure" + fi + + tar -xzf ${SRC_NAME}.${PACK_SUFIX} + cd ${SRC_NAME} + + CROSS_COMPILE=${CROSSTOOL} CFLAGS=-I${PRJ_PATH}/cryptodev-linux ./Configure \ + threads -shared -no-zlib --prefix=$PREFIX_PATH --openssldir=$PREFIX_PATH \ + linux-armv4 + + make -j ${JOBS} && make install + check_result "ERROR: compile ${SRC_NAME} failure" + + cd - +} + +compile_openssl + + diff --git a/3rdparty/x86/qt/build.sh b/3rdparty/x86/qt/build.sh new file mode 100755 index 0000000..be2198c --- /dev/null +++ b/3rdparty/x86/qt/build.sh @@ -0,0 +1,231 @@ +#!/bin/bash + +#+-------------------------------------------------------------------------------------------- +#|Description: This shell script used download and compile QT5 for ARM +#| Author: GuoWenxue <guowenxue@gmail.com> +#| +#| WARNNING: QT >= 5.7 need crosstool g++ support C++11 support +#| QT configure need host g++ support C++11, so need config g++ on ubuntu host: +#| sudo update-alternatives --config g++ +#| +#| ChangeLog: +#| 1, Initialize 1.0.0 on 2011.04.12 +#+-------------------------------------------------------------------------------------------- + +JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l` + +PRJ_PATH=`pwd` +LIBS_PATH=$PRJ_PATH/install + +QT_INST_PATH=/apps/qt5_rpi + +# sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf +CROSSTOOL=arm-linux-gnueabihf- + +LYFTP_SRC=ftp://master.iot-yun.club/src/ + +# display in red +function pr_error() { + echo -e "\033[40;31m --E-- $1 \033[0m" +} + +# display in yellow +function pr_warn() { + echo -e "\033[40;33m --W-- $1 \033[0m" +} + +# display in green +function pr_info() { + echo -e "\033[40;32m --I-- $1 \033[0m" +} + +function msg_banner() +{ + echo "" + echo "+-----------------------------------------------------------------------" + echo -e "|\033[40;33m $1 \033[0m" + echo "+-----------------------------------------------------------------------" + echo "" +} + +function check_result() +{ + if [ $? != 0 ] ; then + pr_error $1 + fi +} + +function compile_qt5() +{ + # 5.6.3 is the last version can be compiled by g++ without c++11 support + SRC_NAME=qt-everywhere-opensource-src-5.6.3 + + PACK_SUFIX=tar.xz + + #rm -rf ${QT_INST_PATH}/lib/libQt5Gui.so + if [ -f ${QT_INST_PATH}/lib/libQt5Gui.so ] ; then + msg_banner "Already cross compile $SRC_NAME " + return 0; + fi + + if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then + msg_banner "Start download ${SRC_NAME}.${PACK_SUFIX} " + wget ${LYFTP_SRC}/qt/${SRC_NAME}.${PACK_SUFIX} + check_result "download ${SRC_NAME} failure" + fi + + msg_banner "Start decompress $SRC_NAME.${PACK_SUFIX} and patch" + if [ ! -d ${SRC_NAME} ] ; then + tar -xJf ${SRC_NAME}.${PACK_SUFIX} + patch -p0 < patch/${SRC_NAME}.patch + fi + + cd ${SRC_NAME} + + QMAKE_FILE=qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf + + grep "`basename ${CROSSTOOL}`" ${QMAKE_FILE} > /dev/null 2>&1 + if [ $? != 0 ] ; then + sed -i "s|arm-linux-gnueabi-|$CROSSTOOL|" ${QMAKE_FILE} + fi + + ./configure -opensource -confirm-license -release -shared -strip -no-c++11 \ + -prefix ${QT_INST_PATH} -xplatform linux-arm-gnueabi-g++ -make libs \ + -no-cups -no-libproxy -no-avx -no-mtdev -no-rpath -no-glib -no-xcb -pch \ + -no-eglfs -no-opengl -no-openssl -no-separate-debug-info -nomake tests \ + -qt-freetype -qt-zlib -qt-libpng -qt-libjpeg -tslib -linuxfb -qpa linuxfb \ + -I${LIBS_PATH}/include/ -L${LIBS_PATH}/lib/ -I${QT_INST_PATH}/include/ -L${QT_INST_PATH}/lib/ + + msg_banner "Start cross compile $SRC_NAME " + make -j${JOBS} && make install + check_result "compile ${SRC_NAME} failure" + cp ./qtbase/plugins/platforms/libqlinuxfb.so ${QT_INST_PATH}/lib + cp -af ${LIBS_PATH}/lib/libts*so* ${QT_INST_PATH}/lib + + cd - +} + +function compile_tslib() +{ + SRC_NAME=tslib-1.22 + PACK_SUFIX=tar.bz2 + + + if [ -f ${LIBS_PATH}/lib/libts.so ] ; then + msg_banner "Already cross compile $SRC_NAME " + return 0; + fi + + mkdir -p libs && cd libs + + msg_banner "Start cross compile $SRC_NAME " + + if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then + #tslib official download address: https://github.com/libts/tslib/tags + wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX} + check_result "download ${SRC_NAME} failure" + fi + + tar -xjf ${SRC_NAME}.${PACK_SUFIX} + cd ${SRC_NAME} + + ./configure --prefix=${LIBS_PATH} ${CONFIG_CROSS} + make && make install + + cd ${PRJ_PATH} +} + +function compile_libiconv() +{ + SRC_NAME=libiconv-1.15 + PACK_SUFIX=tar.gz + + if [ -f ${LIBS_PATH}/lib/libiconv.so ] ; then + msg_banner "Already cross compile $SRC_NAME " + return 0; + fi + + mkdir -p libs && cd libs + + msg_banner "Start cross compile $SRC_NAME " + + if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then + #wget https://ftp.gnu.org/gnu/libiconv/${SRC_NAME}.${PACK_SUFIX} + wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX} + check_result "download ${SRC_NAME} failure" + fi + + tar -xzf ${SRC_NAME}.${PACK_SUFIX} + cd ${SRC_NAME} + + ./configure --prefix=${LIBS_PATH} ${CONFIG_CROSS} + make && make install + + cd ${PRJ_PATH} +} + + +function export_cross() +{ + # export cross toolchain + export CC=${CROSSTOOL}gcc + export AS=${CROSSTOOL}as + export AR=${CROSSTOOL}ar + export LD=${CROSSTOOL}ld + export NM=${CROSSTOOL}nm + export RANLIB=${CROSSTOOL}ranlib + export OBJDUMP=${CROSSTOOL}objdump + export STRIP=${CROSSTOOL}strip + + # export cross configure + export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux " + + # Clear LDFLAGS and CFLAGS + export LDFLAGS= + export CFLAGS= +} + +function unexport_cross() +{ + # export cross toolchain + export CC="" + export AS="" + export AR="" + export LD="" + export NM="" + export RANLIB="" + export OBJDUMP="" + export STRIP="" + + # export cross configure + export CONFIG_CROSS="" + + # Clear LDFLAGS and CFLAGS + export LDFLAGS="" + export CFLAGS="" +} + +function check_deptool() +{ + ${CROSSTOOL}g++ -v > /dev/null 2>&1 + if [ $? != 0 ] ; then + echo "" + pr_error "Crosstool not installed, please install it by follow command:" + pr_info "sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf" + echo "" + exit 1; + fi +} + +check_deptool + +export_cross + +compile_libiconv + +compile_tslib + +unexport_cross + +compile_qt5 + diff --git a/3rdparty/x86/qt/hello/MainForm.ui.qml b/3rdparty/x86/qt/hello/MainForm.ui.qml new file mode 100644 index 0000000..dd8fcab --- /dev/null +++ b/3rdparty/x86/qt/hello/MainForm.ui.qml @@ -0,0 +1,18 @@ +import QtQuick 2.5 + +Rectangle { + property alias mouseArea: mouseArea + + width: 360 + height: 360 + + MouseArea { + id: mouseArea + anchors.fill: parent + } + + Text { + anchors.centerIn: parent + text: "Hello World" + } +} diff --git a/3rdparty/x86/qt/hello/build.sh b/3rdparty/x86/qt/hello/build.sh new file mode 100755 index 0000000..4aa2aca --- /dev/null +++ b/3rdparty/x86/qt/hello/build.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +# export qmake command path +export PATH=$PATH:/apps/qt5_rpi/bin/ + +# project name is current working directory name +PRJ_NAME=$(basename `pwd`) + +# generate project file +rm -f ${PRJ_NAME}.pro +qmake -project + +# Add qml support to fix bug: QQmlApplicationEngine: No such file or directory +echo "QT += qml" >> ${PRJ_NAME}.pro + +# generate makefile +qmake -makefile ${PRJ_NAME}.pro + + +# start to cross compile +make && make clean + diff --git a/3rdparty/x86/qt/hello/main.cpp b/3rdparty/x86/qt/hello/main.cpp new file mode 100644 index 0000000..4e72baa --- /dev/null +++ b/3rdparty/x86/qt/hello/main.cpp @@ -0,0 +1,12 @@ +#include <QGuiApplication> +#include <QQmlApplicationEngine> + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + + return app.exec(); +} diff --git a/3rdparty/x86/qt/hello/main.qml b/3rdparty/x86/qt/hello/main.qml new file mode 100644 index 0000000..ef857da --- /dev/null +++ b/3rdparty/x86/qt/hello/main.qml @@ -0,0 +1,78 @@ +import QtQuick 2.5 +import QtQuick.Window 2.2 + +Window { + visible: true + width: 640 + height: 480 + title: qsTr("Hello World") + + MainForm { + anchors.fill: parent + mouseArea.onClicked: { + Qt.quit(); + } + + Text { + id: text1 + x: 131 + y: 136 + width: 100 + height: 20 + text: "192.168.1.10" + font.pixelSize: 12 + } + + TextInput { + id: textInput1 + x: 45 + y: 136 + width: 80 + height: 20 + text: "IP地址" + font.pixelSize: 12 + } + + TextEdit { + id: textEdit1 + x: 261 + y: 136 + width: 80 + height: 20 + text: qsTr("Text Edit") + font.pixelSize: 12 + } + + Rectangle { + id: rectangle1 + x: 380 + y: 165 + width: 200 + height: 200 + color: "#ffffff" + } + + Image { + id: image1 + x: 25 + y: 245 + width: 100 + height: 100 + source: "qrc:/qtquickplugin/images/template_image.png" + } + + Item { + id: item1 + x: 149 + y: 187 + width: 200 + height: 200 + } + + MainForm { + id: mainForm1 + x: 163 + y: 52 + } + } +} diff --git a/3rdparty/x86/qt/hello/qml.qrc b/3rdparty/x86/qt/hello/qml.qrc new file mode 100644 index 0000000..4e1a206 --- /dev/null +++ b/3rdparty/x86/qt/hello/qml.qrc @@ -0,0 +1,6 @@ +<RCC> + <qresource prefix="/"> + <file>main.qml</file> + <file>MainForm.ui.qml</file> + </qresource> +</RCC> diff --git a/3rdparty/x86/qt/patch/qt-everywhere-opensource-src-5.6.3.patch b/3rdparty/x86/qt/patch/qt-everywhere-opensource-src-5.6.3.patch new file mode 100644 index 0000000..6c810bf --- /dev/null +++ b/3rdparty/x86/qt/patch/qt-everywhere-opensource-src-5.6.3.patch @@ -0,0 +1,11 @@ +diff -Nuar qt-everywhere-opensource-src-5.6.3/qtserialbus/src/plugins/canbus/socketcan/socketcanbackend.cpp qt-everywhere-opensource-src-5.6.3-modify/qtserialbus/src/plugins/canbus/socketcan/socketcanbackend.cpp +--- qt-everywhere-opensource-src-5.6.3/qtserialbus/src/plugins/canbus/socketcan/socketcanbackend.cpp 2017-09-06 20:16:43.000000000 +0800 ++++ qt-everywhere-opensource-src-5.6.3-modify/qtserialbus/src/plugins/canbus/socketcan/socketcanbackend.cpp 2022-04-08 00:26:20.441520428 +0800 +@@ -42,6 +42,7 @@ + + #include <linux/can/error.h> + #include <linux/can/raw.h> ++#include <linux/sockios.h> + #include <errno.h> + #include <unistd.h> + #include <net/if.h> diff --git a/apue/1.File_IO/ds18b20.c b/apue/1.File_IO/ds18b20.c index efb0025..0ff2a34 100644 --- a/apue/1.File_IO/ds18b20.c +++ b/apue/1.File_IO/ds18b20.c @@ -1,14 +1,14 @@ /********************************************************************************* - * Copyright: (C) 2018 LingYun IoT System Studio + * Copyright: (C) 2022 LingYun IoT System Studio * All rights reserved. * * Filename: ds18b20.c - * Description: This file is temperature sensor DS18B20 code - * + * Description: This file is DS18B20 temperature sensor example source code. + * * Version: 1.0.0(2018/10/14) * Author: Guo Wenxue <guowenxue@gmail.com> * ChangeLog: 1, Release initial version on "2018/10/14 12:13:26" - * + * ********************************************************************************/ #include <stdio.h> @@ -24,40 +24,41 @@ int main(int argc, char *argv[]) { - float temp; + float temp; - if( ds18b20_get_temperature(&temp) < 0 ) - { - printf("ERROR: ds18b20 get temprature failure\n"); - return 1; - } + if( ds18b20_get_temperature(&temp) < 0 ) + { + printf("ERROR: ds18b20 get temprature failure\n"); + return 1; + } - printf("DS19B20 get temperature: %f ℃\n", temp); - return 0; + printf("DS18B20 get temperature: %f 'C\n", temp); + return 0; } /* File Content: - pi@raspberrypi:~/guowenxue $ cat /sys/bus/w1/devices/28-041731f7c0ff/w1_slave + pi@raspberrypi:~/guowenxue $ cat /sys/bus/w1/devices/28-041731f7c0ff/w1_slave 3a 01 4b 46 7f ff 0c 10 a5 : crc=a5 YES 3a 01 4b 46 7f ff 0c 10 a5 t=19625 */ int ds18b20_get_temperature(float *temp) { - char w1_path[50] = "/sys/bus/w1/devices/"; + const char *w1_path = "/sys/bus/w1/devices/"; + char ds_path[50]; char chip[20]; char buf[128]; DIR *dirp; struct dirent *direntp; int fd =-1; char *ptr; - float value; int found = 0; + int rv = 0; if( !temp ) { - return -1; + return -1; } /*+-------------------------------------------------------------------+ @@ -76,47 +77,48 @@ /* find and get the chipset SN filename */ strcpy(chip,direntp->d_name); found = 1; - break; + break; } } closedir(dirp); if( !found ) { - printf("Can not find ds18b20 in %s\n", w1_path); - return -3; + printf("Can not find ds18b20 in %s\n", w1_path); + return -3; } /* get DS18B20 sample file full path: /sys/bus/w1/devices/28-xxxx/w1_slave */ - strncat(w1_path, chip, sizeof(w1_path)-strlen(w1_path)); - strncat(w1_path, "/w1_slave", sizeof(w1_path)-strlen(w1_path)); + snprintf(ds_path, sizeof(ds_path), "%s/%s/w1_slave", w1_path, chip); /* open file /sys/bus/w1/devices/28-xxxx/w1_slave to get temperature */ - if( (fd=open(w1_path, O_RDONLY)) < 0 ) - { - printf("open %s error: %s\n", w1_path, strerror(errno)); - return -4; - } - + if( (fd=open(ds_path, O_RDONLY)) < 0 ) + { + printf("open %s error: %s\n", ds_path, strerror(errno)); + return -4; + } + if(read(fd, buf, sizeof(buf)) < 0) { - printf("read %s error: %s\n", w1_path, strerror(errno)); - return -5; - } - + printf("read %s error: %s\n", ds_path, strerror(errno)); + rv = -5; + goto cleanup; + } + ptr = strstr(buf, "t="); if( !ptr ) { - printf("ERROR: Can not get temperature\n"); - return -6; + printf("ERROR: Can not get temperature\n"); + rv = -6; + goto cleanup; } ptr+=2; /* convert string value to float value */ *temp = atof(ptr)/1000; - - close(fd); - return 0; +cleanup: + close(fd); + return rv; } diff --git a/apue/project_socket/do.sh b/apue/project_socket/do.sh new file mode 100755 index 0000000..b07abc2 --- /dev/null +++ b/apue/project_socket/do.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +make +./main/client_main -i 127.0.0.1 -p 8888 -I 30 -d diff --git a/apue/project_socket/libs/cjson/build.sh b/apue/project_socket/libs/cjson/build.sh new file mode 100755 index 0000000..2e72a9d --- /dev/null +++ b/apue/project_socket/libs/cjson/build.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +# libraries install path +INST_PATH=`pwd`/../install + +# LingYun studio FTP server address for all the open source code +LYFTP_SRC=ftp://master.iot-yun.club/src/ + +# set shell script exit when any command failure +set -e + +# funciton used to build cjson source code +function build_cjson() +{ + SRC_NAME=cJSON-1.7.15 + + if [ -L $INST_PATH/lib/libcjson.so ] ; then + echo "$SRC_NAME already compile and installed" + return ; + fi + + # If source code tarball file not exist, it will download the packet. + if [ ! -f ${SRC_NAME}.tar.gz ] ; then + wget ${LYFTP_SRC}/${SRC_NAME}.tar.gz + fi + + + # If source code folder not exist, decompress the tarball packet + if [ ! -d ${SRC_NAME} ] ; then + tar -xzf ${SRC_NAME}.tar.gz + fi + + cd ${SRC_NAME} + + make && make DESTDIR=${INST_PATH} PREFIX=/ install + + cd - +} + +# start build cjson + +build_cjson diff --git a/apue/project_socket/libs/makefile b/apue/project_socket/libs/makefile new file mode 100644 index 0000000..8b2a24d --- /dev/null +++ b/apue/project_socket/libs/makefile @@ -0,0 +1,10 @@ +all: + cd sqlite && ./build.sh + cd cjson && ./build.sh + +clean: + cd sqlite && rm -rf sqlite* + cd cjson && rm -rf c* + +distclean: clean + rm -rf install diff --git a/apue/project_socket/libs/sqlite/build.sh b/apue/project_socket/libs/sqlite/build.sh new file mode 100755 index 0000000..10e13a0 --- /dev/null +++ b/apue/project_socket/libs/sqlite/build.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# library install path +INST_PATH=`pwd`/../install + +# LingYun studio FTP server address for all the open source code +LYFTP_SRC=ftp://master.iot-yun.club/src/ + +# set shell script exit when any command failure +set -e + +#define a funciton to build sqlite source code +function build_sqlite() +{ + SRC_NAME=sqlite-autoconf-3380200 + + if [ -L $INST_PATH/lib/libsqlite3.so ] ; then + echo "$SRC_NAME already compile and installed" + return ; + fi + + # If source code tarball file not exist, it will download the packet. + if [ ! -f ${SRC_NAME}.tar.gz ] ; then + #wget https://sqlite.org/2022/${SRC_NAME}.tar.gz + wget ${LYFTP_SRC}/${SRC_NAME}.tar.gz + fi + + + # If source code folder not exist, decompress the tarball packet + if [ ! -d ${SRC_NAME} ] ; then + tar -xzf ${SRC_NAME}.tar.gz + fi + + cd ${SRC_NAME} + + ./configure --prefix=${INST_PATH} --enable-static + + make && make install +} + + +# call function to start build sqlite + +build_sqlite diff --git a/apue/project_socket/main/client_main.c b/apue/project_socket/main/client_main.c new file mode 100644 index 0000000..3637109 --- /dev/null +++ b/apue/project_socket/main/client_main.c @@ -0,0 +1,244 @@ +#include <stdio.h> +#include <errno.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> +#include <stdlib.h> +#include <getopt.h> +#include <time.h> + +#include "logger.h" +#include "ds18b20.h" +#include "packet.h" +#include "socket.h" +#include "sqlite_blob.h" +#include "util_proc.h" +#include "util_time.h" + + +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"); + + 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"; + + 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 */ + + 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; + + case 'p': + port=atoi(optarg); + break; + + case 'd': + debug=1; + logfile="stdout"; + loglevel=LOG_LEVEL_DEBUG; + break; + + case 'I': + interval=atoi(optarg); + break; + + case 's': + sn=atoi(optarg); + break; + + case 'h': + print_usage(argv[0]); + return 0; + } + + } + + if( !serverip || !port ) + { + print_usage(argv[0]); + return 0; + } + + /* set logger to $logfile with level info */ + if( logger_init(logfile, loglevel) < 0 ) + { + fprintf(stderr, "Initial logger file '%s' failure: %s\n", logfile, strerror(errno)); + 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 */ + } + + install_default_signal(); + + log_info("program start running.\n"); + + if( database_init("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 %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.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 ) + { + blobdb_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"); + blobdb_push_packet(pack_buf, pack_bytes); + socket_term(&sock); /* close the soket */ + } + } + + /* socket send packet in database */ + if( !blobdb_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"); + blobdb_del_packet(); + } + } + + msleep(100); + } + + socket_term(&sock); + database_term(); + + 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; +} diff --git a/apue/project_socket/main/makefile b/apue/project_socket/main/makefile new file mode 100644 index 0000000..382b856 --- /dev/null +++ b/apue/project_socket/main/makefile @@ -0,0 +1,20 @@ + +LIBS_PATH=`pwd`/../libs/install/ + +CFLAGS += -I ${LIBS_PATH}/include/ +LDFLAGS += -L ${LIBS_PATH}/lib/ -lbooster +LDFLAGS += -lpthread -lsqlite3 + +SRCFILES = $(wildcard *.c) +BINARIES=$(SRCFILES:%.c=%) + +all: clean ${BINARIES} + +%: %.c + $(CC) $(CFLAGS) -o $@ $< ${LDFLAGS} + +clean: + rm -f ${BINARIES} + +distclean: clean + rm -f *.log *.db diff --git a/apue/project_socket/main/server_main.c b/apue/project_socket/main/server_main.c new file mode 100644 index 0000000..6e69fcd --- /dev/null +++ b/apue/project_socket/main/server_main.c @@ -0,0 +1,278 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> +#include <ctype.h> +#include <time.h> +#include <pthread.h> +#include <getopt.h> +#include <libgen.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> +#include <netinet/in.h> +#include <sys/epoll.h> +#include <sys/resource.h> + +#define MAX_EVENTS 512 +#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) + +static inline void print_usage(char *progname); +int socket_server_init(char *listen_ip, int listen_port); +void set_socket_rlimit(void); + +int main(int argc, char **argv) +{ + int listenfd, connfd; + int serv_port = 0; + int daemon_run = 0; + char *progname = NULL; + int opt; + int rv; + int i, j; + int found; + char buf[1024]; + + int epollfd; + struct epoll_event event; + struct epoll_event event_array[MAX_EVENTS]; + int events; + + struct option long_options[] = + { + {"daemon", no_argument, NULL, 'b'}, + {"port", required_argument, NULL, 'p'}, + {"help", no_argument, NULL, 'h'}, + {NULL, 0, NULL, 0} + }; + + progname = basename(argv[0]); + + /* Parser the command line parameters */ + while ((opt = getopt_long(argc, argv, "bp:h", long_options, NULL)) != -1) + { + switch (opt) + { + case 'b': + daemon_run=1; + break; + + case 'p': + serv_port = atoi(optarg); + break; + + case 'h': /* Get help information */ + print_usage(progname); + return EXIT_SUCCESS; + + default: + break; + } + } + + if( !serv_port ) + { + print_usage(progname); + return -1; + } + + set_socket_rlimit(); /* set max open socket count */ + + if( (listenfd=socket_server_init(NULL, serv_port)) < 0 ) + { + printf("ERROR: %s server listen on port %d failure\n", argv[0],serv_port); + return -2; + } + printf("%s server start to listen on port %d\n", argv[0],serv_port); + + + /* set program running on background */ + if( daemon_run ) + { + daemon(0, 0); + } + + if( (epollfd=epoll_create(MAX_EVENTS)) < 0 ) + { + printf("epoll_create() failure: %s\n", strerror(errno)); + return -3; + } + + //event.events = EPOLLIN|EPOLLET; + event.events = EPOLLIN; + event.data.fd = listenfd; + + if( epoll_ctl(epollfd, EPOLL_CTL_ADD, listenfd, &event) < 0) + { + printf("epoll add listen socket failure: %s\n", strerror(errno)); + return -4; + } + + + for ( ; ; ) + { + /* program will blocked here */ + events = epoll_wait(epollfd, event_array, MAX_EVENTS, -1); + if(events < 0) + { + printf("epoll failure: %s\n", strerror(errno)); + break; + } + else if(events == 0) + { + printf("epoll get timeout\n"); + continue; + } + + /* rv>0 is the active events count */ + for(i=0; i<events; i++) + { + if ( (event_array[i].events&EPOLLERR) || (event_array[i].events&EPOLLHUP) ) + { + printf("epoll_wait get error on fd[%d]: %s\n", event_array[i].data.fd, strerror(errno)); + epoll_ctl(epollfd, EPOLL_CTL_DEL, event_array[i].data.fd, NULL); + close(event_array[i].data.fd); + } + + /* listen socket get event means new client start connect now */ + if( event_array[i].data.fd == listenfd ) + { + if( (connfd=accept(listenfd, (struct sockaddr *)NULL, NULL)) < 0) + { + printf("accept new client failure: %s\n", strerror(errno)); + continue; + } + + event.data.fd = connfd; + //event.events = EPOLLIN|EPOLLET; + event.events = EPOLLIN; + if( epoll_ctl(epollfd, EPOLL_CTL_ADD, connfd, &event) < 0 ) + { + printf("epoll add client socket failure: %s\n", strerror(errno)); + close(event_array[i].data.fd); + continue; + } + printf("epoll add new client socket[%d] ok.\n", connfd); + } + else /* already connected client socket get data incoming */ + { + if( (rv=read(event_array[i].data.fd, buf, sizeof(buf))) <= 0) + { + printf("socket[%d] read failure or get disconncet and will be removed.\n", event_array[i].data.fd); + epoll_ctl(epollfd, EPOLL_CTL_DEL, event_array[i].data.fd, NULL); + close(event_array[i].data.fd); + continue; + } + else + { + printf("socket[%d] read get %d bytes data\n", event_array[i].data.fd, rv); + + /* convert letter from lowercase to uppercase */ + for(j=0; j<rv; j++) + buf[j]=toupper(buf[j]); + + if( write(event_array[i].data.fd, buf, rv) < 0 ) + { + printf("socket[%d] write failure: %s\n", event_array[i].data.fd, strerror(errno)); + epoll_ctl(epollfd, EPOLL_CTL_DEL, event_array[i].data.fd, NULL); + close(event_array[i].data.fd); + } + } + } + } /* for(i=0; i<rv; i++) */ + } /* while(1) */ + +CleanUp: + close(listenfd); + return 0; +} + + +static inline void print_usage(char *progname) +{ + printf("Usage: %s [OPTION]...\n", progname); + + printf(" %s is a socket server program, which used to verify client and echo back string from it\n", progname); + printf("\nMandatory arguments to long options are mandatory for short options too:\n"); + + printf(" -b[daemon ] set program running on background\n"); + printf(" -p[port ] Socket server port address\n"); + printf(" -h[help ] Display this help information\n"); + + + printf("\nExample: %s -b -p 8900\n", progname); + return ; +} + + +int socket_server_init(char *listen_ip, int listen_port) +{ + struct sockaddr_in servaddr; + int rv = 0; + int on = 1; + int listenfd; + + if ( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + printf("Use socket() to create a TCP socket failure: %s\n", strerror(errno)); + return -1; + } + + /* Set socket port reuseable, fix 'Address already in use' bug when socket server restart */ + setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); + + memset(&servaddr, 0, sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_port = htons(listen_port); + + if( !listen_ip ) /* Listen all the local IP address */ + { + servaddr.sin_addr.s_addr = htonl(INADDR_ANY); + } + else /* listen the specified IP address */ + { + if (inet_pton(AF_INET, listen_ip, &servaddr.sin_addr) <= 0) + { + printf("inet_pton() set listen IP address failure.\n"); + rv = -2; + goto CleanUp; + } + } + + + if(bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) + { + printf("Use bind() to bind the TCP socket failure: %s\n", strerror(errno)); + rv = -3; + goto CleanUp; + } + + if(listen(listenfd, 13) < 0) + { + printf("Use bind() to bind the TCP socket failure: %s\n", strerror(errno)); + rv = -4; + goto CleanUp; + } + +CleanUp: + if(rv<0) + close(listenfd); + else + rv = listenfd; + + return rv; +} + +/* Set open file description count to max */ +void set_socket_rlimit(void) +{ + struct rlimit limit = {0}; + + getrlimit(RLIMIT_NOFILE, &limit ); + limit.rlim_cur = limit.rlim_max; + setrlimit(RLIMIT_NOFILE, &limit ); + + printf("set socket open fd max count to %d\n", limit.rlim_max); +} + diff --git a/apue/project_socket/makefile b/apue/project_socket/makefile new file mode 100644 index 0000000..52c4271 --- /dev/null +++ b/apue/project_socket/makefile @@ -0,0 +1,16 @@ + +all: + make -C libs + make -C src && make install -C src + make -C main + +clean: + make clean -C libs + make clean -C src + make clean -C main + +distclean: + make distclean -C libs + make distclean -C src + make distclean -C main + rm -f *.log *.db diff --git a/apue/project_socket/src/ds18b20.c b/apue/project_socket/src/ds18b20.c new file mode 100644 index 0000000..d0ea616 --- /dev/null +++ b/apue/project_socket/src/ds18b20.c @@ -0,0 +1,113 @@ +/********************************************************************************* + * Copyright: (C) 2020 LingYun IoT System Studio + * All rights reserved. + * + * Filename: ds18b20.c + * Description: This file is get temperature by DS18B20 on RaspberryPi + * + * Version: 1.0.0(2020年04月15日) + * Author: Guo Wenxue <guowenxue@gmail.com> + * ChangeLog: 1, Release initial version on "2020年04月15日 23时14分21秒" + * + ********************************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <stdint.h> +#include <fcntl.h> +#include <dirent.h> +#include <string.h> +#include <time.h> +#include <errno.h> + +#include "logger.h" + +/* File Content: + pi@raspberrypi:~/guowenxue $ cat /sys/bus/w1/devices/28-041731f7c0ff/w1_slave + 3a 01 4b 46 7f ff 0c 10 a5 : crc=a5 YES + 3a 01 4b 46 7f ff 0c 10 a5 t=19625 + */ + +int ds18b20_get_temperature(uint16_t *temp) +{ + char w1_path[50] = "/sys/bus/w1/devices/"; + char chip[20]; + char buf[128]; + DIR *dirp; + struct dirent *direntp; + int fd =-1; + char *ptr; + uint8_t *byte; + float value; + int found = 0; + + if( !temp ) + { + log_error("ERROR: Invalid input arguments\n"); + return -1; + } + + /*+-------------------------------------------------------------------+ + *| open dierectory /sys/bus/w1/devices to get chipset Serial Number | + *+-------------------------------------------------------------------+*/ + if((dirp = opendir(w1_path)) == NULL) + { + log_error("opendir error: %s\n", strerror(errno)); + return -2; + } + + while((direntp = readdir(dirp)) != NULL) + { + if(strstr(direntp->d_name,"28-")) + { + /* find and get the chipset SN filename */ + strcpy(chip,direntp->d_name); + found = 1; + break; + } + } + closedir(dirp); + + if( !found ) + { + log_error("Can not find ds18b20 in %s\n", w1_path); + return -2; + } + + /* get DS18B20 sample file full path: /sys/bus/w1/devices/28-xxxx/w1_slave */ + strncat(w1_path, chip, sizeof(w1_path)-strlen(w1_path)); + strncat(w1_path, "/w1_slave", sizeof(w1_path)-strlen(w1_path)); + + /* open file /sys/bus/w1/devices/28-xxxx/w1_slave to get temperature */ + if( (fd=open(w1_path, O_RDONLY)) < 0 ) + { + log_error("open %s error: %s\n", w1_path, strerror(errno)); + return -2; + } + + if(read(fd, buf, sizeof(buf)) < 0) + { + log_error("read %s error: %s\n", w1_path, strerror(errno)); + close(fd); + return -2; + } + + ptr = strstr(buf, "t="); + if( !ptr ) + { + log_error("ERROR: Can not get temperature\n"); + close(fd); + return -2; + } + + ptr+=2; + + /* use two bytes to save temperature value */ + byte = (uint8_t *)temp; + byte[1] = atoi(ptr)/1000; /* integer part */ + byte[0] = (atoi(ptr)%1000)/10; /* fractional part, two digits after */ + + close(fd); + return 0; +} diff --git a/apue/project_socket/src/ds18b20.h b/apue/project_socket/src/ds18b20.h new file mode 100644 index 0000000..b71ae1e --- /dev/null +++ b/apue/project_socket/src/ds18b20.h @@ -0,0 +1,31 @@ +/******************************************************************************** + * Copyright: (C) 2020 LingYun IoT System Studio + * All rights reserved. + * + * Filename: ds18b20.h + * Description: This head file is get temperature by DS18B20 on RaspberryPi + * + * Version: 1.0.0(2020年04月15日) + * Author: Guo Wenxue <guowenxue@gmail.com> + * ChangeLog: 1, Release initial version on "2020年04月15日 23时37分38秒" + * + ********************************************************************************/ + +#ifndef _DS18B20_H_ +#define _DS18B20_H_ + +#include <stdint.h> + +/* description: get temperature by DS18B20 on RaspberryPi + * return value: 0: Successfully <0: Failure + * output value: $temp: temperature value saved in two bytes: + * byte[0]: fractional part, two digits after + * byte[1]: integer part + */ +int ds18b20_get_temperature(uint16_t *temp); + +#define temper_integer(x) (((x)>>8) & 0xFF) +#define temper_fract(x) ( (x) & 0xFF) + +#endif /* ----- #ifndef _DS18B20_H_ ----- */ + diff --git a/apue/project_socket/src/list.h b/apue/project_socket/src/list.h new file mode 100644 index 0000000..a8c3636 --- /dev/null +++ b/apue/project_socket/src/list.h @@ -0,0 +1,723 @@ +/********************************************************************************* + * Copyright: (C) 2012 Guo Wenxue <guowenxue@gmail.com> + * All rights reserved. + * + * Filename: list.h + * Description: This file is copied from Linux kernel, which provide link list API. + * + * Version: 1.0.0(08/09/2012~) + * Author: Guo Wenxue <guowenxue@gmail.com> + * ChangeLog: 1, Release initial version on "08/09/2012 02:24:34 AM" + * + ********************************************************************************/ + +#ifndef _LINUX_LIST_H +#define _LINUX_LIST_H + +#include <linux/stddef.h> + + +/** + * container_of - cast a member of a structure out to the containing structure + * @ptr: the pointer to the member. + * @type: the type of the container struct this is embedded in. + * @member: the name of the member within the struct. + * + */ +#undef offsetof +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + + +/* + * Architectures might want to move the poison pointer offset + * into some well-recognized area such as 0xdead000000000000, + * that is also not mappable by user-space exploits: + */ +#ifdef CONFIG_ILLEGAL_POINTER_VALUE +# define POISON_POINTER_DELTA _AC(CONFIG_ILLEGAL_POINTER_VALUE, UL) +#else +# define POISON_POINTER_DELTA 0 +#endif + +/* + * These are non-NULL pointers that will result in page faults + * under normal circumstances, used to verify that nobody uses + * non-initialized list entries. + */ +#define LIST_POISON1 ((void *) 0x00100100 + POISON_POINTER_DELTA) +#define LIST_POISON2 ((void *) 0x00200200 + POISON_POINTER_DELTA) + +#ifndef ARCH_HAS_PREFETCH +#define ARCH_HAS_PREFETCH +static inline void prefetch(const void *x) {;} +#endif + +/* + * Simple doubly linked list implementation. + * + * Some of the internal functions ("__xxx") are useful when + * manipulating whole lists rather than single entries, as + * sometimes we already know the next/prev entries and we can + * generate better code by using them directly rather than + * using the generic single-entry routines. + */ + +struct list_head { + struct list_head *next, *prev; +}; + +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +static inline void INIT_LIST_HEAD(struct list_head *list) +{ + list->next = list; + list->prev = list; +} + +/* + * Insert a new entry between two known consecutive entries. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_add(struct list_head *new, + struct list_head *prev, + struct list_head *next) +{ + next->prev = new; + new->next = next; + new->prev = prev; + prev->next = new; +} + +/** + * list_add - add a new entry + * @new: new entry to be added + * @head: list head to add it after + * + * Insert a new entry after the specified head. + * This is good for implementing stacks. + */ +static inline void list_add(struct list_head *new, struct list_head *head) +{ + __list_add(new, head, head->next); +} + +/** + * list_add_tail - add a new entry + * @new: new entry to be added + * @head: list head to add it before + * + * Insert a new entry before the specified head. + * This is useful for implementing queues. + */ +static inline void list_add_tail(struct list_head *new, struct list_head *head) +{ + __list_add(new, head->prev, head); +} + +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_del(struct list_head *prev, struct list_head *next) +{ + next->prev = prev; + prev->next = next; +} + +/** + * list_del - deletes entry from list. + * @entry: the element to delete from the list. + * Note: list_empty() on entry does not return true after this, the entry is + * in an undefined state. + */ +static inline void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + entry->next = LIST_POISON1; + entry->prev = LIST_POISON2; +} + +/** + * list_replace - replace old entry by new one + * @old : the element to be replaced + * @new : the new element to insert + * + * If @old was empty, it will be overwritten. + */ +static inline void list_replace(struct list_head *old, + struct list_head *new) +{ + new->next = old->next; + new->next->prev = new; + new->prev = old->prev; + new->prev->next = new; +} + +static inline void list_replace_init(struct list_head *old, + struct list_head *new) +{ + list_replace(old, new); + INIT_LIST_HEAD(old); +} + +/** + * list_del_init - deletes entry from list and reinitialize it. + * @entry: the element to delete from the list. + */ +static inline void list_del_init(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + INIT_LIST_HEAD(entry); +} + +/** + * list_move - delete from one list and add as another's head + * @list: the entry to move + * @head: the head that will precede our entry + */ +static inline void list_move(struct list_head *list, struct list_head *head) +{ + __list_del(list->prev, list->next); + list_add(list, head); +} + +/** + * list_move_tail - delete from one list and add as another's tail + * @list: the entry to move + * @head: the head that will follow our entry + */ +static inline void list_move_tail(struct list_head *list, + struct list_head *head) +{ + __list_del(list->prev, list->next); + list_add_tail(list, head); +} + +/** + * list_is_last - tests whether @list is the last entry in list @head + * @list: the entry to test + * @head: the head of the list + */ +static inline int list_is_last(const struct list_head *list, + const struct list_head *head) +{ + return list->next == head; +} + +/** + * list_empty - tests whether a list is empty + * @head: the list to test. + */ +static inline int list_empty(const struct list_head *head) +{ + return head->next == head; +} + +/** + * list_empty_careful - tests whether a list is empty and not being modified + * @head: the list to test + * + * Description: + * tests whether a list is empty _and_ checks that no other CPU might be + * in the process of modifying either member (next or prev) + * + * NOTE: using list_empty_careful() without synchronization + * can only be safe if the only activity that can happen + * to the list entry is list_del_init(). Eg. it cannot be used + * if another CPU could re-list_add() it. + */ +static inline int list_empty_careful(const struct list_head *head) +{ + struct list_head *next = head->next; + return (next == head) && (next == head->prev); +} + +/** + * list_is_singular - tests whether a list has just one entry. + * @head: the list to test. + */ +static inline int list_is_singular(const struct list_head *head) +{ + return !list_empty(head) && (head->next == head->prev); +} + +static inline void __list_cut_position(struct list_head *list, + struct list_head *head, struct list_head *entry) +{ + struct list_head *new_first = entry->next; + list->next = head->next; + list->next->prev = list; + list->prev = entry; + entry->next = list; + head->next = new_first; + new_first->prev = head; +} + +/** + * list_cut_position - cut a list into two + * @list: a new list to add all removed entries + * @head: a list with entries + * @entry: an entry within head, could be the head itself + * and if so we won't cut the list + * + * This helper moves the initial part of @head, up to and + * including @entry, from @head to @list. You should + * pass on @entry an element you know is on @head. @list + * should be an empty list or a list you do not care about + * losing its data. + * + */ +static inline void list_cut_position(struct list_head *list, + struct list_head *head, struct list_head *entry) +{ + if (list_empty(head)) + return; + if (list_is_singular(head) && + (head->next != entry && head != entry)) + return; + if (entry == head) + INIT_LIST_HEAD(list); + else + __list_cut_position(list, head, entry); +} + +static inline void __list_splice(const struct list_head *list, + struct list_head *prev, + struct list_head *next) +{ + struct list_head *first = list->next; + struct list_head *last = list->prev; + + first->prev = prev; + prev->next = first; + + last->next = next; + next->prev = last; +} + +/** + * list_splice - join two lists, this is designed for stacks + * @list: the new list to add. + * @head: the place to add it in the first list. + */ +static inline void list_splice(const struct list_head *list, + struct list_head *head) +{ + if (!list_empty(list)) + __list_splice(list, head, head->next); +} + +/** + * list_splice_tail - join two lists, each list being a queue + * @list: the new list to add. + * @head: the place to add it in the first list. + */ +static inline void list_splice_tail(struct list_head *list, + struct list_head *head) +{ + if (!list_empty(list)) + __list_splice(list, head->prev, head); +} + +/** + * list_splice_init - join two lists and reinitialise the emptied list. + * @list: the new list to add. + * @head: the place to add it in the first list. + * + * The list at @list is reinitialised + */ +static inline void list_splice_init(struct list_head *list, + struct list_head *head) +{ + if (!list_empty(list)) { + __list_splice(list, head, head->next); + INIT_LIST_HEAD(list); + } +} + +/** + * list_splice_tail_init - join two lists and reinitialise the emptied list + * @list: the new list to add. + * @head: the place to add it in the first list. + * + * Each of the lists is a queue. + * The list at @list is reinitialised + */ +static inline void list_splice_tail_init(struct list_head *list, + struct list_head *head) +{ + if (!list_empty(list)) { + __list_splice(list, head->prev, head); + INIT_LIST_HEAD(list); + } +} + +/** + * list_entry - get the struct for this entry + * @ptr: the &struct list_head pointer. + * @type: the type of the struct this is embedded in. + * @member: the name of the list_struct within the struct. + */ +#define list_entry(ptr, type, member) \ + container_of(ptr, type, member) + +/** + * list_first_entry - get the first element from a list + * @ptr: the list head to take the element from. + * @type: the type of the struct this is embedded in. + * @member: the name of the list_struct within the struct. + * + * Note, that list is expected to be not empty. + */ +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->next, type, member) + +/** + * list_for_each - iterate over a list + * @pos: the &struct list_head to use as a loop cursor. + * @head: the head for your list. + */ +#define list_for_each(pos, head) \ + for (pos = (head)->next; prefetch(pos->next), pos != (head); \ + pos = pos->next) + +/** + * __list_for_each - iterate over a list + * @pos: the &struct list_head to use as a loop cursor. + * @head: the head for your list. + * + * This variant differs from list_for_each() in that it's the + * simplest possible list iteration code, no prefetching is done. + * Use this for code that knows the list to be very short (empty + * or 1 entry) most of the time. + */ +#define __list_for_each(pos, head) \ + for (pos = (head)->next; pos != (head); pos = pos->next) + +/** + * list_for_each_prev - iterate over a list backwards + * @pos: the &struct list_head to use as a loop cursor. + * @head: the head for your list. + */ +#define list_for_each_prev(pos, head) \ + for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \ + pos = pos->prev) + +/** + * list_for_each_safe - iterate over a list safe against removal of list entry + * @pos: the &struct list_head to use as a loop cursor. + * @n: another &struct list_head to use as temporary storage + * @head: the head for your list. + */ +#define list_for_each_safe(pos, n, head) \ + for (pos = (head)->next, n = pos->next; pos != (head); \ + pos = n, n = pos->next) + +/** + * list_for_each_prev_safe - iterate over a list backwards safe against removal of list entry + * @pos: the &struct list_head to use as a loop cursor. + * @n: another &struct list_head to use as temporary storage + * @head: the head for your list. + */ +#define list_for_each_prev_safe(pos, n, head) \ + for (pos = (head)->prev, n = pos->prev; \ + prefetch(pos->prev), pos != (head); \ + pos = n, n = pos->prev) + +/** + * list_for_each_entry - iterate over list of given type + * @pos: the type * to use as a loop cursor. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry(pos, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member); \ + prefetch(pos->member.next), &pos->member != (head); \ + pos = list_entry(pos->member.next, typeof(*pos), member)) + +/** + * list_for_each_entry_reverse - iterate backwards over list of given type. + * @pos: the type * to use as a loop cursor. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry_reverse(pos, head, member) \ + for (pos = list_entry((head)->prev, typeof(*pos), member); \ + prefetch(pos->member.prev), &pos->member != (head); \ + pos = list_entry(pos->member.prev, typeof(*pos), member)) + +/** + * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue() + * @pos: the type * to use as a start point + * @head: the head of the list + * @member: the name of the list_struct within the struct. + * + * Prepares a pos entry for use as a start point in list_for_each_entry_continue(). + */ +#define list_prepare_entry(pos, head, member) \ + ((pos) ? : list_entry(head, typeof(*pos), member)) + +/** + * list_for_each_entry_continue - continue iteration over list of given type + * @pos: the type * to use as a loop cursor. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + * + * Continue to iterate over list of given type, continuing after + * the current position. + */ +#define list_for_each_entry_continue(pos, head, member) \ + for (pos = list_entry(pos->member.next, typeof(*pos), member); \ + prefetch(pos->member.next), &pos->member != (head); \ + pos = list_entry(pos->member.next, typeof(*pos), member)) + +/** + * list_for_each_entry_continue_reverse - iterate backwards from the given point + * @pos: the type * to use as a loop cursor. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + * + * Start to iterate over list of given type backwards, continuing after + * the current position. + */ +#define list_for_each_entry_continue_reverse(pos, head, member) \ + for (pos = list_entry(pos->member.prev, typeof(*pos), member); \ + prefetch(pos->member.prev), &pos->member != (head); \ + pos = list_entry(pos->member.prev, typeof(*pos), member)) + +/** + * list_for_each_entry_from - iterate over list of given type from the current point + * @pos: the type * to use as a loop cursor. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + * + * Iterate over list of given type, continuing from current position. + */ +#define list_for_each_entry_from(pos, head, member) \ + for (; prefetch(pos->member.next), &pos->member != (head); \ + pos = list_entry(pos->member.next, typeof(*pos), member)) + +/** + * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry + * @pos: the type * to use as a loop cursor. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry_safe(pos, n, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member), \ + n = list_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, typeof(*n), member)) + +/** + * list_for_each_entry_safe_continue + * @pos: the type * to use as a loop cursor. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + * + * Iterate over list of given type, continuing after current point, + * safe against removal of list entry. + */ +#define list_for_each_entry_safe_continue(pos, n, head, member) \ + for (pos = list_entry(pos->member.next, typeof(*pos), member), \ + n = list_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, typeof(*n), member)) + +/** + * list_for_each_entry_safe_from + * @pos: the type * to use as a loop cursor. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + * + * Iterate over list of given type from current point, safe against + * removal of list entry. + */ +#define list_for_each_entry_safe_from(pos, n, head, member) \ + for (n = list_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, typeof(*n), member)) + +/** + * list_for_each_entry_safe_reverse + * @pos: the type * to use as a loop cursor. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + * + * Iterate backwards over list of given type, safe against removal + * of list entry. + */ +#define list_for_each_entry_safe_reverse(pos, n, head, member) \ + for (pos = list_entry((head)->prev, typeof(*pos), member), \ + n = list_entry(pos->member.prev, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.prev, typeof(*n), member)) + +/* + * Double linked lists with a single pointer list head. + * Mostly useful for hash tables where the two pointer list head is + * too wasteful. + * You lose the ability to access the tail in O(1). + */ + +struct hlist_head { + struct hlist_node *first; +}; + +struct hlist_node { + struct hlist_node *next, **pprev; +}; + +#define HLIST_HEAD_INIT { .first = NULL } +#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } +#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) +static inline void INIT_HLIST_NODE(struct hlist_node *h) +{ + h->next = NULL; + h->pprev = NULL; +} + +static inline int hlist_unhashed(const struct hlist_node *h) +{ + return !h->pprev; +} + +static inline int hlist_empty(const struct hlist_head *h) +{ + return !h->first; +} + +static inline void __hlist_del(struct hlist_node *n) +{ + struct hlist_node *next = n->next; + struct hlist_node **pprev = n->pprev; + *pprev = next; + if (next) + next->pprev = pprev; +} + +static inline void hlist_del(struct hlist_node *n) +{ + __hlist_del(n); + n->next = LIST_POISON1; + n->pprev = LIST_POISON2; +} + +static inline void hlist_del_init(struct hlist_node *n) +{ + if (!hlist_unhashed(n)) { + __hlist_del(n); + INIT_HLIST_NODE(n); + } +} + +static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) +{ + struct hlist_node *first = h->first; + n->next = first; + if (first) + first->pprev = &n->next; + h->first = n; + n->pprev = &h->first; +} + +/* next must be != NULL */ +static inline void hlist_add_before(struct hlist_node *n, + struct hlist_node *next) +{ + n->pprev = next->pprev; + n->next = next; + next->pprev = &n->next; + *(n->pprev) = n; +} + +static inline void hlist_add_after(struct hlist_node *n, + struct hlist_node *next) +{ + next->next = n->next; + n->next = next; + next->pprev = &n->next; + + if(next->next) + next->next->pprev = &next->next; +} + +#define hlist_entry(ptr, type, member) container_of(ptr,type,member) + +#define hlist_for_each(pos, head) \ + for (pos = (head)->first; pos && ({ prefetch(pos->next); 1; }); \ + pos = pos->next) + +#define hlist_for_each_safe(pos, n, head) \ + for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \ + pos = n) + +/** + * hlist_for_each_entry - iterate over list of given type + * @tpos: the type * to use as a loop cursor. + * @pos: the &struct hlist_node to use as a loop cursor. + * @head: the head for your list. + * @member: the name of the hlist_node within the struct. + */ +#define hlist_for_each_entry(tpos, pos, head, member) \ + for (pos = (head)->first; \ + pos && ({ prefetch(pos->next); 1;}) && \ + ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ + pos = pos->next) + +/** + * hlist_for_each_entry_continue - iterate over a hlist continuing after current point + * @tpos: the type * to use as a loop cursor. + * @pos: the &struct hlist_node to use as a loop cursor. + * @member: the name of the hlist_node within the struct. + */ +#define hlist_for_each_entry_continue(tpos, pos, member) \ + for (pos = (pos)->next; \ + pos && ({ prefetch(pos->next); 1;}) && \ + ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ + pos = pos->next) + +/** + * hlist_for_each_entry_from - iterate over a hlist continuing from current point + * @tpos: the type * to use as a loop cursor. + * @pos: the &struct hlist_node to use as a loop cursor. + * @member: the name of the hlist_node within the struct. + */ +#define hlist_for_each_entry_from(tpos, pos, member) \ + for (; pos && ({ prefetch(pos->next); 1;}) && \ + ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ + pos = pos->next) + +/** + * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry + * @tpos: the type * to use as a loop cursor. + * @pos: the &struct hlist_node to use as a loop cursor. + * @n: another &struct hlist_node to use as temporary storage + * @head: the head for your list. + * @member: the name of the hlist_node within the struct. + */ +#define hlist_for_each_entry_safe(tpos, pos, n, head, member) \ + for (pos = (head)->first; \ + pos && ({ n = pos->next; 1; }) && \ + ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ + pos = n) + + +#endif + + diff --git a/apue/project_socket/src/logger.c b/apue/project_socket/src/logger.c new file mode 100644 index 0000000..66eef8f --- /dev/null +++ b/apue/project_socket/src/logger.c @@ -0,0 +1,165 @@ +/********************************************************************************* + * Copyright: (C) 2022 LingYun IoT System Studio + * All rights reserved. + * + * Filename: logger.c + * Description: This file + * + * Version: 1.0.0(15/04/22) + * Author: LingYun <lingyun@email.com> + * ChangeLog: 1, Release initial version on "15/04/22 10:38:49" + * + ********************************************************************************/ + +#include <stdio.h> +#include <errno.h> +#include <time.h> +#include <stdarg.h> +#include <string.h> +#include "logger.h" + +/* + * Program name variable is provided by the libc + */ +extern const char* __progname; +#define PROGRAM_NAME __progname + +/* + * Logger internal sctructure + */ +typedef struct logger_s { + FILE *fp; + int loglevel; + int use_stdout; +} logger_t; + +static struct logger_s g_logger; + +static const char* LOG_LEVELS[] = { + LOG_STRING_ERROR, + LOG_STRING_WARN, + LOG_STRING_INFO, + LOG_STRING_DEBUG +}; + +/* + * initial logger system + */ +int logger_init(char *filename, int loglevel) +{ + logger_term(); + + g_logger.loglevel = loglevel>LOG_LEVEL_MAX ? LOG_LEVEL_MAX : loglevel; + + /* $filename is NULL or match "stdout" will use standard output */ + if( !filename || !strcasecmp(filename, "stdout")) + { + g_logger.use_stdout = 1; + g_logger.fp = stderr; + } + else + { + g_logger.use_stdout = 0; + g_logger.fp = fopen(filename, "a"); + if( !g_logger.fp ) + { + fprintf(stderr, "Failed to open file '%s': %s", filename, strerror(errno)); + return -1; + } + } + + return 0; +} + +/* + * terminate logger system + */ +void logger_term(void) +{ + if( !g_logger.fp ) + { + return ; + } + + if( !g_logger.use_stdout ) + { + fclose(g_logger.fp); + } + + g_logger.use_stdout = 0; + g_logger.fp = NULL; + + return ; +} + + +/* + * Logging functions + */ +void log_generic(const int level, const char* format, va_list args) +{ + char message[256]; + struct tm* current_tm; + time_t time_now; + + vsprintf(message, format, args); + + time(&time_now); + current_tm = localtime(&time_now); + + int res = fprintf(g_logger.fp, + "<%s> %02i:%02i:%02i [%s] %s" + , PROGRAM_NAME + , current_tm->tm_hour + , current_tm->tm_min + , current_tm->tm_sec + , LOG_LEVELS[level] + , message ); + + fflush(g_logger.fp); +} + +void log_error(char *format, ...) +{ + va_list args; + va_start(args, format); + log_generic(LOG_LEVEL_ERROR, format, args); + va_end(args); +} + +void log_warn(char *format, ...) +{ + if (g_logger.loglevel < LOG_LEVEL_WARN) { + return; + } + + va_list args; + va_start(args, format); + log_generic(LOG_LEVEL_WARN, format, args); + va_end(args); +} + +void log_info(char *format, ...) +{ + if (g_logger.loglevel < LOG_LEVEL_INFO) { + return; + } + + va_list args; + va_start(args, format); + log_generic(LOG_LEVEL_INFO, format, args); + va_end(args); +} + +void log_debug(char *format, ...) +{ + if (g_logger.loglevel < LOG_LEVEL_DEBUG) { + return; + } + + va_list args; + va_start(args, format); + log_generic(LOG_LEVEL_DEBUG, format, args); + va_end(args); +} + diff --git a/apue/project_socket/src/logger.h b/apue/project_socket/src/logger.h new file mode 100644 index 0000000..095c942 --- /dev/null +++ b/apue/project_socket/src/logger.h @@ -0,0 +1,52 @@ +/******************************************************************************** + * Copyright: (C) 2022 LingYun IoT System Studio + * All rights reserved. + * + * Filename: logger.h + * Description: This head file + * + * Version: 1.0.0(15/04/22) + * Author: LingYun <lingyun@email.com> + * ChangeLog: 1, Release initial version on "15/04/22 10:38:02" + * + ********************************************************************************/ + +#ifndef _LOGGER_H_ +#define _LOGGER_H_ + +/* + * logger level + */ +enum +{ + LOG_LEVEL_ERROR, + LOG_LEVEL_WARN, + LOG_LEVEL_INFO, + LOG_LEVEL_DEBUG, + LOG_LEVEL_MAX, +}; + +/* + * logger prefix string for different logging levels + */ +#define LOG_STRING_ERROR "ERROR" +#define LOG_STRING_WARN "WARN " +#define LOG_STRING_INFO "INFO " +#define LOG_STRING_DEBUG "DEBUG" + + +/* + * logger initial and terminate functions + */ +int logger_init(char *filename, int loglevel); +void logger_term(void); + +/* + * logging methods by levels + */ +void log_error(char* format, ...); +void log_warn(char* format, ...); +void log_info(char* format, ...); +void log_debug(char* format, ...); + +#endif /* ----- #ifndef _LOGGER_H_ ----- */ diff --git a/apue/project_socket/src/makefile b/apue/project_socket/src/makefile new file mode 100644 index 0000000..05877f5 --- /dev/null +++ b/apue/project_socket/src/makefile @@ -0,0 +1,29 @@ + +LIBNAME = booster + +PREFIX ?= `pwd`/../libs/install +CFLAGS += -I ${PREFIX}/include + +INCFILES = $(wildcard *.h) +SRCFILES = $(wildcard *.c) +OBJFILES = $(patsubst %.c,%.o,$(SRCFILES)) + +all: $(OBJFILES) + @${AR} -rcs lib${LIBNAME}.a ${OBJFILES} + +%.o : %.c + @$(CC) $(CFLAGS) -c $< + +clean: + @rm -f *.o + rm -rf lib${LIBNAME}.* + +distclean: clean + +install: all + install lib${LIBNAME}.* ${PREFIX}/lib + install ${INCFILES} ${PREFIX}/include + +uninstall: + rm -f ${PREFIX}/lib/lib${LIBNAME}.* + rm -f ${PREFIX}/include/${INCFILES} diff --git a/apue/project_socket/src/packet.c b/apue/project_socket/src/packet.c new file mode 100644 index 0000000..9bb680f --- /dev/null +++ b/apue/project_socket/src/packet.c @@ -0,0 +1,96 @@ +/********************************************************************************* + * Copyright: (C) 2022 LingYun IoT System Studio + * All rights reserved. + * + * Filename: packet.c + * Description: This file is packet API functions + * + * Version: 1.0.0(18/04/22) + * Author: Guo Wenxue <guowenxue@gmail.com> + * ChangeLog: 1, Release initial version on "18/04/22 16:30:25" + * + ********************************************************************************/ + +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <time.h> +#include "packet.h" +#include "logger.h" +#include "ds18b20.h" + +int get_devid(char *devid, int size, int sn) +{ + 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; +} + +int get_time(struct tm *ptm) +{ + if( !ptm ) + { + log_error("Invalid input arugments\n"); + return -1; + } + + + time_t now = time(NULL); + localtime_r(&now, ptm); + + return 0; +} + +int packet_segmented_pack(pack_info_t *pack_info, char *pack_buf, int size) +{ + 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)); + + return strlen(pack_buf); +} + +int packet_json_pack(pack_info_t *pack_info, char *pack_buf, int size) +{ + 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)); + + return strlen(pack_buf); +} + diff --git a/apue/project_socket/src/packet.h b/apue/project_socket/src/packet.h new file mode 100644 index 0000000..d1b176e --- /dev/null +++ b/apue/project_socket/src/packet.h @@ -0,0 +1,70 @@ +/******************************************************************************** + * Copyright: (C) 2022 LingYun IoT System Studio + * All rights reserved. + * + * Filename: packet.h + * Description: This head file is packet API functions. + * + * Version: 1.0.0(18/04/22) + * Author: Guo Wenxue <guowenxue@gmail.com> + * ChangeLog: 1, Release initial version on "18/04/22 16:24:40" + * + ********************************************************************************/ + + +#ifndef _PACKET_H_ +#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 */ + struct tm sample_time; /* sample time */ + uint16_t temper; /* sample temperature */ +} pack_info_t; + +/* packet function pointer type */ +typedef int (* pack_proc_t)(pack_info_t *pack_info, char *pack_buf, int size); + +/* description: get device ID + * input args: + * $devid : device ID string + * $size : device ID output buffer size + * $sn : serial number + * return value: <0: failure 0:ok + */ +extern int get_devid(char *devid, int size, int sn); + +/* description: get current system in struct tm + * input args: + * $sample_time: sample time in struct tm + * return value: <0: failure 0:ok + */ +extern int get_time(struct tm *sample_time); + +/* description: package a string packet in format "devid|time|temper" + * input args: + * $pack_info: packet data contains devid, time and temperature + * $pack_buf : packet output buffer + * $size : packet output buffer size + * return value: <0: failure >0: packet bytes + */ +extern int packet_segmented_pack(pack_info_t *pack_info, char *pack_buf, int size); + + +/* description: package a json string packet: {"devid":"xxx", "time":"xxx", "temperature":"xxx"} + * input args: + * $pack_info: packet data contains devid, time and temperature + * $pack_buf : packet output buffer + * $size : packet output buffer size + * return value: <0: failure >0: packet bytes + */ +extern int packet_json_pack(pack_info_t *pack_info, char *pack_buf, int size); + + +#endif /* ----- #ifndef _PACKET_H_ ----- */ diff --git a/apue/project_socket/src/socket.c b/apue/project_socket/src/socket.c new file mode 100644 index 0000000..e6231e3 --- /dev/null +++ b/apue/project_socket/src/socket.c @@ -0,0 +1,515 @@ +/******************************************************************************** + * Copyright: (C) 2022 LingYun IoT System Studio + * All rights reserved. + * + * Filename: socket.c + * Description: This file is for socket API functions + * + * Version: 1.0.0(18/04/22) + * Author: Guo Wenxue <guowenxue@gmail.com> + * ChangeLog: 1, Release initial version on "18/04/22 17:09:59" + * + ********************************************************************************/ +#include <stdio.h> +#include <unistd.h> +#include <string.h> +#include <netdb.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/un.h> +#include <poll.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <linux/sockios.h> +#include <sys/ioctl.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <netinet/tcp.h> +#include <arpa/inet.h> +#include <sys/resource.h> + +#include "socket.h" +#include "logger.h" + +/* description: initial socket context + * input args: + * $sock: socket context pointer + * $host: connect server hostname for client mode, unused for server mode + * $port: connect server port for client mode or listen port for server mode + * return value: <0: failure 0:ok + */ +int socket_init(socket_ctx_t *sock, char *host, int port) +{ + if( !sock || port<=0 ) + return -1; + + memset( sock, 0, sizeof(*sock) ); + sock->fd = -1; + sock->port = port; + if( host ) /* server no need it */ + strncpy(sock->host, host, HOSTNAME_LEN); +} + +/* description: close socket + * input args: + * $sock: socket context pointer + * return value: <0: failure 0:ok + */ +int socket_term(socket_ctx_t *sock) +{ + if( !sock ) + return -1; + + if( sock->fd > 0) + { + close(sock->fd); + sock->fd = -1; + } + + return 0; +} + +/* description: socket server start listen + * input args: + * $sock: socket context pointer + * return value: <0: failure 0:ok + */ +int socket_listen(socket_ctx_t *sock) +{ + int rv = 0; + struct sockaddr_in addr; + int backlog = 13; + + if( !sock ) + return -1; + + set_socket_rlimit(); /* set max open socket count */ +} + +/* description: socket connect to server in block mode + * input args: + * $sock: socket context pointer + * return value: <0: failure 0:ok + */ +int socket_connect(socket_ctx_t *sock) +{ + int rv = 0; + int sockfd = 0; + struct sockaddr_in servaddr; + char service[20]; + struct addrinfo hints, *rp; + struct addrinfo *res = NULL; + struct in_addr inaddr; + struct sockaddr_in addr; + int len = sizeof(addr); + + if( !sock ) + return -1; + + socket_term(sock); + + /*+--------------------------------------------------+ + *| use getaddrinfo() to do domain name translation | + *+--------------------------------------------------+*/ + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_INET; /* Only support IPv4 */ + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; /* TCP protocol */ + + /* If $host is a valid IP address, then don't use name resolution */ + if( inet_aton(sock->host, &inaddr) ) + { + //log_info("%s is a valid IP address, don't use domain name resolution.\n", sock->host); + hints.ai_flags |= AI_NUMERICHOST; + } + + /* Obtain address(es) matching host/port */ + snprintf(service, sizeof(service), "%d", sock->port); + if( (rv=getaddrinfo(sock->host, service, &hints, &res)) ) + { + log_error("getaddrinfo() parser [%s:%s] failed: %s\n", sock->host, service, gai_strerror(rv)); + return -3; + } + + /* getaddrinfo() returns a list of address structures. Try each + address until we successfully connect or bind */ + for (rp=res; rp!=NULL; rp=rp->ai_next) + { +#if 0 + char ipaddr[INET_ADDRSTRLEN]; + struct sockaddr_in *sp = (struct sockaddr_in *) rp->ai_addr; + + /* print domain name translation result */ + memset( ipaddr, 0, sizeof(ipaddr) ); + if( inet_ntop(AF_INET, &sp->sin_addr, ipaddr, sizeof(ipaddr)) ) + { + log_info("domain name resolution [%s->%s]\n", sock->host, ipaddr); + } +#endif + + /* Create the socket */ + sockfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + if( sockfd < 0) + { + log_error("socket() create failed: %s\n", strerror(errno)); + rv = -3; + continue; + } + + /* connect to server */ + rv = connect(sockfd, rp->ai_addr, len); + if( 0 == rv ) + { + sock->fd = sockfd; + log_info("Connect to server[%s:%d] on fd[%d] successfully!\n", sock->host, sock->port, sockfd); + break; + } + else + { + /* socket connect get error, try another IP address */ + close(sockfd); + continue; + } + } + + freeaddrinfo(res); + return rv; +} + +/* description: send data from the socket + * input args: + * $sock : socket context pointer + * $data : socket send data + * $bytes: socket send data bytes + * return value: <0: failure 0:ok + */ +int socket_send(socket_ctx_t *sock, char *data, int bytes) +{ + int rv = 0; + int i = 0; + int left_bytes = bytes; + + if( !sock || !data || bytes<= 0 ) + return -1; + + while( left_bytes > 0 ) + { + rv=write(sock->fd, &data[i], left_bytes); + if( rv < 0 ) + { + log_info("socket[%d] write() failure: %s, close socket now\n", sock->fd, strerror(errno)); + socket_term(sock); + return -2; + } + else if( rv == left_bytes ) + { + log_info("socket send %d bytes data over\n", bytes); + return 0; + } + else + { + /* not send over this time, continue to send left data */ + i += rv; + left_bytes -= rv; + continue; + } + } +} + +/* description: receive data from the socket + * input args: + * $sock : socket context pointer + * $buf : socket receive data buffer + * $size : socket receive data buffer size + * $timeout: receive data time, <=0 will don't timeout + * return value: <0: failure 0:ok + */ +int socket_recv(socket_ctx_t *sock, char *buf, int size, int timeout) +{ + int rv = 0; + int i = 0; + fd_set rdset; + int maxfd; + + if( !sock || !buf || size<= 0 ) + return -1; + + memset(buf, 0, size); + + maxfd = sock->fd; + FD_ZERO(&rdset); + FD_SET(sock->fd, &rdset); + + if( timeout <= 0 ) /* no timeout */ + { + rv=select(maxfd+1, &rdset, NULL, NULL, NULL); + } + else + { + struct timeval tv; + tv.tv_sec = timeout; + tv.tv_usec = 0; + rv=select(maxfd+1, &rdset, NULL, NULL, &tv); + } + + if( rv < 0 ) + { + log_error("select() on socket[%d] got error: %s\n", sock->fd, strerror(errno)); + return -2; + } + else if( rv == 0 ) + { + log_error("select() on socket[%d] get timeout\n", sock->fd); + return 0; + } + else + { + rv = read(sock->fd, buf, size); + if( rv <= 0 ) + { + log_error("socket[%d] read() failure or got disconnected: %s, close socket now\n", sock->fd, strerror(errno)); + socket_term(sock); + return -2; + } + else + { + log_debug("socket[%d] receive %d bytes data\n", sock->fd, rv); + return rv; + } + } +} + + + +/*+-------------------------------------------------------------------+ + *| socket utils function | + *+-------------------------------------------------------------------+*/ + + +/* socket connected or not: <0: failure 0:ok */ +int sock_check_connect(int sockfd) +{ + struct tcp_info info; + int len=sizeof(info); + + if( sockfd < 0 ) + return -1; + + getsockopt(sockfd, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len); + + if( TCP_CLOSE==info.tcpi_state || TCP_CLOSING==info.tcpi_state || TCP_CLOSE_WAIT==info.tcpi_state ) + { + return -3; + } + + return -0; +} + +/* description: set socket listen port as reusable, fix port already used bug */ +int socket_set_reuseaddr(int sockfd) +{ + int opt = 1; + int len = sizeof (int); + + if (setsockopt (sockfd, SOL_SOCKET, SO_REUSEADDR, (void *) &opt, len)) + { + log_error("Set socket[%d] option SO_REUSEADDR failed:%s\n", sockfd, strerror(errno)); + return -1; + } + log_debug("Set socket[%d] option SO_REUSEADDR ok\n", sockfd); + + return 0; +} + +/* set socket as non-block mode, common socket default work as block mode */ +int socket_set_nonblock(int sockfd) +{ + int opts; + /* + * fcntl may set: + * + * EACCES, EAGAIN: Operation is prohibited by locks held by other + * processes. Or, operation is prohibited because the file has + * been memory-mapped by another process. + * EBADF: fd is not an open file descriptor, or the command was F_SETLK + * or F_SETLKW and the file descriptor open mode doesn't match + * with the type of lock requested. + * EDEADLK: It was detected that the specified F_SETLKW command would + * cause a deadlock. + * EFAULT: lock is outside your accessible address space. + * EINTR: For F_SETLKW, the command was interrupted by a signal. For + * F_GETLK and F_SETLK, the command was interrupted by a signal + * before the lock was checked or acquired. Most likely when + * locking a remote file (e.g. locking over NFS), but can + * sometimes happen locally. + * EINVAL: For F_DUPFD, arg is negative or is greater than the maximum + * allowable value. For F_SETSIG, arg is not an allowable signal + * number. + * EMFILE: For F_DUPFD, the process already has the maximum number of + * file descriptors open. + * ENOLCK: Too many segment locks open, lock table is full, or a remote + * locking protocol failed (e.g. locking over NFS). + * EPERM: Attempted to clear the O_APPEND flag on a file that has the + * append-only attribute set. + */ + opts = fcntl(sockfd, F_GETFL); + if (opts < 0) + { + log_warn("fcntl() get socket options failure: %s\n", strerror(errno)); + return -1; + } + + opts |= O_NONBLOCK; + + if (fcntl(sockfd, F_SETFL, opts) < 0) + { + log_warn("fcntl() set socket options failure: %s\n", strerror(errno)); + return -1; + } + + log_debug("Set socket[%d] none blocking\n", sockfd); + return opts; +} + + +/* set socket receive and send buffer size in linux kernel space */ +int socket_set_buffer(int sockfd, int rsize, int ssize) +{ + int opt; + socklen_t optlen = sizeof(opt); + + if(sockfd < 0) + return -1; + + /* Get system default receive buffer size, Linux X86: 85K */ + if (getsockopt (sockfd, SOL_SOCKET, SO_RCVBUF, (char *) &opt, &optlen)) + { + log_warn("getsockopt() get receive buffer failure: %s\n", strerror(errno)); + return -2; + } + + /* Only when current receive buffer size larger than the default one will change it */ + if(rsize > opt) + { + opt = (int) rsize; + if (setsockopt (sockfd, SOL_SOCKET, SO_RCVBUF, (char *) &opt, optlen)) + { + log_warn("setsockopt() set receive buffer to %d failure: %s\n", opt, strerror(errno)); + return -2; + } + } + + /* Get system default send buffer size, Linux X86: 16K */ + if (getsockopt (sockfd, SOL_SOCKET, SO_SNDBUF, (char *) &opt, &optlen)) + { + log_warn("getsockopt() get send buffer failure: %s\n", strerror(errno)); + return -3; + } + + /* Only when current receive buffer size larger than the default one will change it */ + if(ssize > opt) + { + opt = (int) ssize; + if (setsockopt (sockfd, SOL_SOCKET, SO_SNDBUF, (char *) &opt, optlen)) + { + log_warn("setsockopt() set send buffer to %d failure: %s\n", opt, strerror(errno)); + return -3; + } + } + + log_info("Set socket[%d] RCVBUF size:%d SNDBUF size:%d\n", sockfd, rsize, ssize); + return 0; +} + +/* + * Enable socket SO_KEEPALIVE, if the connection disconnected, any system call on socket + * will return immediately and errno will be set to "WSAENOTCONN" + * + * keepalive is not program related, but socket related, * so if you have multiple sockets, + * you can handle keepalive for each of them separately. + * + * Reference: http://tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/ + */ +int socket_set_keepalive(int sockfd, int keepintvl, int keepcnt) +{ + int opt; + + if(sockfd < 0) + return -1; + + /* Enable the KEEPALIVE flag */ + opt = 1; + if (setsockopt (sockfd, SOL_SOCKET, SO_KEEPALIVE, (char *) &opt, sizeof (opt))) + { + log_warn("setsockopt() enable SO_KEEPALIVE failure: %s\n", strerror(errno)); + return -2; + } + + if(keepintvl || keepcnt) + { + /* + * The tcp_keepidle parameter specifies the interval between the last data packet sent + * (simple ACKs are not considered data) and the first keepalive probe; after the + * connection is marked to need keepalive, this counter is not used any further. + * ~ >: cat /proc/sys/net/ipv4/tcp_keepalive_time + * 7200 + */ + opt = 3; /* 3 seconds */ + if (setsockopt (sockfd, SOL_TCP, TCP_KEEPIDLE, (char *) &opt, sizeof (opt))) + { + log_error("setsockopt() set TCP_KEEPIDLE to %d seconds failure: %s\n", opt, strerror(errno)); + return -3; + } + + if((opt=keepintvl) > 0) + { + /* + * The tcp_keepintvl parameter specifies the interval between subsequential keepalive + * probes, regardless of what the connection has exchanged in the meantime. + * ~ >: cat /proc/sys/net/ipv4/tcp_keepalive_intvl + * 75 + */ + if (setsockopt (sockfd, SOL_TCP, TCP_KEEPINTVL, (char *) &opt, sizeof (opt))) + { + log_error("setsockopt() set TCP_KEEPINTVL to %d failure: %s\n", opt, strerror(errno)); + return -4; + } + } + + if((opt=keepcnt) > 0) + { + /* + * The TCP_KEEPCNT option specifies the maximum number of unacknowledged probes to + * send before considering the connection dead and notifying the application layer + * probes to be sent. The value of TCP_KEEPCNT is an integer value between 1 and n, + * where n is the value of the systemwide tcp_keepcnt parameter. + * ~ >: cat /proc/sys/net/ipv4/tcp_keepalive_probes + * 9 + */ + if (setsockopt (sockfd, SOL_TCP, TCP_KEEPCNT, (char *) &opt, sizeof (opt))) + { + log_error("setsockopt() set TCP_KEEPCNT to %d failure: %s\n", opt, strerror(errno)); + return -5; + } + } + } + + log_debug("Set socket[%d] KEEPINTVL:%d KEEPCNT:%d\n", sockfd, keepintvl, keepcnt); + return 0; +} + + +/* Set open file description count to max */ +void set_socket_rlimit(void) +{ + struct rlimit limit = {0}; + + getrlimit(RLIMIT_NOFILE, &limit ); + limit.rlim_cur = limit.rlim_max; + setrlimit(RLIMIT_NOFILE, &limit ); + + log_info("set socket open fd max count to %d\n", limit.rlim_max); +} + diff --git a/apue/project_socket/src/socket.h b/apue/project_socket/src/socket.h new file mode 100644 index 0000000..e23b850 --- /dev/null +++ b/apue/project_socket/src/socket.h @@ -0,0 +1,100 @@ +/******************************************************************************** + * Copyright: (C) 2022 LingYun IoT System Studio + * All rights reserved. + * + * Filename: socket.h + * Description: This head file is for socket API functions + * + * Version: 1.0.0(18/04/22) + * Author: Guo Wenxue <guowenxue@gmail.com> + * ChangeLog: 1, Release initial version on "18/04/22 17:09:59" + * + ********************************************************************************/ + +#ifndef _SOCKET_H_ +#define _SOCKET_H_ + +#define HOSTNAME_LEN 64 + +typedef struct socket_ctx_s +{ + char host[HOSTNAME_LEN]; /* CLIENT: Connect server hostname; SERVER: Unused */ + int port; /* CLIENT: Connect server port; SERVER: listen port */ + int fd; /* socket descriptor */ +} socket_ctx_t; + +/* description: initial socket context + * input args: + * $sock: socket context pointer + * $host: connect server hostname for client mode, unused for server mode + * $port: connect server port for client mode or listen port for server mode + * return value: <0: failure 0:ok + */ +extern int socket_init(socket_ctx_t *sock, char *host, int port); + +/* description: close socket + * input args: + * $sock: socket context pointer + * return value: <0: failure 0:ok + */ +extern int socket_term(socket_ctx_t *sock); + +/* description: socket server start listen + * input args: + * $sock: socket context pointer + * return value: <0: failure 0:ok + */ +extern int socket_listen(socket_ctx_t *sock); + +/* description: socket client connect to server + * input args: + * $sock: socket context pointer + * return value: <0: failure 0:ok + */ +extern int socket_connect(socket_ctx_t *sock); + +/* description: send data from the socket + * input args: + * $sock : socket context pointer + * $data : socket send data + * $bytes: socket send data bytes + * return value: <0: failure 0:ok + */ +extern int socket_send(socket_ctx_t *sock, char *data, int bytes); + +/* description: receive data from the socket + * input args: + * $sock : socket context pointer + * $buf : socket receive data buffer + * $size : socket receive data buffer size + * $timeout: receive data time, <=0 will don't timeout + * return value: <0: failure 0:ok + */ +#define TIMEOUT_NONE 0 +extern int socket_recv(socket_ctx_t *sock, char *buf, int size, int timeout); + +/*+-------------------------------------------------------------------+ + *| socket utils function | + *+-------------------------------------------------------------------+*/ + + +/* socket connected or not: <0: failure 0:ok */ +extern int sock_check_connect(int sockfd); + +/* description: set socket listen port as reusable, fix port already used bug */ +extern int socket_set_reuseaddr(int sockfd); + +/* set socket as non-block mode, common socket default work as block mode */ +extern int socket_set_nonblock(int sockfd); + +/* set socket receive and send buffer size in linux kernel space */ +extern int socket_set_buffer(int sockfd, int rsize, int ssize); + +/* set heartbeat keepalive */ +extern int socket_set_keepalive(int sockfd, int keepintvl, int keepcnt); + +/* Set open file description count to max */ +extern void set_socket_rlimit(void); + +#endif /* ----- #ifndef _SOCKET_H_ ----- */ + diff --git a/apue/project_socket/src/sqlite_blob.c b/apue/project_socket/src/sqlite_blob.c new file mode 100644 index 0000000..be70c59 --- /dev/null +++ b/apue/project_socket/src/sqlite_blob.c @@ -0,0 +1,266 @@ +/******************************************************************************** + * Copyright: (C) 2020 LingYun IoT System Studio + * All rights reserved. + * + * Filename: sqlite_blob.c + * Description: This library used to operate blob packet in sqlite database. + * + * Version: 1.0.0(2020年05月13日) + * Author: Guo Wenxue <guowenxue@gmail.com> + * ChangeLog: 1, Release initial version on "2020年05月13日 12时14分23秒" + * + ********************************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include "sqlite_blob.h" +#include "logger.h" + +/* Blob packet table name */ +#define TABLE_NAME "PackTable" + +/* Use static global handler here in order to simplify the API, + * But it will make this library not thread safe + */ +static sqlite3 *s_clidb = NULL; + + +/* description: open or create sqlite database if not exist + * input args: + * $db_file: sqlite database file name + * return value: <0: failure 0:ok + * */ +int database_init(const char *db_file) +{ + char sql[SQL_COMMAND_LEN]={0}; + char *errmsg = NULL; + + if( !db_file ) + { + log_error("%s() Invalid input arguments\n", __func__); + return -1; + } + + /*+------------------------------------------+ + *| database already exist, just open it | + *+------------------------------------------+*/ + if( 0==access(db_file, F_OK) ) + { + if( SQLITE_OK != sqlite3_open(db_file, &s_clidb) ) + { + log_error("open database file '%s' failure\n", db_file); + return -2; + } + log_info("open database file '%s' ok\n", db_file); + return 0; + } + + /*+-----------------------------------------+ + *| database not exist, create and init it | + *+-----------------------------------------+*/ + + if( SQLITE_OK != sqlite3_open(db_file, &s_clidb) ) + { + log_error("create database file '%s' failure\n", db_file); + return -2; + } + + /* SQLite continues without syncing as soon as it has handed data off to the operating system */ + sqlite3_exec(s_clidb, "pragma synchronous = OFF; ", NULL, NULL, NULL); + + /* enable full auto vacuum, Auto increase/decrease */ + sqlite3_exec(s_clidb, "pragma auto_vacuum = 2 ; ", NULL, NULL, NULL); + + /* Create firehost table in the database */ + snprintf(sql, sizeof(sql), "CREATE TABLE %s(packet BLOB);", TABLE_NAME); + if( SQLITE_OK != sqlite3_exec(s_clidb, sql, NULL, NULL, &errmsg) ) + { + log_error("create data_table in database file '%s' failure: %s\n", db_file, errmsg); + sqlite3_free(errmsg); /* free errmsg */ + sqlite3_close(s_clidb); /* close databse */ + unlink(db_file); /* remove database file */ + return -3; + } + + log_info("create and init database file '%s' ok\n", db_file); + return 0; +} + + +/* description: close sqlite database handler + * return value: none + */ +void database_term(void) +{ + log_warn("close sqlite database now\n"); + sqlite3_close(s_clidb); + + return ; +} + + +/* description: push a blob packet into database + * input args: + * $pack: blob packet data address + * $size: blob packet data bytes + * return value: <0: failure 0:ok + */ +int blobdb_push_packet(void *pack, int size) +{ + char sql[SQL_COMMAND_LEN]={0}; + int rv = 0; + char *errmsg = NULL; + sqlite3_stmt *stat = NULL; + + if( !pack || size<=0 ) + { + log_error("%s() Invalid input arguments\n", __func__); + return -1; + } + + if( ! s_clidb ) + { + log_error("sqlite database not opened\n"); + return -2; + } + + snprintf(sql, sizeof(sql), "insert into %s(packet) values(?)", TABLE_NAME); + rv = sqlite3_prepare_v2(s_clidb, sql, -1, &stat, NULL); + if(SQLITE_OK!=rv || !stat) + { + log_error("blob add sqlite3_prepare_v2 failure\n"); + rv = -2; + goto OUT; + } + + if( SQLITE_OK != sqlite3_bind_blob(stat, 1, pack, size, NULL) ) + { + log_error("blob add sqlite3_bind_blob failure\n"); + rv = -3; + goto OUT; + } + + rv = sqlite3_step(stat); + if( SQLITE_DONE!=rv && SQLITE_ROW!=rv ) + { + log_error("blob add sqlite3_step failure\n"); + rv = -4; + goto OUT; + } + +OUT: + sqlite3_finalize(stat); + + if( rv < 0 ) + log_error("add new blob packet into database failure, rv=%d\n", rv); + else + log_info("add new blob packet into database ok\n"); + + return rv; +} + + +/* description: pop the first blob packet from database + * input args: + * $pack: blob packet output buffer address + * $size: blob packet output buffer size + * $byte: blob packet bytes + * return value: <0: failure 0:ok + */ +int blobdb_pop_packet(void *pack, int size, int *bytes) +{ + char sql[SQL_COMMAND_LEN]={0}; + int rv = 0; + sqlite3_stmt *stat = NULL; + const void *blob_ptr; + + if( !pack || size<=0 ) + { + log_error("%s() Invalid input arguments\n", __func__); + return -1; + } + + if( ! s_clidb ) + { + log_error("sqlite database not opened\n"); + return -2; + } + + /* Only query the first packet record */ + snprintf(sql, sizeof(sql), "select packet from %s limit 0,1;", TABLE_NAME); + rv = sqlite3_prepare_v2(s_clidb, sql, -1, &stat, NULL); + if(SQLITE_OK!=rv || !stat) + { + log_error("firehost sqlite3_prepare_v2 failure\n"); + rv = -3; + goto out; + } + + rv = sqlite3_step(stat); + if( SQLITE_DONE!=rv && SQLITE_ROW!=rv ) + { + log_error("firehost sqlite3_step failure\n"); + rv = -5; + goto out; + } + + /* 1rd argument<0> means first segement is packet */ + blob_ptr = sqlite3_column_blob(stat, 0); + if( !blob_ptr ) + { + rv = -6; + goto out; + } + + *bytes = sqlite3_column_bytes(stat, 0); + + if( *bytes > size ) + { + log_error("blob packet bytes[%d] larger than bufsize[%d]\n", *bytes, size); + *bytes = 0; + rv = -1; + } + + memcpy(pack, blob_ptr, *bytes); + rv = 0; + +out: + sqlite3_finalize(stat); + return rv; +} + + +/* description: remove the first blob packet from database + * input args: none + * return value: <0: failure 0:ok + */ +int blobdb_del_packet(void) +{ + char sql[SQL_COMMAND_LEN]={0}; + char *errmsg = NULL; + + if( ! s_clidb ) + { + log_error("sqlite database not opened\n"); + return -2; + } + + /* remove packet from db */ + memset(sql, 0, sizeof(sql)); + snprintf(sql, sizeof(sql), "delete from %s limit 0,1;", TABLE_NAME); + if( SQLITE_OK != sqlite3_exec(s_clidb, sql, NULL, 0, &errmsg) ) + { + log_error("delete first blob packet from database failure: %s\n", errmsg); + sqlite3_free(errmsg); + return -2; + } + log_warn("delete first blob packet from database ok\n"); + + /* Vacuum the database */ + sqlite3_exec(s_clidb, "VACUUM;", NULL, 0, NULL); + + return 0; +} + diff --git a/apue/project_socket/src/sqlite_blob.h b/apue/project_socket/src/sqlite_blob.h new file mode 100644 index 0000000..953e50e --- /dev/null +++ b/apue/project_socket/src/sqlite_blob.h @@ -0,0 +1,60 @@ +/******************************************************************************** + * Copyright: (C) 2020 LingYun IoT System Studio + * All rights reserved. + * + * Filename: sqlite_blob.h + * Description: This library used to operate blob packet in sqlite database. + * + * Version: 1.0.0(2020年05月13日) + * Author: Guo Wenxue <guowenxue@gmail.com> + * ChangeLog: 1, Release initial version on "2020年05月13日 12时14分23秒" + * + ********************************************************************************/ +#ifndef _SQLITE_BLOB_H_ +#define _SQLITE_BLOB_H_ + +#include "sqlite3.h" + +#define SQL_COMMAND_LEN 256 + +/* description: open or create sqlite database if not exist + * input args: + * $db_file: sqlite database file name + * return value: <0: failure 0:ok + * */ +extern int database_init(const char *db_file); + + +/* description: close sqlite database handler + * return value: none + */ +extern void database_term(void); + + +/* description: push a blob packet into database + * input args: + * $pack: blob packet data address + * $size: blob packet data bytes + * return value: <0: failure 0:ok + */ +extern int blobdb_push_packet(void *pack, int size); + + +/* description: pop the first blob packet from database + * input args: + * $pack: blob packet output buffer address + * $size: blob packet output buffer size + * $byte: blob packet bytes + * return value: <0: failure 0:ok + */ +extern int blobdb_pop_packet(void *pack, int size, int *bytes); + + +/* description: remove the first blob packet from database + * input args: none + * return value: <0: failure 0:ok + */ +extern int blobdb_del_packet(void); + + +#endif /* ----- #ifndef _SQLITE_BLOB_H_ ----- */ diff --git a/apue/project_socket/src/util_proc.c b/apue/project_socket/src/util_proc.c new file mode 100644 index 0000000..1878b85 --- /dev/null +++ b/apue/project_socket/src/util_proc.c @@ -0,0 +1,433 @@ +/********************************************************************************* + * Copyright: (C) 2020 LingYun IoT System Studio + * All rights reserved. + * + * Filename: util_proc.c + * Description: This file is the process API + * + * Version: 1.0.0(7/06/2020) + * Author: Guo Wenxue <guowenxue@gmail.com> + * ChangeLog: 1, Release initial version on "7/06/2020 09:19:02 PM" + * + ********************************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <libgen.h> +#include <errno.h> +#include <fcntl.h> +#include <stdarg.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <pthread.h> + +#include "util_proc.h" +#include "logger.h" + +proc_signal_t g_signal={0}; + +void proc_default_sighandler(int sig) +{ + switch(sig) + { + case SIGINT: + log_warn("SIGINT - stopping\n"); + g_signal.stop = 1; + break; + + case SIGTERM: + log_warn("SIGTERM - stopping\n"); + g_signal.stop = 1; + break; + + case SIGSEGV: + log_warn("SIGSEGV - stopping\n"); +#if 0 + if(g_signal.stop) + exit(0); + + g_signal.stop = 1; +#endif + break; + + case SIGPIPE: + log_warn("SIGPIPE - warnning\n"); + break; + + default: + break; + } +} + + +/* install default signal process functions */ +void install_default_signal(void) +{ + struct sigaction sigact, sigign; + + log_info("Install default signal handler.\n"); + + /* Initialize the catch signal structure. */ + sigemptyset(&sigact.sa_mask); + sigact.sa_flags = 0; + sigact.sa_handler = proc_default_sighandler; + + /* Setup the ignore signal. */ + sigemptyset(&sigign.sa_mask); + sigign.sa_flags = 0; + sigign.sa_handler = SIG_IGN; + + sigaction(SIGTERM, &sigact, 0); /* catch terminate signal "kill" command */ + sigaction(SIGINT, &sigact, 0); /* catch interrupt signal CTRL+C */ + //sigaction(SIGSEGV, &sigact, 0); /* catch segmentation faults */ + sigaction(SIGPIPE, &sigact, 0); /* catch broken pipe */ +#if 0 + sigaction(SIGCHLD, &sigact, 0); /* catch child process return */ + sigaction(SIGUSR2, &sigact, 0); /* catch USER signal */ +#endif +} + + +/* **************************************************************************** + * FunctionName: daemonize + * Description : Set the programe runs as daemon in background + * Inputs : nodir: DON'T change the work directory to / : 1:NoChange 0:Change + * noclose: close the opened file descrtipion or not 1:Noclose 0:Close + * Output : NONE + * Return : NONE + * *****************************************************************************/ +void daemonize(int nochdir, int noclose) +{ + int rv, fd; + int i; + + /* already a daemon */ + if (1 == getppid()) + return; + + /* fork error */ + rv = fork(); + if (rv < 0) exit(1); + + /* parent process exit */ + if (rv > 0) + exit(0); + + /* obtain a new process session group */ + setsid(); + + if (!noclose) + { + /* close all descriptors */ + for (i = getdtablesize(); i >= 0; --i) + { + //if (i != g_logPtr->fd) + close(i); + } + + /* Redirect Standard input [0] to /dev/null */ + fd = open("/dev/null", O_RDWR); + + /* Redirect Standard output [1] to /dev/null */ + dup(fd); + + /* Redirect Standard error [2] to /dev/null */ + dup(fd); + } + + umask(0); + + if (!nochdir) + chdir("/"); + + return; +} + +/* **************************************************************************** + * FunctionName: check_set_program_running + * Description : check program already running or not, if not then run it and + * record pid into $pidfile + * Inputs : daemon: set program running in daemon or not + * pid_file:The record PID file path + * Output : NONE + * Return : 0: Record successfully Else: Failure + * *****************************************************************************/ + +int check_set_program_running(int daemon, char *pidfile) +{ + if( !pidfile ) + return 0; + + if( check_daemon_running(pidfile) ) + { + log_error("Program already running, process exit now"); + return -1; + } + + if( daemon ) + { + if( set_daemon_running(pidfile) < 0 ) + { + log_error("set program running as daemon failure\n"); + return -2; + } + } + else + { + if( record_daemon_pid(pidfile) < 0 ) + { + log_error("record program running PID failure\n"); + return -3; + } + } + + return 0; +} + + + +/* **************************************************************************** + * FunctionName: record_daemon_pid + * Description : Record the running daemon program PID to the file "pid_file" + * Inputs : pid_file:The record PID file path + * Output : NONE + * Return : 0: Record successfully Else: Failure + * *****************************************************************************/ +int record_daemon_pid(const char *pid_file) +{ + struct stat fStatBuf; + int fd = -1; + int mode = S_IROTH | S_IXOTH | S_IRGRP | S_IXGRP | S_IRWXU; + char ipc_dir[64] = { 0 }; + + strncpy(ipc_dir, pid_file, 64); + + /* dirname() will modify ipc_dir and save the result */ + dirname(ipc_dir); + + /* If folder pid_file PATH doesnot exist, then we will create it" */ + if (stat(ipc_dir, &fStatBuf) < 0) + { + if (mkdir(ipc_dir, mode) < 0) + { + log_error("cannot create %s: %s\n", ipc_dir, strerror(errno)); + return -1; + } + + (void)chmod(ipc_dir, mode); + } + + /* Create the process running PID file */ + mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; + if ((fd = open(pid_file, O_RDWR | O_CREAT | O_TRUNC, mode)) >= 0) + { + char pid[PID_ASCII_SIZE]; + snprintf(pid, sizeof(pid), "%u\n", (unsigned)getpid()); + write(fd, pid, strlen(pid)); + close(fd); + + log_debug("Record PID<%u> to file %s.\n", getpid(), pid_file); + } + else + { + log_error("cannot create %s: %s\n", pid_file, strerror(errno)); + return -1; + } + + return 0; +} + +/* **************************************************************************** + * FunctionName: get_daemon_pid + * Description : Get the daemon process PID from the PID record file "pid_file" + * Inputs : pid_file: the PID record file + * Output : NONE + * Return : pid_t: The daemon process PID number + * *****************************************************************************/ +pid_t get_daemon_pid(const char *pid_file) +{ + FILE *f; + pid_t pid; + + if ((f = fopen(pid_file, "rb")) != NULL) + { + char pid_ascii[PID_ASCII_SIZE]; + (void)fgets(pid_ascii, PID_ASCII_SIZE, f); + (void)fclose(f); + pid = atoi(pid_ascii); + } + else + { + log_error("Can't open PID record file %s: %s\n", pid_file, strerror(errno)); + return -1; + } + return pid; +} + +/* **************************************************************************** + * FunctionName: check_daemon_running + * Description : Check the daemon program already running or not + * Inputs : pid_file: The record running daemon program PID + * Output : NONE + * Return : 1: The daemon program alread running 0: Not running + * *****************************************************************************/ +int check_daemon_running(const char *pid_file) +{ + int rv = -1; + struct stat fStatBuf; + + rv = stat(pid_file, &fStatBuf); + if (0 == rv) + { + pid_t pid = -1; + printf("PID record file \"%s\" exist.\n", pid_file); + + pid = get_daemon_pid(pid_file); + if (pid > 0) /* Process pid exist */ + { + if ((rv = kill(pid, 0)) == 0) + { + printf("Program with PID[%d] seems running.\n", pid); + return 1; + } + else /* Send signal to the old process get no reply. */ + { + printf("Program with PID[%d] seems exit.\n", pid); + remove(pid_file); + return 0; + } + } + else if (0 == pid) + { + printf("Can not read program PID form record file.\n"); + remove(pid_file); + return 0; + } + else /* Read pid from file "pid_file" failure */ + { + printf("Read record file \"%s\" failure, maybe program still running.\n", pid_file); + return 1; + } + } + + return 0; +} + +/* **************************************************************************** + * FunctionName: stop_daemon_running + * Description : Stop the daemon program running + * Inputs : pid_file: The record running daemon program PID + * Output : NONE + * Return : 1: The daemon program alread running 0: Not running + * *****************************************************************************/ +int stop_daemon_running(const char *pid_file) +{ + pid_t pid = -1; + struct stat fStatBuf; + + if ( stat(pid_file, &fStatBuf) < 0) + return 0; + + printf("PID record file \"%s\" exist.\n", pid_file); + pid = get_daemon_pid(pid_file); + if (pid > 0) /* Process pid exist */ + { + while ( (kill(pid, 0) ) == 0) + { + kill(pid, SIGTERM); + sleep(1); + } + + remove(pid_file); + } + + return 0; +} + +/* **************************************************************************** + * FunctionName: set_daemon_running + * Description : Set the programe running as daemon if it's not running and record + * its PID to the pid_file. + * Inputs : pid_file: The record running daemon program PID + * Output : NONE + * Return : 0: Successfully. 1: Failure + * *****************************************************************************/ +int set_daemon_running(const char *pid_file) +{ + daemon(1, 1); + log_info("Program running as daemon [PID:%d].\n", getpid()); + + if (record_daemon_pid(pid_file) < 0) + { + log_error("Record PID to file \"%s\" failure.\n", pid_file); + return -2; + } + + return 0; +} + +/* start a new thread to run $thread_workbody point function */ +int thread_start(pthread_t *thread_id, thread_body_t thread_workbody, void *thread_arg) +{ + int rv = 0; + pthread_t tid; + + pthread_attr_t thread_attr; + + /* Initialize the thread attribute */ + rv = pthread_attr_init(&thread_attr); + if(rv) + return -1; + +#if 0 + /* Set the stack size of the thread */ + rv = pthread_attr_setstacksize(&thread_attr, 120 * 1024); + if(rv) + goto CleanUp; +#endif + + /* Set thread to detached state:Don`t need pthread_join */ + rv = pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED); + if(rv) + goto CleanUp; + + /* Create the thread */ + rv = pthread_create(&tid, &thread_attr, thread_workbody, thread_arg); + if(rv) + goto CleanUp; + +CleanUp: + + + if( thread_id ) + { + if( rv ) + *thread_id = 0; + else + *thread_id = tid; + } + + /* Destroy the attributes of thread */ + pthread_attr_destroy(&thread_attr); + return rv; +} + + +/* excute a linux command by system() */ +void exec_system_cmd(const char *format, ...) +{ + char cmd[256]; + va_list args; + + memset(cmd, 0, sizeof(cmd)); + + va_start(args, format); + vsnprintf(cmd, sizeof(cmd), format, args); + va_end(args); + + system(cmd); +} + + diff --git a/apue/project_socket/src/util_proc.h b/apue/project_socket/src/util_proc.h new file mode 100644 index 0000000..b52692f --- /dev/null +++ b/apue/project_socket/src/util_proc.h @@ -0,0 +1,65 @@ +/******************************************************************************** + * Copyright: (C) 2020 LingYun IoT System Studio + * All rights reserved. + * + * Filename: util_proc.h + * Description: This head file is for Linux process/thread API + * + * Version: 1.0.0(7/06/2012~) + * Author: Guo Wenxue <guowenxue@gmail.com> + * ChangeLog: 1, Release initial version on "7/06/2012 09:21:33 PM" + * + ********************************************************************************/ + +#ifndef __UTIL_PROC_H_ +#define __UTIL_PROC_H_ + +#include <signal.h> + +#define PID_ASCII_SIZE 11 + +typedef struct proc_signal_s +{ + int signal; + unsigned stop; /* 0: Not term 1: Stop */ +} proc_signal_t; + +typedef void *(* thread_body_t) (void *thread_arg); + +extern proc_signal_t g_signal; + +/* install default signal process functions */ +extern void install_default_signal(void); + +/* excute a linux command by system() */ +extern void exec_system_cmd(const char *format, ...); + +/* check program already running or not, if not then run it and record pid into $pidfile */ +extern int check_set_program_running(int daemon, char *pidfile); + +/* stop program running from $pid_file */ +extern int stop_daemon_running(const char *pid_file); + +/* my implementation for set program running in daemon */ +extern void daemonize(int nochdir, int noclose); + +/* start a new thread to run $thread_workbody point function */ +extern int thread_start(pthread_t *thread_id, thread_body_t thread_workbody, void *thread_arg); + +/* +---------------------+ + * | Low level API | + * +---------------------+*/ + +/* record proces ID into $pid_file */ +extern int record_daemon_pid(const char *pid_file); + +/* get daemon process ID from $pid_file */ +extern pid_t get_daemon_pid(const char *pid_file); + +/* check program already running or not from $pid_file */ +extern int check_daemon_running(const char *pid_file); + +/* set program daemon running and record pid in $pid_file */ +extern int set_daemon_running(const char *pid_file); + +#endif diff --git a/apue/project_socket/src/util_time.h b/apue/project_socket/src/util_time.h new file mode 100644 index 0000000..0f8dbcc --- /dev/null +++ b/apue/project_socket/src/util_time.h @@ -0,0 +1,186 @@ +/******************************************************************************** + * Copyright: (C) 2020 LingYun IoT System Studio + * All rights reserved. + * + * Filename: util_time.h + * Description: This head file is system time, timer API + * + * Version: 1.0.0(07/23/2020) + * Author: Guo Wenxue <guowenxue@gmail.com> + * ChangeLog: 1, Release initial version on "07/23/2020 07:46:37 AM" + * + ********************************************************************************/ +#ifndef __UTIL_TIME_H_ +#define __UTIL_TIME_H_ + +#include <unistd.h> +#include <stdint.h> +#include <string.h> +#include <fcntl.h> +#include <time.h> + +#include <linux/rtc.h> +#include <sys/ioctl.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/time.h> + + +typedef struct date_time_s +{ + int year; + int month; + int day; + int hour; + int minute; + int second; + int dayofweek; +} date_time_t; + +/* sleep for micro second */ +static inline void msleep(unsigned long ms) +{ + struct timespec timeout; + unsigned long tmp; + + timeout.tv_sec = ms / 1000; + if (timeout.tv_sec == 0) + { + tmp = ms * 10000; + timeout.tv_nsec = tmp * 100; + } + else + { + timeout.tv_nsec = 0; + } + + nanosleep(&timeout, 0); +} + +/* call gettimeofday() to get current micro second */ +static inline unsigned long time_now() +{ + struct timeval now; + + gettimeofday(&now, 0); + + return (now.tv_sec*1000) + (now.tv_usec/1000); +} + +/* timep has elapsed since $start, unit as micro second*/ +static inline uint32_t time_elapsed(uint32_t start) +{ + uint32_t current = time_now(); + + if(current >= start) + return current-start; + else + return current+0xFFFFFFFF-start; +} + +/* call gettimeofday() to get current micro second */ +static inline unsigned long time_second() +{ + struct timeval now; + + gettimeofday(&now, 0); + return now.tv_sec; +} + +/* timep has elapsed since $start, unit as micro second*/ +static inline uint32_t seconds_elapsed(uint32_t start) +{ + uint32_t current = time_second(); + + if(current >= start) + return current-start; + else + return current+0xFFFFFFFF-start; +} + +/* +* These inlines deal with timer wrapping correctly. You are +* strongly encouraged to use them +* 1. Because people otherwise forget +* 2. Because if the timer wrap changes in future you won't have to +* alter your driver code. +* +* time_after(a,b) returns true if the time a is after time b. +* +* Do this with "<0" and ">=0" to only test the sign of the result. A +* good compiler would generate better code (and a really good compiler +* wouldn't care). Gcc is currently neither. +*/ + +#define typecheck(type,x) \ +({ type __dummy; \ + typeof(x) __dummy2; \ + (void)(&__dummy == &__dummy2); \ + 1; \ +}) + +#define time_after(a,b) \ +(typecheck(unsigned long, a) && typecheck(unsigned long, b) && ((long)(b) - (long)(a) < 0)) +#define time_before(a,b) time_after(b,a) + +#define time_after_eq(a,b) \ +(typecheck(unsigned long, a) && typecheck(unsigned long, b) && ((long)(a) - (long)(b) >= 0)) +#define time_before_eq(a,b) time_after_eq(b,a) + +/* Same as above, but does so with platform independent 64bit types. + * These must be used when utilizing jiffies_64 (i.e. return value of + * get_jiffies_64() */ +#define time_after64(a,b) \ + (typecheck(__u64, a) && typecheck(__u64, b) && ((__s64)(b) - (__s64)(a) < 0)) +#define time_before64(a,b) time_after64(b,a) + +#define time_after_eq64(a,b) \ + (typecheck(__u64, a) && typecheck(__u64, b) && ((__s64)(a) - (__s64)(b) >= 0)) +#define time_before_eq64(a,b) time_after_eq64(b,a) + + +static inline void get_sys_time(date_time_t *date) +{ + time_t now = time(NULL); + struct tm *tnow = localtime(&now); + + memset(date, 0, sizeof(*date)); + date->year = 1900 + tnow->tm_year; + date->month = 1 + tnow->tm_mon; + date->day = tnow->tm_mday; + + date->hour = tnow->tm_hour; + date->minute = tnow->tm_min; + date->second = tnow->tm_sec; + date->dayofweek = tnow->tm_wday; + return; +} + +static inline int get_rtc_time(date_time_t *date) +{ + int rv, fd = -1; + struct rtc_time rtc_tm; + + memset(date, 0, sizeof(*date)); + + if ((fd=open("/dev/rtc0", O_RDONLY)) < 0) + return -1; + + if((rv=ioctl(fd, RTC_RD_TIME, &rtc_tm)) < 0) + return -2; + + date->year = 1900 + rtc_tm.tm_year; + date->month = 1 + rtc_tm.tm_mon; + date->day = rtc_tm.tm_mday; + + date->hour = rtc_tm.tm_hour; + date->minute = rtc_tm.tm_min; + date->second = rtc_tm.tm_sec; + date->dayofweek = rtc_tm.tm_wday; + + close(fd); + + return 0; +} + +#endif diff --git a/modules/c/beep.c b/modules/c/beep.c deleted file mode 100644 index b26011c..0000000 --- a/modules/c/beep.c +++ /dev/null @@ -1,257 +0,0 @@ -/********************************************************************************* - * Copyright: (C) 2018 LingYun IoT System Studio - * All rights reserved. - * - * Filename: led.c - * Description: This file is used to control Passive buzzer or Active buzzer - * - * pi@raspberrypi:~ $ gpio readall show BCM and wPi pinmap - * - * VCC ---- 5V/3.3V - * GND ---- GND - * I/O ---- GPIO.18 ---- GPIO.1 - * BCM wPi - * - * Version: 1.0.0(2018/10/14) - * Author: Guo Wenxue <guowenxue@gmail.com> - * ChangeLog: 1, Release initial version on "2018/10/14 12:13:26" - * - ********************************************************************************/ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <fcntl.h> -#include <dirent.h> -#include <string.h> -#include <time.h> -#include <errno.h> - -#include <wiringPi.h> -#include "beep.h" - -//#define CONFIG_ACTV_BEEP - -/* Only passive buzzer can play tone */ -#ifndef CONFIG_ACTV_BEEP -#define CONFIG_PLAY_LITTLE_STAR -//#define CONFIG_PLAY_TONE_TEST -#endif - -void play_tone_freq(void); -void play_little_star(void); - -int main(int argc, char *argv[]) -{ - wiringPiSetup(); - -#ifdef CONFIG_PLAY_LITTLE_STAR - while(1) - { - play_little_star(); - sleep(3); - } -#elif (defined CONFIG_PLAY_TONE_TEST) - while(1) - { - play_tone_freq(); - sleep(3); - } -#else - - while(1) - { -#ifdef CONFIG_ACTV_BEEP - turn_active_beep(ON); -#else - turn_passive_beep(ON, BEEP_FREQ); -#endif - sleep(1); - -#ifdef CONFIG_ACTV_BEEP - turn_active_beep(OFF); -#else - turn_passive_beep(OFF, BEEP_FREQ); -#endif - sleep(1); - } -#endif - - - return 0; -} - -/*+-----------------------------+ - *| Turn buzzer on or off API | - *+-----------------------------+*/ - - -int turn_passive_beep(int cmd, int freq) -{ - int range; - - if(OFF == cmd) - { - pwmWrite(PWM_PIN, 0); - pinMode(PWM_PIN, INPUT) ; - } - else - { - - if(freq<2000 || freq>5000) - { - printf("Beep set invalid PWM frequency[%d]!\n", freq); - return -1; - } - - /* Set GPIO as PWM output mode */ - pinMode(PWM_PIN, PWM_OUTPUT) ; - - /* Set PWM mode as ms mode */ - pwmSetMode(PWM_MODE_MS); - - /* Set PWM clock: 19.2MHz/32=600KHz */ - pwmSetClock(32); - - /* Set PWM frequency */ - range=600000/freq; - pwmSetRange(range); - - /* Set PWM duty 50% */ - pwmWrite(PWM_PIN, range/2); - } -} - - -/* Turn ON/OFF buzzer, Active Buzzer can not set frequency */ -int turn_active_beep(int cmd) -{ - - /* Active buzzer VCC connect to: - 5V: Both high and low level will be on - 3.3V: Low level be on and High level be off - - So we use INPUT or OUTPUT to control the Beeper - */ - if(OFF == cmd) - { - pinMode(PWM_PIN, INPUT); - } - else - { - pinMode(PWM_PIN, OUTPUT); - digitalWrite(PWM_PIN, LOW); - } - - return 0; -} - - -/*+---------------------------------+ - *| Play Tone OD,RE,MI....XI,DO1 | - *+---------------------------------+*/ - -enum -{ - UNUSED=0, - DO, - RE, - MI, - FA, - SO, - LA, - XI, - DO1, - RI1, - TONE_MAX, -}; - -#define msleep(x) usleep( 1000*(x) ) - -static int tone_freq[TONE_MAX]={0, 2093, 2349, 2637, 2794, 3136, 3520, 3952, 4186, 4698 }; -//static int tone_freq[TONE_MAX]={0, 2000, 2130, 2250, 2360, 2450, 2530, 2620, 2700, 2780}; - -static inline void play_tone(int tone, int delay) -{ - if(tone<DO || tone>RI1) - return ; - - turn_passive_beep(ON, tone_freq[tone]); - msleep(delay); - turn_passive_beep(OFF, 0); -} - -void play_tone_freq(void) -{ - int i; - - for(i=DO; i<TONE_MAX; i++) - { - play_tone( i, 500 ); - msleep(500); - } -} - - -/*+------------------------------+ - *| Play song "Little Start" | - *+------------------------------+*/ - -typedef struct tone_s -{ - int tone; - int delay_ms; - -} tone_t; - -#define DEF_DELAY 350 -static tone_t little_start_notation[]= -{ - {DO, DEF_DELAY}, - {DO, DEF_DELAY}, - {SO, DEF_DELAY}, - {SO, DEF_DELAY}, - {LA, DEF_DELAY}, - {LA, DEF_DELAY}, - {SO, DEF_DELAY*2}, - - {FA, DEF_DELAY}, - {FA, DEF_DELAY}, - {MI, DEF_DELAY}, - {MI, DEF_DELAY}, - {RE, DEF_DELAY}, - {RE, DEF_DELAY}, - {DO, DEF_DELAY*2}, - - - {SO, DEF_DELAY}, - {SO, DEF_DELAY}, - {FA, DEF_DELAY}, - {FA, DEF_DELAY}, - {MI, DEF_DELAY}, - {MI, DEF_DELAY}, - {RE, DEF_DELAY*2}, - - - {SO, DEF_DELAY}, - {SO, DEF_DELAY}, - {FA, DEF_DELAY}, - {FA, DEF_DELAY}, - {MI, DEF_DELAY}, - {MI, DEF_DELAY}, - {RE, DEF_DELAY*2}, -}; - -#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) -void play_little_star(void) -{ - int i; - - for(i=0; i<ARRAY_SIZE(little_start_notation); i++) - { - play_tone(little_start_notation[i].tone, little_start_notation[i].delay_ms); - msleep(30); - } -} - - diff --git a/modules/c/beep.h b/modules/c/beep.h deleted file mode 100644 index 68c4751..0000000 --- a/modules/c/beep.h +++ /dev/null @@ -1,38 +0,0 @@ -/********************************************************************************* - * Copyright: (C) 2018 LingYun IoT System Studio - * All rights reserved. - * - * Filename: beep.h - * Description: This file is used to control Passive buzzer or Active buzzer - * - * pi@raspberrypi:~ $ gpio readall show BCM and wPi pinmap - * - * VCC ---- 5V/3.3V - * GND ---- GND - * I/O ---- GPIO.18 ---- GPIO.1 - * BCM wPi - * - * Version: 1.0.0(2018/10/14) - * Author: Guo Wenxue <guowenxue@gmail.com> - * ChangeLog: 1, Release initial version on "2018/10/14 12:13:26" - * - ********************************************************************************/ - -#ifndef __BEEP_H -#define __BEEP_H - -#define OFF 0 -#define ON 1 - -#define BEEP_FREQ 2400 - -/* Use Pin12 == GPIO18(BCM) == GPIO.1(wPi) */ -#define PWM_PIN 1 - - -int turn_passive_beep(int cmd, int freq); - -int turn_active_beep(int cmd); - -#endif - diff --git a/modules/c/ds18b20.c b/modules/c/ds18b20.c index 43da548..29fbdc3 100644 --- a/modules/c/ds18b20.c +++ b/modules/c/ds18b20.c @@ -8,9 +8,21 @@ * Version: 1.0.0(2018/10/14) * Author: Guo Wenxue <guowenxue@gmail.com> * ChangeLog: 1, Release initial version on "2018/10/14 12:13:26" - * + * + * + * Pin connection: + * + * vcc --- #Pin1 ( 3.3v ) + * DQ --- #Pin7 (BCM GPIO4) + * GND --- #Pin9 ( GND ) + * + * /boot/config.txt: + * + * dtoverlay=w1-gpio-pullup,gpiopin=4 + * ********************************************************************************/ + #include <stdio.h> #include <stdlib.h> #include <unistd.h> diff --git a/modules/c/gpiod.c b/modules/c/gpiod.c index 3ad04bd..c59e694 100644 --- a/modules/c/gpiod.c +++ b/modules/c/gpiod.c @@ -40,8 +40,9 @@ if( argc != 3 ) { printf(" Usage: sudo %s [BCM Pin number] [1/0]\n", argv[0]); - printf("example, turn BCM Pin #6 lowlevel : sudo %s 6 0\n", argv[0]); - printf("example, turn BCM Pin #6 highlevel: sudo %s 6 1\n", argv[0]); + printf("example, turn BCM Pin #19 lowlevel : sudo %s 19 0\n", argv[0]); + printf("example, turn BCM Pin #19 highlevel: sudo %s 19 1\n", argv[0]); + return 0; } bcm_pin = atoi(argv[1]); diff --git a/modules/c/led.c b/modules/c/led.c index 5ef2c0c..fba63b6 100644 --- a/modules/c/led.c +++ b/modules/c/led.c @@ -1,21 +1,21 @@ /********************************************************************************* - * Copyright: (C) 2018 LingYun IoT System Studio + * Copyright: (C) 2021 LingYun IoT System Studio * All rights reserved. * * Filename: led.c - * Description: This file is used to control RGB 3-colours LED + * Description: This file is used to control RGB 3-colors LED * - * pi@raspberrypi:~ $ gpio readall show BCM and wPi pinmap + * pi@raspberrypi:~ $ gpio readall #show RPi pin map * - * LED BCM wPi - * G ---- GPIO.13 ---- GPIO.23 - * R ---- GPIO.19 ---- GPIO.24 - * B ---- GPIO.26 ---- GPIO.25 - * I ---- GND ---- + * LED #PIN BCM + * I ---- 39 ---- GND + * G ---- 37 ---- GPIO26 + * R ---- 35 ---- GPIO19 + * B ---- 33 ---- GPIO13 * - * Version: 1.0.0(2018/10/14) + * Version: 1.0.0(2012/11/03) * Author: Guo Wenxue <guowenxue@gmail.com> - * ChangeLog: 1, Release initial version on "2018/10/14 12:13:26" + * ChangeLog: 1, Release initial version on "2021/11/03 12:13:26" * ********************************************************************************/ @@ -28,10 +28,28 @@ #include <time.h> #include <errno.h> -#include "led.h" +#include <gpiod.h> #define msleep(x) usleep( 1000*(x) ) #define DELAY 500 + +#define ON 1 +#define OFF 0 + +/* Three LEDs code */ +enum +{ + LED_R = 0, + LED_G, + LED_B, + LED_MAX, +}; + +/* RGB 3-color LED BCM pin number */ +static int led_gpio[LED_MAX]= { 19, 26, 13 }; + +void init_led(void); +int turn_led(int which, int cmd); int main(int argc, char *argv[]) { @@ -40,56 +58,18 @@ while(1) { turn_led(LED_R, ON); - msleep(DELAY); turn_led(LED_R, OFF); - msleep(DELAY); turn_led(LED_G, ON); - msleep(DELAY); turn_led(LED_G, OFF); - msleep(DELAY); turn_led(LED_B, ON); - msleep(DELAY); turn_led(LED_B, OFF); - msleep(DELAY); } return 0; } -#ifdef CONFIG_USE_WIRINGPI -#include <wiringPi.h> - -void init_led(void) -{ - int i; - - wiringPiSetup(); - - for(i=0; i<LED_MAX; i++) - { - pinMode( led_gpio[i], OUTPUT ); - } -} - -int turn_led(int which, int cmd) -{ - if( which<0 || which>=LED_MAX ) - return -1; - - - if( OFF == cmd ) - digitalWrite (led_gpio[which], LOW); - else - digitalWrite (led_gpio[which], HIGH); - - return 0; -} - -#else /* use libgpiod library */ - -#include <gpiod.h> #if 0 /* Use libgpiod lowlevel API */ @@ -126,16 +106,17 @@ { gpiod_line_set_value(line, 1); } + + msleep(DELAY); } #else /* use libgpiod ctxless high level API */ void init_led(void) { - } -void gpiod_ctxless_cb(void *data) +static void gpiod_ctxless_cb(void *data) { sleep(1); } @@ -150,4 +131,3 @@ #endif -#endif diff --git a/modules/c/led.h b/modules/c/led.h deleted file mode 100644 index 125d80d..0000000 --- a/modules/c/led.h +++ /dev/null @@ -1,53 +0,0 @@ -/********************************************************************************* - * Copyright: (C) 2018 LingYun IoT System Studio - * All rights reserved. - * - * Filename: led.h - * Description: This file is used to control RGB 3-colours LED - * - * pi@raspberrypi:~ $ gpio readall #show BCM and wPi pinmap - * - * LED #PIN BCM wPi - * I ---- 9 ---- GND ---- GND - * G ---- 11 ---- 17 ---- 0 - * R ---- 13 ---- 27 ---- 2 - * B ---- 15 ---- 22 ---- 3 - * - * Version: 1.0.0(2018/10/14) - * Author: Guo Wenxue <guowenxue@gmail.com> - * ChangeLog: 1, Release initial version on "2018/10/14 12:13:26" - * - ********************************************************************************/ - -#ifndef __LED_H -#define __LED_H - -#define OFF 0 -#define ON 1 - - -/* Three LEDs code */ -enum -{ - LED_R = 0, - LED_G, - LED_B, - LED_MAX, -}; - -/* 3 LEDs WiringPi GPIO port */ - - -#ifdef CONFIG_USE_WIRINGPI -static int led_gpio[LED_MAX]= { 2, 0, 3 }; -#else /* use libgpiod library */ -static int led_gpio[LED_MAX]= { 27, 17, 22 }; -#endif - - -void init_led(void); -int turn_led(int which, int cmd); - - -#endif - diff --git a/modules/c/makefile b/modules/c/makefile index 240ce22..e397ab0 100644 --- a/modules/c/makefile +++ b/modules/c/makefile @@ -18,10 +18,6 @@ CFLAGS+=-I${PWD} #CFLAGS+=-Wall -Werror -# default use libgpiod library -#CFLAGS+=-DCONFIG_USE_WIRINGPI - -LDFLAGS+=-lwiringPi LDFLAGS+=-lgpiod LDFLAGS+=-lpthread LDFLAGS+=-lm diff --git a/modules/c/pin.txt b/modules/c/pin.txt new file mode 100644 index 0000000..07aef89 --- /dev/null +++ b/modules/c/pin.txt @@ -0,0 +1,27 @@ +pi@raspberrypi:~$ gpio readall + +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+ + | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | + +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ + | | | 3.3v | | | 1 || 2 | | | 5v | | | + | 2 | 8 | SDA.1 | ALT0 | 1 | 3 || 4 | | | 5v | | | + | 3 | 9 | SCL.1 | ALT0 | 1 | 5 || 6 | | | 0v | | | + | 4 | 7 | GPIO. 7 | OUT | 0 | 7 || 8 | 1 | ALT5 | TxD | 15 | 14 | + | | | 0v | | | 9 || 10 | 1 | ALT5 | RxD | 16 | 15 | + | 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 | + | 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | | + | 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 | + | | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 | + | 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | | + | 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 | + | 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 | + | | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 | + | 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 | + | 5 | 21 | GPIO.21 | OUT | 0 | 29 || 30 | | | 0v | | | + | 6 | 22 | GPIO.22 | OUT | 0 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 | + | 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | | + | 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 | + | 26 | 25 | GPIO.25 | OUT | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 | + | | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 | + +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ + | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | + +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+ diff --git a/modules/c/relay.c b/modules/c/relay.c index 3e360b7..392b3c5 100644 --- a/modules/c/relay.c +++ b/modules/c/relay.c @@ -14,11 +14,17 @@ #include <stdio.h> #include <unistd.h> #include <libgen.h> - #include <string.h> -#include <wiringPi.h> -#include "relay.h" +#include <gpiod.h> + +#define ON 1 +#define OFF 0 + +/* Relay #Pin(29) GPIO05(BCM 5) */ +#define relay_pin 5 + +int turn_relay(int cmd); int main (int argc, char **argv) { @@ -27,9 +33,6 @@ printf("Usage: %s [on/off]\n", basename(argv[0])); return -1; } - - wiringPiSetup(); - relay_init(); if( !strstr(argv[1], "on") || !strstr(argv[1], "on") ) { @@ -43,21 +46,16 @@ return 0; } -void relay_init(void) +static void gpiod_ctxless_cb(void *data) { - pinMode(RELAY_PIN, OUTPUT); + sleep(3); } - -void turn_relay(int cmd) +int turn_relay(int cmd) { - if( OFF == cmd ) - { - digitalWrite ( RELAY_PIN, HIGH ); - } - else - { - digitalWrite ( RELAY_PIN, LOW ); - } + if( OFF == cmd ) + gpiod_ctxless_set_value("gpiochip0", relay_pin, 0, false, "relay", gpiod_ctxless_cb, NULL); + else + gpiod_ctxless_set_value("gpiochip0", relay_pin, 1, false, "relay", gpiod_ctxless_cb, NULL); } diff --git a/modules/c/relay.h b/modules/c/relay.h deleted file mode 100644 index c2d238c..0000000 --- a/modules/c/relay.h +++ /dev/null @@ -1,29 +0,0 @@ -/******************************************************************************** - * Copyright: (C) 2019 LingYun IoT System Studio - * All rights reserved. - * - * Filename: relay.h - * Description: This head file - * - * Version: 1.0.0(30/01/19) - * Author: Guo Wenxue <guowenxue@gmail.com> - * ChangeLog: 1, Release initial version on "30/01/19 08:49:31" - * - ********************************************************************************/ - -#ifndef _RELAY_H_ -#define _RELAY_H_ - -#ifndef ON -#define ON 1 -#define OFF 0 -#endif - -/* Moniter RPi I/O Pin connected to PIN#40, and wPi pin number is 29 */ -#define RELAY_PIN 29 - -void relay_init(void); -void turn_relay(int cmd); - -#endif /* ----- #ifndef _RELAY_H_ ----- */ - diff --git a/modules/c/sht20.c b/modules/c/sht20.c index 04a7219..d41e451 100644 --- a/modules/c/sht20.c +++ b/modules/c/sht20.c @@ -8,7 +8,18 @@ * Version: 1.0.0(2018/10/14) * Author: Guo Wenxue <guowenxue@gmail.com> * ChangeLog: 1, Release initial version on "2018/10/14 12:13:26" - * + * + * Pin connection: + * + * vcc --- #Pin17 ( 3.3v ) + * GND --- #Pin20 ( GND ) + * SDA --- #Pin02 ( SDA ) + * SCL --- #Pin03 ( SCL ) + * + * /boot/config.txt: + * + * dtparam=i2c_arm=on + * ********************************************************************************/ #include <stdio.h> diff --git a/modules/c/tsl2561.c b/modules/c/tsl2561.c index 9263fb6..33611ac 100644 --- a/modules/c/tsl2561.c +++ b/modules/c/tsl2561.c @@ -12,8 +12,6 @@ * ********************************************************************************/ -#include <wiringPi.h> -#include <wiringPiI2C.h> #include <string.h> #include <stdio.h> #include <stdlib.h> @@ -22,56 +20,158 @@ #include <errno.h> #include <time.h> -#include "tsl2561.h" +#include <sys/ioctl.h> +#include <linux/i2c.h> +#include <linux/i2c-dev.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +#define TSL2561_I2C_ADDR 0x39 + +#define CONTROL_REG 0x80 +#define REG_COUNT 4 + +#define POWER_UP 0x03 +#define POWER_DOWN 0x00 + +/* Register Address */ +enum +{ + /* Channel_0 = DATA0HIGH<<8 + DATA0LOW */ + DATA0LOW = 0x8C, + DATA0HIGH, + + /* Channel_1 = DATA1HIGH<<8 + DATA1LOW */ + DATA1LOW, + DATA1HIGH, +}; int tsl_fd = -1; static const int regs_addr[REG_COUNT]={DATA0LOW, DATA0HIGH, DATA1LOW, DATA1HIGH}; +#define msleep(x) usleep( 1000*(x) ) + int tsl2561_init(void) { if(tsl_fd > 0) return 0; - tsl_fd = wiringPiI2CSetup(TSL2561_I2C_ADDR); - if(tsl_fd < 0) + if( (tsl_fd=open("/dev/i2c-1", O_RDWR)) < 0) { - printf("TSL2561 I2C setup failure: %s\n", strerror(errno)); - } - else - { - printf("TSL2561 initialise ok, tsl_fd=%d\n", tsl_fd); + printf("TSL2561 I2C device setup failure: %s\n", strerror(errno)); + return -1; } - + printf("TSL2561 initialise ok, tsl_fd=%d\n", tsl_fd); return tsl_fd; } + +#define ON 1 +#define OFF 0 + +void tsl2561_power(int cmd) +{ + struct i2c_msg msg; + struct i2c_rdwr_ioctl_data data; + unsigned char buf[2]; + + msg.addr= TSL2561_I2C_ADDR; + msg.flags=0; /* write */ + msg.len= 1; + msg.buf= buf; + + data.nmsgs= 1; + data.msgs= &msg; + + msg.buf[0]=CONTROL_REG; + if( ioctl(tsl_fd, I2C_RDWR, &data) < 0 ) + { + printf("%s() ioctl failure: %s\n", __func__, strerror(errno)); + return ; + } + + + if( cmd ) + msg.buf[0]=POWER_UP; + else + msg.buf[0]=POWER_DOWN; + + if( ioctl(tsl_fd, I2C_RDWR, &data) < 0 ) + { + printf("%s() ioctl failure: %s\n", __func__, strerror(errno)); + return ; + } + + return ; +} + +int tsl2561_readreg(unsigned char regaddr, unsigned char *regval) +{ + struct i2c_msg msg; + struct i2c_rdwr_ioctl_data data; + unsigned char buf[2]; + + msg.addr= TSL2561_I2C_ADDR; + msg.flags=0; /* write */ + msg.len= 1; + msg.buf= buf; + msg.buf[0] = regaddr; + + data.nmsgs= 1; + data.msgs= &msg; + + if( ioctl(tsl_fd, I2C_RDWR, &data) < 0 ) + { + printf("%s() ioctl failure: %s\n", __func__, strerror(errno)); + return -1; + } + + memset(buf, 0, sizeof(buf)); + + msg.addr= TSL2561_I2C_ADDR; + msg.flags=I2C_M_RD; /* read */ + msg.len= 1; + msg.buf= buf; + + data.nmsgs= 1; + data.msgs= &msg; + + if( ioctl(tsl_fd, I2C_RDWR, &data) < 0 ) + { + printf("%s() ioctl failure: %s\n", __func__, strerror(errno)); + return -1; + } + + *regval = msg.buf[0]; + return 0; +} + int tsl2561_get_lux(void) { int i; - int reg_data[REG_COUNT]; + unsigned char reg_data[REG_COUNT]; + unsigned char buf; int chn0_data = 0; int chn1_data = 0; - double div = 0.0; - double lux = 0.0; - - /* Power up TSL2561 */ - wiringPiI2CWrite(tsl_fd, CONTROL_REG); - wiringPiI2CWrite(tsl_fd, POWER_UP); + float div = 0.0; + float lux = 0.0; - delay(410); /* t(CONV) MAX 400ms */ + + tsl2561_power(ON); + + msleep(410); /* t(CONV) MAX 400ms */ /* Read register Channel0 and channel1 data from register */ for(i=0; i<REG_COUNT; i++) { - wiringPiI2CWrite(tsl_fd, regs_addr[i]); - reg_data[i] = wiringPiI2CRead(tsl_fd); - //printf("write and read register: 0x%0x->%d\n", regs_addr[i], reg_data[i]); + tsl2561_readreg(regs_addr[i], ®_data[i]); } chn0_data = reg_data[1]*256 + reg_data[0]; /* Channel0 = DATA0HIGH<<8 + DATA0LOW */ @@ -79,12 +179,11 @@ if( chn0_data<=0 || chn1_data<0 ) { - //printf("TSL2561 get date chn0_data[%d] chn1_data[%d]\n", chn0_data, chn1_data); lux = 0.0; goto OUT; } - div = (double)chn1_data / (double)chn0_data; + div = (float)chn1_data / (float)chn0_data; if( div>0 && div<=0.5 ) lux = 0.304*chn0_data-0.062*chn0_data*pow(div,1.4); @@ -104,8 +203,7 @@ OUT: printf("TSLl2561 get lux: %.3f\n", lux); - wiringPiI2CWrite(tsl_fd, CONTROL_REG); - wiringPiI2CWrite(tsl_fd, POWER_DOWN); + tsl2561_power(OFF); } void print_datime(void) diff --git a/modules/c/tsl2561.h b/modules/c/tsl2561.h deleted file mode 100644 index ea85025..0000000 --- a/modules/c/tsl2561.h +++ /dev/null @@ -1,38 +0,0 @@ -/******************************************************************************** - * Copyright: (C) 2019 LingYun IoT System Studio - * All rights reserved. - * - * Filename: tsl2561.h - * Description: This head file is the Lux sensor TSL2561 API functions on RaspberryPi - * - * Version: 1.0.0(04/07/19) - * Author: Guo Wenxue <guowenxue@gmail.com> - * ChangeLog: 1, Release initial version on "04/07/19 17:42:35" - * - ********************************************************************************/ - -#ifndef _TSL2561_H_ -#define _TSL2561_H_ - -#define TSL2561_I2C_ADDR 0x39 - -#define CONTROL_REG 0x80 -#define REG_COUNT 4 - -#define POWER_UP 0x03 -#define POWER_DOWN 0x00 - -/* Register Address */ -enum -{ - /* Channel_0 = DATA0HIGH<<8 + DATA0LOW */ - DATA0LOW = 0x8C, - DATA0HIGH, - - /* Channel_1 = DATA1HIGH<<8 + DATA1LOW */ - DATA1LOW, - DATA1HIGH, -}; - -#endif /* ----- #ifndef _TSL2561_H_ ----- */ - diff --git a/modules/c/tsl2561_i2c.c b/modules/c/tsl2561_i2c.c deleted file mode 100644 index 3884671..0000000 --- a/modules/c/tsl2561_i2c.c +++ /dev/null @@ -1,244 +0,0 @@ -/********************************************************************************* - * Copyright: (C) 2019 LingYun IoT System Studio - * All rights reserved. - * - * Filename: tsl2561.c - * Description: This file is the Lux sensor TSL2561 API functions on RaspberryPi, - * which connected to I2C-1 - * - * Version: 1.0.0(04/07/19) - * Author: Guo Wenxue <guowenxue@gmail.com> - * ChangeLog: 1, Release initial version on "04/07/19 17:39:38" - * - ********************************************************************************/ - -#include <wiringPi.h> -#include <wiringPiI2C.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <math.h> -#include <errno.h> -#include <time.h> - -#include <sys/ioctl.h> -#include <linux/i2c.h> -#include <linux/i2c-dev.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> - -#define TSL2561_I2C_ADDR 0x39 - -#define CONTROL_REG 0x80 -#define REG_COUNT 4 - -#define POWER_UP 0x03 -#define POWER_DOWN 0x00 - -/* Register Address */ -enum -{ - /* Channel_0 = DATA0HIGH<<8 + DATA0LOW */ - DATA0LOW = 0x8C, - DATA0HIGH, - - /* Channel_1 = DATA1HIGH<<8 + DATA1LOW */ - DATA1LOW, - DATA1HIGH, -}; - - -int tsl_fd = -1; - -static const int regs_addr[REG_COUNT]={DATA0LOW, DATA0HIGH, DATA1LOW, DATA1HIGH}; - -int tsl2561_init(void) -{ - if(tsl_fd > 0) - return 0; - - if( (tsl_fd=open("/dev/i2c-1", O_RDWR)) < 0) - { - printf("TSL2561 I2C device setup failure: %s\n", strerror(errno)); - return -1; - } - - printf("TSL2561 initialise ok, tsl_fd=%d\n", tsl_fd); - return tsl_fd; -} - -#define ON 1 -#define OFF 0 - -void tsl2561_power(int cmd) -{ - struct i2c_msg msg; - struct i2c_rdwr_ioctl_data data; - unsigned char buf[2]; - - msg.addr= TSL2561_I2C_ADDR; - msg.flags=0; /* write */ - msg.len= 1; - msg.buf= buf; - - data.nmsgs= 1; - data.msgs= &msg; - - msg.buf[0]=CONTROL_REG; - if( ioctl(tsl_fd, I2C_RDWR, &data) < 0 ) - { - printf("%s() ioctl failure: %s\n", __func__, strerror(errno)); - return ; - } - - - if( cmd ) - msg.buf[0]=POWER_UP; - else - msg.buf[0]=POWER_DOWN; - - if( ioctl(tsl_fd, I2C_RDWR, &data) < 0 ) - { - printf("%s() ioctl failure: %s\n", __func__, strerror(errno)); - return ; - } - - return ; -} - -int tsl2561_readreg(unsigned char regaddr, unsigned char *regval) -{ - struct i2c_msg msg; - struct i2c_rdwr_ioctl_data data; - unsigned char buf[2]; - - msg.addr= TSL2561_I2C_ADDR; - msg.flags=0; /* write */ - msg.len= 1; - msg.buf= buf; - msg.buf[0] = regaddr; - - data.nmsgs= 1; - data.msgs= &msg; - - if( ioctl(tsl_fd, I2C_RDWR, &data) < 0 ) - { - printf("%s() ioctl failure: %s\n", __func__, strerror(errno)); - return -1; - } - - memset(buf, 0, sizeof(buf)); - - msg.addr= TSL2561_I2C_ADDR; - msg.flags=I2C_M_RD; /* read */ - msg.len= 1; - msg.buf= buf; - - data.nmsgs= 1; - data.msgs= &msg; - - if( ioctl(tsl_fd, I2C_RDWR, &data) < 0 ) - { - printf("%s() ioctl failure: %s\n", __func__, strerror(errno)); - return -1; - } - - *regval = msg.buf[0]; - return 0; -} - - - -int tsl2561_get_lux(void) -{ - int i; - unsigned char reg_data[REG_COUNT]; - unsigned char buf; - - int chn0_data = 0; - int chn1_data = 0; - - float div = 0.0; - float lux = 0.0; - - - tsl2561_power(ON); - - delay(410); /* t(CONV) MAX 400ms */ - - /* Read register Channel0 and channel1 data from register */ - for(i=0; i<REG_COUNT; i++) - { - tsl2561_readreg(regs_addr[i], ®_data[i]); - } - - chn0_data = reg_data[1]*256 + reg_data[0]; /* Channel0 = DATA0HIGH<<8 + DATA0LOW */ - chn1_data = reg_data[3]*256 + reg_data[2]; /* channel1 = DATA1HIGH<<8 + DATA1LOW */ - - if( chn0_data<=0 || chn1_data<0 ) - { - lux = 0.0; - goto OUT; - } - - div = (float)chn1_data / (float)chn0_data; - - if( div>0 && div<=0.5 ) - lux = 0.304*chn0_data-0.062*chn0_data*pow(div,1.4); - - else if( div>0.5 && div<=0.61 ) - lux = 0.0224*chn0_data-0.031*chn1_data; - - else if( div>0.61 && div<=0.8 ) - lux = 0.0128*chn0_data-0.0153*chn1_data; - - else if( div>0.8 && div<=1.3 ) - lux = 0.00146*chn0_data-0.00112*chn1_data; - - else if( div>1.3 ) - lux = 0.0; - -OUT: - printf("TSLl2561 get lux: %.3f\n", lux); - - tsl2561_power(OFF); -} - -void print_datime(void) -{ - time_t tmp; - struct tm *p; - - time(&tmp); - - p=localtime(&tmp); - - - printf("%d-%02d-%02d %02d:%02d:%02d\t", (p->tm_year+1900),(p->tm_mon+1), - p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec); - -} - -int main(int argc, char **argv) -{ - int interval = 1; - - if( argc >= 2 ) - { - interval = atoi(argv[1]); - } - - tsl2561_init(); - - while(1) - { - print_datime(); - tsl2561_get_lux(); - sleep(interval); - } - -} - - diff --git a/qt/build_QT4.sh b/qt/build_QT4.sh deleted file mode 100755 index 53e72df..0000000 --- a/qt/build_QT4.sh +++ /dev/null @@ -1,111 +0,0 @@ -#!/bin/bash - -#+-------------------------------------------------------------------------------------------- -#|Description: This shell script used download and compile QT5 for ARM -#| Author: GuoWenxue <guowenxue@gmail.com> -#| -#| WARNNING: QT >= 5.7 need crosstool g++ support C++11 support -#| QT configure need host g++ support C++11, so need config g++ on ubuntu host: -#| sudo update-alternatives --config g++ -#| -#| ChangeLog: -#| 1, Initialize 1.0.0 on 2011.04.12 -#+-------------------------------------------------------------------------------------------- - -JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l` - -PRJ_PATH=`pwd` -LIBS_PATH=$PRJ_PATH/install - -#QT_INST_PATH=/apps/QT5.9_RPI -QT_INST_PATH=/apps/QT4.6_RPI - -CROSSTOOL=/opt/rpi/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux- - -LYFTP_SRC=ftp://master.iot-yun.club/src/ - -function msg_banner() -{ - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" -} - -function check_result() -{ - if [ $? != 0 ] ; then - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" - exit ; - fi -} - -function compile_qt() -{ - SRC_NAME=qt-everywhere-opensource-src-4.6.4 - - PACK_SUFIX=tar.gz - - #rm -rf ${QT_INST_PATH}/lib/libQt5Gui.so - if [ -f ${QT_INST_PATH}/lib/libQtGui.so ] ; then - msg_banner "Already cross compile $SRC_NAME " - return 0; - fi - - if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then - msg_banner "Start download ${SRC_NAME}.${PACK_SUFIX} " - wget ${LYFTP_SRC}/qt/${SRC_NAME}.${PACK_SUFIX} - check_result "ERROR: download ${SRC_NAME} failure" - fi - - msg_banner "Start decompress $SRC_NAME.${PACK_SUFIX} " - if [ ! -d ${SRC_NAME} ] ; then - tar -xzf ${SRC_NAME}.${PACK_SUFIX} - fi - - cd ${SRC_NAME} - - QMAKE_FILE=mkspecs/qws/linux-arm-g++/qmake.conf - - grep "`dirname ${CROSSTOOL}`" ${QMAKE_FILE} > /dev/null 2>&1 - if [ $? != 0 ] ; then - sed -i "s|arm-linux-|$CROSSTOOL|" ${QMAKE_FILE} - fi - - ./configure -opensource -confirm-license -release -shared -prefix ${QT_INST_PATH} -embedded arm \ - -xplatform qws/linux-arm-g++ -qt-freetype -make libs -no-fast -no-largefile \ - -qt-zlib -no-gif -qt-libpng -qt-libjpeg -no-openssl -no-cups -no-dbus -pch \ - -no-phonon -no-phonon-backend -no-opengl -no-xmlpatterns \ - -no-rpath -no-glib -no-javascript-jit -no-script -no-scripttools -no-declarative \ - -no-nis -no-mmx -no-3dnow -no-sse -no-sse2 -no-xcursor -no-xfixes -no-xrandr -no-xrender \ - -no-separate-debug-info -nomake tests -nomake tools -nomake examples \ - -I${LIBS_PATH}/include/ -L${LIBS_PATH}/lib/ -I${QT_INST_PATH}/include/ -L${QT_INST_PATH}/lib/ - - msg_banner "Start cross compile $SRC_NAME " - make -j${JOBS} && make install - check_result "ERROR: compile ${SRC_NAME} failure" - - cp -af ${LIBS_PATH}/lib/libts*so* ${QT_INST_PATH}/lib - - cd - -} - - -if [ ! -f ${LIBS_PATH}/lib/libiconv.so ] ; then - cd ./iconv - ./build.sh - cd - -fi - -cd tslib - ./build.sh -cd - - -compile_qt - - diff --git a/qt/build_QT5.sh b/qt/build_QT5.sh deleted file mode 100755 index a7c916a..0000000 --- a/qt/build_QT5.sh +++ /dev/null @@ -1,112 +0,0 @@ -#!/bin/bash - -#+-------------------------------------------------------------------------------------------- -#|Description: This shell script used download and compile QT5 for ARM -#| Author: GuoWenxue <guowenxue@gmail.com> -#| -#| WARNNING: QT >= 5.7 need crosstool g++ support C++11 support -#| QT configure need host g++ support C++11, so need config g++ on ubuntu host: -#| sudo update-alternatives --config g++ -#| -#| ChangeLog: -#| 1, Initialize 1.0.0 on 2011.04.12 -#+-------------------------------------------------------------------------------------------- - -JOBS=`cat /proc/cpuinfo |grep "processor"|wc -l` - -PRJ_PATH=`pwd` -LIBS_PATH=$PRJ_PATH/install - -#QT_INST_PATH=/apps/QT5.9_RPI -QT_INST_PATH=/apps/QT5.6_RPI - -CROSSTOOL=/opt/rpi/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux- - -LYFTP_SRC=ftp://master.iot-yun.club/src/ - -function msg_banner() -{ - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" -} - -function check_result() -{ - if [ $? != 0 ] ; then - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" - exit ; - fi -} - -function compile_qt() -{ - # 5.6.3 is the last version can be compiled by g++ without c++11 support - #SRC_NAME=qt-everywhere-opensource-src-5.9.8 - SRC_NAME=qt-everywhere-opensource-src-5.6.3 - - PACK_SUFIX=tar.xz - - #rm -rf ${QT_INST_PATH}/lib/libQt5Gui.so - if [ -f ${QT_INST_PATH}/lib/libQt5Gui.so ] ; then - msg_banner "Already cross compile $SRC_NAME " - return 0; - fi - - if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then - msg_banner "Start download ${SRC_NAME}.${PACK_SUFIX} " - wget ${LYFTP_SRC}/qt/${SRC_NAME}.${PACK_SUFIX} - check_result "ERROR: download ${SRC_NAME} failure" - fi - - msg_banner "Start decompress $SRC_NAME.${PACK_SUFIX} " - if [ ! -d ${SRC_NAME} ] ; then - tar -xJf ${SRC_NAME}.${PACK_SUFIX} - fi - - cd ${SRC_NAME} - - QMAKE_FILE=qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf - - grep "`dirname ${CROSSTOOL}`" ${QMAKE_FILE} > /dev/null 2>&1 - if [ $? != 0 ] ; then - sed -i "s|arm-linux-gnueabi-|$CROSSTOOL|" ${QMAKE_FILE} - fi - - ./configure -opensource -confirm-license -release -shared -strip -prefix ${QT_INST_PATH} -c++std c++11 \ - -xplatform linux-arm-gnueabi-g++ -qt-freetype -no-libproxy -no-avx -make libs \ - -qt-zlib -no-mtdev -no-gif -qt-libpng -qt-libjpeg -no-openssl -no-cups -no-dbus -pch \ - -no-xcb -no-eglfs -no-kms -no-directfb -no-opengl -linuxfb -qpa linuxfb \ - -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-rpath -no-glib \ - -no-separate-debug-info -nomake tests -nomake tools -nomake examples \ - -tslib -I${LIBS_PATH}/include/ -L${LIBS_PATH}/lib/ -I${QT_INST_PATH}/include/ -L${QT_INST_PATH}/lib/ - - msg_banner "Start cross compile $SRC_NAME " - make -j${JOBS} && make install - check_result "ERROR: compile ${SRC_NAME} failure" - cp ./qtbase/plugins/platforms/libqlinuxfb.so ${QT_INST_PATH}/lib - cp -af ${LIBS_PATH}/lib/libts*so* ${QT_INST_PATH}/lib - - cd - -} - - -if [ ! -f ${LIBS_PATH}/lib/libiconv.so ] ; then - cd ./iconv - ./build.sh - cd - -fi - -cd tslib - ./build.sh -cd - - -compile_qt - - diff --git a/qt/iconv/build.sh b/qt/iconv/build.sh deleted file mode 100755 index fc25292..0000000 --- a/qt/iconv/build.sh +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash - -#+-------------------------------------------------------------------------------------------- -#|Description: This shell script used download and compile libiconv for ARM -#| Author: GuoWenxue <guowenxue@gmail.com> -#| ChangeLog: -#| 1, Initialize 1.0.0 on 2011.04.12 -#+-------------------------------------------------------------------------------------------- - -INST_PATH=`pwd`/../install - -CROSSTOOL=/opt/rpi/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux- - -LYFTP_SRC=ftp://master.iot-yun.club/src/ - -function msg_banner() -{ - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" -} - -function check_result() -{ - if [ $? != 0 ] ; then - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" - exit ; - fi -} - -function export_cross() -{ - # export cross toolchain - export CC=${CROSSTOOL}gcc - export AS=${CROSSTOOL}as - export AR=${CROSSTOOL}ar - export LD=${CROSSTOOL}ld - export NM=${CROSSTOOL}nm - export RANLIB=${CROSSTOOL}ranlib - export OBJDUMP=${CROSSTOOL}objdump - export STRIP=${CROSSTOOL}strip - - # export cross configure - export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux " - - # Clear LDFLAGS and CFLAGS - export LDFLAGS= - export CFLAGS= -} - - -function compile_libiconv() -{ - SRC_NAME=libiconv-1.15 - PACK_SUFIX=tar.gz - - if [ -f ${INST_PATH}/lib/libiconv.so ] ; then - msg_banner "Already cross compile $SRC_NAME " - return 0; - fi - - msg_banner "Start cross compile $SRC_NAME " - - if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then - #wget https://ftp.gnu.org/gnu/libiconv/${SRC_NAME}.${PACK_SUFIX} - wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX} - check_result "ERROR: download ${SRC_NAME} failure" - fi - - tar -xzf ${SRC_NAME}.${PACK_SUFIX} - cd ${SRC_NAME} - - ./configure --prefix=${INST_PATH} ${CONFIG_CROSS} - make && make install - - cd - -} - - -export_cross - -compile_libiconv - - - diff --git a/qt/iconv/libiconv-1.15.tar.gz b/qt/iconv/libiconv-1.15.tar.gz deleted file mode 100644 index abdb6a4..0000000 --- a/qt/iconv/libiconv-1.15.tar.gz +++ /dev/null Binary files differ diff --git a/qt/tslib/build.sh b/qt/tslib/build.sh deleted file mode 100755 index 34ee9ba..0000000 --- a/qt/tslib/build.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash - -#+-------------------------------------------------------------------------------------------- -#|Description: This shell script used download and compile QT5 for ARM -#| Author: GuoWenxue <guowenxue@gmail.com> -#| ChangeLog: -#| 1, Initialize 1.0.0 on 2011.04.12 -#+-------------------------------------------------------------------------------------------- - -INST_PATH=`pwd`/../install - -CROSSTOOL=/opt/rpi/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux- - -LYFTP_SRC=ftp://master.iot-yun.club/src/ - -function msg_banner() -{ - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" -} - -function check_result() -{ - if [ $? != 0 ] ; then - echo "" - echo "+-----------------------------------------------------------------------" - echo "| $1 " - echo "+-----------------------------------------------------------------------" - echo "" - exit ; - fi -} - -function export_cross() -{ - # export cross toolchain - export CC=${CROSSTOOL}gcc - export AS=${CROSSTOOL}as - export AR=${CROSSTOOL}ar - export LD=${CROSSTOOL}ld - export NM=${CROSSTOOL}nm - export RANLIB=${CROSSTOOL}ranlib - export OBJDUMP=${CROSSTOOL}objdump - export STRIP=${CROSSTOOL}strip - - # export cross configure - export CONFIG_CROSS=" --build=i686-pc-linux --host=arm-linux " - - # Clear LDFLAGS and CFLAGS - export LDFLAGS= - export CFLAGS= -} - -function compile_tslib() -{ - SRC_NAME=tslib-1.16 - PACK_SUFIX=tar.bz2 - - - if [ -f ${INST_PATH}/lib/libts.so ] ; then - msg_banner "Already cross compile $SRC_NAME " - return 0; - fi - - msg_banner "Start cross compile $SRC_NAME " - - if [ ! -f ${SRC_NAME}.${PACK_SUFIX} ] ; then - #wget https://gitlab.com/tslib/tslib/uploads/021755cde4aba79478464459c8a2122c/${SRC_NAME}.${PACK_SUFIX} - wget ${LYFTP_SRC}/${SRC_NAME}.${PACK_SUFIX} - check_result "ERROR: download ${SRC_NAME} failure" - fi - - tar -xjf ${SRC_NAME}.${PACK_SUFIX} - cd ${SRC_NAME} - - ./configure --prefix=${INST_PATH} ${CONFIG_CROSS} - make && make install - - cd - -} - - -export_cross - -compile_tslib - - diff --git a/tools/WiringPi.tar.bz2 b/tools/WiringPi.tar.bz2 deleted file mode 100644 index f1ccb2e..0000000 --- a/tools/WiringPi.tar.bz2 +++ /dev/null Binary files differ diff --git a/tools/install.txt b/tools/install.txt deleted file mode 100644 index 86f543c..0000000 --- a/tools/install.txt +++ /dev/null @@ -1,5 +0,0 @@ - -Install cross compiler to /opt path: - -sudo tar -xjf rpi_crosstool.tar.bz2 -C /opt/ - diff --git a/tools/rpi_crosstool.tar.bz2 b/tools/rpi_crosstool.tar.bz2 deleted file mode 100644 index b25d15f..0000000 --- a/tools/rpi_crosstool.tar.bz2 +++ /dev/null Binary files differ diff --git a/tools/setup_libgpiod.sh b/tools/setup_libgpiod.sh deleted file mode 100755 index a2a4737..0000000 --- a/tools/setup_libgpiod.sh +++ /dev/null @@ -1,21 +0,0 @@ -#/bin/bash -# This shell script used install libgpiod library - -set -e - -APP_NAME=libgpiod-1.6.2 - -if [ ! -f ${APP_NAME}.tar.gz ] ; then - wget https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/snapshot/${APP_NAME}.tar.gz -fi - -if [ ! -d ${APP_NAME} ] ; then - tar -xzf ${APP_NAME}.tar.gz -fi - -cd ${APP_NAME} - -./autogen.sh -./configure --enable-tools=yes --prefix=/usr -make -sudo make install diff --git a/tools/setup_systools.sh b/tools/setup_systools.sh index b04a21f..6ef04a3 100755 --- a/tools/setup_systools.sh +++ b/tools/setup_systools.sh @@ -1,7 +1,72 @@ #!/bin/bash -sudo apt update +# display in red +function pr_error() { + echo "" + echo -e "\033[40;31m --E-- $1 \033[0m" + echo "" +} -sudo apt install -y make vim gawk wget curl unzip sed tree coreutils diffstat git subversion groff lzop \ -make gcc g++ libtool automake autoconf autoconf-archive flex texinfo build-essential libelf-dev bison libssl-dev +# display in yellow +function pr_warn() { + echo "" + echo -e "\033[40;33m --W-- $1 \033[0m" + echo "" +} + +# display in green +function pr_info() { + echo "" + echo -e "\033[40;32m --I-- $1 \033[0m" + echo "" +} + +function update_source() +{ + APT_FILE=/etc/apt/sources.list + + pr_warn "start update apt source to ustc" + + if [ ! -f $APT_FILE.orig ] ; then + mv $APT_FILE $APT_FILE.orig + fi + +cat > $APT_FILE <<EOF +deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ bullseye main contrib non-free rpi +deb-src http://mirrors.ustc.edu.cn/raspbian/raspbian/ bullseye main contrib non-free rpi +EOF +} + +function apt_update() +{ + pr_warn "start update apt updata and upgrade" + + apt update + apt upgrade -y + apt autoremove -y +} + +function apt_install() +{ + pr_warn "start apt install system tools" + + apt install -y make vim gawk wget curl unzip sed tree coreutils diffstat git subversion \ + groff lzop make gcc g++ libtool automake autoconf autoconf-archive flex texinfo bison \ + build-essential libelf-dev lrzsz + + # apt-cache policy libssl-dev + apt install -y libssl-dev=1.1.1n-0+deb11u1 libssl1.1 +} + +if [ `id -u` != 0 ] ; then + pr_error "This shell script must run as root." + exit 1; +fi + +update_source + +apt_update + +apt_install + diff --git a/tools/setup_wiringPi.sh b/tools/setup_wiringPi.sh deleted file mode 100755 index 12e7d5c..0000000 --- a/tools/setup_wiringPi.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -# This shell script used to install wiringPi library - -function install_wiringpi() -{ - gpio -v > /dev/null - if [ $? == 0 ] ; then - echo "wiringPi library already installed, exit now..." - #return; - fi - - if [ ! -d WiringPi ] ; then - if [ -f WiringPi.tar.bz2 ] ; then - echo "## decompress WiringPi libarary packet ##" - tar -xjf WiringPi.tar.bz2 - else - echo "## git clone WiringPi libarary source code ##" - git clone https://github.com/WiringPi/WiringPi.git - fi - fi - - cd WiringPi - git pull origin - ./build -} - -function install_systools() -{ - sudo apt-get install -y libssl-dev openssl -} - - -#install_systools - -install_wiringpi - -- Gitblit v1.9.1