WLG/common/common_func.cpp
2024-11-08 17:18:45 +08:00

1793 lines
80 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "common_func.hpp"
#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>
#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>
#include <boost/xpressive/xpressive_dynamic.hpp>
#include <json/json.h>
#include <zlog.h>
#include "global.hpp"
#include "dbaccess/sql_db.hpp"
#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;
extern zlog_category_t *zct;
extern zlog_category_t *zbt;
std::string GetLocalTimeWithMs(void) {
std::string defaultTime = "19700101000000000";
try {
struct timeval curTime;
gettimeofday(&curTime, NULL);
int milli = curTime.tv_usec / 1000;
char buffer[80] = {0};
struct tm nowTime;
localtime_r(&curTime.tv_sec, &nowTime); //é—åšå€·é³å •ã€<C3A3>æ¿ å—æžæ¿žæˆ™åžºé<C2BA>…æ¿æŸ•é<E280A2>?濇å?„椤æ„?ç²™å?Šæ´ªî”—鈧î„粔瀵哥矆é¸â„ƒç¨é<E28099>“æ¬<C3A6>ç¹é<E280BA>«æ¿ˆä»¢éºå??åé<E28093>Œï½‰æ•<C3A6>æ¾¶å?åšé—<C3A9>å“„æœ?ç»æŽ”æ<E2809D>¢å©µå¬?礋椤愵澀ç»?梻浣割å<C2B2>”éºå¤Šç<C5A0><C3A7>é¡?å›?æ‚—ç‘™å‹?礃椤ㄥ﹥淇婇æœé˜å£©Ñ‡æŸå©Šâ¬é<C2AC>︿簺é—åšå€·ç»€ä¾€å¹é?<3F>ï¹€ç¸æ„­ç¥´é<C2B4>æ ¨ç¹éŽ´æ¬<C3A6>ç<EFBFBD>©é¸ã„¥å€¿éªžæ ?ÇŽé¡â¬æ¿¡ä»æŸ£éŽ¾îˆšäº¾é—<C3A9>è?²é?¸ç» å¶‰å´•é<E280A2>—ç<E28094>»æ´?敃é<C692>Œæ¶˜ä»¼é—侇剙绉甸æ¡é<C2A1>‡ãˆ¡ç…™é—<C3A9>î…¨ç®æ¾§îˆžæŸé”<C3A9>å?秺éºå²çµ¾éªžå©‡æŸé<E280BA>跨Фç¼<C3A7>ç¦å¯°å¯å¹‡é<E280A1>¨î£æ«<C3A6>é—ä¾€æ½§è‡Žé¸æ»€ç„¦å•¸ç¼åšå€¸é<C2B8>Šçƒ½æžé”•â¬é<C2AC>£å³°ÎŸç<C5B8>℃ç<C692>ƒé—<C3A9>å“„æ´¢é<C2A2>¨å½æ¡å©µå¬?煠濞æ<C5BE>é<E280A0>‰å½æŸç€£î£å´Œé¹î†¾å…˜é<CB9C>Œå¬æ•é<E2809A>™î?箓å?Šæ´ªå´¨æ¿ å‹?åšé—<C3A9>ç°åšéŽ·ï¿½
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 (...) {
zlog_error(zct, "GetLocalTimeWithMs failed, use default time");
return defaultTime;
}
}
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);
if (cd == 0) {
zlog_error(zct, "iconv_open failed");
return -1;
}
memset(outbuf, 0, outlen);
if ((int)iconv(cd, pin, &inlen, pout, &outlen) == -1) {
zlog_error(zct, "iconv failed");
iconv_close(cd);
return -2;
}
iconv_close(cd);
*pout = '\0';
return 0;
}
int InitGpio(unsigned int gpioN, unsigned int inout) {
int fd = 0;
char tmp[100] = {0};
//闂傚倷鑳堕幊鎾绘倶濮樿泛绠伴柛婵å‹?åŠœæ¤¤î£æ´Ÿé<C5B8>Œç†¸æ½<C3A6>鈺佲å<C2B2>“宄îµé—噿µ‡å®•åž?æ…¨éŽ¶èŠ¥å€¿é¿æžå€¸çº¾å<C2BE>—柟çºå“„î—žé¸ãƒ?剦é<C2A6><C3A9>å—æŸé<E280BA>‡ã„¥äº<C3A4>椤ユ繈姊洪å¹é<E28093><C3A9>æ<EFBFBD>å§·é—åšå«?瀚伴ã€<C3A3>é<EFBFBD>‡ãˆ¡æ™¸é¿ç‡æ?
fd = open("/sys/class/gpio/export", O_WRONLY);
if (-1 == fd) {
zlog_error(zbt, "open gpio export file error");
return 1;
}
//é—åšå€·é<C2B7>ï¹æƒ‡è¤°æŽåžçœç‰ˆå¸—é<E28094>î<E280B9>ˆæŸéŠ‰î†¼å¢»éºä½¸îƒ‰é<E280B0>Œï½‰æ™é<E284A2>?î‚?ç´¬io
sprintf(tmp, "%d", gpioN);
if (write(fd, tmp, strlen(tmp)) < 0) {
zlog_error(zbt, "write file operation error:%s", tmp);
close(fd);
return 2;
}
close(fd);
sleep(1);
//é—åšå€¸é<C2B8>Šçƒ½æžé”•â¬é¡?åž?Οé²â•ƒç…é—<C3A9>割å<C2B2>…娲橀å´é?<3F>å Ÿç…•é»æ„?彃é<C692>˜îœ¯oé—åšå€·ç»€ä¾€å¹é?<3F>﹀磹婵犳艾绠犻柟鎹愵嚙ç¼<C3A7>犳牠é<C2A0>Œã„©æ¤é<C2A4>Œæ¶˜î<CB9C>?
#ifdef G2UL_GATEWAY
char tmp2[100] = {0};
if (gpioN == 507)
memcpy(tmp2, "P18_3", 5);
else if (gpioN == 499)
memcpy(tmp2, "P17_3", 5);
else if (gpioN == 496)
memcpy(tmp2, "P17_0", 5);
else if (gpioN == 130)
memcpy(tmp2, "P9_0", 4);
else if (gpioN == 408)
memcpy(tmp2, "P6_0", 4);
else if (gpioN == 363)
memcpy(tmp2, "P0_3", 4);
else if (gpioN == 498)
memcpy(tmp2, "P17_2", 5);
else if (gpioN == 466)
memcpy(tmp2, "P13_2", 5);
else if (gpioN == 488)
memcpy(tmp2, "P16_0", 5);
else if (gpioN == 474)
memcpy(tmp2, "P14_2", 5);
else if (gpioN == 497)
memcpy(tmp2, "P17_1", 5);
else if (gpioN == 409)
memcpy(tmp2, "P6_1", 4);
else if (gpioN == 410)
memcpy(tmp2, "P6_2", 4);
else if (gpioN == 449)
memcpy(tmp2, "P11_1", 5);
else if (gpioN == 489)
memcpy(tmp2, "P16_1", 5);
sprintf(tmp, "/sys/class/gpio/%s/direction", tmp2);
#endif
#ifdef IMX6UL_GATEWAY
sprintf(tmp, "/sys/class/gpio/gpio%d/direction", gpioN);
#endif
zlog_info(zbt, "open GPIO = %s", tmp);
fd = open(tmp, O_WRONLY);
if (-1 == fd) {
zlog_error(zbt, "open gpio direction file error");
close(fd);
return 3;
}
if (inout == 0) {
zlog_info(zbt, "=====InitGpio=====in");
if (-1 == write(fd, "in", sizeof("in"))) {
zlog_error(zbt, "[%d]write operation direction error", gpioN);
close(fd);
return 4;
}
} else if (inout == 1) {
zlog_info(zbt, "=====InitGpio=====out");
if (-1 == write(fd, "out", sizeof("out"))) {
zlog_error(zbt, "[%d]write operation direction error", gpioN);
close(fd);
return 5;
}
}
close(fd);
return 0;
}
int gpio_set(unsigned int gpioN, char x) {
int fd = 0;
char tmp[100] = {0};
#ifdef G2UL_GATEWAY
char tmp2[100] = {0};
if (gpioN == 507)
memcpy(tmp2, "P18_3", 5);
else if (gpioN == 499)
memcpy(tmp2, "P17_3", 5);
else if (gpioN == 496)
memcpy(tmp2, "P17_0", 5);
else if (gpioN == 130)
memcpy(tmp2, "P9_0", 4);
else if (gpioN == 408)
memcpy(tmp2, "P6_0", 4);
else if (gpioN == 363)
memcpy(tmp2, "P0_3", 4);
else if (gpioN == 498)
memcpy(tmp2, "P17_2", 5);
else if (gpioN == 466)
memcpy(tmp2, "P13_2", 5);
else if (gpioN == 488)
memcpy(tmp2, "P16_0", 5);
else if (gpioN == 474)
memcpy(tmp2, "P14_2", 5);
else if (gpioN == 497)
memcpy(tmp2, "P17_1", 5);
else if (gpioN == 409)
memcpy(tmp2, "P6_1", 4);
else if (gpioN == 410)
memcpy(tmp2, "P6_2", 4);
else if (gpioN == 449)
memcpy(tmp2, "P11_1", 5);
else if (gpioN == 489)
memcpy(tmp2, "P16_1", 5);
sprintf(tmp, "/sys/class/gpio/%s/value", tmp2);
#endif
#ifdef IMX6UL_GATEWAY
sprintf(tmp, "/sys/class/gpio/gpio%d/value", gpioN);
#endif
zlog_info(zbt, "set GPIO = %s", tmp);
//闂傚倷鑳堕幊鎾绘倶濮樿泛绠伴柛婵å‹?åŠœæ¤¤î£æ´Ÿé<C5B8>Œç†¸æ½<C3A6>鈺佲å<C2B2>“å®„îµ valueé—åšå€·ç»€ä¾€å¹é?<3F>﹀磹ç¼<C3A7>å¬?5娲î<C2B2>…æ™²é¸æ¶±äº<C3A4>é<EFBFBD>Žå©šæ¢ºçºã„¥æ«<C3A6>é¹å‡¤æ·
fd = open(tmp, O_WRONLY);
if (-1 == fd) {
zlog_error(zbt, "[%s] open gpio export file error", tmp);
close(fd);
return (-1);
}
//闂備浇宕åž?慨宕å©çŸ†å¨´ï½ˆî<CB86>‰å¨…犲ùé<C2B9>˜å·?å„<C3A5>é¸å¬µäºªé<C2AA>Œæ¶¢åŸ„é<E2809E><C3A9>î<EFBFBD><C3AE>å?‡é—<C3A9>稿é<C692>”æˆ<C3A6>î<EFBFBD><C3AE>æ¿ æ°?醇黿—儤é<C2A4>涢梺褰掓交é¹å‡¤æ?
if (x) {
if (-1 == write(fd, "1", sizeof("1"))) {
zlog_error(zbt, "%d write operation value error", gpioN);
close(fd);
return (-2);
}
} else {
if (-1 == write(fd, "0", sizeof("0"))) {
zlog_error(zbt, "%d write operation value errorn", gpioN);
close(fd);
return (-3);
}
}
zlog_info(zbt, "gpio%d set %d ok", gpioN, x);
close(fd);
return 0;
}
int gpio_read(unsigned int gpioN) {
int fd = 0;
char value;
char tmp[100] = {0};
#ifdef G2UL_GATEWAY
char tmp2[100] = {0};
if (gpioN == 507)
memcpy(tmp2, "P18_3", 5);
else if (gpioN == 499)
memcpy(tmp2, "P17_3", 5);
else if (gpioN == 496)
memcpy(tmp2, "P17_0", 5);
else if (gpioN == 130)
memcpy(tmp2, "P9_0", 4);
else if (gpioN == 408)
memcpy(tmp2, "P6_0", 4);
else if (gpioN == 363)
memcpy(tmp2, "P0_3", 4);
else if (gpioN == 498)
memcpy(tmp2, "P17_2", 5);
else if (gpioN == 466)
memcpy(tmp2, "P13_2", 5);
else if (gpioN == 488)
memcpy(tmp2, "P16_0", 5);
else if (gpioN == 474)
memcpy(tmp2, "P14_2", 5);
else if (gpioN == 497)
memcpy(tmp2, "P17_1", 5);
else if (gpioN == 409)
memcpy(tmp2, "P6_1", 4);
else if (gpioN == 410)
memcpy(tmp2, "P6_2", 4);
else if (gpioN == 449)
memcpy(tmp2, "P11_1", 5);
else if (gpioN == 489)
memcpy(tmp2, "P16_1", 5);
sprintf(tmp, "/sys/class/gpio/%s/value", tmp2);
#endif
#ifdef IMX6UL_GATEWAY
sprintf(tmp, "/sys/class/gpio/gpio%d/value", gpioN);
#endif
//闂傚倷鑳堕幊鎾绘倶濮樿泛绠伴柛婵å‹?åŠœæ¤¤î£æ´Ÿé<C5B8>Œç†¸æ½<C3A6>鈺佲å<C2B2>“å®„îµ valueé—åšå€·ç»€ä¾€å¹é?<3F>﹀磹ç¼<C3A7>å¬?5娲î<C2B2>…æ™²é¸æ¶±äº<C3A4>é<EFBFBD>Žå©šæ¢ºçºã„¥æ«<C3A6>é¹å‡¤æ·
fd = open(tmp, O_RDONLY);
if (-1 == fd) {
zlog_error(zbt, "%d open gpio export file error", gpioN);
return (-1);
}
//闂備浇宕åž?æ…¨é<C2A8>‰æ‡¨æ´ªåŸ¡é<C2A1>œä½¹æ™ªé<C2AA>Ÿæ»„垿濡甸幇é<E280A1>—å Ÿæ«¢é—<C3A9>跨噦鎷� valueé—åšå€·ç»€ä¾€å¹é?<3F>﹀磹ç¼<C3A7>å¬?5娲î<C2B2>…æ™²é¸æ¶±äº<C3A4>é<EFBFBD>Žå©šæ¢ºçºã„¥æ«<C3A6>é¹å‡¤æ·
if (-1 == read(fd, &value, sizeof(value))) {
zlog_error(zbt, "%d read gpiovalue is fail", gpioN);
close(fd);
return (-2);
}
close(fd);
zlog_info(zbt, "gpio%d get %d", gpioN, value);
return value;
}
int config_uart(const char *port, int speed) {
int iFd = open(port, O_RDWR | O_NOCTTY);
if (iFd < 0) {
zlog_error(zbt, "open port:%s failed", port);
return -1;
}
struct termios opt;
tcgetattr(iFd, &opt);
cfsetispeed(&opt, speed);
cfsetospeed(&opt, speed);
if (tcgetattr(iFd, &opt) < 0) {
zlog_error(zbt, "tcgetattr failed");
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) {
zlog_error(zbt, "tcsetattr failed");
return -2;
}
tcflush(iFd, TCIOFLUSH);
return iFd;
}
int write_data(int fd, char *buff, int len) {
int ret;
ret = write(fd, buff, len);
if (ret < 0) {
zlog_error(zct, "write failed");
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) {
zlog_error(zct, "read_data failed");
return -1;
}
buff[ret] = '\0';
return ret;
}
int ModifyMac(char *buff) {
FILE *fp = NULL;
fp = fopen("/opt/system/mac", "w");
if (fp == NULL) {
zlog_error(zbt, "fail to open /opt/system/mac");
return 1;
}
fprintf(fp, buff);
fprintf(fp, "\n");
fclose(fp);
system("cp /opt/system/mac /opt/system/macbak");
system("/opt/Cidn/init.sh");
return 0;
}
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;
zlog_info(zct, "year = %d,month = %d,day = %d", iyear, imonth, day);
return tm_info;
}
int system_custom(const char *cmd, char *buf) {
FILE *fp;
int res;
char temp[1024] = {0};
if (cmd == NULL) {
zlog_error(zct, "cmd is NULL");
return -1;
}
if ((fp = popen(cmd, "r")) == NULL) {
zlog_error(zct, "popen error");
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) {
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);
// 闂備浇é?•Ñ…æ<E280A6>¢éŽ°î†½å´²é¹ç‰ˆæ¾˜é<CB9C>ä¾€æŸå?¥å§å<C2A7>_timeç¼åšå€¸é<C2B8>Šæ<C5A0><C3A6>å´<C3A5>é<EFBFBD>èŠ¥å€¿é¿æžå€¸ç» æ<C2A0>¿â”é<E28098>˜å´‡î•²é¸å©ç<E2809A>šéЇå¯å¼½éŠŠÑ€å§‡æ¿ æ®¿åž±éŽ¸æŠ½å¼»é<C2BB>”ç…Žç?²é¹æ<C2B9>¿ç<C2BF>šç¼<C3A7>堢紓浣风贰é¸ï½<C3AF>ç¶<C3A7>å??婚æ¢é<C2A2>樺ç<C2BA>°é—<C3A9>æ¥æ™é<E280BA>Ÿæ‰®ç²£é<C2A3>ƒå Ÿç…Ÿé»æ¨ºå•¿æ¿®å¤<C3A5>æŸé<E280BA>跨┘me_té—åšå€·ç»€ä¾€å¹é?<3F>ï¹€ç?椤愶附é<E2809E>å¤<C3A5>æŸ£éŽ¾å†²î†æ¿žæˆ™åž¹é¿ã†ä¿ŠéŠˆåšäº¾ç¼ä½ºåª´ç¼<C3A7>侀弻銊â•å<E2809A>†é¸å±¾ç¨é?<3F>�
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;
tm.tm_isdst = -1; // 婵犵數é<C2B8>çºå´¹é<C2B9>?曞ç?°é¸æ¿„儳é<C2B3>»æŸ§è¹‡ï½…亞ç¼<C3A7>犻ç®é<E28093>Œæ¶¢å¦·é?”ç…Žî<C5BD>?é—<C3A9>ç?¿îƒƒé<C692>”戦弻é<C2BB>‡ç†ºç?¾é–¸îŸ‘å––æ¿?è·ºâ”鈥冲级é¸åº¢å¨Šå©€ä¾€æ¢ºç¼<C3A7>橈ä¾é¸çŠ³ç‰ é<C2A0>©â?椤æŽ<C3A6>胶澧î<C2A7>…ã<E280A6>„é¡<C3A9>嫿š£éºä½¹æ<C2B9>‡é<E280A1><C3A9>æ»æ•“锟ï¿?
rtc_timestamp = mktime(&tm);
if (rtc_timestamp == -1) {
zlog_error(zct, "fail to mktime");
return "";
}
printf("RTC timestamp is %ld,millisecond = %d\n", rtc_timestamp, millisecond);
sprintf(timestamp, "%ld", rtc_timestamp);
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)) {
zlog_info(zbt, "root = %d", root.size());
for (size_t i = 0; i < root.size(); i++) {
hwVersion = root[i]["hw_vesion"];
for (size_t j = 0; j < hwVersion.size(); j++) {
datanodeUpdate.hwVersion.push_back(hwVersion[j].asString());
}
datanodeUpdate.strUpdataFileName = root[i]["fw_name"].asString();
datanodeUpdate.strSoftVersion = root[i]["sf_vesion"].asString();
zlog_info(zbt, "strUpdataFileName = %s, strSoftVersion = %s", datanodeUpdate.strUpdataFileName.c_str(), datanodeUpdate.strSoftVersion.c_str());
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);
std::string zigbeeChannel;
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());
for (size_t i = 0; i < dataNode.size(); i++) {
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);
int res = sqlite_db_ctrl::instance().InsertData(T_SENSOR_INFO(TNAME), insertSql);
if (res != 0)
{
zlog_error(zbt, "res:%d", res);
}
}
is.close();
}
void ImportConfig(std::string filename) {
Json::Value root, gateWay, dataNode;
std::fstream is;
Json::Reader reader;
int res = 0;
is.open(filename.c_str(), std::ios::in);
if (!is.is_open()) {
zlog_error(zbt, "fail to open:%s", filename.c_str());
return;
}
if (reader.parse(is, root) == 0) {
zlog_error(zbt, "fail to parse:%s", filename.c_str());
return;
}
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};
for (size_t i = 0; i < jsondataNodeArray.size(); i++) {
Json::Value valNode = jsondataNodeArray[i];
std::vector<std::string> vecDataNode;
for (size_t j = 0; j < valNode.size(); j++) {
vecDataNode.push_back(std::string(valNode[j].asString()));
}
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());
res = sqlite_db_ctrl::instance().InsertData(T_SENSOR_INFO(TNAME), insertSql);
if (res != 0){
zlog_error(zbt, "res:%d", res);
}
}
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());
}
int UpdataDataNodeConfig(std::string filename) {
std::vector<DataNodeInfo> vecDataNode; //婵犵數濮伴崹é<C2B9>Ÿå¸®è€¿é<C2BF>‰å åŠ<C3A5>娅犳俊銈åšäº¾é¸æ?…亶é<C2B6>Œç†ºâ?电ǹ浠чæŸ<C3A6>ç¼<C3A7>樻éºå±½ç§·é¡§ä¾€æŸéŽ¾å­˜çšç¼<C3A7>ç¦å?°å¯å¹‡é<E280A1>¨î£æ«†é—佸憡娲ï¹å´¢æµ å??箟é¼å§<C3A5>倗纾藉ùé”<C3A9>å ?嚃濞å ?絿绱æ»å´å¨æ¬æ®¤é—<C3A9>硅弓é<E2809C>—冲畷é<C2B7>—ç©æ?ˆæ¿¡îˆšæ™<C3A6>é<EFBFBD>‡ãˆ¡â绾æ‡<C3A6>褰хç´é<E28099>˜å†²ç<C2B2>¥é³è¯²ç§¹é<C2B9><C3A9>æ»æ•“锟ï¿?
//婵犵數é<C2B8>涢顓熸å<C2B8><C3A5>娴兼潙纾å<C2BE>—柟ç¼<C3A7>㈠櫘éºä½¸îƒ…霉é¸å¿“å<E2809C>ç¼<C3A7>戠ç´éˆ§î„„å´é<E28099><C3A9>寸厪濠㈣åŸé<E28093>©îˆšîžŠé¡•â¬é<C2AC>Œï½‰å¹˜ç€µåŠå™?é—<C3A9>逞屽å¢?椤旀牠宕伴弽é¡<C3A9>e床é—<C3A9>ç°î‡­é<C2AD>ç²â<C3A2>é<EFBFBD>˜ç»˜ç…¥éºå¨îš…æµœæƒ§îœƒéŠˆå—˜ç©¿ç¼å¶„線宕洪埀é¡ä½µäºœé¹çƒ˜åžµé¡<C3A9>â•俊é?<3F>ï½<C3AF>耿éºå±¾ç¯æ¿¡çƒ½î”é<E280BA><C3A9>æ<EFBFBD>?â‚?嶅銈嗗姧閹凤拷
std::ifstream csv_data(filename, std::ios::in);
int iRet = 0;
if (!csv_data.is_open()) {
zlog_error(zbt, "UpdataDataNodeConfig fail to open:%s", filename.c_str());
return -1;
}
std::string line;
std::vector<std::string> words; //婵犵數濮伴崹é<C2B9>Ÿå¸®è€¿é<C2BF>‰å åŠ<C3A5>娅犳俊銈åšäº¾é¸æ?…亶é<C2B6>Œç†ºâ?电ǹ浠чæŸ<C3A6>ç¼<C3A7>樻éºå±½ç§·é¡§ä¾€æŸéŽ¾å­˜çšç¼<C3A7>ç¦å?°å¯å¹‡é<E280A1>¨î£æ«†é—佸憡娲ï¹å´¢æµ å??箟é¼å§<C3A5>倗纾藉ùé”<C3A9>å ?嚃濞å ?絿绱æ»å´å¨æ¬æ®¤é—<C3A9>硅弓é<E2809C>—冲畷é<C2B7>—ç©æ?ˆæ¿¡îˆšæ™<C3A6>é<EFBFBD>‡ãˆ¡â绾æ‡<C3A6>褰хç´é<E28099>˜å†²ç<C2B2>¥é³è¯²ç§¹é<C2B9><C3A9>æ»æ•“锟ï¿?
std::string word;
DataNodeInfo dataNode;
// ------------闂備浇宕åž?æ…¨é<C2A8>‰æ‡¨æ´ªåŸ¡é<C2A1>œä½¹æ™ªé<C2AA>Ÿæ»„垿濡甸幇é<E280A1>‰è·¨å€žå?žã†å·»é<C2BB>æ»æŸ¡ç€£â•ƒçª”éºå²çµ½èžé³ÑŒå‰ŸéŽ®Ñ‡å´±å¨†æˆ ç„¾é—<C3A9>跨噦鎷ï¿?-----------------
// 闂備浇宕åž?æ…¨é<C2A8>‰æ‡¨æ´ªåŸ¡é<C2A1>œä½¹æ™ªé<C2AA>Ÿæ»„垿濡甸幇é<E280A1>‰è·¨å€žå?žã†å·»é<C2BB>æ»æŸéŽ°ã„¥äº¾é—å™ç„¦éŽ?堕崕娲î<C2B2>„ç¤ˆé¿æžå€¸å§¹å<C2B9>‰ã<E280B0>„é<E2809E><C3A9>î¢ä»¦é¸å¬?姵绻涢å¹é”<C3A9>嗙彧é»åº¢ç†¬éŽ·ï¿½
getline(csv_data, line);
std::istringstream sin;
// é—åšå€·ç»€ä½¸ï¹¢æ<C2A2>ˆã„§ä»šæ¿¡ç?倧闄å‹?繛濠å›?Υ娓氣å<C2A3>“æ? ç‚²îƒ‰éŽ®â•…å´˜é‘¼î„€é…±é—‚ä½½å´µæ¿?æ<>Ãºé”•ä½µäº¹é¸æ„µäºœç»¶ã‰æŸè¤Žé¡¨å—æ¡å¨æ¨<C3A6>彿•<C3A6>é<EFBFBD>儓å?žã<C3A3>ç¶€é<E282AC>愰埀é¡å†¾æ½<C3A6>é¹ç¢±å<C2B1>Šéªžå¿æ•“锟ï¿?
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());
if (words[19].find("8g") != std::string::npos) {
dataNode.Range = 0;
} else if (words[19].find("16g") != std::string::npos) {
dataNode.Range = 1;
} else if (words[19].find("32g") != std::string::npos) {
dataNode.Range = 2;
} else if (words[19].find("64g") != std::string::npos) {
dataNode.Range = 3;
} else if (words[19].find("50g") != std::string::npos) {
dataNode.Range = 0;
}
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;
}
char whereCon[1024] = {0};
char updateSql[1024] = {0};
for (size_t i = 0; i < vecDataNode.size(); i++) {
sprintf(updateSql, "featureInterVal='%d',waveInterVal='%d',range='%d',samplingRate='%d',AccSampleTime = '%d',viff ='%d' ,ZigbeePower = '%d',ZigbeeRetry = '%d',UpdateFlag = 0", vecDataNode[i].FeatureInterVal, vecDataNode[i].WaveInterVal, vecDataNode[i].Range,
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;
}
memset(whereCon, 0x00, sizeof(whereCon));
memset(updateSql, 0x00, sizeof(updateSql));
}
iRet = vecDataNode.size();
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);
if (!is.is_open()) {
zlog_error(zct, "fail to open: %s", filename.c_str());
return 1;
}
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"];
}
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) {
zlog_error(zct, "[GetLocalMac] fail to create socket");
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) {
zlog_error(zct, "mac ioctl error");
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]);
zlog_info(zbt, "net :%s, local mac:%s", net, mac_addr);
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))) {
zlog_error(zct, "[GetGwIp_] fail to create socket");
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) {
//zlog_info(zct, "[IpAddrInit] wlan0: %s", strip.c_str());
return strip;
}
strip = GetGwIp_(WLAN2);
if (strip.compare("0.0.0.0") != 0) {
//zlog_info(zct, "[IpAddrInit] wlan2: %s", strip.c_str());
return strip;
}
strip = GetGwIp_(ETH1);
if (strip.compare("0.0.0.0") != 0 && strip.compare("192.168.188.188") != 0) {
//zlog_info(zct, "[IpAddrInit] eth1: %s", strip.c_str());
return strip;
}
strip = GetGwIp_(ETH2);
if (strip.compare("0.0.0.0") != 0 && strip.compare("192.168.188.188") != 0) {
//zlog_info(zct, "[IpAddrInit] eth2: %s", strip.c_str());
return strip;
}
strip = GetGwIp_(ETH0);
if (strip.compare("0.0.0.0") != 0) {
//zlog_info(zct, "[IpAddrInit] eth0: %s", strip.c_str());
return strip;
}
strip = GetGwIp_(USB0);
if (strip.compare("0.0.0.0") != 0) {
//zlog_info(zct, "[IpAddrInit] usb0: %s", strip.c_str());
return strip;
}
strip = GetGwIp_(WWAN0);
if (strip.compare("0.0.0.0") != 0) {
//zlog_info(zct, "[IpAddrInit] wwan0: %s", strip.c_str());
return strip;
}
zlog_warn(zct, "[IpAddrInit] ip: %s", strip.c_str());
return strip;
}
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);
}
void ZoneConfig(std::string zoneid) {
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"};
for (size_t i = 0; i < sizeof(zonelists); i++) {
if (zoneid.compare(zonelists[i]) == 0) {
a = i;
zlog_info(zbt, "[ZoneConfig] zoneid:%s, a: %d", zoneid.c_str(), a);
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);
zlog_info(zbt, "change timezone success!");
}
std::string GetFileContent(std::string filename, int line) {
std::string strFileContent("");
std::ifstream ifileOut(filename.c_str());
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;
}
}
++i;
}
ifileOut.close();
return strFileContent;
}
// BOOSTé—åšå€·é³å •å´•é<E280A2>¢ç?¿ç£»é¹æ<C2B9><C3A6>绀夌â¬å¹¿å„±é¡¦ä»å¼?é<>¡æ?¼ç¯€å©µçŠ²å€»æ¾§æ ç´éˆ§î„„崱妯è©î†•é—<C3A9>糕å‰<C3A5>锚ç¼<C3A7>æ—ˆç®é<E28093>Œå¶ˆî™<C3AE>鏿´ç©å®•î”姘è©åŠ·é—Šî¢æ´¦ç»æˆ ç²»å?˜è¾¨å<C3A5>éŸ«å¨æ´˜é<CB9C><C3A9>滈æŸ<C3A6>è?œé<C593>“æ°?穱濠å›?Χé¸ãƒ®ç<C2AE><C3A7>éŠ<C3A9>ã†ç…Ÿæ¤¤æ´ç¹„ç»<C3A7>æ—ˆæŸŸé¡æ¬åŠ<C3A5>ç¼<C3A7>诲懘éŽ?å›?å¼´éŠ<C3A9>♀æºé—åšç‰ƒé<C692>…犲é?”界節閵忊埗é?<3F>å šâ?ï¹å´¶é¡â¬ç»€å†©ã<C2A9>„é<E2809E>ƒå§î—<C3AE>ç<EFBFBD>šæ¿æ¢»æµ£ç?¿î—<C3AE>é¸å??æ£<C3A6>宕伴幘ç‡å<E280A1>ラ柨é<C2A8>•åå«?
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;
// 闂備浇é?•Ñ…æ<E280A6>¢éŽ°î†½å´²é¹ç‰ˆæ¾˜ç» æŸ¥æŸéŽ´ï¸¿æ†¾æ¿?婃椽å¦?å†?埡é<C2A1>â¬å¶…â”é<E28098>˜î†¼ç<C2BC>¿æ°­ã<C2AD>„é?“炴喘瀹曟﹢顢欓挊澶å?Œç´¦é—‚備胶鎳撻崥鈧悹浣åœ?å<>€ç€¹æŸåž¿éªžæ©€å¼?銉ョå¢?é—佸憡渚楅崢娲î<C2B2>„礌éºå¶ŽåŽ½éˆ·æˆ¦æŸå¨æ©ˆå·¥ç¼<C3A7>æ?<3F>帗淇婇é”<C3A9>庢當é—<C3A9>伙絿é<C2BF><C3A9>樺畷é<C2B7>”碱敆娴i攱é<C2B1>žå?ç¹<C3A7>é<EFBFBD>¢é<C2A2>仦é¸ã„¥çˆ¼é<C2BC><C3A9>å??梺ç¼<C3A7>樻尰é¸ã„¥æ½¡å??诲澶娢ㄩ柨é<C2A8>åž®â”é»ï½†å„³éˆ¹æˆ¦æ™ç€æ?¼ç¨‡å©µâ˜†å<E280A0>…绻堥æ°é¡•â¬éªžå??敃鈧~é<C5BE>存煃éµå¤ˆå„³é”嶅ù婊愭å«? é—åšå€·é³å •å´éŠŠâ•<C3A2>磿é¼ç¢±å‰™é<E284A2>¨æ¿æŸé?<3F>犲ç<C2B2>±å©µî†½å¨Šé<C5A0>Œå¶‰å´<>•îŸå<C5B8>“ç™å²éµå <C3A5>æ?绠鹃柟瀵é•<C3A9>紳椤忓牊é<C5A0>åžæŸŸæ<C5B8>ˆé¹ƒæ??黿´ç¨éœ‰é¿æ¿†æ‡<C3A6>鎲æ<C2B2><C3A6>柟é<C5B8>£å±½âˆéºå²ç¹<C3A7>宕å<E280A2>žâŽè¹‡æ—亪é—ä½¹æ¶é<C2B6>”戠粻é<C2BB><C3A9>î…žæž<C3A6>é¹å‰§ç²¯é<C2AF>…æ<E280A6><C3A6>柨é<C2A8>•åå??
struct in_addr s;
iRet = inet_pton(AF_INET, mask.c_str(), &s);
// é—å™ç¤<C3A7>鎼î¦Ë‡é¬å¶…磿é¹ç‰ˆæ¾˜ç»€å Ÿæ…¨å§—嗗墰éºå—?箓é<E2809C>Œï¼„ä»¦ç‡æ<E280A1>å§Žç¼ä½ºå?´ç¼<C3A7>侀弻é<C2BB>”å…¼ç„½é¿æ—å<E28094>“å?¢ÑŒå–—銇勯銈å‘?æž…é<E280A6>Žæ®¿åé<E28093>奸崺锟犲磼濞戞艾å??è™?ç¹<C3A7>é<EFBFBD>¢é<C2A2>仩椤æŸç²“éªžå¿æ•“锟�1é—åšå€·é<C2B7>︾â¬ç¬å¯çŸ™é¹è¾¾é™„é<E2809E>Žæ?€ã€’å?˜ï½…亾å?žãƒåžºå®€æ<E282AC><C3A6>崺锟犲å·<C3A5>椤æ¶å<C2B6>éŽ¸ã‰æ¢ºé<C2BA>Ÿæ<C5B8>¿æé»ï½Žäº?宕彿<E28099>¹é<C2B9>¦î…Ÿå™®é—åšå€·ç»€ä¾€å¹é?<3F>︽å<C2BD>é¸â„ƒèé<E280B9>¥ã„¥î‡±éºå¤åž¹é<C2B9>ŒÑ‡æ¢ºé—ˆæ¶±æ§´éºå?粓宕曞澶å??厱é—<C3A9>规惌é<C592>˜ä»æƒ<C3A6>æµ å¬?â娓氣å<C2A3>“濞煎å?Šä»‹å´Ÿé?<3F>î¤å”µå©µâ˜†åž¯ç€ï¹æžæµ å??煥閻曞倹瀚�
if (iRet == 1) {
// 婵犵數é<C2B8>涢顓熸å<C2B8><C3A5>éºå¤åššç™åµæ§¹éŽ¼è¾¾çµ¿é¡¦îˆç¹<C3A7>éŠ<C3A9>f硾é»î„ƒå<C692><C3A5>æ¾¹æ¢å´—é²â•ƒç˜ˆæ¿ ç”µå§´é<C2B4>Šæ<C5A0><C3A6>å¼³é<C2B3>”兼煙é»ï½…è<>涢柡ç<C2A1>žè¯²â¬æ¿†ç•·é¡<C3A9>ï¹€ç¤æ¤¤æ„?åŽæµœé¹ƒæŸè¤Žé¡¨å°ç¹šé—<C3A9>ç°å<C2B0>é<E280B9>£î<C2A3>ˆå´¹å¨²î<C2B2>„ç£¿é»æ—‡å<E280A1><C3A5>é<EFBFBD>™æ»æŸéŠ‰ï½…å?¿æ¤¤ï½ˆå°™ç»±æŽ“笟é<C5B8>¥Ñ„ç<E2809E><C3A7>é—<C3A9>å“„çž¼é<C2BC> æ»å¹<C3A5>é<EFBFBD>˜è¯²ç„ºé¸æ„µäºžé<C5BE>㈤梺é½ã…Ð£é¸æ—€îšŠå®•伴幇顔剧煓濠㈣æ³é<E280BA>?è‚©å?•é<E280A2><C3A9>间繆椤栨ç¹é<E2809A>šå½æŸ£éŠŠãƒ®ç…¼éºå²çµ¾éŽ?æ—ˆå?€éˆ¶â•<C3A2>î<EFBFBD>Œæ¿¡ç?å€é<E28098>”岄ˇé<E280A1>—å ¢â”<C3A2>婵犲æµé<E2809A><C3A9>å?柣é<C2A3>ƒåœç¯€ç¼<C3A7>ㄥå?Šæ´ªå´¨æ¿ å‹?畵é»åº¢å‡¹é<C2B9> æ°¶å´°æ¿ å¨æ™¸é¿ç‡æ?
unsigned int addr = ntohl(s.s_addr);
// é—å™ç¤<C3A7>鎼î¦Ë‡é¬å¶…磿é¹ç‰ˆæ¾˜ç»€å Ÿæ…¨å§—嗗墰éºå—?箓é<E2809C>Œæ¶˜âŽè¹‡ï½†Ð¨é—<C3A9>å´‡ç²?å¦?å†?é<C2A3>«æŸå€·éºå¤åŸˆå¦?å—æ¢ºç庡啰é<C2B0>å“¥â¬æ®¿åé<E28093>奸崺锟犲磼濠хå<E280A6>“é¡?嶉梻浣虹《閺å‘?粓銆å†?崼銉ョ劦妞ã†å¸Šé³å •埊é<C5A0>‡ç†´äºœéµå¨¿å„³æ¾§ï¸½ã<C2BD>„éŠ<C3A9>$å??閹峰懘宕烽娑欑亙闂備浇娉曢崳锕傚ç??閿燂æ‹?
std::bitset<32> b((int)addr);
std::string strMask = b.to_string();
// 闂傚倷绀侀幖é?<3F>ã†å<E280A0>椤愶ç®çº¾å<C2BE>—æŸå¨†å¿£æ§ºé»æ¿ŠåŸæ·‡å©‡î”婵嗗惞å?žã晞ç<C5BE><C3A7>欓埀é¡â¬é<C2AC>˜æ»ˆå´éŽ¾ç»˜ç…•é¹æ<C2B9>¿å<C2BF>€ç»¨èŠ¥ã<C2A5>„é<E2809E>ƒâ?ç”?″î<C2B3><C3AE>娲î<C2B2>„å·<C3A5>婵犲倻é?å«â”é<E28098><C3A9>å·?槹閻╊垶骞冩ウ娆ç‚?Ьç¼å™ç·¡é<C2A1>£î‡€å´£é<C2A3><C3A9>æž<C3A6>é¸å²€å<E282AC>žé<C5BE>¤å<>„é<E2809E><C3A9>电稻é¼å“¥æ‡“鈹戦æ™é<E284A2>‰æˆ ä»¸é—<C3A9>ç°çš·é<C2B7>…犲畷éŠ<C3A9>ã…箚çœå?<3F>弸é<C2B8>ƒå Ÿç…¥é»æžå€¹ç€šï¿½"01"é—åšå€·é<C2B7>︾â¬ç¬å¯çŸ™é¹è¾¾é™„é<E2809E>¤æ„­ã<C2AD>„é<E2809E><C3A9>î?亼é³ÑŒå‰™é޳æ»Ë‡é<E280A1>¦î…å<E280BA>“娈垮枤é<C2A4>î<E280B9>…îšœé¡<C3A9>冨嵆é¸â”¾å<C2BE>“妞ã†å¸é<E28099>Šè<C5A0>¤ç²»é<C2BB>æ?¾ç††é<E280A0> å“„æ<E2809E>?顦柛瀣å°?閳藉î˜?鈻嶉è?Œç»¨å©šæŸ¨é<C2A8>‡æ¨ºç<C2BA>²æ¤¤ãˆ¡æ?ƒå®•奸æ¢é<C2A2>婄彨é—<C3A9>诲é?¸é<C2B8>˜æ»ˆå´éŽ¾ç»˜ç…•é¹é¦å޼é<C2BC>”ã†ç¹é<E280BA>«î¢ç<C2A2>¦æ¿?婃椽宕崟é?<3F>î¡æ£é—<C3A9>诲å?©ç»‹å ¥å¼²å¨‘樺ç¥?é—佸綊妫跨粈浣衡å<C2A1>“å?˜î„‰æ§¸æ¤¤î…¡æ³•鎹勬笟é?氬壉濠电å<C2B5>鎳庣æ<C2A3>¢å?—€å¯?婚æ•<C3A6>澶娢╅柕澶å <C3A5>労娴犲ã¸å§Šæ´ªæœéˆºä½¸â‰é—<C3A9>è<EFBFBD>¤å•™é<E284A2>潟é—<C3A9>å“„å•?é<>—嗙粻é”<C3A9>å¤ç…Ÿé¹é¦åž°é„è©ç´éˆ§î„â?nå—鈷戞ç¹é¼é¢<C3A9>嚙濞å®ç©é<C2A9>Œç†¼å´™éŠˆå——î<E28094>?
return (strMask.find("01") == std::string::npos);
}
return false;
}
int getSysIntValue(char *key) {
if (key == NULL) {
zlog_error(zct, "key is NULL");
return 0;
}
FILE *fp = NULL;
int value = 0;
fp = fopen(key, "r");
if (fp == NULL) {
zlog_error(zct, "could not open %s file", key);
return 1;
}
fscanf(fp, "%d", &value);
fclose(fp);
return value;
}
std::string GetSysStatus() {
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);
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;
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);
#ifdef IMX6UL_GATEWAY
char hardName[32];
char hardUse[32];
const char *getEmmcInfo = "df -h | grep /opt";
system_custom(getEmmcInfo, chRes);
sscanf(chRes, "%s%s%s%s%s", hardName, hardTotal, hardUse, hardFree, rateHardUse);
#endif
#ifdef G2UL_GATEWAY
getDiskInfo(hardTotal, hardFree);
#endif
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::Value jsData;
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());
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;
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;
}
// 闂備浇é?•Ñ…æ<E280A6>¢éŽ°î†½å´²é¹é¦å„µå¨æ?œæ—ˆåŸ€é¡å¬å<C2AC>©é»æˆ£å§¤é<C2A4>坿Ÿå©µå?劗閺å¬?牠å?Šè™¹æ<C2B9>„銊ユç<C2A6>¢é—<C3A9>ç°åšéŽ·ï¿?16é—å™ç¤<C3A7>鎼î¦Ë‡é?<3F>ï¹€ç¾æ¿ å©æ‡<C3A6>é<EFBFBD>?欓柟æ<C5B8>ˆå‰§ç•±éºå©å„²æ·‡å©‡å¦¶é<C2B6>殜é—<C3A9>ç?¿îƒ†éޏæ<C2B8><C3A6>埥澶娾枎濡îˆ<C3AE>å´µé<C2B5>†î…Ÿä¿Šé<C5A0><C3A9>î<EFBFBD>„â?æ ?å´¹éŽ¶èŠ¥å€¿é¿æ—å<E28094>“椤æ´?顢旈崼é?<3F>ï½†æ«Œå©µç¶æ<C2B6>ªç»²æŒŽç<C5BD>™ç¼ä½µåŠŠé<C5A0>ŽèŒ¬æ<C2AC>¢å¨ãˆ ç?£é–»æ„?潙纰嶉梺é<C2BA>¦î…æ¡é¸å¬?ï¹?銆佸î<C2B8><C3AE>棰濇晩é—<C3A9>兼亽é<C2BD>Žé<C5BD><C3A9>å´<C3A5>é<EFBFBD>å­˜â鏿¿†å??é<>†æ¬“æŸæ¿ åœç§ºé¹î‡€ç®é<E28093>Œå——î…¼é<C2BC>¡æ¤»å<C2BB>“é<E2809C>¨î¤ç?¾é¹å¯¸å<C2B8>ŸéŽ³æ„­ç¹é<E280BA>«ç†ºæ‡ƒé³è?„åž¿é<C2BF>©ãƒ©å´±å¦¤â?ç»?嶉悗瑙勬礃閸旀瑩å??î¦å¹˜ç¼<C3A7>樻櫢é—<C3A9>跨噦鎷�
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;
return 0; // 闂備浇é?•уùé<C2B9>è—‰æž<C3A6>婵犳艾é<C2BE>åž?ã<>„鎺嶈兌éµå—˜å¸¡é<C2A1>Œãˆã<CB86><C3A3>éŽºæ—æš?é—<C3A9>哄矉绻濆畷姗â¬é¡¢æ—ˆå´ŸéŽ´îˆœç§®éºå²ç¹<C3A7>宕ㄩéŠ<C3A9>犲Еé—ä½½î‡é<E28093>¨ä¼´å´¯é<C2AF>‰æˆ æš¦é»æ—âˆé<CB86><C3A9>冮柕é<E280A2>«æ¿‡î—žé¸çŠ³æ´œç»±æ»å´å¨†æˆ<C3A6>妽å?žãƒåŠ<C3A5>é<EFBFBD>”楅å¹<C3A5>瀣晲é¸ãƒ?ç…ˆå?¼ç†·â”é<E28098>˜ç»˜æ¶§æ¿žè?§é™„绂嶉妶澶å¬?厸é—<C3A9>ç¨¿æœ¬ç»æˆ¦î”šå?Šå¯ç£¼é³ÑŒå‰Ÿé<C5B8>©â?閿燂æ‹?0
}
// 闂備浇é?•Ñ…æ<E280A6>¢éŽ°î…§æ®½éŸ«å¨ç¨ç» îˆžæŸ¨é<C2A8>•åå??16é—å™ç¤<C3A7>鎼î¦Ë‡é?<3F>ï¹€ç¾æ¿ å©æ‡<C3A6>é<EFBFBD>?欓柟æ<C5B8>ˆå‰§ç•±éºå©å„²æ·‡å©‡å¦¶é<C2B6>殜é—<C3A9>ç?¿îƒ†éޏæ<C2B8><C3A6>埥澶娾枎濡îˆ<C3AE>å´µé<C2B5>†î…Ÿä¿Šé<C5A0><C3A9>î<EFBFBD>„â?æ ?å´¹éŽ¶èŠ¥å€¿é¿æ¿å¢½é<C2BD>?æ¬<C3A6>é¸é<C2B8>姈é¸ã†åž¿é<C2BF>Œã‰å´?銉︽毄é—<C3A9>é<EFBFBD>牜é<C593>£ï½…î<E280A6><C3AE>é“<C3A9>è§„å…œé¸æ»€ç¤<C3A7>娈æ„?â”é<E28098>˜î£å™°é¸å??æ<>‡é<E280A1>Œï½‰æ©é<C2A9><C3A9>æ<EFBFBD>î<E28099>Žé—<C3A9>哥姵鎹å¬å´ºéˆ§î„<C3AE>ã<EFBFBD>„鎺嶈兌é³îˆæ´˜éЇå¯å¦¸éŠ‰î†½Ð§æ¿žï½…æ´¤é”•î<E280A2>ˆã€<C3A3>å?—€æ¿?â‚?閻樺ç£?鈧剟å?Šè™¹æ†´é<C2B4>•é<E280A2>æ™±é—<C3A9>哥姵宀æ<E282AC><C3A6>幆宀å?晸閿燂拷
int hexStringToBytes(const char *hexStr, unsigned char *bytes, size_t bytesSize) {
size_t hexLen = strlen(hexStr);
if (hexLen % 2 != 0) {
zlog_error(zct, "hexLen:%d is odd", hexLen);
return -1; // Hexé—噿µ‡é?•Ñ…â¬æ¶æ™<C3A6>ç»?欓å¹å¦žå°å<E28093>“é<E2809C><C3A9>醇éµå?˜å—é<E28094>…ç´ç¹æ<E280BA>ˆå‰§åˆ°æ¿ â¬é?å¶…ç…<C3A7>éºå†¨ç‰Šé<C5A0>“æ¶¢æ˜é<CB9C><C3A9>é?<3F>åš™é¸æ—€ç²<C3A7>鎱ㄩæ•<C3A6>é<EFBFBD>¡æ?€î<E282AC>妤犵å<C2B5>žé<C5BE>—æ?€îŸ‡è¹‡æ¶˜ç?ˆçœå¿å¼³é<C2B3>˜ç”µç£½å¨´ï½‰æ½§æ¿?â‚?é»å¿“ç¹é<E28098>Ÿâ•…ç<E280A6>®è¹‡æ¶™å<E284A2><C3A5>é<EFBFBD> å§å¼¬éŠŠâ•ç…¥éºåšç<C5A1><C3A7>寤洪柨é<C2A8>‡ç²â¬å½æ¡é<C2A1>‡ãˆ¡å€µé¿æ¿†é?¸éªžæ ?柣鎾æ<C2BE>å?<3F>éºå²ç¹<C3A7>宕é<E280A2><C3A9>é<CB9C>”奉伓
}
if (bytesSize < hexLen / 2) {
zlog_error(zct, "bytesSize:%d < hexLen:%d", bytesSize, hexLen);
return -1; // 闂備浇é?•Ñ…â¬æ¶æ™<C3A6>ç»?欓å¹å¦žå°å<E28093>“é<E2809C><C3A9>â•<C3A2>ç·žé<C5BE>Žï½æ™<C3A6>ç» æ°?銈嗘尪閸ㄥ綊å??åŠç¬Ÿéˆ§î„„å¼»é<C2BB>”å°<C3A5>æž”é¸îŸå—é<E28094><C3A9>æ»æ¢ºå¨²è?²å¹æ¤¤æˆ<C3A6>å??婚æ•<C3A6>澶娢╅柕澶å <C3A5>労娴犲ã¸å§Šæ´ªæ£ƒå¨æ¬<C3A6>æ™å©µç²çœ°é<C2B0>”嶇ç²å®¥å<C3A5>潰瀹â¬éˆ§î„„æ¿éˆ§î„„柟é¹ç‰ˆå½§ç¼<C3A7>æ<EFBFBD>潡骞å?Žã<C5BD><C3A3>鎺æ¶å޽é—<C3A9>æ¥æ™é<E280BA>Ÿî¤ç²?鎺æ?<3F>ç…•æ¿¡îˆ<C3AE>崵澧î„ç´é<E28099>Œæ°±Ð§æ¥ ç´å¸¡å??î„„å´«é<C2AB>•î<E280A2>„î—šé—佽崵é<C2B5> æ´æ™¶å¦¤å†©å?»é¿ç†ºå§µé<C2B5>“欓柟é?–å——å•?é<>Šîˆšâ”é<E28098><C3A9>碘æ¡å¨´æ»Žäº?銆佸Δ浣瑰缂佸娉曢å´?æ<>´ã„¦â娴e憡é<C2A1>ŸçºæŸ¤ç™å?劤闇夌€瑰å??æ¾¹å??弸é<C2B8>ƒå Ÿç…™é<E284A2>Žç”µÇ¹è¢¥é—<C3A9>稿鎸æ<C2B8><C3A6>埥澶娾枎濡îˆ<C3AE>å´µé<C2B5>†îˆšâ”é<E28098>˜æ?¿æš¯æ¿¡æ<C2A1>å«°éªžå¿æ•“锟�
}
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;
}
return 0; // é—åšå€·é³å •幊鎾绘å<CB9C>¤éµå¨¾æ™ç»€å¤<C3A5>柡é<C2A1>¥â•<C3A2>æžé¸æ¬<C3A6>繘é<CB9C>Œã„©æ¤é<C2A4>Œæ¶˜î<CB9C>
}
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) {
// 闂備浇宕åž?æ…¨é<C2A8>‰æ‡¨æ´ªåŸ¡é<C2A1>œä½¹æ™ªé<C2AA>Ÿæ»„垿濡甸幇é<E280A1>‰è·¨å€žé—<C3A9>é<EFBFBD>Ä鈧弸é<C2B8><C3A9>î…Ÿâé—å Ÿç¨“æ¾§æ¢æ—å?˜î¢åµ†ç€¹æ æ•¸éˆ§î„Šç¶†é<E280A0> æ?…å´<C3A5>é<EFBFBD>?ç?¾é¹å¯¸å<C2B8>ŸéŽ³æ„­ç¹é<E280BA>«ç†æˆ¦å¦µé<C2B5>•ç?£æ¿ å©æ‡<C3A6>é<EFBFBD>㈤梺ç¼<C3A7>樹緱é¸çŠ³å²¸éªžæˆ¦å´Ÿé¡æ¶™å„?閻熸瑥瀚烽å´?é<>?ユâ娴e懙é<E284A2>¦î…Ÿå´²é¹è¾¾ç®çº¾å<C2BE>—柣鎾崇ç˜<C3A7>çœç‰ˆå¸éªžãˆ¡ç¹éŽ´çƒ†ç„½æ¤¤æ¿î˜?é¡?å†?妶æ<C2B6>´â€²èˆªé—<C3A9>åŠç¢é<C2A2>æ¶ç´“æµ£æ<C2A3>亾é»åº?綆é<E280A0> æ¥…æ¡å¨æ¨<C3A6>彿•<C3A6>é<EFBFBD>å<C3A5>é—<C3A9>åœ?æ™?濞â¬éºå²ç¹<C3A7>宕é<E280A2><C3A9>é<CB9C>”å?‰ä¼“
int byte;
sscanf(&hexStr[i], "%2x", &byte);
// 闂備浇é?•Ñ…æ<E280A6>¢éŽ°î†½å´²é¹é¦å„µå¨æ¨·æžŽé¹æ<C2B9><C3A6>æ«•æ<E280A2>ˆå ¥æ¢ºéŽ¸åº£ç®“æ¤¤ï¸»åž¶å??åŠç¬Ÿéˆ§î„„å¼»é<C2BB>”风æšé»æ?€ç‰ŠéŽ·è¾©ç´“æµ£é?Žè´°é¸ï½<C3AF>ç¶<C3A7>å??婚æ¢é<C2A2>樺ç<C2BA>°é—<C3A9>æ¥æ™é<E280BA>Ÿæ‰®ç²£é<C2A3>ƒå Ÿç…Ÿé»æ¨ºå•¿æ¿®å¤<C3A5>æŸé<E280BA>˜è™«å´Œé¸â”¾å<C2BE>“妞ã†å¸é<E28099>Šå½å¼³éˆºå®ç…™é¾å¿£å<C2A3>…ç<E280A6><C3A7>甸柤娲î<C2B2>ƒæ†¾ç€µî†¼îŸ·æ¿¡çƒ½æ•ƒéˆ§î„„å´œé?“㈡â鏿¶˜ï¹¤é<C2A4><C3A9>ï¹æŸ<C3A6>é<EFBFBD>Ÿä¼´æ¤IIé—噿µ‡é?•Ñ…â¬æ¶æ™<C3A6>ç»?欓å¹å¦žå°å<E28093>“é<E2809C><C3A9>醇éµå?˜å—é<E28094>…çºæ¢ºçºã„¥æ«<C3A6>é¹å‡¤æ?
asciiStr[j++] = (char)byte;
}
// 濠电姷é<C2B7><C3A9>æ<EFBFBD><C3A6>崕鎴犵礊é³ÑŒå‰šéЇå?å¼´é<C2B4>¡æ¥€î<E282AC>¸æ¬<C3A6>繘é<CB9C>Œï½‰å¹‡é¡•宿¯Œé—<C3A9>稿鎸æ<C2B8><C3A6>埥澶娾枎濡îˆ<C3AE>å´µé<C2B5>†î…Ÿä¿Šé<C5A0><C3A9>î<EFBFBD>„â?æ ?å´¹éŽ¶èŠ¥å€¿é¿æ¿å¢½é<C2BD>?æ¬<C3A6>é¸é<C2B8>姈é¸ã†åž¶éЇå¯å¹éŽ´æ¿ƒå<C692>“é<E2809C>¦î…<C3AE>焊濠é<C2A0>鈷戦æŸå©µå——î<E28094>´æ¿¡å<C2A1>‰æ¤½é<C2BD>Œæ¶¢æ©é“<C3A9>î¢ç£³å?žãƒåžºé<C2BA>—犻弫鎾绘晸é¿ç‡æ·
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);
gpio_set(GlobalConfig::GPIO_G.hardWatchDog, 1); //婵犲痉é<E280B0>‰åº“å<E2809C>“é<E2809C>‡ãˆ ç£¹çœç‰ˆå·»éˆ§î„Šç®“宕堕鈧弸渚â<>Œç†¼æ¢»çº¾å¬?厡é<C2A1>Žè§„挷绶氶弻è?ç» æ¶¢æ•<C3A6>é<EFBFBD>î„凹ç¼å™èƒ¶æ¿?电敮锟犲蓟é³â•<C3A2>å•°é<C2B0>Ÿç°â”é<E28098>˜æ<CB9C>暙椤忥æ?
if (0 > (fd = open("/dev/watchdog", O_WRONLY))) {
zlog_error(zbt, "fail to open /dev/watchdog");
}
return fd;
}
int WriteWatchDog(int fd) {
if (1 != write(fd, "0", 1)) {
zlog_error(zbt, "fail to feed watchdog");
return 1;
}
return 0;
}
std::string TrimStringLeft(const char *szData, const char *szTargets) {
std::string strData = szData;
int nPos = 0;
nPos = strData.find(szTargets);
while (nPos == 0) {
strData.erase(nPos, 1);
nPos = strData.find(szTargets);
}
return strData;
}
std::string TrimStringRight(const char *szData, const char *szTargets) {
std::string strData = szData;
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;
}
std::string GetOneContent(const char *szData, int nRow, const char *szSeparate) {
std::string strParam = "";
std::string strTemp = szData;
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);
}
strParam = TrimStringRight(strParam.c_str(), " ");
strParam = TrimStringLeft(strParam.c_str(), " ");
return strParam.c_str();
}
int set_opt(int fd, int nSpeed, int nBits, char nEvent, int nStop) {
zlog_info(zbt, "[set_opt] speed:%d, bits:%d, event:%c, stop:%d", nSpeed, nBits, nEvent, nStop);
struct termios newtio, oldtio;
if (tcgetattr(fd, &oldtio) != 0) { //濠电姷顣藉Σé<C2A3>æ<E280BA>磻é³ÑŒå‰Ÿé<C5B8>Œæ¶šâ?nå<C5BD>…ç<E280A6><C3A7>扮ç´ç¼<C3A7>樼洴瀵爼骞å¬?é<CB9C><C3A9>æ<EFBFBD>î—é—佽崵é<C2B5> æ„?úé<C2BA><C3A9>涘â”é<E28098>¡æ¬<C3A6>殾é—<C3A9>挎ç¹é¡¦ä¼´å¼²é<C2B2>Œãƒ¦ç…•é³â•<C3A2>åšé<C5A1>æ´?柨é<C2A8>‡ç²â¬å½æ¡é<C2A1>‡ç†¸å<C2B8><C3A5>濡æ<C5A1>«éˆ·æ—ˆæŸ£é”<C3A9>å œå<C593>«é¹å<C2B9>‰æéŽ®Ñ‡å´¼éŠ<C3A9>犲绩é—ä½½î‡é<E28093> æ åˆå¨†æ³æž<C3A6>é¹å‰§ç²¯é<C2AF>…æ<E280A6><C3A6>柨é<C2A8>•åå??
zlog_error(zbt, "tcgetattr fail");
return -1;
}
bzero(&newtio, sizeof(newtio));
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;
switch (nBits) {
case 7: newtio.c_cflag |= CS7; break;
case 8: newtio.c_cflag |= CS8; break;
default:
zlog_error(zbt, "invalid nbits:%d", nBits);
break;
}
switch (nEvent) {
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;
default:
zlog_error(zbt, "invalid event:%c", nEvent);
break;
}
switch (nSpeed) //闂備浇宕åž?慨宕å©çŸ†å¨´ï½ˆî<CB86>‰å¨…犲ùé<C2B9>˜å·?å„<C3A5>é¸å¬µäºªé<C2AA>Œæ¶¢åŸ„é<E2809E><C3A9>︿粶é—<C3A9>哄é<E280A0>—犻弻é<C2BB>‡ï¼„ç€é<E282AC>Žï½Žäºžæµ ç…ŽîœƒéŠˆå†¨åŠœæ¤¤ã„¥ï¹ªå¯?婚æ•<C3A6>é<EFBFBD>î<E280BA>„牚é—<C3A9>å½å<E28099>Šé<C5A0>˜å¥¸î””锟ï¿?
{
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);
zlog_error(zbt, "invalid speed:%d, use B9600", nSpeed);
break;
}
if (nStop == 1) //闂備浇宕åž?慨宕å©çŸ†å¨´ï½ˆî<CB86>‰å¨…犲ùé<C2B9>˜å·?å„<C3A5>é¸å¬µäºªé<C2AA>Œæ¶¢åŸ„é<E2809E><C3A9>î<EFBFBD><C3AE>æ?ˆç¼<C3A7>惧墽ç»?æ<C593>¢å©µå©ç¯€é¸å±¾å‡¹æµ¼å²„梺é<C2BA>婃尰é¸åº¢å¨Šå©€ä¾€æ¢ºéŽ¸åº£ç®“ç¼<C3A7>绘垹鈧î„<C3AE>熬鎷�
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);
if ((tcsetattr(fd, TCSANOW, &newtio)) != 0) {
zlog_error(zbt, "tcsetattr fail");
return -1;
}
return 0;
}
void IniReadValue(const char *section, const char *key, char *val, const char *file) {
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) {
zlog_error(zbt, "fail to open %s", file);
return;
}
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;
}
}
fclose(fp);
if (!bFoundSection) {
zlog_error(zbt, "No section = %s", section);
} else if (!bFoundKey) {
zlog_error(zbt, "No key = %s", key);
}
}
int readStringValue(const char *section, const char *key, char *val, const char *file) {
zlog_info(zct, "section = %s, key = %s, file = %s", section, key, file);
if (section == NULL || key == NULL || val == NULL || file == NULL) {
zlog_error(zct, "input parameter, section:%s, key:%s, val:%s, file:%s exist NULL", section, key, val, file);
return -1;
}
char sect[SECTION_MAX_LEN];
memset(sect, 0, SECTION_MAX_LEN);
sprintf(sect, "[%s]", section);
IniReadValue(sect, key, val, file);
return 0;
}
int readIntValue(const char *section, const char *key, const char *file) {
char strValue[STRVALUE_MAX_LEN];
memset(strValue, '\0', STRVALUE_MAX_LEN);
if (readStringValue(section, key, strValue, file) != 0) {
return 0;
}
return (atoi(strValue));
}
void IniWriteValue(const char *section, const char *key, char *val, const char *file) {
FILE *fp;
char lineContent[LINE_CONTENT_MAX_LEN];
char strWrite[LINE_CONTENT_MAX_LEN];
bool bFoundSection = false;
bool bFoundKey = false;
int err = 0;
memset(lineContent, '\0', LINE_CONTENT_MAX_LEN);
memset(strWrite, '\0', LINE_CONTENT_MAX_LEN);
sprintf(strWrite, "%s=%s\n", key, val);
fp = fopen(file, "r+");
if (fp == NULL) {
zlog_error(zct, "fail to open:%s", file);
return;
}
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;
}
}
fclose(fp);
if (!bFoundSection) {
zlog_error(zct, "No section = %s", section);
} else if (!bFoundKey) {
zlog_error(zct, "No key = %s", key);
}
}
int writeStringVlaue(const char *section, const char *key, char *val, const char *file) {
// char sect[SECTION_MAX_LEN];
zlog_debug(zct, "section = %s, key = %s, file = %s", section, key, file);
if (section == NULL || key == NULL || val == NULL || file == NULL) {
zlog_error(zct, "input parameter(s) is NULL!");
return -1;
}
// memset(sect, 0, SECTION_MAX_LEN);
// sprintf(sect, "[%s]", section);
IniWriteValue(section, key, val, file);
return 0;
}
int writeIntValue(const char *section, const char *key, int val, const char *file) {
char strValue[STRVALUE_MAX_LEN];
memset(strValue, 0, STRVALUE_MAX_LEN);
sprintf(strValue, "%d", val);
writeStringVlaue(section, key, strValue, file);
return 0;
}
int getDiskInfo(char *diskTotal, char *diskFree) {
DISK diskInfo;
/* 1.闂傚倷绀侀崥瀣磿閹惰æ?„æ<E2809E>´å©‡æŸ¤é¹æ‰®å ?娴滃綊é<C5A0>Œã„©æ¤é<C2A4>Œæ¶˜î<CB9C>?/home/婵犵數é<C2B8>çºå´¹é<C2B9>?曞ç?°é¹é—´ç·¡é<C2A1><C3A9>å«îŸ¿çºè¡¡çœé»æŽ•æ£„éœ‰é»æ³æµ·éŽ½çŠ»æŸæ<E280BA>´ï¼„Чéºå±¾ç?å¯?æ’?妸銉ュç?£é—‚佺ǹé?å—å¹<C3A5>楣冨ç??黿¨ºæ¨Šé<C5A0>Ÿå<>„é<E2809E>åž?悑濞å‘?ç§¹å?Šå?šå´’娆愮グå?žã†æ´˜ç»®æ»ç<C2BB>®è¹‡æ¶™æ™¸é¿ç‡æ· */
statfs("/", &diskInfo);
unsigned long long blocksize = diskInfo.f_bsize;
unsigned long long totalsize = blocksize * diskInfo.f_blocks;
/* 2.闂傚倷绀侀崥瀣磿閹惰æ?„æ<E2809E>´å©‡æŸ¤é¹æ‰®å ?娴滃綊é<C5A0>Œæ¶¢å¦·é”<C3A9>å­îžé—<C3A9>崇粯å¦?å†?å¼»å?¥å «æª¨é—<C3A9>åŠæŒ»å§˜ã„§åˆå¨†æ„?ç·žé<C5BE><C3A9>çµÇ¹æµœé¹ƒæŸ¨å©µå—™å‡¹ç¼<C3A7>ㄥé<C2B7>Œå¶‰æŸ¨ç€£î„€â…¹é—å§î˜µé<C2B5>Œã„¥â”é<E28098>¡æ©†æ£¤é—<C3A9>ç°å•¿éŽ³æ©€å¼»å?¥å›¨å–†é–¸æ›¨åŽ¼éˆ·å±½â”‘é?”硷工椤嘲顕i崼é<C2BC>‡çµî…ºé—<C3A9>绘劕妯婃å?¼é<C2BC>å­˜â娴e憡é<C2A1>ŸçºæŸ£é<C2A3>•佸ç<C2B8>¦ç€¹æžç¶Šéªžåº¨æŒŠæ¾¶å??â‚?梺闈涚墕濞层劑éŽ?å±½î<C2BD><C3AE>顓犵é<E280A2>Žç°å?Šé<C5A0> æ èбæ¿åŠç…¥æ¿žæˆžè‰¾é<C2BE>涢柡宀å¬?ç§?å©µâ„ƒææ¿¡çƒ½å¦·é¡”绘å<CB9C>…é—å™ç·šå¨¼ÑƒÃºéŠˆå<CB86>¤æ´ªå¦¸é””绢洸é—<C3A9>彿£¿é<C2BF>ï¹å¼²éŽ¼ä½¹ç…¥é»æžå€¹ç€šï¿½ */
unsigned long long freeDisk = diskInfo.f_bfree * blocksize; //闂傚倷绀侀幉锟犲ç?°é¹ç»¢åé<E28093>¤ç¬ç¹é<E280BA>¡æ¨ºç<C2BA>©ç¼<C3A7>â¬æ¿ å¨ç…™é<E284A2>Žç”µÇ¹å•¸é—<C3A9>活厽纰嶇æ<E280A1>¢å¨æ©†å•…椤旇崵é<C2B5>彿¢ºéŽ¸åº£ã€é¸çŠ³ç‰ å¯?婚æ•<C3A6>澶娢╅柕澶å <C3A5>労娴犲ã¸å§Šæ´ªæ£ƒå¨æ¬<C3A6>æ™å©µç²çœ°é<C2B0>”嶇ç²å®¥å?Šç?¹å¨´ï½ˆî<CB86>‰å¨…㈤梺çºã„¥æ«<C3A6>é¹å‡¤æ?
// unsigned long long availableDisk = diskInfo.f_bavail * blocksize; //é—åšå€·ç»€ä¾€å¹‰é”Ÿçгå<C2B3>¡æ¤¤æ «å<C2AB>é<E280BA>¨åžæŸŸéŽ?版閺å?©ç·šé<C5A1>Œæ¢å´¼å©µå§çªé—<C3A9>活厽纰嶇æ<E280A1>¢å¨æ©†å•…椤旇崵é<C2B5>彿¢ºéŽ¸åº£ã€é¸çŠ²é…£éˆ¥ï¹å´¸å¦¤â±å¬æŸéˆ©å†¾æ®”éºå—™å<C3A5>鎱ㄩæ•<C3A6>蹇æ¿î<C2BF>?
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;
while (nleft > 1) {
sum += *w++;
nleft -= 2;
}
if (nleft == 1) {
*(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) {
zlog_info(zct, "socketHeart");
int sockfd; // Socketé—åšå€·ç»€ä¾€å¹é?<3F>﹀磹ç¼<C3A7>å¬?5娲î<C2B2>…æ™²é¸æ¶±äº<C3A4>é<EFBFBD>Žå©šæ¢ºé—ˆæ¶šç®žé¸å©ƒæ´œç»?婚æ½é<C2BD><C3A9>ュ彄é—<C3A9>æ<EFBFBD>žå„¯é<C2AF>”忔竟å?—â¬é<C2AC>Œï½…Δ浣圭殤ç¼ä½½é²¸ç”?掕ç<E280A2>ƒé»åº¯ç¶†é<E280A0>å?锟ï¿?
struct sockaddr_in serverAddr {}; // Serveré—åšå€·ç»¶æ°?濠æ°?â”鏿¨å<C2A8>é<E28099>”嗘俊é?æ¬î„Ÿé»æŽ<C3A6>ç²™é<E284A2>Œæ¶¢å¹‡é<E280A1><C3A9>å“¥æ•ç¼<C3A7>ç¬å„³éŠˆæ<CB86><C3A6>å¼»é<C2BB>”ç…Žç®šçœæ»ˆå´µé<C2B5>”å…¼ç…ƒçœæ»ˆå´œé”•åšåžé—<C3A9>秴绠æŸå¨æ?¼æ éºå®æé<E2809A>Œã„©æ¤é<C2A4>Œæ¶˜î<CB9C>?
// 闂傚倷绀侀幉锛å‹?暜濡ã…å•°é<C2B0>?欓柟瀵ç?¿Ð¥ç»¾å<C2BE>¥ç²™é<E284A2>Œç†ºç´å¦¯è©æ½‰cket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
zlog_error(zct, "Failed to create socket.");
return 1;
}
// 闂備浇宕åž?慨宕å©çŸ†å¨´ï½ˆî<CB86>‰å¨…犲ùé<C2B9>˜å·?å„<C3A5>é¸å¬µäºªé<C2AA>Œæ¶˜â”é<E28098>«æ¿ˆâ¬ç€veré—åšå€·ç»¶æ°?濠æ°?â”鏿¨å<C2A8>é<E28099>”嗘俊é?æ¬î„Ÿé»æŽ<C3A6>ç²™é<E284A2>Œæ¶¢å¹‡éŠŠï¸½ç<C2BD>é—<C3A9>崇懓绉å½å¼»å®¥å?Šç…›å¨´ï½…憡娈ㄧ紓浣瑰敾閹凤拷
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(18393); // TCP婵犳î†é<E28093> æ¥ƒæ•®å¦¤å†ªçŸ™é¹çƒ˜æŒ¾æµ æ°­ä¿Šé<C5A0><C3A9>î<EFBFBD>„â¬æ ?广µ£å“¥æš¦é»ãˆ¤æ½§é<C2A7>¨æ¿æŸ<C3A6>é<EFBFBD><C3A9>å¬åª¼éºä½¸ç§µéŽ±ã„¥î<C2A5>œé<C593>¡æ¥€î<E282AC>?ç¼ä½¸îƒ…顦é<C2A6>î<E280BA><C3AE>娲î<C2B2>„å·<C3A5>婵犲å??é<>£îˆšâ”é<E28098><C3A9>存尭濠â¬é?å¶…ç??çœç‰ˆå¸—é<E28094>…æ<E280A6><C3A6>柨é<C2A8>•åå«?80
inet_pton(AF_INET, "192.168.1.147", &serverAddr.sin_addr);
// é—å™ç¤<C3A7>鎼î¦Ë‡é?<3F>ï¹€ç¾æ¿ é<C2A0>纾å?šæŸ£éŽ°î„ä»éºå—˜ç²“é<E2809C>Œç†ºç´éŠ<C3A9>犳ç<C2B3>ˆç¼ä½²å<C2B2>“é¸â„ƒç¨é<E28099>“熺憸æ<C2B8>´ï½†î<E280A0>•ç»¾ç¬æ½³er
if (connect(sockfd, reinterpret_cast<struct sockaddr *>(&serverAddr), sizeof(serverAddr)) == -1) {
zlog_error(zct, "Failed to connect to the server.");
close(sockfd);
return 1;
}
// é—åšå€·ç»€ä¾€å¹‰é”Ÿçгå<C2B3>¡é¿æžå€¸é<C2B8>¨åžæŸè¤Žé¡¨å´æžé<C5BE> äºœé¹è¾¾çµ¾çº­èˆµã<C2B5>„锔煎î?ç¼<C3A7>辨帡宕î¦å´Ÿé¡<C3A9>熸å¯é—佸湱鎳æ¶â?æ°?å<>³éªžæ <><C3A3>鎺濇æ™<C3A6>é—<C3A9>挎ç¹å¦«î…¢å´¯éˆ§î„„梻é<C2BB>Œæ¬å…Œæ¤¤ãˆ ï¹?顢氶弽é?“çµç<C2B5>¥é—<C3A9>å“„ç¨<C3A7>é<EFBFBD>â¬é¸å??挾é<C2BE> å©ƒå¾„瀣î<C2A3><C3AE>ä¼?
ssize_t bytesSent = send(sockfd, pSendData, strlen(pSendData), MSG_NOSIGNAL);
if (bytesSent == -1) {
zlog_error(zct, "Failed to send heartbeat packet.");
close(sockfd);
return 1;
} else if (static_cast<size_t>(bytesSent) != strlen(pSendData)) {
zlog_error(zct, "Partially sent heartbeat packet.");
close(sockfd);
return 1;
}
// é—åšå€·é³èˆµç<C2B5>™ç¼ä½ºç²?é<>¨å‰<C3A5>æ<EFBFBD>¢å¨æ¬ç¯€é¸å??å§¤ç»æ»å´°æ¿ å§ç…黿»…â¬æ”…té—å™ç¤<C3A7>鎼î¦Ë‡é?<3F>ï¹€ç¾æ¿ é<C2A0>纾å?šæŸ£éŽ°î„ä»éºå—˜ç²“é<E2809C>Œã„©æ¤é<C2A4>Œæ¶˜î<CB9C>
close(sockfd);
return 0;
}
// Pingé—åšå€·ç»€ä¾€å¹‰é”Ÿçвåžé¸å¿“å<E2809C>é<E280B9>™å¿æŸ•é<E280A2>?æ¿<C3A6>槸æ¿?è§„ç…¡é<C2A1>Œï½‰å¼?é<>?å€?é—<C3A9>å“„æé<E280B9>“ç†¼å¹ƒå¦¤å­æ<C2AD>¶æ¤¤æ¶å<C2B6>˜å§˜î“eout婵犵數é<C2B8>çºå´¹é<C2B9>?曞ç?²é¸ãƒ¢æ™<C3A6>纾芥慨妯夸å<C2B8>«é»î…Ÿæ<C5B8>‡é<E280A1>Œç†ºç´éŠ<C3A9>犳ç<C2B3>ˆç¼ä¾‡å<E280A1>„绉å½å¼»éŠˆå©çŸ™é<E284A2> æ<C2A0>åŠç»®é<C2AE>銇ç¤<C3A7>娲ï¹åŸéŽºæ?<3F>ç…•é<E280A2><C3A9>ç²å¢½ç» æ ?æ†¸éŽ¶å©æ‡<C3A6>纾奸弶é<C2B6>«æ¶˜å?¿ç¼<C3A7>犵å<C2B5>Ÿéˆ§î„ƒî<C692>‰å¨²â•ƒæ<C692>¢å©µå—©åš•éºå¤åŸˆå¨¼â•…å¼¶é<C2B6>«æ°?æš•éµå¿å€éˆ·æˆ¦æŸå©µå——î<E28094>©æ¤¤å¿£å<C2A3>…淇婇銈庢敵,10000 濠电姵é?”æ ­å´³é?–滅礊閸℃稑纾å?šæŸéˆ©å†¨å•ç¼å¶†ç‰ é<C2A0>Œã„©æ¤é<C2A4>Œæ¶˜î<CB9C>¶=10 ç¼åšå€¸é<C2B8>Šé£Žç²ˆæ¸šâ¬ç¯“é³ÑŒå‰Ÿé<C5B8>Œç†¼å´™éŠˆå——î<E28094>?
//é—åšå€·é³å •幊鎾绘å<CB9C>¤éµå¨¾æ™ç»€å¤<C3A5>柡é<C2A1>¥â•<C3A2>æžé¸æ¬<C3A6>ç¹ç»»æ¶¢å¹å¨†å¿•仾é—<C3A9>å“„æé<E280B9>“氶幈銊ノ熼æ<C2BC>¹é<C2B9>§å“¥ç¤Šç¼å™èƒ¶æ¿?甸悡锟犲蓟濞戙垹å”?妞ã†ç‰—ç»æˆ¦î””锟�0é—åšå€·é<C2B7>︾â¬ç¬å¯çŸ™é¹è¾¾é™„é<E2809E>¤æ„­ã<C2AD>„é<E2809E><C3A9>î?仜å?—å´æ¢ºé<C2BA>Ÿé¦åšŸå©µî†¾æ•¸éˆ§î„<C3AE>艾é¡?烽弻é<C2BB>‡ç†·ç·žæ¿¡îˆ<C3AE>æ?£æµ îˆœç´“æµ£ç°å§ˆæ¤¤ã„¥ï¹¤é¡•i崼é<C2BC>‡çµåޏé—<C3A9>ç?¿æœ¬ç»æ»å´£é<C2A3>¡æ¤»æ”½é»æ„°îé<E2809A>¤å¬?柟é<C5B8>ã†å??1é—åšå€·é³å •ã€<C3A3>æ¿ å§ç?µæ¤¤å¿“牆绠柨é<C2A8>•åå??-1
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;
// 闂備浇宕åž?æ…¨éŽ¶èŠ¥å€¿é¿æžå€¸çº¾å<C2BE>—柟éŽ?æ<>¿Ð“é¸å¬§æ™<C3A6>ç»±æ³î…¼æ<C2BC>´ãˆ¡î<C2A1>£å©µçŠµæ•¸é<C2B8>Žæˆ å¾Šé˜å?<3F>æ´ªæ©ç‡èŒ?î˜?婵犻潧娲らé–?嶆煥閻曞倹瀚�
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(ips);
int sockfd;
// é—åšå€·ç»€ä¾€å¹‰é”Ÿçгå<C2B3>¡é¿æžå€¹é<C2B9>å¬?柡é<C2A1>¥â•<C3A2>У椤æ„?ç²™é<E284A2>Œï½‰î””é<E2809D>åæºˆket 闂傚倷绶æ°?è?<3F>èžžé¹ç»¢å绠柨é<C2A8>•åå«? 婵犵數濮烽。浠å¬?焵椤掆å<E280A0>“é¸ç†·æ½¡é<C2A1>©â?椤掆å<E280A0>“ç¼å¶…﹪骞冨Οç‡èŒ¬çªžæ¿ ç”µå<C2B5>Ÿé<C5B8>æ»æ¡éŠ<C3A9>ã†â黿„¯æ£„é<E2809E>”æ°¶æŸé<E280BA>”é”å<E280B9>¥é¿æ¿ˆå<CB86>¤è·?ç¼<C3A7>犲垼o é—å™ç¤<C3A7>鎼î¦Ë‡é?<3F>ï¹€ç¾æ¿ å©ç‰Šé<C5A0>ï¿ æŸ<C3A6>é<EFBFBD><C3A9>å?噹闂傤垶姊洪崹é?•呭剰å?žã†æ´<C3A6>椴æ<C2B4><C3A6>幈銊ヮ潨é¸â„ƒîš…ç» å½æ¶å?˜î…žå“ºæ¿®å©„粯鎷å¯ç²™çºã„¦î†<C3AE>é—佺懓é<E2809C>¤æ ?å¹<C3A5>锟ï¿?
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (sockfd < 0) {
zlog_error(zct, "ip:%s,socket error", ips);
return -1;
}
struct timeval timeo;
// 闂備浇宕åž?æ…¨éŽ¶èŠ¥å€¿é¿æžå€¸çº¾å<C2BE>—柟éŽ?æ<>¿Ð“é¸å¬§æ™<C3A6>ç»±æ³î…¼é<C2BC>¥îŸéª<C3A9>meOuté—åšå€·ç»€ä¾€å¹é?<3F>ï¹€ç?椤愶附é<E2809E>å¤<C3A5>æŸ£éŽ¾å†²î†æ¿žæˆ™åžºé<C2BA>…æ<E280A6><C3A6>柨é<C2A8>•åå??
timeo.tv_sec = timeout / 1000;
timeo.tv_usec = timeout % 1000;
if (setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeo, sizeof(timeo)) == -1) {
zlog_error(zct, "ip:%s,setsockopt error", ips);
close(sockfd);
return -1;
}
char sendpacket[2048];
char recvpacket[2048];
// 闂備浇宕åž?æ…¨éŽ¶èŠ¥å€¿é¿æžå€¸çº¾å<C2BE>—柟éŽ?æ<>¿Ð“é¸å¬§æ™<C3A6>ç»±æ³î…¼é<C2BC>¥Ñ…毇ngé—åšå€·ç»€ä¾€å¹‰é”Ÿçгå<C2B3>椤æ±åž¹ç» îˆžæŸ¨é<C2A8>•åå«?
memset(sendpacket, 0, sizeof(sendpacket));
pid_t pid;
// é—åšå€·ç»€ä¾€å¹‰é”Ÿçгå<C2B3>¡é¿æžå€¹é<C2B9>å¬?柡é<C2A1>¥â•<C3A2>У椤æ„?ç²™é<E284A2>Œï½‰åŸ¡æ¿ å†¿ç´¬Dé—åšå€·é<C2B7>︾â¬ç¬å¯çŸ™é¹å¯¸å<C2B8>Ÿé—„坿Ÿ¡é<C2A1><C3A9>ã„¥â¬è<C2AC>¤ç²ˆæ¿ å¨ç…鏿„¶çµ½æµœå‰§ç´“浣割å„<C3A5>椤﹀å´?顕héµå—˜å¸—é<E28094>å©îžŠæ¿ å¨âå¨´ï½…æ¹±å©€ä»æŸé<E280BA>è·¨ç„¸ç€¹æ æ•»éŽ®î‡€æ¥å®„ç§nce ID
pid = getpid();
struct ip *iph;
struct icmp *icmp;
icmp = (struct icmp *)sendpacket;
icmp->icmp_type = ICMP_ECHO; //é—åšå€·é<C2B7>ï¹å¹ƒé<C692>žç£¿é¹æƒ°æ£„çº¾å©šæŸ£éŽ°î„€æ£˜é»æ—Ç¹ç»¶çºæ˜é<CB9C><C3A9>æ<EFBFBD>åŠ¤é»æ¿…å<E280A6>³å§Šç»˜æ…é<E280A6><C3A9>ヤ虎妞ã†åžµå¨²ã‰æ•ƒéŠ<C3A9>ã†æ™¸é¿ç‡æ·
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);
icmp->icmp_cksum = cal_chksum((unsigned short *)icmp, sizeof(struct icmp)); //闂傚倷绀侀幖é?<3F>ã‡çŸ™é¸æ¨å޽宕å<E280A2>‰ç¹<C3A7>闈涱å„<C3A5>é¸å??ï¹¢é<C2A2>Œã„©æ¤é<C2A4>Œæ¶˜î<CB9C>?
int n = sendto(sockfd, (char *)&sendpacket, sizeof(struct icmp), 0, (struct sockaddr *)&addr, sizeof(addr));
if (n < 1) {
zlog_error(zct, "ip:%s,sendto error", ips);
close(sockfd);
return -1;
}
// 闂傚倷娴å›?~澶å¬?î²å¨´çŠ²îƒ…çº¾å<C2BE>—å¼¶é<C2B6>«î?äºå¨´æ»ƒç¶Šé<C5A0>Œã„©æ¤é<C2A4>Œæ¶˜î<CB9C>
// é—åšå€·é<C2B7>ï¹æƒ‡è¤°æŽåžç»¾î…žæ‡Œæµœç°îŸ¿çºè™¹ç„·å©µî†¿æ«•銇å?å¹éŽ´æ¿<C3A6>仼é—<C3A9>活厽顨å—妵é<C2B5>•冀éµå¨§å?暤闂佸憡蓱閹告娊å¯?婚æ¢é<C2A2>“庣畳é—<C3A9>åœ?儤é<C2A4>¨åž?æ…¨æ<C2A8>´ã„¦å<C2A6>¡æ¿ å©å«?绶查柣妤佹尭é»ï½…嘲顫濈æ<CB86>„é“<C3A9>å½ç<E28099>“é—佸å?Šé<C5A0>“堥崰é<C2B0><C3A9>î£î½æ¤¤æ¶å“绠鹃æ—é<E28094>¢ç™»è?„牎濠电å§?é<>æ´ã<C2B4>„é”<C3A9>å?礆gé—åšå€·é<C2B7>ï¹æƒ‡è¤°æŽç¤‰ç€¹â¬éˆ§î„„埀é¡ä½¸åš?閸撴ç›?鎳為柆å?¥å——殤å?žã†å¸é<E28099>Šå<C5A0>—埞蹇涙â鏿¿†å??é<>†å©‡æŸç€£î£å°µç¼<C3A7>辨帗寰å­ä»¦é˜å¤Šç?£æ¿¡ã‡å§·é<C2B7>æ?¼æ?¢å?˜èº²â‚?佸☉éŠ<C3A9>çŠÑ‡æŸéŠ‰ãˆ¡æ«“æ¿¡èŒ¬å…˜å?Šç»˜æ…é<E280A6>å©…ç?€å¦žã<C3A3>絼绮æ¬<C3A6>畷鎴﹀箻é<C2BB>¡æŽ<C3A6>ç?<3F>ç¼<C3A7>婇幃鈺å<C3A5>æ•Šé»æ³é?¸è?šç¼åšå€·é³å‰<C3A5>åˆé¡ç´å<C2B4>黿¨¿î‡§éƒç†¼æ˜é<CB9C><C3A9>åž?櫕閺嗗æ?<3F>é<EFBFBD>Œæ¶¢å¹‡é¡”间壕é—<C3A9>活厽顨å©î<E2809A><C3AE>娲î<C2B2>…倻é³è½°æ?æ¾¹æ¢æ¢ºé<C2BA>婃煥é»î…žå€¿é<C2BF>崱妯è©ç˜ˆé—<C3A9>æ<EFBFBD>žå„?é<>”å±¾ç¦éŠ<C3A9>ã†âé<E28098> æ<C2A0>劌娅愰柟é<C5B8>ã†å«?
int cnt = 0;
while (1) {
// 闂備浇宕åž?æ…¨éŽ¶èŠ¥å€¿é¿æžå€¸çº¾å<C2BE>—柟éŽ?æ<>¿Ð“é¸å¬§æ™<C3A6>ç»±æ³î…¼é<C2BC>¥îŸéª<C3A9>meOuté—åšå€·ç»€ä¾€å¹é?<3F>ï¹€ç?椤愶附é<E2809E>å¤<C3A5>æŸ£éŽ¾å†²î†æ¿žæˆ™åž¹é¿ã†ä¿ŠéŠˆå?åŠ<C3A5>濞å?牠鎮楅崗澶å©<C3A5>壕é—佸憡é<C2A1>”︽ç¦<C3A7>é<EFBFBD><C3A9>ä¾?敊é¹é¦å…˜é<CB9C>€ä»æŸ£éŽ°î„€çº§æ¤¤ãƒ¦åž¿é<C2BF>Œæ¶¢å¹˜ç€µå“¥ç•ºé—<C3A9>哄懎é<C5BD>奸幃鈺冩嫚é¹ç»˜å¸éޏã†ä¿Šé<C5A0><C3A9>î<EFBFBD>„â?æ ?æ§å¦¤å†¨åž<C3A5>瀹ュî˜<>„ラæŸç<E280BA>žå‰§âЕ鏿¬<C3A6>ç¹ç»»æ¿å´¹é¡<C3A9>ï½…æš—ç¼ä½¸î˜½é<C2BD>“熼弻é<C2BB>”å…¼å„Œé¸æ¿„儳蓱é—佺懓é<E2809C>¢æŸ¥å¹Šæ<C5A0>´ã„£å<C2A3>娴兼潙宸濇ã<E280A1>„é<E2809E>ƒå?Г椤撳綊å?Šç»˜æ…ç™å©ä»§é—<C3A9>绘挸顦甸ç<C2B8>®è¹‡æ¶™æ™¸é¿ç‡æ·
FD_ZERO(&readfds);
FD_SET(sockfd, &readfds);
maxfds = sockfd + 1;
n = select(maxfds, &readfds, NULL, NULL, &timeo);
if (n <= 0) {
zlog_info(zct, "ip:%s,Time out error", ips);
close(sockfd);
iRet = -1;
break;
}
// 闂傚倷娴å›?~澶å¬?î²å¨´çŠ²îƒ…çº¾å<C2BE>—å¼¶é<C2B6>«î?äºå¨´æ»ƒç¶Šé<C5A0>Œã„©æ¤é<C2A4>Œæ¶˜î<CB9C>
memset(recvpacket, 0, sizeof(recvpacket));
int fromlen = sizeof(from);
n = recvfrom(sockfd, recvpacket, sizeof(recvpacket), 0, (struct sockaddr *)&from, (socklen_t *)&fromlen);
zlog_info(zct, "recvfrom Len:%d", n);
if (n < 1) {
close(sockfd);
iRet = 1;
break;
}
char *from_ip = (char *)inet_ntoa(from.sin_addr);
// 闂傚倷绀侀幉锛å‹?暜閸ãƒ?剙纾归柡宥庡幖閽å†?åé<E28093>Œæ¶¢å¦·é¡”ç…Žî<C5BD>©é—<C3A9>åŠç¥é”•ラ妵é<C2B5>•冀éµå¨§å±¾æ?¹é—‚佺ǹæ? æ<C2A0><C3A6>敃é?<3F>å <C3A5>蓟é¿ç†ºå§´ç»€å¬?梻é<C2BB>«ç†ºã€å¨´çŠ³æŒ³å§Šæ´ªå¹é<E28093><C3A9>æµå<E280B9>“é<E2809C><C3A9>î¢åž<C3A5>瀹â¬é<C2AC>•åž«æ™©é—Šî¢æ´¦ç»æŽ—å´•æ<E280A2>´â?äºœé¿æ—å<E28094>“ç¼<C3A7>辨é—åšå€·é<C2B7>ï¹æƒ‡è¤°æŽç¤‰ç€¹â¬éˆ§î„„埀é¡ä½¸åš?鏿´ç§é<C2A7>™å´æ¢ºé<C2BA><C3A9>å­Ð é¸æ¿çž¼å¨†ãˆ¤æ™é<E284A2>æ?¼å<C2BC>†é—<C3A9>绘æ´é<E28093>Šåœ?â‚?氾拷
if (strcmp(from_ip, ips) != 0) {
zlog_info(zct, "NowPingip:%s Fromip:%s NowPingip is not same to Fromip,so ping wrong!", ips, from_ip);
close(sockfd);
iRet = 1;
break;
}
iph = (struct ip *)recvpacket;
icmp = (struct icmp *)(recvpacket + (iph->ip_hl << 2));
zlog_info(zct, "ip:%s,icmp->icmp_type:%d,icmp->icmp_id:%d\n", ips, icmp->icmp_type, icmp->icmp_id);
// 闂傚倷绀侀幉锛å‹?暜閸ãƒ?剙纾归柡宥庡幖閽å†?åé<E28093>Œæ¶¢å?€é™‡éŽ¶æ¢Ÿgé—åšå€·é<C2B7>ï¹å¹ƒé<C692>žç£¿é¹æƒ°æ£„纾绘ç¹éŽ´æ—€åš<C3A5>é¸ãƒ?剙éƒç†¼æŸ•æ¾¶å <C3A5>劤椤ï¹äº¶å§Šæ´ªå´¨æ¿ ä½ºç¹<C3A7>é—<C3A9>æ<EFBFBD>žåŠæµœå •幃楣冩焼瀹ュæ£é<E280BA>˜è—‰â”鈽嗗ç<E28094> é»å¿”繈éŽ?¢幇é<E280A1>—堢厓é<E2809C>Ÿæ»„粓宕滈妸鈺佺é—<C3A9>跨噦鎷ï¿?
if (icmp->icmp_type == ICMP_ECHOREPLY && icmp->icmp_id == pid) // ICMP_ECHOREPLYé—åšå€·é<C2B7>ï¹å¹ƒé<C692>žç£¿é¹æƒ°æ£„çº¾å©šæŸ£éŽ°î„€æ£˜é»æ—Ç¹ç»¶çºæ—é”<C3A9>åº¡äºœé¸æ¿æ‡˜å§Šæ´ªå´<>•î£æ®?é—<C3A9>ç?¿ï¹¤é¡?烽ç<C2BD>®å¦¤å®æ™¸é¿ç‡æ·
{
// 濠电姵é?”栭崰妤冩崲é¹é¦åç»¶ã…ùé<C2B9>˜å·?å„<C3A5>é¸å¬?é<C2B5>Œæ¶¢å¹˜é<CB9C>™å?˜æ¨é—<C3A9>绘å¸é”•î<E280A2>„î<E2809E><C3AE>娲î<C2B2><C3AE>敆é³ÑŒå‰ç»®æ—ˆî”šéˆ§î„€ç•·éŽ´ï¹€ç®»é<C2BB> å?å°™é<E284A2>”﹀銈嗗ç¬é<E28099>Žæ°¼å‰ç»®å ¥å´Ÿé¡æ¶šåŽ±å©µçŠ»æ½§å¦?楅é¡<C3A9>堟煕鎼æ·?垺绀å¬?柡宀å¬?到æ?—î<E28094>ƒå<C692>³éªžå?é<CB9C>å—•ç´¦
zlog_info(zct, "icmp succecss ............. \n");
break;
} else if (cnt < 3) {
// é—åšå€·ç»€ä¾€å¹‰é”Ÿçгå<C2B3>„椤æŽå€»æ¶“嶉柟æ<C5B8>ˆå‰§ç•±é¸ã„¥å€¹éЇå?弽銊хç…ç¼<C3A7>ç´˜é<CB9C>愰幉å§<C3A5>å²€ç€æ¿žæˆžç¥æµ æ´?梺é<C2BA>“åº?潟é¸å©ƒîš†éŠ‡æ¬“å¹Žéºãƒ§å<C2A7>†é—<C3A9>绘æ´é<E28093>Šåœ?â‚?氾拷
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) {
zlog_error(zct, "ioctl failed, if_name:%s", if_name);
close(skfd);
return -1;
}
close(skfd);
return edata.data;
}
// 闂備浇é?•Ñ…æ<E280A6>¢éŽ°î†½å´²é¹é¦å„µå¨æ¨·æ§ˆæ¿žå—˜åŠé<E28093><C3A9>å³°â”æŽ³é<C2B3>Šæ¢å¹Šæ<C5A0>´ï½å<E2809A>“姘槹éµå§å?°éªžæŽ—崱妞惧é—<C3A9>è<EFBFBD>¤å<C3A5>ç»?嶆刊钘å?†æžéºå¥åž¹é<C2B9>åž?ã<>„鎺嶈兌é³îˆæ´˜éЇå?妸銉уⅵå?žãƒåžºé<C2BA>—楅å¹<C3A5>é<EFBFBD>æ<E280BA>æ<E28098>¶æ¤¤æ´ç¨é<E28099><C3A9>冮梻浣åŠå•žé»ç†´å„µè—<C3A8>椤栫å„<C3A5>é<EFBFBD><C3A9>侀柡é<C2A1>¥ãƒ¥ç<C2A5>ªé»æ´æ´Ÿé<C5B8>Œç†¼æœå¦?虹仸妞ãƒå„²é<C2B2>Ÿâ•…幃褰æŽç®æ¤¤æ¿å<C2BF>é<E280B9><C3A9>å ¥æ—娈åž?櫘閸å¬?æ£<C3A6>é<EFBFBD>©â?椤æŽ<C3A6>èƒ¶éˆ¯æ¢ææ<E28098>ˆã„§ç®¾é¸î£ç¹é¡£å´‡ç´æ<E28099>ˆã„¦å°°é¹å³°æ‡<C3A6>ç»®æ¬<C3A6>âŽé<C5BD>™ãƒ§æ£?é—å™ç„¦éޮ堕å´<C3A5>宥坿š†é¹é—´ç?<3F>ç» æ°¶æŸéްé<C2B0>æžç¼<C3A7>â?瀣î äºœé¹æ<C2B9>¿å?Žé<C5BD>ä¼´æŸ<C3A6>褜é<C593>“æ¬“â€¦å®„é¦æ½é¾å¿šî<C5A1>‰ç€šæ°±æ†¸æ<C2B8>´ï½å<E2809A>“姘ç¬å«?
std::vector<int> splitVersion(const std::string &version) {
std::vector<int> parts;
std::stringstream ss(version);
std::string part;
// é—åšå€·é³å •å´•é<E280A2>¢ç?¿ç£»é¹æ<C2B9><C3A6>绀å¤<C3A5>å¹å¨£î„€å¦¼ç»¾æƒ§îŸ·é<C2B7>Œã„¥â”é<E28098>¡æ©†æ£¡æ¿ æ?¿åž°é<C2B0>¡ã„§æ<C2A7>¢å©µå©ç?¾é–¹îˆ†å‚šî—šé—‚佽崵æ¿?甸å´<C3A5>妤å­çª—éºåµ?å‘?殾婵ǹ娉涢ç<C2A2>®éŠ<C3A9>$箾é¹å¯¸å<C2B8>ŸéŽ³æ„°æŸå?˜î…§ç„½ç¼<C3A7>è¾¨æŒ»éŽ·å¯æ éˆ©å†¾å<C2BE>…é—<C3A9>è<EFBFBD>¤å§³ç»¶ã‡å¾Šé<C5A0>?i幇é?‘芥斀閻庯綆浜為ˇé?<3F>︽âç¼<C3A7>îˆæ´æ¾§å<C2A7>‰ã<E280B0>„銊ユ嚇é˜ç†¼ç…?é<>¥ã„§âЕ黿¶å<C3A5>淇婇妶é<C2B6>Œæ°?壕é—ä½ºç²¯é¡¨å´æ•ƒéŠˆå¤æ™<C3A6>éµå¿Šâ?æ„<C3A6>嚤é—<C3A9>哄é<C2B0>¨å½æ¡éŽ´ï¸½âé<E28098> æ<C2A0>劌娅愰柟é<C5B8>ã†å??
while (std::getline(ss, part, '.')) {
parts.push_back(std::stoi(part)); // 闂備浇é?•Ñ…æ<E280A6>¢éŽ°î†½å´²é¹é¦å„µå¨æ?œæ—ˆå´¨é?“炵â‚?柟é<C5B8><C3A9>è©æš˜é¸æ¿çž¼ç»?堥崼銉︾厵ç¼å™ç„¦é”šç¼<C3A7>æ¥<C3A6>岸é<C2B8>Œæ¶™ç¹<C3A7>é<EFBFBD>•î„<C3AE>毈é—<C3A9>哄矉ç¼<C3A7>佹俊鎼佸Ψéµå?˜å–•绱旈梻浣呵圭â‚?æ¶æ™ éªžæ„°å´˜é¼î„<C3AE>æ?¾å©µî†½Ç¹å¨‰æ¶¢ç<C2A2>®éŠ<C3A9>℃å<C692><C3A5>濮楀棗骞橀柕é<E280A2>«î¢æ«<C3A6>æ¿?å©…æ?£å¨ç”¸å´ªæµ£åŠç•°æ¿ ç”µå§­é޳å¬å´éŽ¾ç»˜ç…Ÿé»æ¨ºå•¿æ¿®å¤<C3A5>æŸé<E280BA>˜å´‡å¢?椤æªç¶<C3A7>é¡¢æ¢å¦¶é<C2B6>Œæ°«å£•婵ç´åž¶é¡<C3A9>ä¼´å¹å©µå†©ç<C2A9><C3A7>é—<C3A9>跨噦鎷ï¿?
}
return parts;
}
// 濠电姵é?”æ ­å´³é?滃緤é¹îˆ£ç<C2A3>卿¬<C3A6>åª´é»æˆžï¹©é<C2A9>ã„¥â”é<E28098>˜ç»˜æ¶§æ¿žå±åŠé<E28098>©ãˆ¤å¼®é<C2AE>?熺厪é—<C3A9>割å<C2B2>…ç»»åžî””顓㈡煕éµå <C3A5>æé<E280B9>Žæ—ˆæŸ¡å®€å¬?到铻æ ?æŸ<C3A6>è?œé<C593>“熼幃褎绻æ¿å´é”•ä½²å<C2B2>“é<E2809C>¨î†šå½å´—é<E28094><C3A9>è©ç¨‡é—<C3A9>活厽顨婇弻銊â•å<E2809A>†é¸å±¾ç¨é¡<C3A9>�
int compareVersions(const std::string &version1, const std::string &version2) {
std::vector<int> v1 = splitVersion(version1);
std::vector<int> v2 = splitVersion(version2);
// é—åšå€·é³å •幊鎾绘倶濮樿æ³çº¾å<C2BE>—柟鎯版éºå©å„³éˆ§î„€åŽœé<C593>æ»æŸé<E280BA>‡ã„¥äºœé»æ¿‡ï¹¢å§Šæ´ªæŸ…é<E280A6><C3A9>茶å?°å?¢Ñƒç“¨éŽ±ã„¦ç¹<C3A7>é<EFBFBD>Œæ¶œç?€é—<C3A9>åœ­æ‡“ç€šç‰ˆä¿ŠéŽ¼ä½¹æ™œé»æ„µå‰šé?”å¿æ¢»é<C2BB>Œæ¬å…Œç¼<C3A7>垶銆å†?å´¨ç€æ¨ºäº±æ¿ ç”µå§´é<C2B4>婇懓é<E2809C>¨î†šå½å´—é<E28094><C3A9>è©ç¨‡é—<C3A9>活厽顨婇弻é”<C3A9>å?Šç?£é–¿æ¿†æ£­å¦?å‹?梺é<C2BA>婃煟é¸åº£æ•»å??诲☉éŠ<C3A9>犵é—<C3A9>ç°î‡­é<C2AD>Žæ„¬Î锕åâ鏿¿†å??é¡¥â€³îœƒç€æ¨»å€<C3A5>æ? ç²æ£<C3A6>å??崼é<C2BC>”åŠî<C5A0>Ÿé—佽法é<E280A2>£ï¹å¹<C3A5>锟�
size_t maxLength = std::max(v1.size(), v2.size());
for (size_t i = 0; i < maxLength; ++i) {
int num1 = i < v1.size() ? v1[i] : 0; // 婵犵數濮烽。浠å¬?焵椤掆å<E280A0>“é¸ç†·æ½¡é<C2A1>©â?椤掆å<E280A0>“ç¼å¶…﹪骞冨Οç‡èŒ¬çªžé—<C3A9>å½å<E28099>Šé<C5A0>“æ¿å¹—é<E28094>‡ãˆ¡âé¸ï¸»å޼顣兼ç¹<C3A7>éŠ<C3A9>★耿瀹æŸç¹ˆæ¿¡çƒ½åŸ¡é<C2A1>Œæ»ƒå¹ˆé—佸湱é<C2B1>Žã‰å´¹é<C2B9>«æ€å¤ŠâŽéŽ´çŠµï¼œå©µÂ°å€<C3A5>é<EFBFBD>æ´ã<C2B4>„锕噿†¾é¸â”¾å<C2BE>“妞ã†å¸Šé³å •埊é<C5A0>‡ãˆ¡ç…¥æ¿®æ©†åŽ¾ç»¡â¬é—<C3A9>逞屽墴椤㈡æ?ƒå®•奸æ¢é<C2A2>婄彨é—<C3A9>诲é?¸é<C2B8>˜æ»ˆå´éŽ¾ç»˜ç…•é¹é¦å浜剧紓å?¥åƒæ”»ç¼<C3A7>绘ç¯éªžå??æ™ç€æ¨ºå‰µé—佺懓é<E2809C>¤æ ­å¹<C3A5>锟ï¿?0
int num2 = i < v2.size() ? v2[i] : 0;
if (num1 > num2) return 1; // version1 婵犵數濮伴崹褰掓å<E2809C>‰éµå¿å€•纾兼ç¹<C3A7>æ¿ å椤ãƒ?æ‹? version2
if (num1 < num2) return -1; // version1 闂備浇é?•Ñ…æ<E280A6>¢éŽ°î†½å´²é¹é¦å—宕查æ—é”<C3A9>庡墲婵娊é<C5A0>Œã„©æ¤é<C2A4>Œæ¶˜î<CB9C>? version2
}
return 0; // é—åšå€·é³å‰<C3A5>åˆé¡çªâ?å†?å´¨ç€æ¨ºäº±æ¿ ç”µå§´é<C2B4>婇懓é<E2809C>¨î†šå½å´—é<E28094><C3A9>è©ç¨‡é—<C3A9>活厽顨å´â€”é<E2809D><C3A9>î<EFBFBD><C3AE>å<EFBFBD>“é”<C3A9>åº<C3A5>簻椤æŽåž»ç»±æŽ“æ…é<E280A6>¦î…žå¼¨é—<C3A9>å“„æœ?绋戦~婵å¬?倷椤掆å<E280A0>“椤忥æ?
}
void Binary_Bit(unsigned char *p_data, unsigned char position, int flag) {
//婵犵數é<C2B8>æ¶¢æºéŠŠÑƒåž<C3A5>瀹â¬é<C2AC>•剹濞达絿é<C2BF>Žã…ç•·é<C2B7>™å¤å<E280B9><C3A5>æ¿¡ç¶î‡§æµœé¹ƒæ—ç™å¬ç¤ƒç€¹â¬éŽ¼ä½¸ç® æ¿ å©ç‰Šé<C5A0>ㄩ梻é<C2BB>«ç†ºâ˜‰ç¼<C3A7>åšç¹<C3A7>鈹戦æ™é¸é<C2B8>æ¶§ç¼ä½½å°™é<E284A2>…î¤åˆé<E28099>ƒå <C3A5>醇éºå©åŽæµ é¹ƒæ¢ºç»?æžå¢²ç¼<C3A7>å??帡é<C2A1>©æ¶¢å¼½é¡“熺厾é—<C3A9>彿£¿é<C2BF>﹀☉è?”é<E2809D>Œï½ˆç®é<E280BA>ƒæˆžç<C3A7>é—<C3A9>å“„è??é<>Šæ¿†î‡£é<C2A3>«æžç?°éŽ¼ç²¹å‰<C3A5>é¡<C3A9>熺紓é<E2809C>Œæ¬åŠ<C3A5>æ¿¡î£åž¿éªžå¿æ•“锟� position婵犵數é<C2B8>çºå´¹é<C2B9>?曞ç?²å¨´ï½…å?Šå¨´æ ?柕濞уæ‡<C3A6>顦梺é<C2BA>婄⊕濞兼ç©å¯?åŠç¬Ÿéˆ§î„„弻銊â•å<E2809A>†é¸å±¾ç¨é?<3F>�(婵犵數é<C2B8>涢顓熷垔é¹ç»¢å绠柨é<C2A8>•åå??0 é—佽ç€â•…î”™é<E284A2><C3A9>窗é¹çƒ˜îš…纾婚柟é<C5B8><C3A9>î„<C3AE>ç<EFBFBD>±éºâºãƒ£äºœéºå©å<C2A9>žé¡¥çºæ—å?˜ç‚¬å«?)
if (flag) {
*p_data |= 0x01 << (position);
} else {
*p_data &= ~(0x01 << (position));
}
}