2024-10-22 20:56:21 +08:00
# include "common_func.hpp"
2024-10-22 19:04:25 +08:00
# include <time.h>
# include <sys/time.h>
# include <unistd.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <sys/select.h>
# include <sys/types.h>
# include <fcntl.h>
# include <limits.h>
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <unistd.h>
# include <linux/sockios.h>
# include <linux/rtc.h>
2024-10-24 16:01:21 +08:00
# include <sys/socket.h>
# include <netinet/in.h>
# include <net/if.h>
# include <stdlib.h>
# include <memory.h>
# include <string>
# include <list>
# include <iostream>
# include <fstream>
# include <arpa/inet.h>
# include <sys/ioctl.h>
# include <sys/mman.h>
# include <fcntl.h>
# include <memory.h>
# include <sys/ipc.h>
# include <sys/shm.h>
# include "dirent.h"
# include <iconv.h>
# include <termios.h>
# include <netinet/in.h>
# include <netinet/ip.h>
# include <netinet/ip_icmp.h>
# include <netdb.h>
# include <boost/algorithm/string/split.hpp>
# include <boost/thread/mutex.hpp>
# include <boost/algorithm/string/classification.hpp>
# include <boost/lexical_cast.hpp>
2024-10-22 20:56:21 +08:00
# include <boost/xpressive/xpressive_dynamic.hpp>
2024-10-23 09:58:35 +08:00
# include <zlog.h>
2024-10-22 20:56:21 +08:00
# include "global.hpp"
# include "dbaccess/sql_db.hpp"
2024-10-22 19:04:25 +08:00
# define ETHTOOL_GLINK 0x0000000a /* Get link status (ethtool_value) */
# define MAX_WAIT_TIME 1
# define MAX_NO_PACKETS 1
# define ICMP_HEADSIZE 8
# define PACKET_SIZE 4096
struct timeval tvsend , tvrecv ;
struct sockaddr_in dest_addr , recv_addr ;
int sockfd ;
pid_t pid ;
char sendpacket [ PACKET_SIZE ] ;
char recvpacket [ PACKET_SIZE ] ;
static boost : : mutex s_config_mu ;
2024-10-23 09:58:35 +08:00
2024-10-23 10:03:13 +08:00
extern zlog_category_t * zct ;
extern zlog_category_t * zbt ;
2024-10-23 09:58:35 +08:00
2024-10-23 16:10:23 +08:00
std : : string GetLocalTimeWithMs ( void ) {
std : : string defaultTime = " 19700101000000000 " ;
2024-10-22 19:04:25 +08:00
try {
struct timeval curTime ;
gettimeofday ( & curTime , NULL ) ;
int milli = curTime . tv_usec / 1000 ;
char buffer [ 80 ] = { 0 } ;
struct tm nowTime ;
2024-11-09 16:15:39 +08:00
localtime_r ( & curTime . tv_sec , & nowTime ) ; //闂傚倷鑳堕、濠傗枖濞戙垺鏅濋柕<E6BF8B> ?濇<> ?<3F> 椤<EFBFBD> ?粙<> ?<3F> 洪鈧粔瀵哥矆閸℃稒鐓欐繛鍫濈仢閺<E4BBA2> ??喖鏌i 敐澶<E69590> ?<3F> 喚闁哄<E99781> ?绋掔换婵<E68DA2> ?礋椤愵澀<E684B5> ?梻浣割吔閺夊灝<E5A48A> ?<3F> ?悗瑙<E68297> ?礃椤ㄥ﹥淇婇悜钘壩ч柛婊€鐒︿簺闂傚倷绀侀幖<E4BE80> ?<3F> ﹀<EFBFBD> ?閸愭祴鏋栨繛鎴欏灩閸ㄥ倿骞<E580BF> ?ǎ顒€濡介柣鎾亾闁<E4BABE> ?<3F> <> ?<3F> 绠嶉崕鍗灻<E98D97> ?敃鍌涘仼闂侇剙绉甸悡鏇㈡煙闁箑澧柛锝<E69F9B> ?秺閺岋絾骞婇柛鏂跨Ф缁瑦寰勯幇鍨櫍闂侀潧臎閸滀焦啸缂傚倸鍊烽悞锕€鐣峰Ο 琛℃灃闁哄洢鍨归悡婵<E682A1> ?煠濞村鏉归柛瀣崌閹兘鏌囬敂鍙<E69582> ?箓<> ?<3F> 洪崨濠<E5B4A8> ?嚂闁瑰嚖鎷<E59A96>
2024-10-22 19:04:25 +08:00
strftime ( buffer , sizeof ( buffer ) , " %Y%m%d%H%M%S " , & nowTime ) ;
char currentTime [ 84 ] = { 0 } ;
snprintf ( currentTime , sizeof ( currentTime ) , " %s%03d " , buffer , milli ) ;
return currentTime ;
} catch ( . . . ) {
2024-11-14 18:48:45 +08:00
zlog_warn ( zct , " GetLocalTimeWithMs failed, use default time " ) ;
2024-10-22 19:04:25 +08:00
return defaultTime ;
}
}
2024-10-23 09:58:35 +08:00
2024-10-22 19:04:25 +08:00
int code_convert ( const char * from_charset , const char * to_charset , char * inbuf , size_t inlen , char * outbuf , size_t outlen ) {
iconv_t cd ;
char * * pin = & inbuf ;
char * * pout = & outbuf ;
cd = iconv_open ( to_charset , from_charset ) ;
2024-10-23 16:10:23 +08:00
if ( cd = = 0 ) {
2024-11-14 18:48:45 +08:00
zlog_warn ( zct , " iconv_open failed " ) ;
2024-10-23 16:10:23 +08:00
return - 1 ;
}
2024-10-22 19:04:25 +08:00
memset ( outbuf , 0 , outlen ) ;
if ( ( int ) iconv ( cd , pin , & inlen , pout , & outlen ) = = - 1 ) {
2024-11-14 18:48:45 +08:00
zlog_warn ( zct , " iconv failed " ) ;
2024-10-22 19:04:25 +08:00
iconv_close ( cd ) ;
2024-10-25 18:45:26 +08:00
return - 2 ;
2024-10-22 19:04:25 +08:00
}
iconv_close ( cd ) ;
* pout = ' \0 ' ;
return 0 ;
}
2024-10-25 18:45:26 +08:00
int InitGpio ( unsigned int gpioN , unsigned int inout ) {
2024-10-22 19:04:25 +08:00
int fd = 0 ;
char tmp [ 100 ] = { 0 } ;
2024-11-09 16:15:39 +08:00
//闂傚倷鑳堕幊鎾绘倶濮樿泛绠伴柛婵<E69F9B> ?劜椤洟鏌熸潏鈺佲偓宄闂備浇宕<E6B587> ?慨鎶芥倿閿曞倸纾块柟璺哄閸<EE979E> ?剦鏁嗛柛鏇ㄥ亝椤ユ繈姊洪幖鐐插姷闂傚<E99782> ?瀚伴、鏇㈡晸閿燂<E996BF> ?
2024-10-22 19:04:25 +08:00
fd = open ( " /sys/class/gpio/export " , O_WRONLY ) ;
if ( - 1 = = fd ) {
2024-11-14 18:48:45 +08:00
zlog_warn ( zbt , " open gpio export file error " ) ;
2024-10-25 18:45:26 +08:00
return 1 ;
2024-10-22 19:04:25 +08:00
}
2024-11-09 16:15:39 +08:00
//闂傚倷鐒﹂惇褰掑垂瑜版帗鍋柛銉墻閺佸鏌i 悙<EFBD89> ?<3F> ?紬io
2024-10-22 19:04:25 +08:00
sprintf ( tmp , " %d " , gpioN ) ;
if ( write ( fd , tmp , strlen ( tmp ) ) < 0 ) {
2024-11-14 18:48:45 +08:00
zlog_warn ( zbt , " write file operation error:%s " , tmp ) ;
2024-10-23 16:10:23 +08:00
close ( fd ) ;
2024-10-25 18:45:26 +08:00
return 2 ;
2024-10-22 19:04:25 +08:00
}
2024-10-23 16:10:23 +08:00
2024-10-22 19:04:25 +08:00
close ( fd ) ;
sleep ( 1 ) ;
2024-11-09 16:15:39 +08:00
//闂傚倸鍊烽悞锕€<E99495> ?<3F> ?Ο 鑲╃煋闁割偅娲橀崑<E6A980> ?<3F> 堟煕閻<E78595> ?彃鍘o闂傚倷绀侀幖<E4BE80> ?<3F> ﹀磹婵犳艾绠犻柟鎹愵嚙缁犳牠鏌ㄩ悤鍌涘<E98D8C> ?
2024-11-14 19:01:30 +08:00
2024-10-22 19:04:25 +08:00
sprintf ( tmp , " /sys/class/gpio/gpio%d/direction " , gpioN ) ;
2024-10-23 16:10:23 +08:00
zlog_info ( zbt , " open GPIO = %s " , tmp ) ;
2024-10-22 19:04:25 +08:00
fd = open ( tmp , O_WRONLY ) ;
if ( - 1 = = fd ) {
2024-11-14 18:48:45 +08:00
zlog_warn ( zbt , " open gpio direction file error " ) ;
2024-10-22 19:04:25 +08:00
close ( fd ) ;
2024-10-25 18:45:26 +08:00
return 3 ;
2024-10-22 19:04:25 +08:00
}
if ( inout = = 0 ) {
2024-10-23 16:10:23 +08:00
zlog_info ( zbt , " =====InitGpio=====in " ) ;
2024-10-22 19:04:25 +08:00
if ( - 1 = = write ( fd , " in " , sizeof ( " in " ) ) ) {
2024-11-14 18:48:45 +08:00
zlog_warn ( zbt , " [%d]write operation direction error " , gpioN ) ;
2024-10-22 19:04:25 +08:00
close ( fd ) ;
2024-10-25 18:45:26 +08:00
return 4 ;
2024-10-22 19:04:25 +08:00
}
} else if ( inout = = 1 ) {
2024-10-23 16:10:23 +08:00
zlog_info ( zbt , " =====InitGpio=====out " ) ;
2024-10-22 19:04:25 +08:00
if ( - 1 = = write ( fd , " out " , sizeof ( " out " ) ) ) {
2024-11-14 18:48:45 +08:00
zlog_warn ( zbt , " [%d]write operation direction error " , gpioN ) ;
2024-10-22 19:04:25 +08:00
close ( fd ) ;
2024-10-25 18:45:26 +08:00
return 5 ;
2024-10-22 19:04:25 +08:00
}
}
close ( fd ) ;
2024-10-25 18:45:26 +08:00
return 0 ;
2024-10-22 19:04:25 +08:00
}
2024-10-23 16:10:23 +08:00
2024-10-22 19:04:25 +08:00
int gpio_set ( unsigned int gpioN , char x ) {
int fd = 0 ;
char tmp [ 100 ] = { 0 } ;
2024-11-14 19:01:30 +08:00
2024-10-22 19:04:25 +08:00
sprintf ( tmp , " /sys/class/gpio/gpio%d/value " , gpioN ) ;
2024-10-23 16:10:23 +08:00
2024-11-09 16:15:39 +08:00
//闂傚倷鑳堕幊鎾绘倶濮樿泛绠伴柛婵<E69F9B> ?劜椤洟鏌熸潏鈺佲偓宄 value闂傚倷绀侀幖<E4BE80> ?<3F> ﹀磹缁<E7A3B9> ?5娲晲閸涱亝鐎婚梺璺ㄥ櫐閹凤拷
2024-10-22 19:04:25 +08:00
fd = open ( tmp , O_WRONLY ) ;
if ( - 1 = = fd ) {
2024-11-14 18:48:45 +08:00
zlog_warn ( zbt , " [%s] open gpio export file error " , tmp ) ;
2024-10-22 19:04:25 +08:00
close ( fd ) ;
2024-10-23 16:10:23 +08:00
return ( - 1 ) ;
2024-10-22 19:04:25 +08:00
}
2024-11-09 16:15:39 +08:00
//闂備浇宕<E6B587> ?慨宕囩矆娴h 娅犲ù鐘<C3B9> ?儐閸嬵亪鏌涢埄鍐<E98D90> ?<3F> 闁稿鍔戝濠<EE9D8F> ?醇閻旂儤鍒涢梺褰掓交閹凤<E996B9> ?
2024-10-22 19:04:25 +08:00
if ( x ) {
if ( - 1 = = write ( fd , " 1 " , sizeof ( " 1 " ) ) ) {
2024-11-14 18:48:45 +08:00
zlog_warn ( zbt , " %d write operation value error " , gpioN ) ;
2024-10-22 19:04:25 +08:00
close ( fd ) ;
2024-10-25 18:45:26 +08:00
return ( - 2 ) ;
2024-10-22 19:04:25 +08:00
}
} else {
if ( - 1 = = write ( fd , " 0 " , sizeof ( " 0 " ) ) ) {
2024-11-14 18:48:45 +08:00
zlog_warn ( zbt , " %d write operation value errorn " , gpioN ) ;
2024-10-22 19:04:25 +08:00
close ( fd ) ;
2024-10-25 18:45:26 +08:00
return ( - 3 ) ;
2024-10-22 19:04:25 +08:00
}
}
close ( fd ) ;
return 0 ;
}
2024-10-23 16:10:23 +08:00
2024-10-22 19:04:25 +08:00
int gpio_read ( unsigned int gpioN ) {
int fd = 0 ;
char value ;
char tmp [ 100 ] = { 0 } ;
sprintf ( tmp , " /sys/class/gpio/gpio%d/value " , gpioN ) ;
2024-11-14 19:01:30 +08:00
2024-11-09 16:15:39 +08:00
//闂傚倷鑳堕幊鎾绘倶濮樿泛绠伴柛婵<E69F9B> ?劜椤洟鏌熸潏鈺佲偓宄 value闂傚倷绀侀幖<E4BE80> ?<3F> ﹀磹缁<E7A3B9> ?5娲晲閸涱亝鐎婚梺璺ㄥ櫐閹凤拷
2024-10-22 19:04:25 +08:00
fd = open ( tmp , O_RDONLY ) ;
if ( - 1 = = fd ) {
2024-11-14 18:48:45 +08:00
zlog_warn ( zbt , " %d open gpio export file error " , gpioN ) ;
2024-10-23 16:10:23 +08:00
return ( - 1 ) ;
2024-10-22 19:04:25 +08:00
}
2024-11-09 16:15:39 +08:00
//闂備浇宕<E6B587> ?慨鏉懨洪埡鍜佹晪鐟滄垿濡甸幇鐗堟櫢闁跨噦鎷<E599A6> value闂傚倷绀侀幖<E4BE80> ?<3F> ﹀磹缁<E7A3B9> ?5娲晲閸涱亝鐎婚梺璺ㄥ櫐閹凤拷
2024-10-22 19:04:25 +08:00
if ( - 1 = = read ( fd , & value , sizeof ( value ) ) ) {
2024-11-14 18:48:45 +08:00
zlog_warn ( zbt , " %d read gpiovalue is fail " , gpioN ) ;
2024-10-22 19:04:25 +08:00
close ( fd ) ;
2024-10-25 18:45:26 +08:00
return ( - 2 ) ;
2024-10-22 19:04:25 +08:00
}
close ( fd ) ;
return value ;
}
2024-10-23 16:10:23 +08:00
int config_uart ( const char * port , int speed ) {
int iFd = open ( port , O_RDWR | O_NOCTTY ) ;
2024-10-22 19:04:25 +08:00
if ( iFd < 0 ) {
2024-11-14 18:48:45 +08:00
zlog_warn ( zbt , " open port:%s failed " , port ) ;
2024-10-22 19:04:25 +08:00
return - 1 ;
}
struct termios opt ;
tcgetattr ( iFd , & opt ) ;
cfsetispeed ( & opt , speed ) ;
cfsetospeed ( & opt , speed ) ;
if ( tcgetattr ( iFd , & opt ) < 0 ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zbt , " tcgetattr failed " ) ;
2024-10-22 19:04:25 +08:00
return - 1 ;
}
opt . c_lflag & = ~ ( ECHO | ICANON | IEXTEN | ISIG ) ;
opt . c_iflag & = ~ ( BRKINT | ICRNL | INPCK | ISTRIP | IXON ) ;
opt . c_oflag & = ~ ( OPOST ) ;
opt . c_cflag & = ~ ( CSIZE | PARENB | CBAUD ) ;
opt . c_cflag | = ( CS8 | speed ) ;
opt . c_cc [ VMIN ] = 255 ;
opt . c_cc [ VTIME ] = 5 ;
if ( tcsetattr ( iFd , TCSANOW , & opt ) < 0 ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zbt , " tcsetattr failed " ) ;
2024-10-25 18:45:26 +08:00
return - 2 ;
2024-10-22 19:04:25 +08:00
}
tcflush ( iFd , TCIOFLUSH ) ;
return iFd ;
}
int write_data ( int fd , char * buff , int len ) {
int ret ;
ret = write ( fd , buff , len ) ;
if ( ret < 0 ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " write failed " ) ;
2024-10-22 19:04:25 +08:00
return - 1 ;
}
return ret ;
}
int read_data ( int fd , char * buff , int len , int timeout ) {
int ret ;
struct timeval to ;
fd_set rdfds ;
to . tv_sec = 0 ;
to . tv_usec = timeout ;
FD_ZERO ( & rdfds ) ;
FD_SET ( fd , & rdfds ) ;
if ( timeout > 0 ) {
ret = select ( fd + 1 , & rdfds , NULL , NULL , & to ) ;
if ( ret < = 0 ) {
return ret ;
}
}
ret = read ( fd , buff , len ) ;
if ( ret < 0 ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " read_data failed " ) ;
2024-10-22 19:04:25 +08:00
return - 1 ;
}
buff [ ret ] = ' \0 ' ;
return ret ;
}
int ModifyMac ( char * buff ) {
2024-10-23 16:10:23 +08:00
FILE * fp = NULL ;
fp = fopen ( " /opt/system/mac " , " w " ) ;
if ( fp = = NULL ) {
zlog_error ( zbt , " fail to open /opt/system/mac " ) ;
return 1 ;
}
2024-10-22 19:04:25 +08:00
fprintf ( fp , buff ) ;
fprintf ( fp , " \n " ) ;
fclose ( fp ) ;
system ( " cp /opt/system/mac /opt/system/macbak " ) ;
system ( " /opt/Cidn/init.sh " ) ;
2024-10-23 16:10:23 +08:00
return 0 ;
2024-10-22 19:04:25 +08:00
}
void mssleep ( unsigned long microseconds ) {
struct timespec req ;
struct timespec rem ;
req . tv_sec = microseconds / 1000000 ;
req . tv_nsec = ( microseconds % 1000000 ) * 1000 ;
nanosleep ( & req , & rem ) ;
}
std : : string GetCurrentTime ( ) {
struct tm nowtime ;
struct timeval tv ;
char time_now [ 128 ] ;
gettimeofday ( & tv , NULL ) ;
localtime_r ( & tv . tv_sec , & nowtime ) ;
sprintf ( time_now , " %d-%d-%d %d:%d:%d.%03d " , nowtime . tm_year + 1900 , nowtime . tm_mon + 1 , nowtime . tm_mday , nowtime . tm_hour , nowtime . tm_min , nowtime . tm_sec , ( int ) ( tv . tv_usec / 1000 ) ) ;
std : : string strtime_now = std : : string ( ( char * ) time_now ) ;
return strtime_now ;
}
tm * get_current_date ( ) {
time_t t = time ( NULL ) ;
struct tm * tm_info = localtime ( & t ) ;
int iyear = 0 ;
int imonth = 0 ;
int day = 0 ;
iyear = tm_info - > tm_year + 1900 ;
imonth = tm_info - > tm_mon + 1 ;
day = tm_info - > tm_mday ;
2024-10-23 16:10:23 +08:00
zlog_info ( zct , " year = %d,month = %d,day = %d " , iyear , imonth , day ) ;
2024-10-22 19:04:25 +08:00
return tm_info ;
}
int system_custom ( const char * cmd , char * buf ) {
FILE * fp ;
int res ;
char temp [ 1024 ] = { 0 } ;
if ( cmd = = NULL ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " cmd is NULL " ) ;
2024-10-22 19:04:25 +08:00
return - 1 ;
}
if ( ( fp = popen ( cmd , " r " ) ) = = NULL ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " popen error " ) ;
2024-10-22 19:04:25 +08:00
return - 1 ;
} else {
buf [ 0 ] = ' \0 ' ;
while ( fgets ( temp , sizeof ( temp ) , fp ) ) {
strcat ( buf , temp ) ;
}
res = pclose ( fp ) ;
}
char * p ;
int pos = 0 ;
p = strstr ( buf , " \n " ) ;
if ( p ! = NULL ) {
pos = p - buf ;
buf [ pos ] = ' \0 ' ;
}
return res ;
}
void GetTimeNet ( char * timebuf , int type ) {
struct timeval tv ;
gettimeofday ( & tv , NULL ) ;
int millisecond = tv . tv_usec / 1000 ;
if ( type = = 0 ) {
sprintf ( timebuf , " %ld%03d " , tv . tv_sec , millisecond ) ;
} else {
sprintf ( timebuf , " %ld " , tv . tv_sec ) ;
}
}
std : : string GetRTC ( char * timestamp , int & millisecond ) {
time_t rtc_timestamp ;
struct tm tm ;
struct timespec ts ;
char rtcTime [ 100 ] = { 0x00 } ;
int fd = open ( " /dev/rtc0 " , O_RDONLY ) ;
if ( fd < 0 ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " fail to open /dev/rtc0 " ) ;
return " " ;
}
struct rtc_time rtc_tm ;
if ( ioctl ( fd , RTC_RD_TIME , & rtc_tm ) < 0 ) {
zlog_error ( zct , " fail to ioctl RTC_RD_TIME " ) ;
return " " ;
}
clock_gettime ( CLOCK_REALTIME , & ts ) ;
millisecond = ( int ) ( ts . tv_nsec / 1000000 ) ;
printf ( " RTC date/time is %d-%d-%d, %02d:%02d:%02d \n " , rtc_tm . tm_year + 1900 , rtc_tm . tm_mon + 1 , rtc_tm . tm_mday , rtc_tm . tm_hour , rtc_tm . tm_min , rtc_tm . tm_sec ) ;
sprintf ( rtcTime , " %d-%d-%d, %02d:%02d:%02d " , rtc_tm . tm_year + 1900 , rtc_tm . tm_mon + 1 , rtc_tm . tm_mday , rtc_tm . tm_hour , rtc_tm . tm_min , rtc_tm . tm_sec ) ;
2024-11-09 16:15:39 +08:00
// 闂備浇<E58299> ?<3F> х 换鎰崲閹版澘鏋侀柛<E4BE80> ?<3F> 囧发_time缂傚倸鍊搁崐鐑芥倿閿曞倸绠板┑鐘崇閸婂灚銇勯弽銊р 姇濠殿垱鎸抽弻鐔煎<E99094> ?<3F> 閹板灚缍堢紓浣风贰閸o 綁<EFBD8F> ??婚悢鐑樺珰闁斥晛鍟扮粣鏃堟煟閻樺啿濮夐柛鏂跨┘me_t闂傚倷绀侀幖<E4BE80> ?<3F> ﹀<EFBFBD> ?椤愶附鍋夐柣鎾冲濞戙垹閿ゆ俊銈傚亾缂佺媴缍侀弻銊╂偆閸屾稑<E5B1BE> ?<3F> <>
2024-10-23 16:10:23 +08:00
tm . tm_year = rtc_tm . tm_year ;
tm . tm_mon = rtc_tm . tm_mon ;
tm . tm_mday = rtc_tm . tm_mday ;
tm . tm_hour = rtc_tm . tm_hour ;
tm . tm_min = rtc_tm . tm_min ;
tm . tm_sec = rtc_tm . tm_sec ;
2024-11-09 16:15:39 +08:00
tm . tm_isdst = - 1 ; // 婵犵數鍋為崹<E782BA> ?曞<> ?<3F> 閸濄儳<E6BF84> ?撻柧蹇e 亞缁犻箖鏌涢妷<E6B6A2> ?<3F> 煎<EFBFBD> ?闁<> ?<3F> 鍔戦弻鏇熺<E98F87> ?<3F> 閸喖<EE9F91> ?跺┑鈥冲级閸庢娊婀侀梺缁橈供閸犳牠鍩<E789A0> ?椤掍胶澧い顏勫暣閺佹捇鏁撻敓锟<E69593> ?
2024-10-23 16:10:23 +08:00
rtc_timestamp = mktime ( & tm ) ;
if ( rtc_timestamp = = - 1 ) {
zlog_error ( zct , " fail to mktime " ) ;
return " " ;
2024-10-22 19:04:25 +08:00
}
2024-10-23 16:10:23 +08:00
printf ( " RTC timestamp is %ld,millisecond = %d \n " , rtc_timestamp , millisecond ) ;
sprintf ( timestamp , " %ld " , rtc_timestamp ) ;
2024-10-22 19:04:25 +08:00
close ( fd ) ;
return std : : string ( rtcTime ) ;
}
std : : string ReadStrByOpt ( std : : string filename , std : : string config , std : : string option ) {
boost : : mutex : : scoped_lock lock ( s_config_mu ) ;
Json : : Value root ;
Json : : Reader reader ;
std : : string value ;
std : : fstream is ;
is . open ( filename . c_str ( ) , std : : ios : : in ) ;
if ( reader . parse ( is , root ) ) {
value = root [ config ] [ " option " ] [ option ] . asString ( ) ;
}
is . close ( ) ;
return value ;
}
std : : vector < DataNodeUpdate > ReadStrUpdate ( std : : string filename ) {
boost : : mutex : : scoped_lock lock ( s_config_mu ) ;
Json : : Value root , hwVersion ;
Json : : Reader reader ;
std : : vector < std : : string > value ;
std : : vector < DataNodeUpdate > vecDataNodeUpdate ;
DataNodeUpdate datanodeUpdate ;
std : : fstream is ;
is . open ( filename . c_str ( ) , std : : ios : : in ) ;
if ( reader . parse ( is , root ) ) {
2024-10-23 16:10:23 +08:00
zlog_info ( zbt , " root = %d " , root . size ( ) ) ;
2024-10-24 16:01:21 +08:00
for ( size_t i = 0 ; i < root . size ( ) ; i + + ) {
2024-10-22 19:04:25 +08:00
hwVersion = root [ i ] [ " hw_vesion " ] ;
2024-10-24 16:01:21 +08:00
for ( size_t j = 0 ; j < hwVersion . size ( ) ; j + + ) {
datanodeUpdate . hwVersion . push_back ( hwVersion [ j ] . asString ( ) ) ;
2024-10-22 19:04:25 +08:00
}
datanodeUpdate . strUpdataFileName = root [ i ] [ " fw_name " ] . asString ( ) ;
datanodeUpdate . strSoftVersion = root [ i ] [ " sf_vesion " ] . asString ( ) ;
2024-10-23 16:10:23 +08:00
zlog_info ( zbt , " strUpdataFileName = %s, strSoftVersion = %s " , datanodeUpdate . strUpdataFileName . c_str ( ) , datanodeUpdate . strSoftVersion . c_str ( ) ) ;
2024-10-22 19:04:25 +08:00
vecDataNodeUpdate . push_back ( datanodeUpdate ) ;
}
}
is . close ( ) ;
return vecDataNodeUpdate ;
}
void ReadStrConfig ( std : : string filename ) {
Json : : Value root , gateWay , dataNode ;
std : : fstream is ;
Json : : Reader reader ;
is . open ( filename . c_str ( ) , std : : ios : : in ) ;
2024-10-24 16:01:21 +08:00
std : : string zigbeeChannel ;
2024-10-23 16:10:23 +08:00
if ( reader . parse ( is , root ) = = 0 ) {
zlog_error ( zbt , " fail to parse file:%s " , filename . c_str ( ) ) ;
return ;
}
gateWay = root [ " gateWay " ] ;
dataNode = root [ " dataNodeArray " ] ;
zlog_info ( zbt , " dataNode = %d " , dataNode . size ( ) ) ;
2024-10-24 16:01:21 +08:00
for ( size_t i = 0 ; i < dataNode . size ( ) ; i + + ) {
2024-10-23 16:10:23 +08:00
std : : string softVersion = dataNode [ i ] [ " softVersion " ] . asString ( ) ;
std : : string bpNo = dataNode [ i ] [ " bpNo " ] . asString ( ) ;
std : : string wakeupTime = dataNode [ i ] [ " wakeupTime " ] . asString ( ) ;
int viff = dataNode [ i ] [ " viff " ] . asInt ( ) ;
std : : string StaticTime = dataNode [ i ] [ " StaticTime " ] . asString ( ) ;
int configFlag = dataNode [ i ] [ " configFlag " ] . asInt ( ) ;
int rangeValue = dataNode [ i ] [ " range " ] . asInt ( ) ;
int updateValue = dataNode [ i ] [ " update " ] . asInt ( ) ;
std : : string zigbeeLongAddr = dataNode [ i ] [ " zigbeeLongAddr " ] . asString ( ) ;
int accFlag = dataNode [ i ] [ " accFlag " ] . asInt ( ) ;
int temTopFlag = dataNode [ i ] [ " temTopFlag " ] . asInt ( ) ;
std : : string startBrands = dataNode [ i ] [ " startBrands " ] . asString ( ) ;
int waveInterVal = dataNode [ i ] [ " waveInterVal " ] . asInt ( ) ;
std : : string zigbeePanId = dataNode [ i ] [ " zigbeePanId " ] . asString ( ) ;
int waveTime = dataNode [ i ] [ " waveTime " ] . asInt ( ) ;
int zigbeePower = dataNode [ i ] [ " zigbeePower " ] . asInt ( ) ;
int zigbeeRetry = dataNode [ i ] [ " zigbeeRetry " ] . asInt ( ) ;
std : : string stopBrands = dataNode [ i ] [ " stopBrands " ] . asString ( ) ;
int featureInterVal = dataNode [ i ] [ " featureInterVal " ] . asInt ( ) ;
int zigbeeFlag = dataNode [ i ] [ " zigbeeFlag " ] . asInt ( ) ;
std : : string zigbeeDesAddr = dataNode [ i ] [ " zigbeeDesAddr " ] . asString ( ) ;
int ZigbeeRetryGap = dataNode [ i ] [ " zigbeeRetryGap " ] . asInt ( ) ;
std : : string dataNodeNo = dataNode [ i ] [ " dataNodeNo " ] . asString ( ) ;
int initFlag = dataNode [ i ] [ " initFlag " ] . asInt ( ) ;
std : : string faultFrequency = dataNode [ i ] [ " faultFrequency " ] . asString ( ) ;
int temBotFlag = dataNode [ i ] [ " temBotFlag " ] . asInt ( ) ;
std : : string bateryV = dataNode [ i ] [ " bateryV " ] . asString ( ) ;
int ACCSampleTime = dataNode [ i ] [ " ACCSampleTime " ] . asInt ( ) ;
std : : string firstPowerTime = dataNode [ i ] [ " firstPowerTime " ] . asString ( ) ;
std : : string serialNo = dataNode [ i ] [ " serialNo " ] . asString ( ) ;
std : : string zigbeeAddr = dataNode [ i ] [ " zigbeeAddr " ] . asString ( ) ;
std : : string productNo = dataNode [ i ] [ " productNo " ] . asString ( ) ;
std : : string timeStamp = dataNode [ i ] [ " timeStamp " ] . asString ( ) ;
zigbeeChannel = dataNode [ i ] [ " zigbeeChannel " ] . asString ( ) ;
int RSSI = dataNode [ i ] [ " RSSI " ] . asInt ( ) ;
std : : string hardVersion = dataNode [ i ] [ " hardVersion " ] . asString ( ) ;
std : : string envelopeBandPass = dataNode [ i ] [ " envelopeBandPass " ] . asString ( ) ;
int samplingRate = dataNode [ i ] [ " samplingRate " ] . asInt ( ) ;
std : : string dataNodeName = dataNode [ i ] [ " dataNodeName " ] . asString ( ) ;
int status = dataNode [ i ] [ " status " ] . asInt ( ) ;
int EquipSta = dataNode [ i ] [ " equipSta " ] . asInt ( ) ;
char insertSql [ 1024 ] = { 0 } ;
char whereCon [ 100 ] = { 0x00 } ;
sprintf ( whereCon , " dataNodeNo = '%s' " , dataNodeNo . c_str ( ) ) ;
int rows = sqlite_db_ctrl : : instance ( ) . GetTableRows ( T_SENSOR_INFO ( TNAME ) , whereCon ) ;
if ( rows > 0 ) continue ;
sprintf ( insertSql , " '%s','%s','%d','%d','%d','%d','%d','%d', \
' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % d ' , \
' % d ' , ' % d ' , ' % d ' , ' % s ' , ' % d ' , ' % s ' , \
' % s ' , ' % d ' , ' % d ' , ' % d ' , ' % s ' , ' % d ' , ' % s ' , ' % s ' , \
' % s ' , ' % d ' , ' % s ' , ' % s ' , ' % s ' , \
' % d ' , ' % d ' , ' % d ' , ' % d ' , ' % d ' , ' % s ' , ' % d ' , ' % d ' , ' % d ' , ' 0 ' , ' 0 , 0 ' " ,
dataNodeNo . c_str ( ) , dataNodeName . c_str ( ) , initFlag , accFlag , zigbeeFlag , temTopFlag , temBotFlag , EquipSta , hardVersion . c_str ( ) , softVersion . c_str ( ) , bpNo . c_str ( ) , serialNo . c_str ( ) , firstPowerTime . c_str ( ) , atoi ( wakeupTime . c_str ( ) ) , atoi ( StaticTime . c_str ( ) ) ,
waveTime , atoi ( bateryV . c_str ( ) ) , productNo . c_str ( ) , configFlag , startBrands . c_str ( ) , stopBrands . c_str ( ) , featureInterVal , waveInterVal , samplingRate , " " , rangeValue , envelopeBandPass . c_str ( ) , faultFrequency . c_str ( ) , zigbeePanId . c_str ( ) ,
atoi ( zigbeeChannel . c_str ( ) ) , zigbeeAddr . c_str ( ) , zigbeeLongAddr . c_str ( ) , zigbeeDesAddr . c_str ( ) , zigbeePower , zigbeeRetry , ZigbeeRetryGap , ACCSampleTime , status , timeStamp . c_str ( ) , viff , RSSI , updateValue ) ;
2024-10-25 18:45:26 +08:00
int res = sqlite_db_ctrl : : instance ( ) . InsertData ( T_SENSOR_INFO ( TNAME ) , insertSql ) ;
if ( res ! = 0 )
{
zlog_error ( zbt , " res:%d " , res ) ;
}
2024-10-22 19:04:25 +08:00
}
2024-10-23 16:10:23 +08:00
2024-10-22 19:04:25 +08:00
is . close ( ) ;
}
void ImportConfig ( std : : string filename ) {
Json : : Value root , gateWay , dataNode ;
std : : fstream is ;
Json : : Reader reader ;
2024-10-25 18:45:26 +08:00
int res = 0 ;
2024-10-22 19:04:25 +08:00
is . open ( filename . c_str ( ) , std : : ios : : in ) ;
2024-10-23 16:10:23 +08:00
if ( ! is . is_open ( ) ) {
zlog_error ( zbt , " fail to open:%s " , filename . c_str ( ) ) ;
return ;
}
2024-10-22 19:04:25 +08:00
2024-10-23 16:10:23 +08:00
if ( reader . parse ( is , root ) = = 0 ) {
zlog_error ( zbt , " fail to parse:%s " , filename . c_str ( ) ) ;
return ;
2024-10-22 19:04:25 +08:00
}
2024-10-23 16:10:23 +08:00
std : : string zigbeeChannel ;
Json : : Value jsSystemSetting , jsonValnet , jsonValnet1 , jsSystemInfo , jsonValZigbee , jsondataNodeArray ;
jsSystemInfo = root [ " SystemInfo " ] ;
jsonValZigbee = root [ " zigbee " ] ;
jsonValnet1 = root [ " eth1 " ] ;
jsonValnet = root [ " eth0 " ] ;
jsSystemSetting = root [ " ServerConfig " ] ;
jsondataNodeArray = root [ " dataNodeArray " ] ;
char insertSql [ 1024 ] = { 0 } ;
2024-10-24 16:01:21 +08:00
for ( size_t i = 0 ; i < jsondataNodeArray . size ( ) ; i + + ) {
2024-10-23 16:10:23 +08:00
Json : : Value valNode = jsondataNodeArray [ i ] ;
std : : vector < std : : string > vecDataNode ;
for ( size_t j = 0 ; j < valNode . size ( ) ; j + + ) {
2024-10-24 16:01:21 +08:00
vecDataNode . push_back ( std : : string ( valNode [ j ] . asString ( ) ) ) ;
2024-10-23 16:10:23 +08:00
}
char dataNodeName [ 100 ] = { 0x00 } ;
hexToAscii ( vecDataNode [ 1 ] . c_str ( ) , dataNodeName ) ;
memset ( insertSql , 0 , 1024 ) ;
sprintf ( insertSql , " '%s','%s','%s','%s','%s','%s','%s','%s', \
' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' , \
' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' , \
' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' , \
' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' , \
' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' , ' % s ' " ,
vecDataNode [ 0 ] . c_str ( ) , dataNodeName , vecDataNode [ 2 ] . c_str ( ) , vecDataNode [ 3 ] . c_str ( ) ,
vecDataNode [ 4 ] . c_str ( ) , vecDataNode [ 5 ] . c_str ( ) , vecDataNode [ 6 ] . c_str ( ) ,
vecDataNode [ 7 ] . c_str ( ) , vecDataNode [ 8 ] . c_str ( ) , vecDataNode [ 9 ] . c_str ( ) , vecDataNode [ 10 ] . c_str ( ) ,
vecDataNode [ 11 ] . c_str ( ) , vecDataNode [ 12 ] . c_str ( ) , vecDataNode [ 13 ] . c_str ( ) , vecDataNode [ 14 ] . c_str ( ) ,
vecDataNode [ 15 ] . c_str ( ) , vecDataNode [ 16 ] . c_str ( ) , vecDataNode [ 17 ] . c_str ( ) , vecDataNode [ 18 ] . c_str ( ) ,
vecDataNode [ 19 ] . c_str ( ) , vecDataNode [ 20 ] . c_str ( ) ,
vecDataNode [ 21 ] . c_str ( ) , vecDataNode [ 22 ] . c_str ( ) , vecDataNode [ 23 ] . c_str ( ) , vecDataNode [ 24 ] . c_str ( ) ,
vecDataNode [ 25 ] . c_str ( ) , vecDataNode [ 26 ] . c_str ( ) , vecDataNode [ 27 ] . c_str ( ) , vecDataNode [ 28 ] . c_str ( ) ,
vecDataNode [ 29 ] . c_str ( ) , vecDataNode [ 30 ] . c_str ( ) ,
vecDataNode [ 31 ] . c_str ( ) , vecDataNode [ 32 ] . c_str ( ) , vecDataNode [ 33 ] . c_str ( ) , vecDataNode [ 34 ] . c_str ( ) ,
vecDataNode [ 35 ] . c_str ( ) , vecDataNode [ 36 ] . c_str ( ) , vecDataNode [ 37 ] . c_str ( ) , vecDataNode [ 38 ] . c_str ( ) ,
vecDataNode [ 39 ] . c_str ( ) , vecDataNode [ 40 ] . c_str ( ) ,
vecDataNode [ 41 ] . c_str ( ) , vecDataNode [ 42 ] . c_str ( ) , vecDataNode [ 43 ] . c_str ( ) , vecDataNode [ 44 ] . c_str ( ) ) ;
2024-10-25 18:45:26 +08:00
res = sqlite_db_ctrl : : instance ( ) . InsertData ( T_SENSOR_INFO ( TNAME ) , insertSql ) ;
if ( res ! = 0 ) {
zlog_error ( zbt , " res:%d " , res ) ;
}
2024-10-23 16:10:23 +08:00
}
WriteStr2Config ( SERVERCONFIG , " Server " , " localServerIpAddress " , jsSystemSetting [ " ServerIpAddress " ] . asString ( ) ) ;
WriteStr2Config ( SERVERCONFIG , " Server " , " localServerPort " , jsSystemSetting [ " ServerPort " ] . asString ( ) ) ;
WriteStr2Config ( SERVERCONFIG , " Server " , " CommMode " , " 2 " ) ;
WriteStr2Config ( SERVERCONFIG , " Server " , " UserName " , jsSystemSetting [ " UserName " ] . asString ( ) ) ;
WriteStr2Config ( SERVERCONFIG , " Server " , " Password " , jsSystemSetting [ " Password " ] . asString ( ) ) ;
WriteStr2Config ( SERVERCONFIG , " Server " , " APN " , jsSystemSetting [ " APN " ] . asString ( ) ) ;
char APN [ 100 ] = { 0x00 } ;
std : : string apn = jsSystemSetting [ " APN " ] . asString ( ) ;
sprintf ( APN , " sed -i '15c \t \t \t \t /opt/quectel-CM/quectel-CM -s %s > /dev/null &' /etc/init.d/S95check5G " , apn . c_str ( ) ) ;
system ( APN ) ;
WriteStr2Config ( ZIGBEECONFIG , " Zigbee " , " channel " , jsonValZigbee [ " channel " ] . asString ( ) ) ;
WriteStr2Config ( ZIGBEECONFIG , " Zigbee " , " PanID " , jsonValZigbee [ " PanID " ] . asString ( ) ) ;
WriteStr2Config ( SYSTEMINFOFILE , " Version " , " GateWayVersion " , jsSystemInfo [ " GateWayVersion " ] . asString ( ) ) ;
WriteStr2Config ( SYSTEMINFOFILE , " Version " , " SystemVersion " , jsSystemInfo [ " SystemVersion " ] . asString ( ) ) ;
WriteStr2Config ( SYSTEMINFOFILE , " Version " , " WebVersion " , jsSystemInfo [ " WebVersion " ] . asString ( ) ) ;
WriteStr2Config ( SYSTEMINFOFILE , " Version " , " GateWayHwVesion " , jsSystemInfo [ " GateWayHwVesion " ] . asString ( ) ) ;
WriteStr2Config ( SYSTEMINFOFILE , " Version " , " GateWayProduct " , jsSystemInfo [ " GateWayProduct " ] . asString ( ) ) ;
2024-10-22 19:04:25 +08:00
}
2024-10-23 16:10:23 +08:00
2024-10-22 19:04:25 +08:00
int UpdataDataNodeConfig ( std : : string filename ) {
2024-11-09 16:15:39 +08:00
std : : vector < DataNodeInfo > vecDataNode ; //婵犵數濮伴崹鐟帮耿鏉堛劍娅犳俊銈傚亾閸<E4BABE> ?<3F> 亶鏌熺<E98F8C> ?电ǹ浠ч柍缁樻閺屽秷顧侀柛鎾存皑缁瑦<EE86BD> ?<3F> 勯幇鍨櫆闂佸憡娲﹂崢浠<E5B4A2> ??箟閼姐倗纾藉ù锝<C3B9> ?嚃濞<E59A83> ?絿绱撻崒娑欑殤闁硅弓鍗冲畷鍗炩<E98D97> ?<3F> 濡晝鏇㈡⒑绾懏褰х 紒鐘冲灥閳诲秹鏁撻敓锟<E69593> ?
//婵犵數鍋涢顓熸叏娴兼潙纾块柟缁㈠櫘閺佸霉閸忓吋缍戠紒鈧崒鐐寸厪濠㈣埖鐩顕€鏌i 幘瀵告<E780B5> ?闁逞屽<E9809E> ?椤旀牠宕伴弽顐e 床闁瑰鍋炲▍鐘绘煥閺囨浜惧銈嗘穿缂嶄線宕洪埀顒併亜閹烘垵顏╂俊<E29582> ?<3F> o 耿閺屾盯濡烽鐐<EE949B> ?<3F> ?嶅銈嗗姧閹凤拷
2024-10-24 16:01:21 +08:00
std : : ifstream csv_data ( filename , std : : ios : : in ) ;
2024-10-22 19:04:25 +08:00
int iRet = 0 ;
if ( ! csv_data . is_open ( ) ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zbt , " UpdataDataNodeConfig fail to open:%s " , filename . c_str ( ) ) ;
2024-10-22 19:04:25 +08:00
return - 1 ;
2024-10-23 16:10:23 +08:00
}
std : : string line ;
2024-11-09 16:15:39 +08:00
std : : vector < std : : string > words ; //婵犵數濮伴崹鐟帮耿鏉堛劍娅犳俊銈傚亾閸<E4BABE> ?<3F> 亶鏌熺<E98F8C> ?电ǹ浠ч柍缁樻閺屽秷顧侀柛鎾存皑缁瑦<EE86BD> ?<3F> 勯幇鍨櫆闂佸憡娲﹂崢浠<E5B4A2> ??箟閼姐倗纾藉ù锝<C3B9> ?嚃濞<E59A83> ?絿绱撻崒娑欑殤闁硅弓鍗冲畷鍗炩<E98D97> ?<3F> 濡晝鏇㈡⒑绾懏褰х 紒鐘冲灥閳诲秹鏁撻敓锟<E69593> ?
2024-10-23 16:10:23 +08:00
std : : string word ;
DataNodeInfo dataNode ;
2024-11-09 16:15:39 +08:00
// ------------闂備浇宕<E6B587> ?慨鏉懨洪埡鍜佹晪鐟滄垿濡甸幇鏉跨倞<E8B7A8> ?<3F> ゆ巻鍋撻柡瀣╃窔閺岋絽螖閳ь剟鎮ч崱娆戠焾闁跨噦鎷<E599A6> ?-----------------
// 闂備浇宕<E6B587> ?慨鏉懨洪埡鍜佹晪鐟滄垿濡甸幇鏉跨倞<E8B7A8> ?<3F> ゆ巻鍋撻柛鎰ㄥ亾闂備焦<E58299> ?堕崕娲礈閿曞倸姹叉い鏍仦閸<E4BBA6> ?姵绻涢幋锝嗙彧閻庢熬鎷<E786AC>
2024-10-23 16:10:23 +08:00
getline ( csv_data , line ) ;
std : : istringstream sin ;
2024-11-09 16:15:39 +08:00
// 闂傚倷绀佸﹢杈ㄧ仚濡<E4BB9A> ?倧闄<E580A7> ?繛濠<E7B99B> ?Υ 娓氣偓<E6B0A3> ?<3F> 炲鎮╅崘鑼酱闂佽崵<E4BDBD> ?村ú锕併亹閸愵亜绶ら柛褎顨嗛悡娑樏归敐鍛儓<EE86BD> ?<3F> わ綀鍋愰埀顒冾潐閹碱偊骞忛敓锟<E69593> ?
2024-10-23 16:10:23 +08:00
while ( getline ( csv_data , line ) ) {
words . clear ( ) ;
sin . clear ( ) ;
sin . str ( line ) ;
while ( getline ( sin , word , ' , ' ) ) {
words . push_back ( word ) ;
}
std : : string mac = words [ 1 ] ;
if ( mac ! = GlobalConfig : : MacAddr_G ) {
iRet = - 2 ;
break ;
}
dataNode . ZigbeeLongAddr = words [ 7 ] ;
dataNode . FeatureInterVal = atoi ( words [ 16 ] . c_str ( ) ) ;
dataNode . WaveInterVal = atoi ( words [ 17 ] . c_str ( ) ) ;
dataNode . SamplingRate = atoi ( words [ 18 ] . c_str ( ) ) ;
2024-10-24 16:01:21 +08:00
if ( words [ 19 ] . find ( " 8g " ) ! = std : : string : : npos ) {
2024-10-23 16:10:23 +08:00
dataNode . Range = 0 ;
2024-10-24 16:01:21 +08:00
} else if ( words [ 19 ] . find ( " 16g " ) ! = std : : string : : npos ) {
2024-10-23 16:10:23 +08:00
dataNode . Range = 1 ;
2024-10-24 16:01:21 +08:00
} else if ( words [ 19 ] . find ( " 32g " ) ! = std : : string : : npos ) {
2024-10-23 16:10:23 +08:00
dataNode . Range = 2 ;
2024-10-24 16:01:21 +08:00
} else if ( words [ 19 ] . find ( " 64g " ) ! = std : : string : : npos ) {
2024-10-23 16:10:23 +08:00
dataNode . Range = 3 ;
2024-10-24 16:01:21 +08:00
} else if ( words [ 19 ] . find ( " 50g " ) ! = std : : string : : npos ) {
2024-10-23 16:10:23 +08:00
dataNode . Range = 0 ;
2024-10-22 19:04:25 +08:00
}
2024-10-23 16:10:23 +08:00
dataNode . ACCSampleTime = atoi ( words [ 20 ] . c_str ( ) ) ;
dataNode . VIntegralFilterFrequency = atoi ( words [ 21 ] . c_str ( ) ) ;
dataNode . ZigbeePower = atoi ( words [ 22 ] . c_str ( ) ) ;
dataNode . ZigbeeRetry = atoi ( words [ 23 ] . c_str ( ) ) ;
int update = atoi ( words [ 24 ] . c_str ( ) ) ;
if ( update = = 1 ) vecDataNode . push_back ( dataNode ) ;
}
csv_data . close ( ) ;
if ( vecDataNode . size ( ) = = 0 ) {
iRet = - 3 ;
zlog_error ( zbt , " UpdataDataNodeConfig vecDataNode is 0 " ) ;
return iRet ;
}
2024-10-22 19:04:25 +08:00
char whereCon [ 1024 ] = { 0 } ;
2024-10-23 16:10:23 +08:00
char updateSql [ 1024 ] = { 0 } ;
2024-10-24 16:01:21 +08:00
for ( size_t i = 0 ; i < vecDataNode . size ( ) ; i + + ) {
2025-01-25 16:55:06 +08:00
sprintf ( updateSql , " range='%d',samplingRate='%d',AccSampleTime = '%d',viff ='%d' ,ZigbeePower = '%d',ZigbeeRetry = '%d',UpdateFlag = 0 " , vecDataNode [ i ] . Range ,
2024-10-23 16:10:23 +08:00
vecDataNode [ i ] . SamplingRate , vecDataNode [ i ] . ACCSampleTime , vecDataNode [ i ] . VIntegralFilterFrequency , vecDataNode [ i ] . ZigbeePower , vecDataNode [ i ] . ZigbeeRetry ) ;
sprintf ( whereCon , " dataNodeNo='%s' " , vecDataNode [ i ] . ZigbeeLongAddr . c_str ( ) ) ;
iRet = sqlite_db_ctrl : : instance ( ) . UpdateTableData ( T_SENSOR_INFO ( TNAME ) , updateSql , whereCon ) ;
if ( iRet ! = 0 ) {
zlog_error ( zbt , " UpdataDataNodeConfig UpdateTableData fail " ) ;
return - 4 ;
2024-10-22 19:04:25 +08:00
}
2024-10-23 16:10:23 +08:00
memset ( whereCon , 0x00 , sizeof ( whereCon ) ) ;
memset ( updateSql , 0x00 , sizeof ( updateSql ) ) ;
}
iRet = vecDataNode . size ( ) ;
2024-10-22 19:04:25 +08:00
return iRet ;
}
int WriteStr2Config ( std : : string filename , std : : string config , std : : string option , std : : string value , bool listable ) {
boost : : mutex : : scoped_lock lock ( s_config_mu ) ;
Json : : Value root ;
Json : : Value subroot ;
Json : : Value list ;
Json : : Value op ;
Json : : Reader reader ;
std : : fstream is ;
is . open ( filename . c_str ( ) , std : : ios : : in ) ;
2024-10-23 16:10:23 +08:00
if ( ! is . is_open ( ) ) {
zlog_error ( zct , " fail to open: %s " , filename . c_str ( ) ) ;
return 1 ;
2024-10-22 19:04:25 +08:00
}
2024-10-23 16:10:23 +08:00
if ( reader . parse ( is , root ) = = 0 ) {
zlog_error ( zct , " fail to parse: %s " , filename . c_str ( ) ) ;
return 2 ;
}
subroot = root [ config ] ;
if ( listable ) {
list = root [ config ] [ " list " ] ;
} else {
op = root [ config ] [ " option " ] ;
}
2024-10-22 19:04:25 +08:00
is . close ( ) ;
if ( listable ) {
list [ option ] . append ( Json : : Value ( value ) ) ;
subroot [ " list " ] = list ;
} else {
op [ option ] = Json : : Value ( value ) ;
subroot [ " option " ] = op ;
}
root [ config ] = subroot ;
Json : : StyledWriter sw ;
std : : ofstream os ;
os . open ( filename . c_str ( ) ) ;
os < < sw . write ( root ) ;
os . close ( ) ;
return 0 ;
}
std : : string GetLocalMac ( const char * net ) {
int sock_mac ;
struct ifreq ifr_mac ;
char mac_addr [ 30 ] ;
sock_mac = socket ( AF_INET , SOCK_STREAM , 0 ) ;
if ( sock_mac = = - 1 ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " [GetLocalMac] fail to create socket " ) ;
2024-10-22 19:04:25 +08:00
return " " ;
}
memset ( & ifr_mac , 0 , sizeof ( ifr_mac ) ) ;
strncpy ( ifr_mac . ifr_name , net , sizeof ( ifr_mac . ifr_name ) - 1 ) ;
if ( ( ioctl ( sock_mac , SIOCGIFHWADDR , & ifr_mac ) ) < 0 ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " mac ioctl error " ) ;
2024-10-22 19:04:25 +08:00
return " " ;
}
sprintf ( mac_addr , " %02x%02x%02x%02x%02x%02x " , ( unsigned char ) ifr_mac . ifr_hwaddr . sa_data [ 0 ] , ( unsigned char ) ifr_mac . ifr_hwaddr . sa_data [ 1 ] , ( unsigned char ) ifr_mac . ifr_hwaddr . sa_data [ 2 ] , ( unsigned char ) ifr_mac . ifr_hwaddr . sa_data [ 3 ] , ( unsigned char ) ifr_mac . ifr_hwaddr . sa_data [ 4 ] ,
( unsigned char ) ifr_mac . ifr_hwaddr . sa_data [ 5 ] ) ;
2024-10-23 16:10:23 +08:00
zlog_info ( zbt , " net :%s, local mac:%s " , net , mac_addr ) ;
2024-10-22 19:04:25 +08:00
close ( sock_mac ) ;
return std : : string ( mac_addr ) ;
}
std : : string GetGwIp_ ( const char * eth_name ) {
int sockfd ;
char gwip_ [ 16 ] = { 0 } ;
if ( - 1 = = ( sockfd = socket ( PF_INET , SOCK_STREAM , 0 ) ) ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " [GetGwIp_] fail to create socket " ) ;
2024-10-22 19:04:25 +08:00
return " " ;
}
struct ifreq req ;
struct sockaddr_in * host ;
bzero ( & req , sizeof ( struct ifreq ) ) ;
strcpy ( req . ifr_name , eth_name ) ;
ioctl ( sockfd , SIOCGIFADDR , & req ) ;
host = ( struct sockaddr_in * ) & req . ifr_addr ;
close ( sockfd ) ;
if ( host ) {
strcpy ( gwip_ , inet_ntoa ( host - > sin_addr ) ) ;
}
return std : : string ( gwip_ ) ;
}
std : : string IpAddrInit ( ) {
const char * WLAN2 = " wlan2 " ;
const char * WLAN0 = " wlan0 " ;
const char * ETH0 = " eth0 " ;
const char * USB0 = " usb0 " ;
const char * WWAN0 = " wwan0 " ;
const char * ETH1 = " eth1 " ;
const char * ETH2 = " eth2 " ;
std : : string strip = " " ;
strip = GetGwIp_ ( WLAN0 ) ;
if ( strip . compare ( " 0.0.0.0 " ) ! = 0 ) {
2024-11-08 16:55:14 +08:00
//zlog_info(zct, "[IpAddrInit] wlan0: %s", strip.c_str());
2024-10-22 19:04:25 +08:00
return strip ;
}
strip = GetGwIp_ ( WLAN2 ) ;
if ( strip . compare ( " 0.0.0.0 " ) ! = 0 ) {
2024-11-08 16:55:14 +08:00
//zlog_info(zct, "[IpAddrInit] wlan2: %s", strip.c_str());
2024-10-22 19:04:25 +08:00
return strip ;
}
strip = GetGwIp_ ( ETH1 ) ;
if ( strip . compare ( " 0.0.0.0 " ) ! = 0 & & strip . compare ( " 192.168.188.188 " ) ! = 0 ) {
2024-11-08 16:55:14 +08:00
//zlog_info(zct, "[IpAddrInit] eth1: %s", strip.c_str());
2024-10-22 19:04:25 +08:00
return strip ;
}
strip = GetGwIp_ ( ETH2 ) ;
if ( strip . compare ( " 0.0.0.0 " ) ! = 0 & & strip . compare ( " 192.168.188.188 " ) ! = 0 ) {
2024-11-08 16:55:14 +08:00
//zlog_info(zct, "[IpAddrInit] eth2: %s", strip.c_str());
2024-10-22 19:04:25 +08:00
return strip ;
}
strip = GetGwIp_ ( ETH0 ) ;
if ( strip . compare ( " 0.0.0.0 " ) ! = 0 ) {
2024-11-08 16:55:14 +08:00
//zlog_info(zct, "[IpAddrInit] eth0: %s", strip.c_str());
2024-10-22 19:04:25 +08:00
return strip ;
}
strip = GetGwIp_ ( USB0 ) ;
if ( strip . compare ( " 0.0.0.0 " ) ! = 0 ) {
2024-11-08 16:55:14 +08:00
//zlog_info(zct, "[IpAddrInit] usb0: %s", strip.c_str());
2024-10-22 19:04:25 +08:00
return strip ;
}
strip = GetGwIp_ ( WWAN0 ) ;
if ( strip . compare ( " 0.0.0.0 " ) ! = 0 ) {
2024-11-08 16:55:14 +08:00
//zlog_info(zct, "[IpAddrInit] wwan0: %s", strip.c_str());
2024-10-22 19:04:25 +08:00
return strip ;
}
2024-10-23 16:10:23 +08:00
zlog_warn ( zct , " [IpAddrInit] ip: %s " , strip . c_str ( ) ) ;
return strip ;
}
2024-10-22 19:04:25 +08:00
int SetTime ( unsigned long seconds , int milliseconds ) {
struct timeval tv ;
time_t timep = ( time_t ) seconds ;
tv . tv_sec = timep ;
tv . tv_usec = milliseconds * 1000 ;
return settimeofday ( & tv , NULL ) ;
}
2024-10-23 16:10:23 +08:00
void ZoneConfig ( std : : string zoneid ) {
2024-10-22 19:04:25 +08:00
int a = 0 ;
std : : string zonelists [ ] = { " UTC+12 " , " UTC+11 " , " UTC+10 " , " UTC+9 " , " UTC+8 " , " UTC+7 " , " UTC+6 " , " UTC+5 " , " UTC+4 " , " UTC+3 " , " UTC+2 " , " UTC+1 " , " UTC+0 " , " UTC-1 " , " UTC-2 " , " UTC-3 " , " UTC-4 " , " UTC-5 " , " UTC-6 " , " UTC-7 " , " UTC-8 " , " UTC-9 " , " UTC-10 " , " UTC-11 " } ;
2024-10-24 16:01:21 +08:00
for ( size_t i = 0 ; i < sizeof ( zonelists ) ; i + + ) {
2024-10-22 19:04:25 +08:00
if ( zoneid . compare ( zonelists [ i ] ) = = 0 ) {
2024-10-23 16:10:23 +08:00
a = i ;
zlog_info ( zbt , " [ZoneConfig] zoneid:%s, a: %d " , zoneid . c_str ( ) , a ) ;
2024-10-22 19:04:25 +08:00
break ;
}
}
switch ( a ) {
case 0 : zoneid = " GMT-12 " ; break ;
case 1 : zoneid = " GMT-11 " ; break ;
case 2 : zoneid = " GMT-10 " ; break ;
case 3 : zoneid = " GMT-9 " ; break ;
case 4 : zoneid = " GMT-8 " ; break ;
case 5 : zoneid = " GMT-7 " ; break ;
case 6 : zoneid = " GMT-6 " ; break ;
case 7 : zoneid = " GMT-5 " ; break ;
case 8 : zoneid = " GMT-4 " ; break ;
case 9 : zoneid = " GMT-3 " ; break ;
case 10 : zoneid = " GMT-2 " ; break ;
case 11 : zoneid = " GMT-1 " ; break ;
case 12 : zoneid = " GMT-0 " ; break ;
case 13 : zoneid = " GMT+1 " ; break ;
case 14 : zoneid = " GMT+2 " ; break ;
case 15 : zoneid = " GMT+3 " ; break ;
case 16 : zoneid = " GMT+4 " ; break ;
case 17 : zoneid = " GMT+5 " ; break ;
case 18 : zoneid = " GMT+6 " ; break ;
case 19 : zoneid = " GMT+7 " ; break ;
case 20 : zoneid = " GMT+8 " ; break ;
case 21 : zoneid = " GMT+9 " ; break ;
case 22 : zoneid = " GMT+10 " ; break ;
case 23 : zoneid = " GMT+11 " ; break ;
}
char cmd [ 256 ] = { 0 } ;
memset ( cmd , 0 , 256 ) ;
sprintf ( cmd , " sudo ln -sf /usr/share/zoneinfo/Etc/%s /etc/localtime " , zoneid . c_str ( ) ) ;
system ( cmd ) ;
2024-10-23 16:10:23 +08:00
zlog_info ( zbt , " change timezone success! " ) ;
2024-10-22 19:04:25 +08:00
}
std : : string GetFileContent ( std : : string filename , int line ) {
std : : string strFileContent ( " " ) ;
std : : ifstream ifileOut ( filename . c_str ( ) ) ;
2024-10-23 16:10:23 +08:00
if ( ! ifileOut . is_open ( ) ) {
zlog_error ( zct , " fail to open:%s " , filename . c_str ( ) ) ;
return strFileContent ;
}
int i = 1 ;
while ( ! ifileOut . eof ( ) ) {
if ( line = = 0 ) {
std : : string strTemp ( " " ) ;
getline ( ifileOut , strTemp ) ;
strFileContent + = strTemp ;
strFileContent + = " \r \n " ;
} else {
std : : string strTemp ( " " ) ;
getline ( ifileOut , strTemp ) ;
if ( line = = i ) {
strFileContent = strTemp ;
break ;
2024-10-22 19:04:25 +08:00
}
}
2024-10-23 16:10:23 +08:00
+ + i ;
2024-10-22 19:04:25 +08:00
}
2024-10-23 16:10:23 +08:00
ifileOut . close ( ) ;
2024-10-22 19:04:25 +08:00
return strFileContent ;
}
2024-11-09 16:15:39 +08:00
// BOOST闂傚倷鑳堕崕鐢<E5B495> ?<3F> 磻閹捐绀夌€广儱顦介<E9A1A6> ?鍡<> ?<3F> 節婵犲倻澧曠紒鈧崱妯肩闁糕剝锚缁旈箖鏌嶈閸撴瑩宕姘肩劷闊洦绋戠粻<E688A0> ?<3F> 辨喐韫囨洘鍏滈柍<E6BB88> ?<3F> 鍓<EFBFBD> ?穱濠<E7A9B1> ?Χ 閸ヮ灝銏ゆ煟椤撴繄绐旈柟顖欑劍缁诲懘<E8AFB2> ?<3F> ?弴銏♀拺闂傚牃鏅犲<E78AB2> ?<3F> 界節閵忊埗<E5BF8A> ?<3F> 堚<EFBFBD> ?﹂崶顒€绀冩い鏃囧琚濋梻浣<E6A2BB> ?<3F> 閸<EE978F> ??棝宕伴幘璇参ラ柨鐕傛<E99095> ?
2024-10-22 19:04:25 +08:00
bool CheckIP ( const char * ip ) {
boost : : xpressive : : cregex reg_ip =
boost : : xpressive : : cregex : : compile ( " (25[0-4]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])[.](25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])[.](25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])[.](25[0-4]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9]) " ) ;
return boost : : xpressive : : regex_match ( ip , reg_ip ) ;
}
bool IsValidMask ( std : : string mask ) {
int iRet = - 1 ;
2024-11-09 16:15:39 +08:00
// 闂備浇<E58299> ?<3F> х 换鎰崲閹版澘绠查柛鎴︿憾<EFB8BF> ?婃椽<E5A983> ?<3F> ?埡鍛€嶅┑鐘<E99098> ?閿氭い<E6B0AD> ?<3F> 炴喘瀹曟﹢顢欓挊澶<E68C8A> ?<3F> 紦闂備胶鎳撻崥鈧悹浣<E682B9> ?叀瀹曟垿骞橀<E9AA9E> ?銉ョ<E98A89> ?闂佸憡渚楅崢娲礌閺嶎厽鈷戦柛娑橈工缁<E5B7A5> ?<3F> 帗淇婇锝庢當闁伙絿鍏樺畷鐔碱敆娴i 攱鍞<E694B1> ?<3F> 繝鐢靛仦閸ㄥ爼鏁<E788BC> ??梺缁樻尰閸ㄥ潡<E384A5> ??诲澶娢ㄩ柨鏂垮⒔閻f 儳鈹戦悙瀛<E68299> ?<3F> 稇婵☆偅绻堥悰顕€骞<E282AC> ??敃鈧~ 鍛存煃閵夈儳锛嶅ù婊愭<E5A98A> ? 闂傚倷鑳堕崑銊╁磿閼碱剙鍨濋柛<E6BF8B> ?<3F> 犲灱婵娊鏌嶉<E98F8C> ?鍕偓瑙<E58193> ?閵堝<E996B5> ?<3F> 绠鹃柟瀵镐紳椤忓牊鍋傞柟杈鹃<E69D88> ??閻撴稑霉閿濆懏鎲搁柟鐣屽█閺岋繝宕卞▎蹇旂亪闂佹悶鍔戠粻鏍极閹剧粯鏅搁柨鐕傛<E99095> ??
2024-10-22 19:04:25 +08:00
struct in_addr s ;
iRet = inet_pton ( AF_INET , mask . c_str ( ) , & s ) ;
2024-11-09 16:15:39 +08:00
// 闂備礁鎼ˇ閬嶅磿閹版澘绀堟慨姗嗗墰閺<E5A2B0> ?箓鏌$ 仦璇插姎缂佺<E7BC82> ?<3F> 缍侀弻鐔兼焽閿曗偓<E69B97> ?<3F> ь喗銇勯銈<EE9495> ?枅鐎殿喖鐖奸崺锟犲磼濞戞艾<E6889E> ??<3F> ?繝鐢靛仩椤曟粓骞忛敓锟<E69593> 1闂傚倷鐒︾€笛呯矙閹达附鍎<E99984> ?<3F> 〒<EFBFBD> ?<3F> e 亾<EFBD85> ?<3F> ゃ垺宀搁崺锟犲川椤撶偛鎸ら梺鐟板悑閻n <E996BB> ?宕归搹鍦噮闂傚倷绀侀幖<E4BE80> ?<3F> ︽偋閸℃蛋鍥ㄥ閺夋垹鏌ч梺闈涱槴閺<E6A7B4> ?粓宕曞澶<EE85BC> ??厱闁规惌鍘介惁浠<E68381> ?⒒娓氣偓濞煎<E7858E> ?<3F> 介崟<E4BB8B> ?<3F> 唵婵☆垯璀﹂悞浠<E6829E> ??煥閻曞倹瀚<E580B9>
2024-10-22 19:04:25 +08:00
if ( iRet = = 1 ) {
2024-11-09 16:15:39 +08:00
// 婵犵數鍋涢顓熸叏閺夋嚚瑙勵槹鎼达絿顦繝銏f 硾閻偐澹曢崗鑲╃瘈濠电姴鍊搁弳鐔兼煙閻e <E996BB> ?鏋涢柡灞诲€濆畷顐﹀礋椤<E7A48B> ?喎浜鹃柛褎顨呰繚闁瑰吋鐣崹娲磿閻旇偐鍙撻柛銉e <E98A89> ?<3F> 椤h 尙绱掓笟鍥ф珝闁哄瞼鍠撻幏鐘诲焺閸愵亞鐛㈤梺鑽ゅУ 閸旀宕伴幇顔剧煓濠㈣泛<E388A3> ?肩<> ?<3F> 鍏间繆椤栨繂鍚归柣銊ヮ煼閺岋絾<E5B28B> ?旈<> ?<3F> 鈶╁濡<EE9D8C> ?們鍔岄ˇ鐗堢┍婵犲浂鏁<E6B582> ?柣鏃傜節缁ㄥ<E384A5> ?<3F> 洪崨濠<E5B4A8> ?畵閻庢凹鍠氶崰濠囨晸閿燂<E996BF> ?
2024-10-22 19:04:25 +08:00
unsigned int addr = ntohl ( s . s_addr ) ;
2024-11-09 16:15:39 +08:00
// 闂備礁鎼ˇ閬嶅磿閹版澘绀堟慨姗嗗墰閺<E5A2B0> ?箓鏌涘▎蹇f Ш闁崇<E99781> ?<3F> ?<3F> ?鍫曟倷閺夋埈<E5A48B> ?嗛梺璋庡啰鐒哥€殿喖鐖奸崺锟犲磼濠х 偓<D185> ?嶉梻浣虹《閺<E3808A> ?粓銆<E7B293> ?崼銉ョ劦妞ゆ帊鑳堕埊鏇熴亜閵娿儳澧︽い銏$ <E98A8F> ??閹峰懘宕烽娑欑亙闂備浇娉曢崳锕傚<E99495> ??閿燂<E996BF> ?
2024-10-22 19:04:25 +08:00
std : : bitset < 32 > b ( ( int ) addr ) ;
std : : string strMask = b . to_string ( ) ;
2024-11-09 16:15:39 +08:00
// 闂傚倷绀侀幖<E4BE80> ?<3F> ゆ偖椤愶箑纾块柛娆忣槺閻濊埖淇婇婵嗗惞<E59797> ?<3F> も晞灏欓埀顒€鍘滈崑鎾绘煕閹板吀绨芥い鏃<E38184> ?<3F> ?″娲川婵犲倻<E78AB2> ?<3F> 勫┑鐐<E29491> ?槹閻╊垶骞冩ウ娆<E382A6> ?Ь 缂備緡鍣崣鍐极閸岀偞鍤<E5819E> ?い鏍电稻閼哥懓鈹戦悙鏉戠仸闁瑰皷鏅犲畷銏ゅ箚瑜<E7AE9A> ?<3F> 弸鏃堟煥閻曞倹瀚<E580B9> "01"闂傚倷鐒︾€笛呯矙閹达附鍤愭い鏍<E38184> ?亼閳ь剙鎳撻ˇ鍦偓娈垮枤鏋顏冨嵆閸┾偓妞ゆ帒鍊荤粻鏂<E7B2BB> ?<3F> 熆鐠哄<E990A0> ?顦柛瀣<E780A3> ?閳藉<E996B3> ?鈻嶉<E5B689> ?<3F> 绨婚柨鏇樺灲椤㈡<E6A4A4> ?<3F> 宕奸悢鍛婄彨闁诲<E99781> ?<3F> 鍘滈崑鎾绘煕閹邦厼鍔ゆ繛鍫灦<EE82A2> ?婃椽宕崟<EE82A6> ?<3F> 患闁诲<E99781> ?<3F> 绋堥弲娑樺<E5A891> ?闂佸綊妫跨粈浣衡偓<E8A1A1> ?<3F> 槸椤法鎹勬笟<E58BAC> ?<3F> 氬壉濠电偛鎳庣换<E5BAA3> ?<3F> €<EFBFBD> ?婚敐澶娢╅柕澶堝労娴犲ジ姊洪悜鈺佸⒉闁荤啙鍛潟闁哄<E99781> ?鐗嗙粻锝夋煟閹邦垰钄肩紒鈧<E988A7> ?n 喗鈷戞繛鑼额嚙濞呮瑩鏌熼崙銈嗗<E98A88> ?
2024-10-22 19:04:25 +08:00
return ( strMask . find ( " 01 " ) = = std : : string : : npos ) ;
}
return false ;
}
int getSysIntValue ( char * key ) {
2024-10-23 16:10:23 +08:00
if ( key = = NULL ) {
zlog_error ( zct , " key is NULL " ) ;
return 0 ;
}
2024-10-22 19:04:25 +08:00
FILE * fp = NULL ;
2024-10-23 16:10:23 +08:00
int value = 0 ;
2024-10-22 19:04:25 +08:00
fp = fopen ( key , " r " ) ;
if ( fp = = NULL ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " could not open %s file " , key ) ;
2024-10-22 19:04:25 +08:00
return 1 ;
}
fscanf ( fp , " %d " , & value ) ;
fclose ( fp ) ;
return value ;
}
2025-01-23 20:28:05 +08:00
void GetSysStatusCMT ( int & cpu_use , int & mem_use , int & disk_remain , int & cpu_temp )
2025-01-23 20:07:10 +08:00
{
long mem_used = - 1 ;
long mem_free = - 1 ;
long mem_total = - 1 ;
long mem_cached = - 1 ;
char name1 [ 20 ] ;
std : : string strMemTotal = GetFileContent ( " /proc/meminfo " , 1 ) ;
std : : string strMemFree = GetFileContent ( " /proc/meminfo " , 2 ) ;
std : : string strMemCache = GetFileContent ( " /proc/meminfo " , 5 ) ;
2024-10-22 19:04:25 +08:00
2025-01-23 20:07:10 +08:00
sscanf ( strMemTotal . c_str ( ) , " %s%ld " , name1 , & mem_total ) ;
sscanf ( strMemFree . c_str ( ) , " %s%ld " , name1 , & mem_free ) ;
sscanf ( strMemCache . c_str ( ) , " %s%ld " , name1 , & mem_cached ) ;
mem_used = mem_total - mem_free ;
float fMemRate = 1.0 * mem_used / mem_total ;
char name [ 8 ] ;
double cpu_user = - 1 ;
double cpu_total = - 1 ;
long int user , nice , sys , idle , iowait , irq , softirq ;
std : : string strCpu1 = GetFileContent ( " /proc/stat " , 1 ) ;
sscanf ( strCpu1 . c_str ( ) , " %s%ld%ld%ld%ld%ld%ld%ld " , name , & user , & nice , & sys , & idle , & iowait , & irq , & softirq ) ;
sleep ( 1 ) ;
long int userNext , niceNext , sysNext , idleNext , iowaitNext , irqNext , softirqNext ;
std : : string strCpu2 = GetFileContent ( " /proc/stat " , 1 ) ;
sscanf ( strCpu2 . c_str ( ) , " %s%ld%ld%ld%ld%ld%ld%ld " , name , & userNext , & niceNext , & sysNext , & idleNext , & iowaitNext , & irqNext , & softirqNext ) ;
cpu_total = ( userNext + niceNext + sysNext + idleNext + iowaitNext + irqNext + softirqNext ) - ( user + nice + sys + idle + iowait + irq + softirq ) ;
cpu_user = userNext - user ;
float rateUser = cpu_user * 100.0 / cpu_total ;
if ( rateUser > 95 ) {
rateUser = 92 ;
}
char hardTotal [ 32 ] ;
char hardFree [ 32 ] ;
char chRes [ 100 ] ;
memset ( chRes , 0 , 100 ) ;
getDiskInfo ( hardTotal , hardFree ) ;
std : : string strhardFree ( hardFree ) ;
char key [ 128 ] = { 0 } ;
memset ( key , 0 , sizeof ( key ) ) ;
sprintf ( key , " /sys/class/thermal/thermal_zone0/temp " ) ;
int temp = getSysIntValue ( key ) ;
cpu_use = rateUser ;
mem_use = fMemRate * 100 ;
disk_remain = atoi ( strhardFree . substr ( 0 , strhardFree . length ( ) - 1 ) . c_str ( ) ) ;
cpu_temp = temp / 1000.0 ;
}
2024-11-22 15:20:22 +08:00
std : : string GetSysStatus ( Json : : Value & jsData ) {
2024-10-22 19:04:25 +08:00
long mem_used = - 1 ;
long mem_free = - 1 ;
long mem_total = - 1 ;
long mem_cached = - 1 ;
char name1 [ 20 ] ;
std : : string strMemTotal = GetFileContent ( " /proc/meminfo " , 1 ) ;
std : : string strMemFree = GetFileContent ( " /proc/meminfo " , 2 ) ;
std : : string strMemCache = GetFileContent ( " /proc/meminfo " , 5 ) ;
sscanf ( strMemTotal . c_str ( ) , " %s%ld " , name1 , & mem_total ) ;
sscanf ( strMemFree . c_str ( ) , " %s%ld " , name1 , & mem_free ) ;
sscanf ( strMemCache . c_str ( ) , " %s%ld " , name1 , & mem_cached ) ;
mem_used = mem_total - mem_free ;
float fMemRate = 1.0 * mem_used / mem_total ;
char name [ 8 ] ;
double cpu_sys = - 1 ;
double cpu_user = - 1 ;
double cpu_total = - 1 ;
long int user , nice , sys , idle , iowait , irq , softirq ;
std : : string strCpu1 = GetFileContent ( " /proc/stat " , 1 ) ;
2024-10-24 16:01:21 +08:00
sscanf ( strCpu1 . c_str ( ) , " %s%ld%ld%ld%ld%ld%ld%ld " , name , & user , & nice , & sys , & idle , & iowait , & irq , & softirq ) ;
2024-10-22 19:04:25 +08:00
sleep ( 1 ) ;
long int userNext , niceNext , sysNext , idleNext , iowaitNext , irqNext , softirqNext ;
std : : string strCpu2 = GetFileContent ( " /proc/stat " , 1 ) ;
2024-10-24 16:01:21 +08:00
sscanf ( strCpu2 . c_str ( ) , " %s%ld%ld%ld%ld%ld%ld%ld " , name , & userNext , & niceNext , & sysNext , & idleNext , & iowaitNext , & irqNext , & softirqNext ) ;
2024-10-22 19:04:25 +08:00
cpu_total = ( userNext + niceNext + sysNext + idleNext + iowaitNext + irqNext + softirqNext ) - ( user + nice + sys + idle + iowait + irq + softirq ) ;
cpu_user = userNext - user ;
cpu_sys = sysNext - sys ;
float rateUser = cpu_user * 100.0 / cpu_total ;
float rateSys = cpu_sys * 100.0 / cpu_total ;
if ( rateUser > 95 ) {
rateUser = 92 ;
}
char hardTotal [ 32 ] ;
char hardFree [ 32 ] ;
char rateHardUse [ 32 ] ;
char chRes [ 100 ] ;
memset ( chRes , 0 , 100 ) ;
2024-11-14 19:01:30 +08:00
2024-10-24 16:01:21 +08:00
char hardName [ 32 ] ;
char hardUse [ 32 ] ;
const char * getEmmcInfo = " df -h | grep /opt " ;
2024-10-22 19:04:25 +08:00
system_custom ( getEmmcInfo , chRes ) ;
sscanf ( chRes , " %s%s%s%s%s " , hardName , hardTotal , hardUse , hardFree , rateHardUse ) ;
std : : string strhardTotal ( hardTotal ) ;
std : : string strhardFree ( hardFree ) ;
std : : string strrateHardUse ( rateHardUse ) ;
char key [ 128 ] = { 0 } ;
memset ( key , 0 , sizeof ( key ) ) ;
sprintf ( key , " /sys/class/thermal/thermal_zone0/temp " ) ;
int temp = getSysIntValue ( key ) ;
Json : : FastWriter fw ;
jsData [ " dataNodeGatewayNo " ] = GlobalConfig : : MacAddr_G ;
jsData [ " cpuUserUse " ] = rateUser ;
jsData [ " memoryTotal " ] = ( int ) mem_total ;
jsData [ " memoryFree " ] = ( int ) mem_free ;
jsData [ " memoryUse " ] = fMemRate * 100 ;
jsData [ " hardDiskTotal " ] = atof ( strhardTotal . substr ( 0 , strhardTotal . length ( ) - 1 ) . c_str ( ) ) ;
jsData [ " hardDiskFree " ] = atof ( strhardFree . substr ( 0 , strhardFree . length ( ) - 1 ) . c_str ( ) ) ;
jsData [ " temperature " ] = temp / 1000.0 ;
jsData [ " temperatureNR5G " ] = atoi ( GlobalConfig : : NR5GTemp . c_str ( ) ) ;
2024-10-24 16:01:21 +08:00
float total = atof ( strhardTotal . substr ( 0 , strhardTotal . length ( ) - 1 ) . c_str ( ) ) ;
float free = atof ( strhardFree . substr ( 0 , strhardFree . length ( ) - 1 ) . c_str ( ) ) ;
float use = ( ( total - free ) / total ) * 100 ;
2024-10-22 19:04:25 +08:00
jsData [ " hardDiskUse " ] = use ;
jsData [ " cpuSystemUse " ] = rateSys ;
char localtimestamp [ 32 ] = { 0 } ;
GetTimeNet ( localtimestamp , 1 ) ;
std : : string nowTimetamp = std : : string ( localtimestamp ) ;
jsData [ " updateTime " ] = nowTimetamp ;
std : : string strJson = fw . write ( jsData ) ;
return strJson ;
}
2024-11-09 16:15:39 +08:00
// 闂備浇<E58299> ?<3F> х 换鎰崲閹邦儵娑<E584B5> ?<3F> 旈埀顒勬偩閻戣姤鍋勯柛婵<E69F9B> ?劗閺<E58A97> ?牠<> ?<3F> 虹捄銊ユ珢闁瑰嚖鎷<E59A96> ?16闂備礁鎼ˇ<EE82A6> ?<3F> ﹀疾濠婂懐<E5A982> ?欓柟杈剧畱閺勩儲淇婇妶鍛殜闁<E6AE9C> ?<3F> 鎸搁埥澶娾枎濡崵鏆俊鐐<E99090> ?<3F> ?崹鎶芥倿閿曗偓椤<E6A4A4> ?顢旈崼<E69788> ?<3F> f 櫌婵炶揪绲挎灙缂併劊鍎茬换娑㈠<E5A891> ?<3F> 閻<EFBFBD> ?潙纰嶉梺鍦拡閸<E68BA1> ?<3F> ?銆佸棰濇晩闁兼亽鍎遍崝鍛存⒑閸濆<E996B8> ??鏆欓柛濠傜秺閹箖鏌嗗鍡椻偓鍨<E98DA8> ?<3F> 閹寸偟鎳愭繛鍫熺懃閳<E68783> ?<3F> 垿鍩ラ崱妤<E5B4B1> ?<3F> ?嶉悗瑙勬礃閸旀瑩<E69780> ??幘缁樻櫢闁跨噦鎷<E599A6>
2024-10-22 19:04:25 +08:00
unsigned char hexCharToByte ( char c ) {
if ( c > = ' 0 ' & & c < = ' 9 ' ) return c - ' 0 ' ;
if ( c > = ' A ' & & c < = ' F ' ) return c - ' A ' + 10 ;
if ( c > = ' a ' & & c < = ' f ' ) return c - ' a ' + 10 ;
2024-11-09 16:15:39 +08:00
return 0 ; // 闂備浇<E58299> ?<3F> у ù鐑藉极婵犳艾鐒<E889BE> ?い鎺嶈兌閵嗘帡鏌よぐ鎺旂<E98EBA> ?闁哄矉绻濆畷姗€顢旈崟鎴秮閺岋繝宕ㄩ銏犲Е 闂佽鍨伴崯鏉戠暦閻旂⒈鏁冮柕鍫濇閸犳洜绱撻崒娆戝妽<E6889D> ?<3F> ゃ劍鍔楅幏瀣晲閸<E699B2> ?煈<> ?<3F> 熷┑鐘绘涧濞<E6B6A7> ?<3F> 附绂嶉妶澶<E5A6B6> ?厸闁稿本绋戦<E688A6> ?<3F> 呯磼閳ь剟鍩<E5899F> ?閿燂<E996BF> ?0
2024-10-22 19:04:25 +08:00
}
2024-11-09 16:15:39 +08:00
// 闂備浇<E58299> ?<3F> х 换鎰殽韫囨稑绠柨鐕傛<E99095> ??16闂備礁鎼ˇ<EE82A6> ?<3F> ﹀疾濠婂懐<E5A982> ?欓柟杈剧畱閺勩儲淇婇妶鍛殜闁<E6AE9C> ?<3F> 鎸搁埥澶娾枎濡崵鏆俊鐐<E99090> ?<3F> ?崹鎶芥倿閿斿墽<E696BF> ?欏鑸靛姈閸ゆ垿鏌ら<E98F8C> ?銉︽毄闁靛牜鍣e 铏规兜閸滀礁娈<E7A481> ?┑鐘噰閸<E599B0> ??捇鏌i 悩鍐插闁哥姵鎹囬崺鈧い鎺嶈兌閳洘銇勯妸銉Ч濞e 洤锕、<EE8188> ?<3F> €<EFBFBD> ?<3F> ?閻樺<E996BB> ?鈧剟<EE8489> ?<3F> 虹憴鍕靛晱闁哥姵宀搁幆宀<E5B986> ?晸閿燂拷
2024-10-22 19:04:25 +08:00
int hexStringToBytes ( const char * hexStr , unsigned char * bytes , size_t bytesSize ) {
size_t hexLen = strlen ( hexStr ) ;
if ( hexLen % 2 ! = 0 ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " hexLen:%d is odd " , hexLen ) ;
2024-11-09 16:15:39 +08:00
return - 1 ; // Hex闂備浇<E58299> ?<3F> х €涒晝<E6B692> ?欓幒妞尖偓鍐醇閵<E98687> ?<3F> 喗鏅炴繛杈剧到濠€<E6BFA0> ?嶅煝閺冨牊鐓涢悘鐐<E68298> ?<3F> 嚙閸旀粍鎱ㄩ敐鍡<E69590> ?<3F> 妤犵偞鐗<E5819E> ?<3F> 蹇涘<E8B987> ?<3F> 瑜忛弳鐘电磽娴i 潧<EFBD89> ?<3F> ?閻忓繑鐟╅獮蹇涙偐鐠囧弬銊╂煥閺傚灝寤洪柨鏇炲€归悡鏇㈡倵閿濆<E996BF> ?<3F> 骞<EFBFBD> ?柣鎾村<E98EBE> ?<3F> 閺岋繝宕遍鐔奉伓
2024-10-22 19:04:25 +08:00
}
if ( bytesSize < hexLen / 2 ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " bytesSize:%d < hexLen:%d " , bytesSize , hexLen ) ;
2024-11-09 16:15:39 +08:00
return - 1 ; // 闂備浇<E58299> ?<3F> х €涒晝<E6B692> ?欓幒妞尖偓鍐╁緞鐎b 晝绠<E6999D> ?銈嗘尪閸ㄥ綊<E384A5> ??告笟鈧弻鐔封枔閸喗鐏撻梺娲<E6A2BA> ?<3F> 幖椤戝<E6889D> ??婚敐澶娢╅柕澶堝労娴犲ジ姊洪棃娑欐悙婵炲眰鍔嶇粋宥咁潰瀹€鈧悿鈧柟鑹版彧缁插潡骞<E6BDA1> ?<3F> ぐ鎺撶厽闁斥晛鍟<E98D9F> ?鎺<> ?<3F> 煕濡崵澧紒鍌氱Ч楠炴帡<E782B4> ??崫鍕闂佽崵鍠撴晶妤冩<E5A6A4> ?<3F> 閿熺姵鐓欓柟<E6AC93> ?<3F> 嗗<EFBFBD> ?鍊┑鐐碘拡娴滎<E5A8B4> ?銆佸Δ浣瑰缂佸娉曢<E5A889> ?搴ㄦ⒒娴e 憡鍟為柤瑙<E69FA4> ?劤闇夌€瑰<E282AC> ??澹<> ??弸鏃堟煙鐎电ǹ袥闁稿鎸搁埥澶娾枎濡崵鏆┑鐘<E29491> ?<3F> 暯濡插嫰骞忛敓锟<E69593>
2024-10-22 19:04:25 +08:00
}
for ( size_t i = 0 ; i < hexLen ; i + = 2 ) {
unsigned char highNibble = hexCharToByte ( hexStr [ i ] ) ;
unsigned char lowNibble = hexCharToByte ( hexStr [ i + 1 ] ) ;
bytes [ i / 2 ] = ( highNibble < < 4 ) | lowNibble ;
}
2024-11-05 15:15:51 +08:00
return 0 ; // 闂傚倷鑳堕幊鎾绘偤閵娾晛绀夐柡鍥╁枑閸欏繘鏌ㄩ悤鍌涘
2024-10-22 19:04:25 +08:00
}
void stringToHex ( const char * str , char * hexStr ) {
while ( * str ) {
sprintf ( hexStr , " %02x " , ( unsigned char ) * str ) ;
hexStr + = 2 ;
str + + ;
}
* hexStr = ' \0 ' ;
}
void hexToAscii ( const char * hexStr , char * asciiStr ) {
int len = strlen ( hexStr ) ;
int i , j = 0 ;
for ( i = 0 ; i < len ; i + = 2 ) {
2024-11-09 16:15:39 +08:00
// 闂備浇宕<E6B587> ?慨鏉懨洪埡鍜佹晪鐟滄垿濡甸幇鏉跨倞闁靛ě鈧弸鏍⒑闂堟稓澧曢悗<E69BA2> ?<3F> 嵆瀹曠數鈧綆鍠<E7B686> ?<3F> 崐<EFBFBD> ?<> ?<3F> 閹寸偟鎳愭繛鍫熒戦妵鍕<E98D95> ?<3F> 濠婂懐鐛㈤梺缁樹緱閸犳岸骞戦崟顖涙<E9A196> ?閻熸瑥瀚烽<E7809A> ?<3F> ?ユ⒒娴e 懙鍦崲閹达箑纾块柣鎾崇瘍瑜版帒骞㈡繛鎴烆焽椤斿<E6A4A4> ?<3F> ?<3F> ?妶搴′ 航闁告瑢鍋撶紓浣插亾閻<E4BABE> ?綆鍠楅悡娑樏归敐鍛喐闁<E59690> ?<3F> ?濞€閺岋繝宕遍鐔<EE9498> ?<3F> 伓
2024-10-22 19:04:25 +08:00
int byte ;
sscanf ( & hexStr [ i ] , " %2x " , & byte ) ;
2024-11-09 16:15:39 +08:00
// 闂備浇<E58299> ?<3F> х 换鎰崲閹邦儵娑樷枎閹捐櫕杈堥梺鎸庣箓椤︻垶<EFB8BB> ??告笟鈧弻鐔风暋閻<E69A8B> ?<3F> 牊鎷辩紓浣<E7B493> ?<3F> 贰閸o 綁<EFBD8F> ??婚悢鐑樺珰闁斥晛鍟扮粣鏃堟煟閻樺啿濮夐柛鐘虫崌閸┾偓妞ゆ帒鍊归弳鈺呮煙閾忣偅灏甸柤娲憾瀵濡烽敃鈧崜<EE8484> ?<3F> ㈡⒑閸涘﹤鐏﹂柍鐟伴拤II闂備浇<E58299> ?<3F> х €涒晝<E6B692> ?欓幒妞尖偓鍐醇閵<E98687> ?<3F> 喗鏅為梺璺ㄥ櫐閹凤<E996B9> ?
2024-10-22 19:04:25 +08:00
asciiStr [ j + + ] = ( char ) byte ;
}
2024-11-09 16:15:39 +08:00
// 濠电姷鏁搁崕鎴犵礊閳ь剚銇<E5899A> ?弴鍡楀<E98DA1> ?閸欏繘鏌i 幇顕呮毌闁稿鎸搁埥澶娾枎濡崵鏆俊鐐<E99090> ?<3F> ?崹鎶芥倿閿斿墽<E696BF> ?欏鑸靛姈閸ゆ垶銇勯幒鎴濃偓鍦焊濠靛鈷戦柛婵嗗濡叉椽鏌涢悩铏磳<EE82A2> ?<3F> ゃ垺鐗犻弫鎾绘晸閿燂拷
2024-10-22 19:04:25 +08:00
asciiStr [ j ] = ' \0 ' ;
}
unsigned char ch2hex ( char ch ) {
static const char * hex = " 0123456789ABCDEF " ;
for ( unsigned char i = 0 ; i ! = 16 ; + + i )
if ( ch = = hex [ i ] ) return i ;
return 0 ;
}
char * solve ( char * dest , const char * src ) {
int i = 0 ;
int cnt = 0 ;
unsigned char * d = ( unsigned char * ) dest ;
while ( * src ) {
if ( i & 1 ) {
d [ cnt + + ] | = ch2hex ( * src ) ;
} else {
d [ cnt ] = ch2hex ( * src ) < < 4 ;
}
src + + ;
i + + ;
}
return dest ;
}
void swap ( char * data ) {
int tmp ;
tmp = data [ 1 ] ;
data [ 1 ] = data [ 0 ] ;
data [ 0 ] = tmp ;
}
int OpenWatchDog ( ) {
int fd = - 1 ;
InitGpio ( GlobalConfig : : GPIO_G . hardWatchDog , 1 ) ;
2024-11-09 16:15:39 +08:00
gpio_set ( GlobalConfig : : GPIO_G . hardWatchDog , 1 ) ; //婵犲痉鏉库偓鏇㈠磹瑜版巻鈧箓宕堕鈧弸渚<E5BCB8> ?鏌熼梻纾<E6A2BB> ?厡鐎规挷绶氶弻<E6B0B6> ?<3F> 绠涢敐鍛凹缂備胶<E58299> ?电敮锟犲蓟閳╁啰鐟瑰┑鐘插暙椤忥<E6A4A4> ?
2024-10-22 19:04:25 +08:00
if ( 0 > ( fd = open ( " /dev/watchdog " , O_WRONLY ) ) ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zbt , " fail to open /dev/watchdog " ) ;
2024-10-22 19:04:25 +08:00
}
return fd ;
}
int WriteWatchDog ( int fd ) {
if ( 1 ! = write ( fd , " 0 " , 1 ) ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zbt , " fail to feed watchdog " ) ;
return 1 ;
2024-10-22 19:04:25 +08:00
}
2024-10-23 16:10:23 +08:00
return 0 ;
2024-10-22 19:04:25 +08:00
}
2024-10-23 16:10:23 +08:00
std : : string TrimStringLeft ( const char * szData , const char * szTargets ) {
std : : string strData = szData ;
2024-10-22 19:04:25 +08:00
int nPos = 0 ;
nPos = strData . find ( szTargets ) ;
while ( nPos = = 0 ) {
strData . erase ( nPos , 1 ) ;
nPos = strData . find ( szTargets ) ;
}
return strData ;
}
2024-10-23 16:10:23 +08:00
std : : string TrimStringRight ( const char * szData , const char * szTargets ) {
std : : string strData = szData ;
2024-10-22 19:04:25 +08:00
int nPos = 0 ;
nPos = strData . rfind ( szTargets ) ;
while ( ( nPos = = ( int ) ( strData . size ( ) - 1 ) ) & & ( nPos > = 0 ) ) {
strData . erase ( nPos , 1 ) ;
nPos = strData . rfind ( szTargets ) ;
}
return strData ;
}
2024-10-23 16:10:23 +08:00
std : : string GetOneContent ( const char * szData , int nRow , const char * szSeparate ) {
std : : string strParam = " " ;
std : : string strTemp = szData ;
2024-10-22 19:04:25 +08:00
int nFirstPos = - 1 ;
for ( int i = 0 ; i < nRow ; i + + ) {
nFirstPos = strTemp . find ( szSeparate , nFirstPos + 1 ) ;
if ( nFirstPos < 0 ) return strParam . c_str ( ) ;
}
int nSecondPos = strTemp . find ( szSeparate , nFirstPos + 1 ) ;
if ( nSecondPos < 0 ) {
strParam = strTemp . substr ( nFirstPos + 1 ) ;
} else {
strParam = strTemp . substr ( nFirstPos + 1 , nSecondPos - nFirstPos - 1 ) ;
}
2024-10-23 16:10:23 +08:00
strParam = TrimStringRight ( strParam . c_str ( ) , " " ) ;
strParam = TrimStringLeft ( strParam . c_str ( ) , " " ) ;
2024-10-22 19:04:25 +08:00
return strParam . c_str ( ) ;
}
int set_opt ( int fd , int nSpeed , int nBits , char nEvent , int nStop ) {
2024-10-23 16:10:23 +08:00
zlog_info ( zbt , " [set_opt] speed:%d, bits:%d, event:%c, stop:%d " , nSpeed , nBits , nEvent , nStop ) ;
2024-10-22 19:04:25 +08:00
struct termios newtio , oldtio ;
2024-11-09 16:15:39 +08:00
if ( tcgetattr ( fd , & oldtio ) ! = 0 ) { //濠电姷顣藉Σ鍛村磻閳ь剟鏌涚<E98F8C> ?n 偅灏扮紒缁樼洴瀵爼骞<E788BC> ?鐐插闂佽崵鍠<E5B4B5> ?ú鏍涘┑鍡欐殾闁挎繂顦伴弲鏌ユ煕閳╁喚鐒<E5969A> ?柨鏇炲€归悡鏇熸叏濡搫鈷旈柣锝堜含閹叉悂鎮ч崼銏犲绩闂佽鍠曠划娆撳极閹剧粯鏅搁柨鐕傛<E99095> ??
2024-10-23 16:10:23 +08:00
zlog_error ( zbt , " tcgetattr fail " ) ;
2024-10-22 19:04:25 +08:00
return - 1 ;
}
bzero ( & newtio , sizeof ( newtio ) ) ;
newtio . c_cflag | = CLOCAL | CREAD ;
newtio . c_cflag & = ~ CSIZE ;
2024-10-23 16:10:23 +08:00
switch ( nBits ) {
2024-10-22 19:04:25 +08:00
case 7 : newtio . c_cflag | = CS7 ; break ;
case 8 : newtio . c_cflag | = CS8 ; break ;
2024-10-23 16:10:23 +08:00
default :
zlog_error ( zbt , " invalid nbits:%d " , nBits ) ;
break ;
2024-10-22 19:04:25 +08:00
}
2024-10-23 16:10:23 +08:00
switch ( nEvent ) {
2024-10-22 19:04:25 +08:00
case ' O ' :
newtio . c_cflag | = PARENB ;
newtio . c_cflag | = PARODD ;
newtio . c_iflag | = ( INPCK | ISTRIP ) ;
break ;
case ' E ' :
newtio . c_iflag | = ( INPCK | ISTRIP ) ;
newtio . c_cflag | = PARENB ;
newtio . c_cflag & = ~ PARODD ;
break ;
case ' N ' : newtio . c_cflag & = ~ PARENB ; break ;
2024-10-23 16:10:23 +08:00
default :
zlog_error ( zbt , " invalid event:%c " , nEvent ) ;
break ;
2024-10-22 19:04:25 +08:00
}
2024-11-09 16:15:39 +08:00
switch ( nSpeed ) //闂備浇宕<E6B587> ?慨宕囩矆娴h 娅犲ù鐘<C3B9> ?儐閸嬵亪鏌涢埄鍐︿粶闁哄鐗犻弻鏇$ 疀鐎n 亞浠煎銈冨劜椤ㄥ﹪<E384A5> ?婚敐鍛牚闁归偊鍘奸锟<EE9494> ?
2024-10-22 19:04:25 +08:00
{
case 2400 :
cfsetispeed ( & newtio , B2400 ) ;
cfsetospeed ( & newtio , B2400 ) ;
break ;
case 4800 :
cfsetispeed ( & newtio , B4800 ) ;
cfsetospeed ( & newtio , B4800 ) ;
break ;
case 9600 :
cfsetispeed ( & newtio , B9600 ) ;
cfsetospeed ( & newtio , B9600 ) ;
break ;
case 115200 :
cfsetispeed ( & newtio , B115200 ) ;
cfsetospeed ( & newtio , B115200 ) ;
break ;
case 460800 :
cfsetispeed ( & newtio , B460800 ) ;
cfsetospeed ( & newtio , B460800 ) ;
break ;
default :
cfsetispeed ( & newtio , B9600 ) ;
cfsetospeed ( & newtio , B9600 ) ;
2024-10-23 16:10:23 +08:00
zlog_error ( zbt , " invalid speed:%d, use B9600 " , nSpeed ) ;
2024-10-22 19:04:25 +08:00
break ;
}
2024-11-09 16:15:39 +08:00
if ( nStop = = 1 ) //闂備浇宕<E6B587> ?慨宕囩矆娴h 娅犲ù鐘<C3B9> ?儐閸嬵亪鏌涢埄鍐<E98D90> ?<3F> 缁惧墽<E683A7> ?换婵囩節閸屾凹浼岄梺鍛婃尰閸庢娊婀侀梺鎸庣箓缁绘垹鈧熬鎷<E786AC>
2024-10-22 19:04:25 +08:00
newtio . c_cflag & = ~ CSTOPB ;
else if ( nStop = = 2 )
newtio . c_cflag | = CSTOPB ;
newtio . c_cc [ VTIME ] = 0 ;
newtio . c_cc [ VMIN ] = 0 ;
tcflush ( fd , TCIFLUSH ) ;
2024-10-23 16:10:23 +08:00
if ( ( tcsetattr ( fd , TCSANOW , & newtio ) ) ! = 0 ) {
zlog_error ( zbt , " tcsetattr fail " ) ;
2024-10-22 19:04:25 +08:00
return - 1 ;
}
return 0 ;
}
2024-10-24 16:01:21 +08:00
void IniReadValue ( const char * section , const char * key , char * val , const char * file ) {
2024-10-22 19:04:25 +08:00
FILE * fp ;
int i = 0 ;
int lineContentLen = 0 ;
int position = 0 ;
char lineContent [ LINE_CONTENT_MAX_LEN ] ;
bool bFoundSection = false ;
bool bFoundKey = false ;
fp = fopen ( file , " r " ) ;
if ( fp = = NULL ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zbt , " fail to open %s " , file ) ;
2024-10-22 19:04:25 +08:00
return ;
}
2024-10-23 16:10:23 +08:00
2024-10-22 19:04:25 +08:00
while ( feof ( fp ) = = 0 ) {
memset ( lineContent , 0 , LINE_CONTENT_MAX_LEN ) ;
fgets ( lineContent , LINE_CONTENT_MAX_LEN , fp ) ;
if ( ( lineContent [ 0 ] = = ' ; ' ) | | ( lineContent [ 0 ] = = ' \0 ' ) | | ( lineContent [ 0 ] = = ' \r ' ) | | ( lineContent [ 0 ] = = ' \n ' ) ) {
continue ;
}
// check section
if ( strncmp ( lineContent , section , strlen ( section ) ) = = 0 ) {
bFoundSection = true ;
// printf("Found section = %s\n", lineContent);
while ( feof ( fp ) = = 0 ) {
memset ( lineContent , 0 , LINE_CONTENT_MAX_LEN ) ;
fgets ( lineContent , LINE_CONTENT_MAX_LEN , fp ) ;
// check key
if ( strncmp ( lineContent , key , strlen ( key ) ) = = 0 ) {
bFoundKey = true ;
lineContentLen = strlen ( lineContent ) ;
// find value
for ( i = strlen ( key ) ; i < lineContentLen ; i + + ) {
if ( lineContent [ i ] = = ' = ' ) {
position = i + 1 ;
break ;
}
}
if ( i > = lineContentLen ) break ;
strncpy ( val , lineContent + position , strlen ( lineContent + position ) ) ;
lineContentLen = strlen ( val ) ;
for ( i = 0 ; i < lineContentLen ; i + + ) {
if ( ( lineContent [ i ] = = ' \0 ' ) | | ( lineContent [ i ] = = ' \r ' ) | | ( lineContent [ i ] = = ' \n ' ) ) {
val [ i ] = ' \0 ' ;
break ;
}
}
} else if ( lineContent [ 0 ] = = ' [ ' ) {
break ;
}
}
break ;
}
}
2024-10-23 16:10:23 +08:00
fclose ( fp ) ;
2024-10-22 19:04:25 +08:00
if ( ! bFoundSection ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zbt , " No section = %s " , section ) ;
2024-10-22 19:04:25 +08:00
} else if ( ! bFoundKey ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zbt , " No key = %s " , key ) ;
}
2024-10-22 19:04:25 +08:00
}
2024-10-24 16:01:21 +08:00
int readStringValue ( const char * section , const char * key , char * val , const char * file ) {
2024-10-23 16:10:23 +08:00
zlog_info ( zct , " section = %s, key = %s, file = %s " , section , key , file ) ;
2024-10-22 19:04:25 +08:00
if ( section = = NULL | | key = = NULL | | val = = NULL | | file = = NULL ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " input parameter, section:%s, key:%s, val:%s, file:%s exist NULL " , section , key , val , file ) ;
2024-10-22 19:04:25 +08:00
return - 1 ;
}
2024-11-04 21:35:50 +08:00
char sect [ SECTION_MAX_LEN ] ;
memset ( sect , 0 , SECTION_MAX_LEN ) ;
sprintf ( sect , " [%s] " , section ) ;
IniReadValue ( sect , key , val , file ) ;
2024-10-22 19:04:25 +08:00
return 0 ;
}
2024-10-24 16:01:21 +08:00
int readIntValue ( const char * section , const char * key , const char * file ) {
2024-10-22 19:04:25 +08:00
char strValue [ STRVALUE_MAX_LEN ] ;
memset ( strValue , ' \0 ' , STRVALUE_MAX_LEN ) ;
2024-10-23 16:10:23 +08:00
if ( readStringValue ( section , key , strValue , file ) ! = 0 ) {
2024-10-22 19:04:25 +08:00
return 0 ;
}
return ( atoi ( strValue ) ) ;
}
2024-10-24 16:01:21 +08:00
void IniWriteValue ( const char * section , const char * key , char * val , const char * file ) {
2024-10-22 19:04:25 +08:00
FILE * fp ;
char lineContent [ LINE_CONTENT_MAX_LEN ] ;
char strWrite [ LINE_CONTENT_MAX_LEN ] ;
bool bFoundSection = false ;
bool bFoundKey = false ;
2024-10-24 16:01:21 +08:00
int err = 0 ;
2024-10-22 19:04:25 +08:00
memset ( lineContent , ' \0 ' , LINE_CONTENT_MAX_LEN ) ;
memset ( strWrite , ' \0 ' , LINE_CONTENT_MAX_LEN ) ;
2024-10-24 16:01:21 +08:00
sprintf ( strWrite , " %s=%s \n " , key , val ) ;
2024-10-22 19:04:25 +08:00
fp = fopen ( file , " r+ " ) ;
if ( fp = = NULL ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " fail to open:%s " , file ) ;
2024-10-22 19:04:25 +08:00
return ;
}
2024-10-23 16:10:23 +08:00
2024-10-22 19:04:25 +08:00
while ( feof ( fp ) = = 0 ) {
memset ( lineContent , 0 , LINE_CONTENT_MAX_LEN ) ;
fgets ( lineContent , LINE_CONTENT_MAX_LEN , fp ) ;
if ( ( lineContent [ 0 ] = = ' ; ' ) | | ( lineContent [ 0 ] = = ' \0 ' ) | | ( lineContent [ 0 ] = = ' \r ' ) | | ( lineContent [ 0 ] = = ' \n ' ) ) {
continue ;
}
// check section
if ( strncmp ( lineContent , section , strlen ( section ) ) = = 0 ) {
bFoundSection = true ;
while ( feof ( fp ) = = 0 ) {
memset ( lineContent , 0 , LINE_CONTENT_MAX_LEN ) ;
fgets ( lineContent , LINE_CONTENT_MAX_LEN , fp ) ;
// check key
if ( strncmp ( lineContent , key , strlen ( key ) ) = = 0 ) {
bFoundKey = true ;
printf ( " %s: %s=%s \n " , __func__ , key , val ) ;
fseek ( fp , ( 0 - strlen ( lineContent ) ) , SEEK_CUR ) ;
err = fputs ( strWrite , fp ) ;
if ( err < 0 ) {
printf ( " %s err. \n " , __func__ ) ;
}
break ;
} else if ( lineContent [ 0 ] = = ' [ ' ) {
break ;
}
}
break ;
}
}
2024-10-23 16:10:23 +08:00
fclose ( fp ) ;
2024-10-22 19:04:25 +08:00
if ( ! bFoundSection ) {
2024-11-11 20:51:40 +08:00
zlog_warn ( zct , " No section = %s " , section ) ;
2024-10-22 19:04:25 +08:00
} else if ( ! bFoundKey ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " No key = %s " , key ) ;
}
2024-10-22 19:04:25 +08:00
}
2024-10-24 16:01:21 +08:00
int writeStringVlaue ( const char * section , const char * key , char * val , const char * file ) {
2024-11-12 20:04:43 +08:00
char sect [ SECTION_MAX_LEN ] ;
2024-10-24 16:01:21 +08:00
zlog_debug ( zct , " section = %s, key = %s, file = %s " , section , key , file ) ;
2024-10-22 19:04:25 +08:00
if ( section = = NULL | | key = = NULL | | val = = NULL | | file = = NULL ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " input parameter(s) is NULL! " ) ;
2024-10-22 19:04:25 +08:00
return - 1 ;
}
2024-11-12 20:04:43 +08:00
memset ( sect , 0 , SECTION_MAX_LEN ) ;
sprintf ( sect , " [%s] " , section ) ;
2024-11-12 20:08:31 +08:00
IniWriteValue ( sect , key , val , file ) ;
2024-10-24 16:01:21 +08:00
return 0 ;
2024-10-22 19:04:25 +08:00
}
2024-10-24 16:01:21 +08:00
int writeIntValue ( const char * section , const char * key , int val , const char * file ) {
2024-10-22 19:04:25 +08:00
char strValue [ STRVALUE_MAX_LEN ] ;
2024-10-23 16:10:23 +08:00
memset ( strValue , 0 , STRVALUE_MAX_LEN ) ;
2024-10-22 19:04:25 +08:00
sprintf ( strValue , " %d " , val ) ;
writeStringVlaue ( section , key , strValue , file ) ;
2024-10-24 16:01:21 +08:00
return 0 ;
2024-10-22 19:04:25 +08:00
}
int getDiskInfo ( char * diskTotal , char * diskFree ) {
DISK diskInfo ;
2024-11-09 16:15:39 +08:00
/* 1.闂傚倷绀侀崥瀣磿閹惰<E996B9> ?<3F> 搴婇柤鑹扮<E991B9> ?娴滃綊鏌ㄩ悤鍌涘<E98D8C> ?/home/婵犵數鍋為崹<E782BA> ?曞<> ?<3F> 閹间緡鏁勫璺衡看閻掕棄霉閻撳海鎽犻柛搴$ Ч閺屾<E996BA> ?<3F> ?<3F> ?妸銉ュ<E98A89> ?<3F> 闂佺ǹ<E4BDBA> ?<3F> 嗛幐楣冨<E6A5A3> ??閻樺樊鍟<E6A88A> ?い鏂<E38184> ?悑濞<E68291> ?秹<> ?<3F> <> ?<3F> 崒娆愮グ<E684AE> ?<3F> ゆ洘绮撻獮蹇涙晸閿燂拷 */
2024-10-22 19:04:25 +08:00
statfs ( " / " , & diskInfo ) ;
2024-10-24 16:01:21 +08:00
unsigned long long blocksize = diskInfo . f_bsize ;
unsigned long long totalsize = blocksize * diskInfo . f_blocks ;
2024-10-22 19:04:25 +08:00
2024-11-09 16:15:39 +08:00
/* 2.闂傚倷绀侀崥瀣磿閹惰<E996B9> ?<3F> 搴婇柤鑹扮<E991B9> ?娴滃綊鏌涢妷锝呭闁崇粯<E5B487> ?<3F> ?弻<> ?<3F> 堫檨闁告挻姘ㄧ划娆<E58892> ?緞鐏炵ǹ浜鹃柨婵嗙凹缁ㄥ鏌嶉柨瀣ⅹ 闂囧鏌ㄥ┑鍡橆棤闁瑰啿鎳橀弻<E6A980> ?<3F> 囨喆閸曨厼鈷屽┑<E5B1BD> ?<3F> 硷工椤嘲顕i 崼鏇炵闁绘劕妯婃<E5A6AF> ?<3F> 鍛存⒒娴e 憡鍟為柣鐕佸灦瀹曞綊骞庨挊澶<E68C8A> ??<3F> ?梺闈涚墕濞层劑<E5B182> ?屽顓犵鐎瑰<E9908E> ?<3F> 鍠曠花濂告煥濞戞艾鏋涢柡宀<E69FA1> ?<3F> ?婵℃悂濡烽妷顔绘偅闂備線娼у ú銈吤洪妸锔绢洸闁归棿鐒﹂弲鎼佹煥閻曞倹瀚<E580B9> */
unsigned long long freeDisk = diskInfo . f_bfree * blocksize ; //闂傚倷绀侀幉锟犲<E9949F> ?<3F> 閹绢喖鐤炬繛鍡樺灩缁€濠囨煙鐎电ǹ啸闁活厽纰嶇换娑橆啅椤旇崵鍑归梺鎸庣〒閸犳牠<E78AB3> ?婚敐澶娢╅柕澶堝労娴犲ジ姊洪棃娑欐悙婵炲眰鍔嶇粋宥<E7B28B> ?<3F> <> ?<3F> 娴h 娅㈤梺璺ㄥ櫐閹凤<E996B9> ?
// unsigned long long availableDisk = diskInfo.f_bavail * blocksize; //闂傚倷绀侀幉锟犳偡椤栫偛鍨傞柟<E5829E> ?版閺<EE9789> ?<3F> 線鏌曢崼婵囧窛闁活厽纰嶇换娑橆啅椤旇崵鍑归梺鎸庣〒閸犲酣鈥﹂崸妤<E5B4B8> ?閱囬柛鈩冾殔閺嗙喐鎱ㄩ敐蹇斿<E8B987> ?
2024-10-24 16:01:21 +08:00
2024-10-22 19:04:25 +08:00
sprintf ( diskTotal , " %llu " , totalsize > > 20 ) ;
sprintf ( diskFree , " %llu " , freeDisk > > 20 ) ;
return 1 ;
}
unsigned short cal_chksum ( unsigned short * addr , int len ) {
int nleft = len ;
int sum = 0 ;
unsigned short * w = addr ;
unsigned short answer = 0 ;
2024-10-23 16:10:23 +08:00
while ( nleft > 1 ) {
2024-10-22 19:04:25 +08:00
sum + = * w + + ;
nleft - = 2 ;
}
2024-10-23 16:10:23 +08:00
if ( nleft = = 1 ) {
2024-10-22 19:04:25 +08:00
* ( unsigned char * ) ( & answer ) = * ( unsigned char * ) w ;
sum + = answer ;
}
sum = ( sum > > 16 ) + ( sum & 0xffff ) ;
sum + = ( sum > > 16 ) ;
answer = ~ sum ;
return answer ;
}
int socketHeart ( const char * pSendData ) {
2024-10-23 16:10:23 +08:00
zlog_info ( zct , " socketHeart " ) ;
2024-11-09 16:15:39 +08:00
int sockfd ; // Socket闂傚倷绀侀幖<E4BE80> ?<3F> ﹀磹缁<E7A3B9> ?5 娲晲閸涱亝鐎婚梺闈涚箞閸婃洜<E5A983> ?婚悽鍝ュ彄闁搞儯鍔忔竟<E5BF94> ?<3F> €鏌e Δ浣圭殤缂佽鲸<E4BDBD> ?掕灃閻庯綆鍋<E7B686> ?锟<EE9494> ?
struct sockaddr_in serverAddr { } ; // Server闂傚倷绶<E580B7> ?濠<EE9F87> ?⒔閸曨偒鐔嗘俊<E59798> ?<3F> 欒閻掍粙鏌涢幇鍏哥敖缁炬儳銈搁弻鐔煎箚瑜滈崵鐔兼煃瑜滈崜锕傚垂闁秴绠柛娑<E69F9B> ?<3F> 摠閺呮悂鏌ㄩ悤鍌涘<E98D8C> ?
2024-10-22 19:04:25 +08:00
2024-11-09 16:15:39 +08:00
// 闂傚倷绀侀幉锛<E5B989> ?暜濡ゅ啰<E38285> ?欓柟瀵<E69F9F> ?<3F> Х 绾句粙鏌熺紒妯肩潉cket
2024-10-22 19:04:25 +08:00
if ( ( sockfd = socket ( AF_INET , SOCK_STREAM , 0 ) ) = = - 1 ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " Failed to create socket. " ) ;
2024-10-22 19:04:25 +08:00
return 1 ;
}
2024-11-09 16:15:39 +08:00
// 闂備浇宕<E6B587> ?慨宕囩矆娴h 娅犲ù鐘<C3B9> ?儐閸嬵亪鏌涘┑鍫濈€瑀ver闂傚倷绶<E580B7> ?濠<EE9F87> ?⒔閸曨偒鐔嗘俊<E59798> ?<3F> 欒閻掍粙鏌涢幇銊︽珖闁崇懓绉归弻宥<E5BCBB> ?<3F> 煛娴e 憡娈ㄧ紓浣瑰敾閹凤拷
2024-10-22 19:04:25 +08:00
serverAddr . sin_family = AF_INET ;
2024-11-09 16:15:39 +08:00
serverAddr . sin_port = htons ( 18393 ) ; // TCP婵犳鍠楃敮妤冪矙閹烘挾浠氭俊鐐€<EE8184> ?幑浣哥暦閻㈤潧鍨濋柍鍝勬媼閺佸秵鎱ㄥ鍡楀<E98DA1> ?缂佸顦靛娲川婵犲<E5A9B5> ??鍣┑鐐存尭濠€<E6BFA0> ?嶅<> ??瑜版帗鏅搁柨鐕傛<E99095> ?80
2024-10-23 16:10:23 +08:00
inet_pton ( AF_INET , " 192.168.1.147 " , & serverAddr . sin_addr ) ;
2024-10-22 19:04:25 +08:00
2024-11-09 16:15:39 +08:00
// 闂備礁鎼ˇ<EE82A6> ?<3F> ﹀疾濠靛纾<EE8385> ?<3F> 柣鎰仛閺嗘粓鏌熺紒銏犳灈缂佲偓閸℃稒鐓熺憸搴f 绾炬潳er
2024-10-22 19:04:25 +08:00
if ( connect ( sockfd , reinterpret_cast < struct sockaddr * > ( & serverAddr ) , sizeof ( serverAddr ) ) = = - 1 ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " Failed to connect to the server. " ) ;
2024-10-22 19:04:25 +08:00
close ( sockfd ) ;
return 1 ;
}
2024-11-09 16:15:39 +08:00
// 闂傚倷绀侀幉锟犳偡閿曞倸鍨傞柛褎顨呴悞<E591B4> ?亜閹达絾纭舵い锔煎<E99494> ?缁辨帡宕崟顐熸寖闂佸湱鎳撶<E98EB3> ?<3F> ?即骞<E58DB3> ?ぐ鎺濇晝闁挎繂妫崯鈧梻鍌欒兌椤㈠<E6A4A4> ?顢氶弽<E6B0B6> ?<3F> 炵獥闁哄稁鍋€閸<E282AC> ??挾鍠婃径瀣<E780A3> ?
2024-10-24 16:01:21 +08:00
2024-10-22 19:04:25 +08:00
ssize_t bytesSent = send ( sockfd , pSendData , strlen ( pSendData ) , MSG_NOSIGNAL ) ;
if ( bytesSent = = - 1 ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " Failed to send heartbeat packet. " ) ;
2024-10-22 19:04:25 +08:00
close ( sockfd ) ;
return 1 ;
} else if ( static_cast < size_t > ( bytesSent ) ! = strlen ( pSendData ) ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " Partially sent heartbeat packet. " ) ;
2024-10-22 19:04:25 +08:00
close ( sockfd ) ;
return 1 ;
}
2024-11-09 16:15:39 +08:00
// 闂傚倷鑳舵灙缂佺<E7BC82> ?鍨剁换娑欑節閸<E7AF80> ??姤绋撻崰濠囧煛閻滅€攅t闂備礁鎼ˇ<EE82A6> ?<3F> ﹀疾濠靛纾<EE8385> ?<3F> 柣鎰仛閺嗘粓鏌ㄩ悤鍌涘
2024-10-22 19:04:25 +08:00
close ( sockfd ) ;
return 0 ;
}
2024-11-09 16:15:39 +08:00
// Ping闂傚倷绀侀幉锟犲垂閸忓吋鍙忛柕<E5BF9B> ?濐槸<E6BF90> ?规煡鏌i <E98F8C> ?<3F> ?<> ?闁哄拋鍓熼幃妤呭捶椤撶偘姘eout婵犵數鍋為崹<E782BA> ?曞<> ?<3F> 閸モ晝纾芥慨妯夸含閻捇鏌熺紒銏犳灈缂侇偄绉归弻銈囩矙鐠恒劋绮靛銇礁娲﹂埛鎺<E59F9B> ?<3F> 煕鐏炲墽绠<E5A2BD> ?憸鎶婂懐纾奸弶鍫涘<E98DAB> ?<3F> 缁犵偟鈧娲╃换婵嗩嚕閺夋埈娼╅弶鍫<E5BCB6> ?暕閵忋倖鈷戦柛婵嗗椤忣偅淇婇銈庢敵,10000 濠电姵<E794B5> ?<3F> 栭崳<E6A0AD> ?<3F> 滅礊閸℃稑纾<E7A891> ?<3F> 柛鈩冨喕缂嶆牠鏌ㄩ悤鍌涘=10 缂傚倸鍊风粈渚€篓閳ь剟鏌熼崙銈嗗<E98A88> ?
//闂傚倷鑳堕幊鎾绘偤閵娾晛绀夐柡鍥╁枑閸欏繑绻涢幋娆忕仾闁哄拋鍓氶幈銊ノ 熼搹鐧哥礊缂備胶<E58299> ?甸悡锟犲蓟濞戙垹<E68899> ?妞ゆ牗绋戦锟<EE9494> 0闂傚倷鐒︾€笛呯矙閹达附鍤愭い鏍<E38184> ?仜<> ?<3F> 呴梺鐟邦嚟婵數鈧艾<EE8481> ?烽弻鏇熷緞濡<E6BFA1> ?<3F> 浠紓浣瑰姈椤ㄥ﹤顕i 崼鏇炵厸闁<E58EB8> ?<3F> 本绋撻崣鍡椻攽閻愰鍤<EE9682> ?柟鍑ゆ<E98D91> ??1闂傚倷鑳堕、濠囧<E6BFA0> ?<3F> 椤忓牆绠柨鐕傛<E99095> ??-1
2024-10-22 19:04:25 +08:00
int Ping ( const char * ips , int timeout ) {
struct timeval * tval ;
int maxfds = 0 ;
fd_set readfds ;
int iRet = 0 ;
struct sockaddr_in addr ;
struct sockaddr_in from ;
2024-11-09 16:15:39 +08:00
// 闂備浇宕<E6B587> ?慨鎶芥倿閿曞倸纾块柟<E59D97> ?板Г閸嬧晝绱撳搴㈡婵犵數鍎戠徊钘<E5BE8A> ?<3F> 洪悩璇<E682A9> ?<3F> ?婵犻潧娲ら<E38289> ?嶆煥閻曞倹瀚<E580B9>
2024-10-22 19:04:25 +08:00
bzero ( & addr , sizeof ( addr ) ) ;
addr . sin_family = AF_INET ;
addr . sin_addr . s_addr = inet_addr ( ips ) ;
int sockfd ;
2024-11-09 16:15:39 +08:00
// 闂傚倷绀侀幉锟犳偡閿曞倹鍋<E580B9> ?柡鍥╁У 椤<D0A3> ?粙鏌i 鍛傛溈ket 闂傚倷绶<E580B7> ?<> ?<3F> 螞閹绢喖绠柨鐕傛<E99095> ? 婵犵數濮烽。浠<E38082> ?焵椤掆偓閸熷潡鍩<E6BDA1> ?椤掆偓缂嶅﹪骞冨Ο 璇茬窞濠电偟鍋撻悡銏ゆ⒑閻愯棄鍔氶柛鐔锋健閿濈偤<E6BF88> ?缁犲垼o 闂備礁鎼ˇ<EE82A6> ?<3F> ﹀疾濠婂牊鍋¢柍鍝<E69F8D> ?噹闂傤垶姊洪崹<E6B4AA> ?<3F> 呭剰<E591AD> ?<3F> ゆ洝椴搁幈銊ヮ潨閸℃绠归悶<E5BD92> ?<3F> 哺濮婄粯鎷呯粙璺ㄦ闂佺懓鍤<E68793> ?幏锟<E5B98F> ?
2024-10-22 19:04:25 +08:00
sockfd = socket ( AF_INET , SOCK_RAW , IPPROTO_ICMP ) ;
if ( sockfd < 0 ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " ip:%s,socket error " , ips ) ;
2024-10-22 19:04:25 +08:00
return - 1 ;
}
struct timeval timeo ;
2024-11-09 16:15:39 +08:00
// 闂備浇宕<E6B587> ?慨鎶芥倿閿曞倸纾块柟<E59D97> ?板Г閸嬧晝绱撳鍥骏meOut闂傚倷绀侀幖<E4BE80> ?<3F> ﹀<EFBFBD> ?椤愶附鍋夐柣鎾冲濞戙垺鏅搁柨鐕傛<E99095> ??
2024-10-22 19:04:25 +08:00
timeo . tv_sec = timeout / 1000 ;
timeo . tv_usec = timeout % 1000 ;
if ( setsockopt ( sockfd , SOL_SOCKET , SO_SNDTIMEO , & timeo , sizeof ( timeo ) ) = = - 1 ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " ip:%s,setsockopt error " , ips ) ;
2024-10-22 19:04:25 +08:00
close ( sockfd ) ;
return - 1 ;
}
char sendpacket [ 2048 ] ;
char recvpacket [ 2048 ] ;
2024-11-09 16:15:39 +08:00
// 闂備浇宕<E6B587> ?慨鎶芥倿閿曞倸纾块柟<E59D97> ?板Г閸嬧晝绱撳鍥х 毇ng闂傚倷绀侀幉锟犳偋椤撱垹绠柨鐕傛<E99095> ?
2024-10-22 19:04:25 +08:00
memset ( sendpacket , 0 , sizeof ( sendpacket ) ) ;
pid_t pid ;
2024-11-09 16:15:39 +08:00
// 闂傚倷绀侀幉锟犳偡閿曞倹鍋<E580B9> ?柡鍥╁У 椤<D0A3> ?粙鏌i 埡濠冿紬D闂傚倷鐒︾€笛呯矙閹寸偟闄勯柡鍐ㄥ€荤粈濠囨煛閸愶絽浜剧紓浣割儏椤﹀<E6A4A4> ?顕h 閵嗘帗鍒婂濠囨⒒娴e 湱婀介柛鏂跨焸瀹曠敻鎮悥宄秂nce ID
2024-10-22 19:04:25 +08:00
pid = getpid ( ) ;
struct ip * iph ;
struct icmp * icmp ;
icmp = ( struct icmp * ) sendpacket ;
2024-11-09 16:15:39 +08:00
icmp - > icmp_type = ICMP_ECHO ; //闂傚倷鐒﹂幃<EFB982> ?曞磿閹惰棄纾婚柣鎰棘閻旂ǹ绶為悘鐐村劤閻濅即姊绘担鍝ヤ虎妞ゆ垵娲ら敃銏ゆ晸閿燂拷
2024-10-22 19:04:25 +08:00
icmp - > icmp_code = 0 ;
icmp - > icmp_cksum = 0 ;
icmp - > icmp_seq = 0 ;
icmp - > icmp_id = pid ;
tval = ( struct timeval * ) icmp - > icmp_data ;
gettimeofday ( tval , NULL ) ;
2024-11-09 16:15:39 +08:00
icmp - > icmp_cksum = cal_chksum ( ( unsigned short * ) icmp , sizeof ( struct icmp ) ) ; //闂傚倷绀侀幖<E4BE80> ?<3F> ょ矙閸曨厽宕叉繝闈涱儐閸<E58490> ??﹢鏌ㄩ悤鍌涘<E98D8C> ?
2024-10-22 19:04:25 +08:00
int n = sendto ( sockfd , ( char * ) & sendpacket , sizeof ( struct icmp ) , 0 , ( struct sockaddr * ) & addr , sizeof ( addr ) ) ;
if ( n < 1 ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " ip:%s,sendto error " , ips ) ;
2024-10-22 19:04:25 +08:00
close ( sockfd ) ;
return - 1 ;
}
2024-11-09 16:15:39 +08:00
// 闂傚倷娴<E580B7> ?~ 澶<EFBD9E> ?娴犲纾块弶鍫<E5BCB6> ?亖娴滃綊鏌ㄩ悤鍌涘
// 闂傚倷鐒﹂惇褰掑垂绾懌浜瑰璺虹焷婵櫕銇<E6AB95> ?幒鎴濐仼闁活厽顨嗛妵鍕冀閵娧<E996B5> ?暤闂佸憡蓱閹告娊<E5918A> ?婚悢鐓庣畳闁<E795B3> ?儤鍨<E584A4> ?慨搴ㄦ偡濠婂<E6BFA0> ?绶查柣妤佹尭閻e 嘲顫濈捄铏归獓闂佸<E99782> ?<3F> 鐓堥崰鏍椤撶喓绠鹃悗鐢登<E990A2> ?<3F> 牎濠电<E6BFA0> ?鍋撴い锝<E38184> ?礆g闂傚倷鐒﹂惇褰掑礉瀹€鈧埀顒佸<E9A192> ?閸撴<E996B8> ?鎳為柆<E782BA> ?<3F> 嗗殤<E59797> ?<3F> ゆ帒鍊块埞蹇涙⒑閸濆<E996B8> ??鏆婇柛瀣尵缁辨帗寰勭仦钘夊<E99298> ?<3F> 濡ょ姷鍋<E5A7B7> ?<3F> <> ?<3F> <> ?<3F> 躲<EFBFBD> ?佸☉銏犖ч柛銉㈡櫓濡茬兘<E88CAC> ?<3F> 绘担鍛婅<E98D9B> ?<3F> 妞わ絼绮欏畷鎴﹀箻鐡掍<E990A1> ?<3F> 缍婇幃鈺咁敊閻撳<E996BB> ?<3F> <> ?<3F> 缂傚倷鑳剁划顖炴偋閻樿钃熼悘鐐<E68298> ?櫕閺嗗<E996BA> ?<3F> 鏌涢幇顔间壕闁活厽顨婂娲倻閳轰<E996B3> ?<3F> 澹曢梺鍛婃煥閻倿鐛崱妯肩瘈闁搞<E99781> ?鍔屾禒銏ゆ⒑鐠恒劌娅愰柟鍑ゆ<E98D91> ?
2024-10-22 19:04:25 +08:00
int cnt = 0 ;
while ( 1 ) {
2024-11-09 16:15:39 +08:00
// 闂備浇宕<E6B587> ?慨鎶芥倿閿曞倸纾块柟<E59D97> ?板Г閸嬧晝绱撳鍥骏meOut闂傚倷绀侀幖<E4BE80> ?<3F> ﹀<EFBFBD> ?椤愶附鍋夐柣鎾冲濞戙垹閿ゆ俊銈<E4BF8A> ?劍濞<E58A8D> ?牠鎮楅崗澶婁壕闂佸憡鍔︽禍鐐<E7A68D> ?敊閹邦兘鏀介柣鎰级椤ユ垿鏌涢幘瀵哥畺闁哄懎鐖奸幃鈺冩嫚閹绘帒鎸ゆ俊鐐<E99090> ?<3F> ?悧妤冨垝瀹ュ<E780B9> ?鏄ラ柛灞剧⊕閸欏繑绻濋崹顐e 暗缂佸鍓熼弻鐔兼儌閸濄儳蓱闂佺懓鍢查幊搴ㄣ偑娴兼潙宸濇い鏃<E38184> ?Г椤撳綊<E692B3> ?<3F> 绘担瑙勩仧闁绘挸顦甸獮蹇涙晸閿燂拷
2024-10-22 19:04:25 +08:00
FD_ZERO ( & readfds ) ;
FD_SET ( sockfd , & readfds ) ;
maxfds = sockfd + 1 ;
n = select ( maxfds , & readfds , NULL , NULL , & timeo ) ;
if ( n < = 0 ) {
2024-10-23 16:10:23 +08:00
zlog_info ( zct , " ip:%s,Time out error " , ips ) ;
2024-10-22 19:04:25 +08:00
close ( sockfd ) ;
iRet = - 1 ;
break ;
}
2024-11-09 16:15:39 +08:00
// 闂傚倷娴<E580B7> ?~ 澶<EFBD9E> ?娴犲纾块弶鍫<E5BCB6> ?亖娴滃綊鏌ㄩ悤鍌涘
2024-10-22 19:04:25 +08:00
memset ( recvpacket , 0 , sizeof ( recvpacket ) ) ;
int fromlen = sizeof ( from ) ;
n = recvfrom ( sockfd , recvpacket , sizeof ( recvpacket ) , 0 , ( struct sockaddr * ) & from , ( socklen_t * ) & fromlen ) ;
2024-10-23 16:10:23 +08:00
zlog_info ( zct , " recvfrom Len:%d " , n ) ;
2024-10-22 19:04:25 +08:00
if ( n < 1 ) {
close ( sockfd ) ;
iRet = 1 ;
break ;
}
char * from_ip = ( char * ) inet_ntoa ( from . sin_addr ) ;
2024-11-09 16:15:39 +08:00
// 闂傚倷绀侀幉锛<E5B989> ?暜閸<E69A9C> ?剙纾归柡宥庡幖閽<E5B996> ?喖鏌涢妷顔煎闁告瑥锕ラ妵鍕冀閵娧屾<E5A8A7> ?<3F> 闂佺ǹ<E4BDBA> ?<3F> 搁敃<E69081> ?<3F> 堝蓟閿熺姴绀<E5A7B4> ?梻鍫熺〒娴犳挳姊洪幖鐐测偓鏍垝瀹€鍕垫晩闊洦绋掗崕搴<E5B495> ?亜閿曗偓缁辨闂傚倷鐒﹂惇褰掑礉瀹€鈧埀顒佸<E9A192> ?閸撴瑧鍙呴梺鍝勭Р 閸斿瞼娆㈤悙鐑<E68299> ?<3F> 叆闁绘洖鍊<E6B496> ?<3F> ?氾拷
2024-10-22 19:04:25 +08:00
if ( strcmp ( from_ip , ips ) ! = 0 ) {
2024-10-23 16:10:23 +08:00
zlog_info ( zct , " NowPingip:%s Fromip:%s NowPingip is not same to Fromip,so ping wrong! " , ips , from_ip ) ;
2024-10-22 19:04:25 +08:00
close ( sockfd ) ;
iRet = 1 ;
break ;
}
iph = ( struct ip * ) recvpacket ;
icmp = ( struct icmp * ) ( recvpacket + ( iph - > ip_hl < < 2 ) ) ;
2024-10-23 16:10:23 +08:00
zlog_info ( zct , " ip:%s,icmp->icmp_type:%d,icmp->icmp_id:%d \n " , ips , icmp - > icmp_type , icmp - > icmp_id ) ;
2024-11-09 16:15:39 +08:00
// 闂傚倷绀侀幉锛<E5B989> ?暜閸<E69A9C> ?剙纾归柡宥庡幖閽<E5B996> ?喖鏌涢<E98F8C> ?<3F> 陇鎶梟g闂傚倷鐒﹂幃<EFB982> ?曞磿閹惰棄纾绘繛鎴旀嚍閸<E59A8D> ?剙钃熼柕澶堝劤椤﹂亶姊洪崨濠佺繁闁搞劑浜堕幃楣冩焼瀹ュ棛鍘藉┑鈽嗗灠閻忔繈<E5BF94> ?¢幇鐗堢厓鐟滄粓宕滈妸鈺佺闁跨噦鎷<E599A6> ?
if ( icmp - > icmp_type = = ICMP_ECHOREPLY & & icmp - > icmp_id = = pid ) // ICMP_ECHOREPLY闂傚倷鐒﹂幃<EFB982> ?曞磿閹惰棄纾婚柣鎰棘閻旂ǹ绶為悗锝庡亜閸斿懘姊洪<E5A78A> ?鍕<E98D95> ?闁<> ?<3F> ﹤<EFBFBD> ?烽獮妤呮晸閿燂拷
2024-10-22 19:04:25 +08:00
{
2024-11-09 16:15:39 +08:00
// 濠电姵<E794B5> ?<3F> 栭崰妤冩崲閹邦喖绶ゅù鐘<C3B9> ?儐閸<E58490> ?鏌涢幘鍙<E5B998> ?<3F> 樂闁绘帒锕娲敆閳ь剛绮旈鈧畷鎴﹀箻鐠<E7AEBB> ?尙鍔﹀銈嗗笒鐎氼剛绮堥崟顖涚厱婵犻潧<E78ABB> ?楅顏堟煕鎼<E78595> ?垺绀<E59EBA> ?柡宀<E69FA1> ?到<> ?<3F> 即骞<E58DB3> ?鐑嗕紦
2024-10-23 16:10:23 +08:00
zlog_info ( zct , " icmp succecss ............. \n " ) ;
2024-10-22 19:04:25 +08:00
break ;
} else if ( cnt < 3 ) {
2024-11-09 16:15:39 +08:00
// 闂傚倷绀侀幉锟犳偄椤掑倻涓嶉柟杈剧畱閸ㄥ倹銇<E580B9> ?弽銊х 煂缁<E78582> ?崘鍋愰幉姝岀疀濞戞瑥浠<E791A5> ?梺鐓<E6A2BA> ?潟閸婃銇欓幎鑺ョ叆闁绘洖鍊<E6B496> ?<3F> ?氾拷
2024-10-22 19:04:25 +08:00
cnt + + ;
continue ;
} else {
close ( sockfd ) ;
iRet = - 1 ;
break ;
}
}
close ( sockfd ) ;
return iRet ;
}
int get_netlink_status ( const char * if_name ) {
int skfd ;
struct ifreq ifr ;
struct ethtool_value edata ;
edata . cmd = ETHTOOL_GLINK ;
edata . data = 0 ;
memset ( & ifr , 0 , sizeof ( ifr ) ) ;
strncpy ( ifr . ifr_name , if_name , sizeof ( ifr . ifr_name ) - 1 ) ;
ifr . ifr_data = ( char * ) & edata ;
if ( ( skfd = socket ( AF_INET , SOCK_DGRAM , 0 ) ) = = 0 ) return - 1 ;
if ( ioctl ( skfd , SIOCETHTOOL , & ifr ) = = - 1 ) {
2024-10-23 16:10:23 +08:00
zlog_error ( zct , " ioctl failed, if_name:%s " , if_name ) ;
2024-10-22 19:04:25 +08:00
close ( skfd ) ;
return - 1 ;
}
close ( skfd ) ;
return edata . data ;
}
2024-11-09 16:15:39 +08:00
// 闂備浇<E58299> ?<3F> х 换鎰崲閹邦儵娑樷槈濞嗘劖鐝峰┑掳鍊曢幊搴b 偓姘槹閵囧<E996B5> ?<3F> 骞掗崱妞惧闁荤喐<E88DA4> ?嶆刊钘<E5888A> ?<3F> 枖閺囥垹鐒<E59EB9> ?い鎺嶈兌閳洘銇<E6B498> ?妸銉у ⅵ<D183> ?<3F> ゃ垺鐗楅幏鍛村捶椤撴稒鐏冮梻浣告啞閻熴儵藝椤栫儐鏁侀柡鍥ュ灪閻撴洟鏌熼悜<E786BC> ?虹仸妞ゃ儲鐟╅幃褰掑箛椤斿吋鐏堥悗娈<E68297> ?櫘閸<E6AB98> ?棝鍩<E6A39D> ?椤掍胶鈯曢拑杈ㄧ箾閸繂顣崇紒杈ㄦ尰閹峰懐绮欏▎鍙ョ<E98D99> ?闂備焦鎮堕崝宥呯暆閹间<E996B9> ?<3F> 绠氶柛鎰靛枛缁<E69E9B> ?瀣亜閹板<E996B9> ?<3F> 鍒伴柍褜鍓欓…宄邦潖閾忚瀚氱憸搴b 偓姘炬<E5A798> ?
2024-10-22 19:04:25 +08:00
std : : vector < int > splitVersion ( const std : : string & version ) {
std : : vector < int > parts ;
std : : stringstream ss ( version ) ;
std : : string part ;
2024-11-09 16:15:39 +08:00
// 闂傚倷鑳堕崕鐢<E5B495> ?<3F> 磻閹捐绀夐幖娣妼绾惧鏌ㄥ┑鍡橆棡濠<E6A3A1> ?<3F> 垰鐡ㄧ换婵囩<E5A9B5> ?<3F> 閹傚闂佽崵<E4BDBD> ?甸崝妤呭窗閺<E7AA97> ?<3F> ?殾婵ǹ娉涢獮銏$ 箾閹寸偟鎳愰柛<E684B0> ?<3F> 焽缁辨挻鎷呯拠鈩冾吅闁荤姳绶ょ徊<E38287> ?i 幇<EFBD89> ?<3F> 芥斀閻庯綆浜為ˇ<E782BA> ?<3F> ︽⒑缁洖澧叉い銊ユ嚇钘熼<E99298> ?鍥ㄧ⊕閻撶喐淇婇妶鍌<E5A6B6> ?壕闂佺粯顨呴敃銈夋晝閵忊<E996B5> ?愁嚤闁哄鍨归悡鎴︽⒑鐠恒劌娅愰柟鍑ゆ<E98D91> ??
2024-10-22 19:04:25 +08:00
while ( std : : getline ( ss , part , ' . ' ) ) {
2024-11-09 16:15:39 +08:00
parts . push_back ( std : : stoi ( part ) ) ; // 闂備浇<E58299> ?<3F> х 换鎰崲閹邦儵娑<E584B5> ?<3F> 旈崨<E69788> ?<3F> 炵<EFBFBD> ?柟鍏肩暘閸斿瞼<E696BF> ?堥崼銉︾厵缂備焦锚缁楁岸鏌涙繝鍕毈闁哄矉缍佹俊鎼佸Ψ閵<CEA8> ?<3F> 喕绱旈梻浣呵圭<E591B5> ?涒晠骞愰崘鑼<E991BC> ?<3F> 婵ǹ娉涢獮銏℃叏濮楀棗骞橀柕鍫櫍<EE82A2> ?婅<> ?<3F> 娑甸崪浣告異濠电姭鎳囬崑鎾绘煟閻樺啿濮夐柛鐘崇<E99098> ?椤曪綁顢曢妶鍌氫壕婵炴垶顏伴幋婵冩灁闁跨噦鎷<E599A6> ?
2024-10-22 19:04:25 +08:00
}
return parts ;
}
2024-11-09 16:15:39 +08:00
// 濠电姵<E794B5> ?<3F> 栭崳<E6A0AD> ?<3F> 滃緤閹灛娑欐媴閻戞﹩鍋ㄥ┑鐘绘涧濞层劑鍩㈤弮<E388A4> ?熺厪闁割偅绻傞顓㈡煕閵堝拋鍎旈柡宀<E69FA1> ?到铻<E588B0> ?柍<> ?<3F> 鍓熼幃褎绻濋崒锕佲偓鍨归崗鍏肩稇闁活厽顨婇弻銊╂偆閸屾稑顏<E7A891>
2024-10-22 19:04:25 +08:00
int compareVersions ( const std : : string & version1 , const std : : string & version2 ) {
std : : vector < int > v1 = splitVersion ( version1 ) ;
std : : vector < int > v2 = splitVersion ( version2 ) ;
2024-11-09 16:15:39 +08:00
// 闂傚倷鑳堕幊鎾绘倶濮樿泛纾块柟鎯版閺勩儳鈧厜鍋撻柛鏇ㄥ亜閻濇﹢姊洪柅鐐茶<E99090> ?<3F> <> ?<3F> у 瓨鎱ㄦ繝鍌涜<E98D8C> ?<3F> 闁圭懓瀚版俊鎼佹晜閻愵剚<E684B5> ?<3F> 忛梻鍌欒兌缁垶銆<E59EB6> ?崨瀛樺亱濠电姴鍋婇懓鍨归崗鍏肩稇闁活厽顨婇弻锝<E5BCBB> ?<3F> <> ?<3F> 閿濆棭<E6BF86> ?<3F> ?梺鍛婃煟閸庣敻<E5BAA3> ??诲☉銏犵闁瑰鍎愬Λ锕傛⒑閸濆<E996B8> ??顥″瀛樻倐<E6A8BB> ?<3F> 炲棝<E782B2> ??崼鐔告闂佽法鍣﹂幏锟<E5B98F>
2024-10-22 19:04:25 +08:00
size_t maxLength = std : : max ( v1 . size ( ) , v2 . size ( ) ) ;
for ( size_t i = 0 ; i < maxLength ; + + i ) {
2024-11-09 16:15:39 +08:00
int num1 = i < v1 . size ( ) ? v1 [ i ] : 0 ; // 婵犵數濮烽。浠<E38082> ?焵椤掆偓閸熷潡鍩<E6BDA1> ?椤掆偓缂嶅﹪骞冨Ο 璇茬窞闁归偊鍓濋幗鏇㈡⒑閸︻厼顣兼繝銏★耿瀹曟繈濡烽埡鍌滃幈闂佸湱鍎ら崹鍫曀夊▎鎴犵< 婵°倐鍋撴い锕備憾閸┾偓妞ゆ帊鑳堕埊鏇㈡煥濮橆厾绡€闁逞屽墴椤㈡<E6A4A4> ?<3F> 宕奸悢鍛婄彨闁诲<E99781> ?<3F> 鍘滈崑鎾绘煕閹邦喖浜剧紓<E589A7> ?<3F> 咃攻缁绘盯骞<E79BAF> ??悙瀛樺創闂佺懓鍤栭幏锟<E5B98F> ?0
2024-10-22 19:04:25 +08:00
int num2 = i < v2 . size ( ) ? v2 [ i ] : 0 ;
2024-11-09 16:15:39 +08:00
if ( num1 > num2 ) return 1 ; // version1 婵犵數濮伴崹褰掓偉閵忋倕纾兼繝濠傛椤<EE979C> ?<3F> ? version2
if ( num1 < num2 ) return - 1 ; // version1 闂備浇<E58299> ?<3F> х 换鎰崲閹邦喗宕查悗锝庡墲婵娊鏌ㄩ悤鍌涘<E98D8C> ? version2
2024-10-22 19:04:25 +08:00
}
2024-11-09 16:15:39 +08:00
return 0 ; // 闂傚倷鑳剁划顖炪<E9A196> ?<3F> ?崨瀛樺亱濠电姴鍋婇懓鍨归崗鍏肩稇闁活厽顨呴—鍐偓锝庝簻椤掋垻绱掓担鍦弨闁哄<E99781> ?绋戦~ 婵<EFBD9E> ?倷椤掆偓椤忥<E6A4A4> ?
2024-10-22 19:04:25 +08:00
}
void Binary_Bit ( unsigned char * p_data , unsigned char position , int flag ) {
2024-11-09 16:15:39 +08:00
//婵犵數鍋涢悺銊у 垝瀹€鍕剹濞达絿鍎ゅ畷鍙夋叏濡炶浜鹃悗瑙勬礃瀹€鎼佸箠濠婂牊鍋ㄩ梻鍫熺☉缁傚繐鈹戦悙鑸靛涧缂佽尙鏅划鏃堝醇閺囩喎浠鹃梺<E9B983> ?曞墲缁<E5A2B2> ??帡鍩涢弽顓熺厾闁归棿鐒﹀☉<EFB980> ?<3F> 鏌h 箛鏃戞疁闁哄<E99781> ??鍊濆鍫曞<E98DAB> ?<3F> 鎼粹剝顏熺紓鍌欑劍濡垿骞忛敓锟<E69593> position婵犵數鍋為崹<E782BA> ?曞<> ?<3F> 娴e <E5A8B4> ?<3F> 娴<EFBFBD> ?柕濞у 懐顦梺鍛婄⊕濞兼瑩<E585BC> ?告笟鈧弻銊╂偆閸屾稑<E5B1BE> ?<3F> <> (婵犵數鍋涢顓熷垔閹绢喖绠柨鐕傛<E99095> ??0 闂佽瀛╅鏍窗閹烘纾婚柟鐐灱閺<E781B1> ?鑺ャ亜閺囩偞顥為悗<E782BA> ?<3F> 炬<EFBFBD> ?)
2024-10-22 19:04:25 +08:00
if ( flag ) {
* p_data | = 0x01 < < ( position ) ;
} else {
* p_data & = ~ ( 0x01 < < ( position ) ) ;
}
2024-10-24 16:01:21 +08:00
}
2025-01-24 16:11:49 +08:00
std : : string get_file_md5 ( const std : : string & file_path ) {
// 使用 md5sum 命令计算文件的 MD5 值
std : : string command = " md5sum " + file_path + " | awk '{ print $1 }' " ;
// 使用 popen 执行命令并获取输出
std : : array < char , 128 > buffer ;
std : : string result ;
std : : shared_ptr < FILE > pipe ( popen ( command . c_str ( ) , " r " ) , pclose ) ;
if ( ! pipe ) {
std : : cerr < < " Error: Unable to run md5sum command " < < std : : endl ;
return " " ;
}
// 从命令的输出流中读取数据
while ( fgets ( buffer . data ( ) , buffer . size ( ) , pipe . get ( ) ) ! = nullptr ) {
result + = buffer . data ( ) ;
}
// 去除末尾的换行符
result . erase ( result . find_last_not_of ( " \n " ) + 1 ) ;
return result ;
}