WLG/common/common_func.cpp
2024-10-23 16:10:23 +08:00

2004 lines
80 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

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 <linux/rtc.h>
#include <boost/xpressive/xpressive_dynamic.hpp>
#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); //闂備胶顢婂▔娑㈡晝閵堝洦顐介梺顒€绉寸粈鍡涙煙濞堝灝鏋熼柣锝変憾閺屾稒绻濋崟顐粯闂佸鏉垮鐎规洘顨婃俊鐑藉Χ閸滀焦些闂備礁鎼崯鍐测枖濞戙垹鍨傞幖娣妽閻撯偓閻庡箍鍎卞ú锕傛偩闁秵鐓曢柟閭﹀墯閸e綊鏌f幊閸斿秶绮欐径鎰垫晣闁靛ě鍜佹Х缂傚倷鐒﹀畷妯衡枖閺囥垹鐓濋柤娴嬫杹閸嬫捇鎮烽柇锔叫﹂梺鍛婄懕閹凤拷
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 -1;
}
iconv_close(cd);
*pout = '\0';
return 0;
}
int u2g(char *inbuf, size_t inlen, char *outbuf, size_t outlen) { return code_convert("utf-8", "gb2312", inbuf, inlen, outbuf, outlen); }
int g2u(char *inbuf, size_t inlen, char *outbuf, size_t outlen) { return code_convert("gb2312", "utf-8", inbuf, inlen, outbuf, outlen); }
std::string GBKToUTF8(const std::string &strGBK) {
int length = strGBK.size() * 2 + 1;
char *temp = (char *)malloc(sizeof(char) * length);
if (temp == NULL) {
zlog_error(zct, "fail to malloc size:%d", length);
return "";
}
if (g2u((char *)strGBK.c_str(), strGBK.size(), temp, length) >= 0) {
std::string str_result;
str_result.append(temp);
free(temp);
return str_result;
} else {
free(temp);
return "";
}
}
std::string UTFtoGBK(const char *utf8) {
int length = strlen(utf8);
char *temp = (char *)malloc(sizeof(char) * length);
if (temp == NULL) {
zlog_error(zct, "fail to malloc size:%d", length);
return "";
}
if (u2g((char *)utf8, length, temp, length) >= 0) {
std::string str_result;
str_result.append(temp);
free(temp);
return str_result;
} else {
free(temp);
return "";
}
}
std::string convertEncoding(const std::string &input, const char *fromEncoding, const char *toEncoding) {
iconv_t conv = iconv_open(toEncoding, fromEncoding);
if (conv == (iconv_t)-1) {
zlog_error(zct, "iconv_open failed");
return "";
}
size_t inBytesLeft = input.size();
size_t outBytesLeft = inBytesLeft * 2; // GBK may require up to twice the space of UTF-8
char *inBuf = const_cast<char *>(input.c_str());
char *outBuf = new char[outBytesLeft];
char *outPtr = outBuf;
if (iconv(conv, &inBuf, &inBytesLeft, &outPtr, &outBytesLeft) == (size_t)-1) {
delete[] outBuf;
iconv_close(conv);
zlog_error(zct, "iconv failed");
return "";
}
std::string result(outBuf, outPtr);
delete[] outBuf;
iconv_close(conv);
return result;
}
void InitGpio(unsigned int gpioN, unsigned int inout) {
int fd = 0;
char tmp[100] = {0};
//闂備胶鎳撻悘姘跺箰閸濄儲顫曢柟杈╁€峣o闂佽崵濮抽悞锕傚磿閹跺壙鍥敆閸曨偅顥濋梺鎼炲劵闂勫嫰顢曢敓锟<E69593>
fd = open("/sys/class/gpio/export", O_WRONLY);
if (-1 == fd) {
zlog_error(zbt, "open gpio export file error");
return;
}
//闂備焦鐪归崹褰掓偪閸ヮ剦鏁嬮柣鐐垫io
sprintf(tmp, "%d", gpioN);
if (write(fd, tmp, strlen(tmp)) < 0) {
zlog_error(zbt, "write file operation error:%s", tmp);
close(fd);
return;
}
close(fd);
sleep(1);
//闂傚倷鐒﹀妯肩矓閸洘鍋柛鐐插厧io闂備礁鎼崐濠氬箠閹捐绠栭柨鐕傛嫹
#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);
#else if 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;
}
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;
}
} 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;
}
}
close(fd);
}
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);
#else if IMX6UL_GATEWAY
sprintf(tmp, "/sys/class/gpio/gpio%d/value", gpioN);
#endif
zlog_info(zbt, "set GPIO = %s", tmp);
//闂備胶鎳撻悘姘跺箰閸濄儲顫曢柟杈╁€峣o value闂備礁鎼崐绋棵洪敐鍛瀻闁跨噦鎷<E599A6>
fd = open(tmp, O_WRONLY);
if (-1 == fd) {
zlog_error(zbt, "[%s] open gpio export file error", tmp);
close(fd);
return (-1);
}
//闂佽崵濮崇粈浣规櫠娴犲鍋柛鈩冪⊕閸嬨劑姊婚崼鐔烘创闁归潻鎷<E6BDBB>
if (x) {
if (-1 == write(fd, "1", sizeof("1"))) {
zlog_error(zbt, "%d write operation value error", gpioN);
close(fd);
return (-1);
}
} else {
if (-1 == write(fd, "0", sizeof("0"))) {
zlog_error(zbt, "%d write operation value errorn", gpioN);
close(fd);
return (-1);
}
}
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);
#else if IMX6UL_GATEWAY
sprintf(tmp, "/sys/class/gpio/gpio%d/value", gpioN);
#endif
//闂備胶鎳撻悘姘跺箰閸濄儲顫曢柟杈╁€峣o value闂備礁鎼崐绋棵洪敐鍛瀻闁跨噦鎷<E599A6>
fd = open(tmp, O_RDONLY);
if (-1 == fd) {
zlog_error(zbt, "%d open gpio export file error", gpioN);
return (-1);
}
//闂佽崵濮村ú鈺咁敋瑜戦妵鎰版晸閿燂拷 value闂備礁鎼崐绋棵洪敐鍛瀻闁跨噦鎷<E599A6>
if (-1 == read(fd, &value, sizeof(value))) {
zlog_error(zbt, "%d read gpiovalue is fail", gpioN);
close(fd);
return (-1);
}
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 -1;
}
tcflush(iFd, TCIOFLUSH);
return iFd;
}
int write_data(int fd, char *buff, int len) {
int ret;
char buf[100];
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;
int hour = 0;
iyear = tm_info->tm_year + 1900;
imonth = tm_info->tm_mon + 1;
day = tm_info->tm_mday;
hour = tm_info->tm_hour;
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;
}
std::string GetDayDate() {
time_t t = time(0);
char tmp[64];
strftime(tmp, sizeof(tmp), "%Y-%m-%d", localtime(&t));
std::string data = std::string((char *)tmp);
return data;
}
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);
// 闂佽绻愮换鎰板极閸嶇巢_time缂傚倸鍊烽悞锕傚箰婵犳碍鍊垫い鏍ㄧ⊕婵挳鏌熼幑鎰垫綈缂佷緡鍣弻鐔烘嫚閳╁啰绐旈柣鐘冲姉閸斿穼me_t闂備礁鎼崯顐︽偉閻撳宫娑㈠锤濡も偓缁狅綁鏌ㄩ悤鍌涘
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; // 濠电偞鍨堕幐鍝ョ矓閾忣偆绠鹃柛銉墯閸嬨劑鏌曟繛鍨姶婵″弶鍎抽湁闁绘﹩鍠栭埀顒佺墪椤啴鏁撻敓锟<E69593>
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);
}
void GetTime_(char time_buff[], TIME_SIZE len) {
int i = sizeof(time_buff);
memset(time_buff, 0, i);
time_t timep;
time(&timep);
strcpy(time_buff, ctime(&timep));
std::string strtemp = time_buff;
strtemp = strtemp.substr(11, len);
memset(time_buff, 0, strlen(time_buff));
strcpy(time_buff, strtemp.c_str());
}
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 (int i = 0; i < root.size(); i++) {
hwVersion = root[i]["hw_vesion"];
for (int i = 0; i < hwVersion.size(); i++) {
datanodeUpdate.hwVersion.push_back(hwVersion[i].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);
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 (int i = 0; i < dataNode.size(); i++) {
std::string softVersion = dataNode[i]["softVersion"].asString();
std::string bpNo = dataNode[i]["bpNo"].asString();
zlog_info(zbt, "bpNo = %s", bpNo.c_str());
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();
zlog_info(zbt, "accFlag = %d", accFlag);
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();
zlog_info(zbt, "zigbeeDesAddr = %s", zigbeeDesAddr.c_str());
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();
zlog_info(zbt, "ACCSampleTime = %d", ACCSampleTime);
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();
zlog_info(zbt, "RSSI = %d", RSSI);
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);
sqlite_db_ctrl::instance().InsertData(T_SENSOR_INFO(TNAME), insertSql);
}
is.close();
}
void ImportConfig(std::string filename) {
Json::Value root, gateWay, dataNode;
std::fstream is;
Json::Reader reader;
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 (int 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(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());
sqlite_db_ctrl::instance().InsertData(T_SENSOR_INFO(TNAME), insertSql);
}
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; //濠电姰鍨瑰﹢杈ㄦ櫠濡も偓鍗遍柟瀵稿仧閳绘棃鏌嶈閸撴氨绮欐径鎰垫晜闁告洦鍘介幉鑽ょ磽娴娈紓鍌涙皑閹蹭即宕卞☉妯啃曢梺纭呮彧缁犳垵鈻嶉敓锟<E69593>
//濠电偛顕慨浼村磿閹绢噮鏁嬪ù鍏兼綑缁€鍌炴煏婢舵盯妾柣鎾寸懅閳ь剚顔栭崰鏍崲閹寸偞娅犻柨鏇楀亾妞ゆ洩缍侀崺鈧い鎺戝濡﹢鏌涢妷顖炴妞ゆ劧鎷<E58AA7>
std::ifstream csv_data(filename, 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; //濠电姰鍨瑰﹢杈ㄦ櫠濡も偓鍗遍柟瀵稿仧閳绘棃鏌嶈閸撴氨绮欐径鎰垫晜闁告洦鍘介幉鑽ょ磽娴娈紓鍌涙皑閹蹭即宕卞☉妯啃曢梺纭呮彧缁犳垵鈻嶉敓锟<E69593>
std::string word;
DataNodeInfo dataNode;
// ------------闂佽崵濮村ú鈺咁敋瑜戦妵鎰板炊椤掆偓閺嬩線鏌eΔ鈧悧鍡欑矈閿燂拷-----------------
// 闂佽崵濮村ú鈺咁敋瑜戦妵鎰板炊椤掆偓閸愨偓闂佹悶鍎洪崜锕傚汲椤栫偞鍋犳繛鎴f珪鐎氾拷
getline(csv_data, line);
std::istringstream sin;
// 闂備礁婀辨灙妞わ附濞婇妴渚€骞嬮悩鍐茬彴闁荤姴娲﹁ぐ鍐緤閸ф鐓涘ù锝呮惈椤偐鈧鎼幏锟<E5B98F>
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") != string::npos) {
dataNode.Range = 0;
} else if (words[19].find("16g") != string::npos) {
dataNode.Range = 1;
} else if (words[19].find("32g") != string::npos) {
dataNode.Range = 2;
} else if (words[19].find("64g") != string::npos) {
dataNode.Range = 3;
} else if (words[19].find("50g") != 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 (int 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));
}
zlog_info(zbt, "eth_name :%s, local ip:%s", eth_name, gwip_);
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;
}
// std::string GetWorkNic() {
// const char *WLAN0 = "wlan0";
// const char *ETH0 = "eth0";
// std::string strip;
// strip = GetGwIp_(WLAN0);
// if (strip.compare("0.0.0.0") != 0) {
// zlog_info(zbt, "[GetWorkNic] wlan0: %s", strip.c_str());
// return std::string(WLAN0);
// }
// strip = GetGwIp_(ETH0);
// if (strip.compare("0.0.0.0") != 0) {
// zlog_info(zbt, "[GetWorkNic] eth0: %s", strip.c_str());
// return std::string(ETH0);
// }
// zlog_error(zbt, "[GetWorkNic] no ip return str eth0");
// return std::string(ETH0);
// }
std::string &ClearAllSpace(std::string &str) {
int index = 0;
if (!str.empty()) {
while ((index = str.find(' ', index)) != string::npos) {
str.erase(index, 1);
}
}
return str;
}
std::string GetSysInfo() {
const char *getCpuUse = "top -b -n 1 |grep Cpu | cut -d \",\" -f 1 | cut -d \":\" -f 2 |tr -d ' us'";
char chRes[100] = {0};
system_custom(getCpuUse, chRes);
std::string CpuUse = std::string(chRes);
const char *getCpuSys = "top -b -n 1 |grep Cpu | cut -d \",\" -f 2 |tr -d ' sy'";
memset(chRes, 0, 100);
system_custom(getCpuSys, chRes);
std::string CpuSys = std::string(chRes);
const char *getMemtotal = "cat /proc/meminfo | grep MemTotal | awk -F"
":"
" '{print $2}' |tr -d ' kB'";
memset(chRes, 0, 100);
system_custom(getMemtotal, chRes);
std::string MemTotal = std::string(chRes);
const char *getMemFree = "cat /proc/meminfo | grep MemFree | awk -F"
":"
" '{print $2}' |tr -d ' kB'";
memset(chRes, 0, 100);
system_custom(getMemFree, chRes);
std::string MemFree = std::string(chRes);
float a = atof(MemFree.c_str());
float b = atof(MemTotal.c_str());
float c = (1 - a / b) * 100;
const char *getEmmcInfo = "df -h | grep /dev/root";
memset(chRes, 0, 100);
system_custom(getEmmcInfo, chRes);
std::string Emmcinfo = std::string(chRes);
std::size_t found = Emmcinfo.find("%");
if (found != std::string::npos) {
Emmcinfo = Emmcinfo.substr(found - 3, 3);
}
Emmcinfo = ClearAllSpace(Emmcinfo);
char sysinfo[128] = {0};
sprintf(sysinfo, "%-13s%-13s%-13s%-13s ", to_string(c).substr(0, 4).c_str(), CpuSys.c_str(), CpuUse.c_str(), Emmcinfo.c_str());
return std::string(sysinfo);
}
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 (int 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闂備胶鍎甸崑鎾诲礉瀹ュ鏁嗘繝濠傜墕缁€鍡樼箾閸℃ê绔鹃柍褜鍓欓崯顖氼焽韫囨稑绠氱憸蹇曟兜閳ь剚淇婇妶鍥㈤柣顓濈窔閹焦绻呴惇鏇㈡⒑闂堚晠妾繝銏…鍥礃椤旇壈袝闂佸壊鍋嗛崰鎾诲Υ閿燂拷
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;
// 闂佽绻愮换鎰板箲閸戦亶姊洪棃鈺呮婵犮垺锚椤洭宕橀钘変缓闂佺懓鍚€鐠佹煡宕戦幘鏂ュ牚闁告侗鍘洪崠鏍⒑閸涘﹤绗掓俊顐n殔閻g兘宕熼浣锋唉濠电偞鍨堕敋闁绘挻鍨块弻宥夊Ψ閿斿墽鐣惧┑鐐存綑濡繈鐛幋锕€顫呴柍銉ョ-娴滐拷 闂備胶鍋ㄩ崕鑼垝閸垼濮抽柍鍝勫€规禍銈嗙箾閹寸伝顏堟偂閹达附鐓涘ù锝呮憸閹界娀鏌¢崱娆忔灈闁搞劑绠栭弫鎾绘晸閿燂拷
struct in_addr s;
iRet = inet_pton(AF_INET, mask.c_str(), &s);
// 闂佸搫顦遍崕鎰板礈濮橆剛鏆﹂柡灞诲劚缁狅綁鏌熼柇锕€澧い顐ゅ█瀵爼鍩¢崒娑氬弳濠电偠顕滈幏锟<E5B98F>1闂備焦瀵х粙鎴︽儗娓氣偓椤㈡岸鍩¢崨顓炲挤闁瑰吋鐣崹铏圭懅闂備礁鎼悧鍡浰囨导鏉戠柧闁靛鏅滈崕宥夋煕閹搭厽鐦介梻渚€娼婚梽鍕熆濡警鐒介柨鐕傛嫹
if (iRet == 1) {
// 濠电偛顕慨鏉懨规搴濠㈣泛鐬肩壕鍏肩節婵犲倸鏆熼柟鐣屽枛閺屻倝宕崟顐熷亾閸ф违閹兼番鍨洪崕鐔肩叓閸ャ劎顣茬紒渚囧櫍閺岀喓鎷犻埄鍐獢闁荤姵鍔楅崰鎰矙婢跺瞼纾兼俊顖濆吹閻ㄥ鏌惔銏⑩姇妞ゃ劌顦版穱濠囶敇閻旂繝绨婚梺鍛婄箓鐎氼喚鍠婇敓锟<E69593>
unsigned int addr = ntohl(s.s_addr);
// 闂佸搫顦遍崕鎰板礈濮橆剛鏆﹂柛娆忣槺閳绘棃寮堕悙鏉戭棆闁谎冪焸瀵爼鍩¢崒婧炬闂佺硶鏅滈〃鍫ュ焵椤掍胶鈯曟い銊ョ墦椤㈡牗鎷呴崷顓涙灃闂佽法鍣﹂幏锟<E5B98F>
std::bitset<32> b((int)addr);
std::string strMask = b.to_string();
// 闂備礁鎼悮顐﹀磿閸欏鐝舵俊顖濆吹椤╄尙鈧厜鍋撻柛鎰典簽椤旀帡姊洪崨濠傜婵炲鐩幃楦款槾缂侇噮鍙冮弫鍌炴嚄椤栵絾鑸瑰┑鐐村灦閹尖晠宕㈤幆褉鏋旈柨鐕傛嫹"01"闂備焦瀵х粙鎴︽嚐椤栫偑鈧懓顦圭€殿喚枪楗即鍩€椤掑倻绠斿璺哄閸嬫挸鈽夊▍顓т簻閿曘垽顢旈崼鐔告珫閻庡厜鍋撻柛鎰劤濞堫垶姊洪崫鍕仼閻庢稈鏅涘嵄闁归棿绀佺€氬顭跨捄渚剱婵炲懎绻橀弻锝夊Ω閵夈儺浠奸梺鐑╁墲閻熝呮閺冨牆绠i柣鎰蔼缁€瀣⒑濞茶娅欓柟鍑ゆ嫹
return (strMask.find("01") == std::string::npos);
}
return false;
}
double GetHardDiskFree() {
char hardName[32];
char hardTotal[32];
char hardUse[32];
char hardFree[32];
char rateHardUse[32];
const char *getEmmcInfo = "df -h | grep /opt";
char chRes[100];
memset(chRes, 0, 100);
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);
double freeDisk = atof(strhardFree.substr(0, strhardFree.length() - 1).c_str());
return freeDisk;
}
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;
float fCpuRate;
char name[8];
double cpu_idle = -1;
double cpu_sys = -1;
double cpu_user = -1;
double cpu_total = -1;
double cpu_wait = -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%d", 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%d", 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;
cpu_wait = iowaitNext - iowait;
cpu_idle = idleNext - idle;
fCpuRate = 1.0 * (cpu_total - cpu_idle) / cpu_total;
float rateUser = cpu_user * 100.0 / cpu_total;
float rateSys = cpu_sys * 100.0 / cpu_total;
if (rateUser > 95) {
rateUser = 92;
}
char hardName[32];
char hardTotal[32];
char hardUse[32];
char hardFree[32];
char rateHardUse[32];
const char *getEmmcInfo = "df -h | grep /opt";
char chRes[100];
memset(chRes, 0, 100);
#ifdef IMX6UL_GATEWAY
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());
double total = atof(strhardTotal.substr(0, strhardTotal.length() - 1).c_str());
double free = atof(strhardFree.substr(0, strhardFree.length() - 1).c_str());
double 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;
}
// 闂佽绻愮换鎰涘Δ鈧悾鐑芥偄閸濄儮鏋栭梺璺ㄥ櫐閹凤拷16闂佸搫顦弲婊呯矙閹达箑鏄ユ俊銈呭暊閸嬫挸鈽夊▎妯荤暭濡炪倖鍨抽悞锕€顭囬鍫晢濞达絿枪缁ㄣ儲绻涢幋鐐村碍闁圭⒈鍋婇、姘额敊閼恒儱鍔呴梺鍝勫暙閸婂綊鎮鹃柆宥嗗€垫繛鎴炵懐濞堟瑥鈹戦埥鍡楀籍鐎规洘鍔欓弫鎾绘晸閿燂拷
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; // 闂佽娴烽弫濠氬焵椤掍胶銆掗柤褰掔畺閺岋繝宕橀鍕戯綁鏌¢崨顐㈠姦闁诡垰鍟村畷鐔碱敃閵堝棙鍠曠紓鍌欑劍椤ㄦ劗鎷嬮敐鍥潟婵犻潧娲︽禍銈夋煛閸屾稑顕滅紒鈧埀锟<E59F80>0
}
// 闂佽绻愭蹇涘箯閿燂拷16闂佸搫顦弲婊呯矙閹达箑鏄ユ俊銈呭暊閸嬫挸鈽夊▎妯荤暭濡炪倖鍨抽悞锔剧矙婢舵劖鍤戦柤鍝ユ暩閵堫噣姊虹涵鍜佸殐婵犫懇鍋撻柣鐘冲姉閸犳捇鍩€椤掍胶鈯曟い銊ヮ槹娣囧﹪顢橀姀鐘崇€梺瑙勵問閸犳岸鎯岄敓锟<E69593>
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闂佽瀛╃粙鎺椼€冮崼銉晞濞达絽婀遍埢鏃堟煛鐏炶鍔滄慨锝嗗姍楠炴牗娼忛崜褏鏆犵紓浣靛姀鐏忔瑩骞忛悩璇参ㄩ柨鏂垮建閿曞倹鐓曢悗锝庡幖閻撴劙鏌¢崱顓熷
}
if (bytesSize < hexLen / 2) {
zlog_error(zct, "bytesSize:%d < hexLen:%d", bytesSize, hexLen);
return -1; // 闂佽瀛╃粙鎺椼€冩径瀣╃箚妞ゆ挶鍨归弸渚€鏌熷▓鍨灓闁活厼顑夐弻锝夊Ω閵夈儺浠奸梺闈涙搐濞层劍绂嶅宀€鐤€閹艰揪绲块幉褰掓煟閳╁啫绗掗柛妯荤墬缁傚秹骞掗弬鍝勪壕闁荤喓澧楃拹锟犳煙閹冩倯婵炵⒈浜、妤佹媴缁嬭法鍝庨梻浣告啞閼规儳霉瀹勬壋鏋旈柟瀵稿Л閸嬫挸鈽夊▎妯荤暯婵犵妲勯幏锟<E5B98F>
}
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; // 闂備胶鎳撻悺銊╁礉閺囩喐鍙忛柨鐕傛嫹
}
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) {
// 闂佽崵濮村ú鈺咁敋瑜戦妵鎰板炊閵娧€鏋栭梺闈涚墕鐎氫即宕电€n喗鍊垫繛鎴炵懐濞堟ɑ銇勯幋婊呯獢闁绘侗鍠氶幑鍕惞鐟欏嫷鍟堥梻浣呵圭换鎴﹀磿閻撳篃褰掑幢濞戞顔夊銈庡亽閸欌偓缂佲偓鐎n喗鐓涘ù锝呮憸閹界娀鏌¢崱顓熷
int byte;
sscanf(&hexStr[i], "%2x", &byte);
// 闂佽绻愮换鎰涘▎鎾虫辈闁挎繂顦弸渚€鏌熷畡鐗堟拱缂佷緡鍣弻鐔烘嫚閳╁啰绐旈柣鐘冲姉閸犳捇鍩€椤掑倹鏆╅柟铏尵閼洪亶寮婚妷锕€鍓梺鍛婂灦閳瑰钉II闂佽瀛╃粙鎺椼€冮崼銉晞闁跨噦鎷<E599A6>
asciiStr[j++] = (char)byte;
}
// 婵犵數鍎戠紞鈧い鏇嗗嫭鍙忛柣鎰暯閸嬫挸鈽夊▎妯荤暭濡炪倖鍨抽悞锔剧矙婢舵劖鍤戞い鎺戝€圭亸婵嬫⒑閸濆嫷妲洪柛鐘虫崌椤㈡牠鏁撻敓锟<E69593>
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;
}
string tohex(const string &str) {
string ret;
static const char *hex = "0123456789ABCDEF";
for (int i = 0; i != str.size(); ++i) {
ret.push_back(hex[(str[i] >> 4) & 0xf]);
ret.push_back(hex[str[i] & 0xf]);
}
return ret;
}
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); //濠德板€曢崐褰掆€﹂崶顒€鏋侀柟闂磋兌瀹撲線鏌ц箛锝呬簼缂佺姵甯¢弻鈩冪瑹婵犲啫顏<E595AB>
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) { //婵犵妲呴崑鈧柛瀣尰缁绘盯寮堕幋顓炲壆闁荤喐娲栧Λ婵嗙暦閿濆鏅查柛鈩冾焺閿曞倹鐓曟慨妯哄⒔閻h京鎲搁悧鍫㈠弨闁诡喕绮欓弫鎾绘晸閿燂拷
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) //闂佽崵濮崇粈浣规櫠娴犲鍋柛鈩冦仜閺嬫牠鏌曡箛瀣仼妞ゃ儲顨婇弻锝呪堪閹邦厼顏<E58EBC>
{
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) //闂佽崵濮崇粈浣规櫠娴犲鍋柛鈩冪☉绾剧粯绻濇繝鍌氼伌闁告挻鍎抽湁闁挎繂绻戠€氾拷
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;
}
int getcsq() {
int ret = 0;
char csq[128] = {0};
int fd = 0, sig = 0;
if ((fd = open("/dev/ttyUSB2", O_RDWR | O_NOCTTY | O_NDELAY)) < 0) {
zlog_error(zct, "fail to open /dev/ttyUSB2");
return 1;
} else {
set_opt(fd, 9600, 8, 'N', 1);
}
set_opt(fd, 115200, 8, 'N', 1);
ret = write(fd, "AT+CSQ", 6);
if (ret < 0) {
zlog_error(zct, "fail to write AT+CSQ");
close(fd);
return 1;
}
sleep(1);
unsigned char rbuf[128] = {0x00};
int len = read(fd, rbuf, sizeof(rbuf)); // 闂備線娼荤拹鐔煎礉鐎剚鍟洪柛鈩冪☉閻鏌ㄥ┑鍡欏⒈闁搞們鍨介弻娑滅疀鐎亜濮庨梺鐑╁閸涱垳鐣堕梺鎸庢閸庡銆呴敓锟<E69593>
close(fd);
zlog_info(zct, "rbuf = %s,len = %d", rbuf, len);
sleep(1);
if (len < 0) {
zlog_error(zct, "Can't get /dev/ttyUSBx Serial Port data!");
return 1;
}
const char *str2 = "+QENG: ";
char *pdata = strstr((char *)rbuf, str2);
if (pdata)
strncpy(csq, pdata + 7, sizeof(csq));
else {
zlog_error(zct, "fail to find +QENG: ");
return -1;
}
GlobalConfig::NetStatus = GetOneContent(csq, 1, ",");
string signal = GetOneContent(csq, 13, ",");
GlobalConfig::NetSignal = atoi(signal.c_str());
zlog_info(zct, "NetStatus = %s,NetSignal = %d", GlobalConfig::NetStatus.c_str(), GlobalConfig::NetSignal);
return atoi(signal.c_str());
}
void IniReadValue(char *section, 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, char *key, char *val, const char *file) {
char sect[SECTION_MAX_LEN];
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;
}
memset(sect, 0, SECTION_MAX_LEN);
sprintf(sect, "[%s]", section);
IniReadValue(sect, key, val, file);
return 0;
}
int readIntValue(const char *section, 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, char *key, char *val, const char *file) {
FILE *fp;
int i = 0, n = 0, err = 0;
int lineContentLen = 0;
int position = 0;
char lineContent[LINE_CONTENT_MAX_LEN];
char strWrite[LINE_CONTENT_MAX_LEN];
bool bFoundSection = false;
bool bFoundKey = false;
memset(lineContent, '\0', LINE_CONTENT_MAX_LEN);
memset(strWrite, '\0', LINE_CONTENT_MAX_LEN);
n = 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, char *key, char *val, const char *file) {
char sect[SECTION_MAX_LEN];
zlog_debug(zct, "section = %s, key = %s, file = %s\n", 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(sect, key, val, file);
}
int writeIntValue(const char *section, 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);
}
int getDiskInfo(char *diskTotal, char *diskFree) {
DISK diskInfo;
/* 1.闂備礁鍚嬮崕鎶藉床閼艰翰浜归柨鐕傛嫹/home/濠电偞鍨堕幐鎼侇敄婢跺⿴鐒藉ù鐓庣摠閸庡秹鏌涢弴銊ュ幋闁稿鎸鹃幏鐘差啅椤斿吋娅嶉梻鍌欐祰椤曟粓骞忛敓锟<E69593> */
statfs("/", &diskInfo);
unsigned long long blocksize = diskInfo.f_bsize; //婵犳鍣徊鐣屾崲鐎喗鐓傛繛鎾插悍ock闂傚倷鐒﹁ぐ鍐嚐椤栨壕鍋撻崹顐€跨€规洏鍎甸、鏇㈠Χ閸℃瑦娈搁梺璇插缁嬫帡銆冩径瀣╃箚妞ゆ挶鍨归弸渚€鏌ㄩ悤鍌涘
unsigned long long totalsize = blocksize * diskInfo.f_blocks; //闂備浇顕栭崜婵嗙暦闂堟稈鏋旈柟瀵稿Л閸嬫挸鈽夊▎妯荤暯婵犵妲呴崣鍐嚕椤愩倖鏆滄い鏂垮⒔椤︾敧_blocks濠电偞鍨堕幐楣冾敋閻氱棶ck闂備焦鐪归崝宀€鈧凹鍙冨鎶芥偄閸忕厧鍓梺璺ㄥ櫐閹凤拷
//printf("Total_size=%llu B =%llu KB =%llu MB = %llu GB\n",\
totalsize,totalsize>>10,totalsize>>20, totalsize>>30);
/* 2.闂備礁鍚嬮崕鎶藉床閼艰翰浜归柛銉e妿閳绘棃鏌嶈閸撴氨绮欐径灞稿亾閿濆簼绨婚柍閿嬬墪闇夐柨婵嗘閹冲懘鏌嶇憴鍕⒌婵﹤顭峰鍫曞箣閻愬樊浼呴梻浣告啞閻燁垶宕归幎钘夋瀬闁靛牆娲ㄩ惌姘箾瀹割喕绨奸柨娑氬枛閺岋綁濡搁妷銉患闂侀潧娲ゅú銊︾閹间焦鏅搁柨鐕傛嫹 */
unsigned long long freeDisk = diskInfo.f_bfree * blocksize; //闂備礁鎲¢幐鎾疾濞嗘垹绀婇柟瀵稿Х閻碍绻涘顔荤凹闁挎稓鍠栭弻锝夊Ω閵夈儺浠奸梺闈涙搐濞层劍绂嶉幖浣规櫢闁跨噦鎷<E599A6>
unsigned long long availableDisk = diskInfo.f_bavail * blocksize; //闂備礁鎲¢悷顖炲垂閹惰棄鏋侀柕鍫濇川閻碍绻涘顔荤凹闁挎稓鍠庨…鍧楀醇閸℃鏆熸慨锝忔嫹
//printf("Disk_free=%llu MB =%llu GB Disk_available=%llu MB = %llu GB\n",\
freeDisk>>20,freeDisk>>30,availableDisk>>20, availableDisk>>30);
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闂備礁鎼崐绋棵洪敐鍛瀻闁靛繈鍊曠粻鐢哥叓閸ャ劏澹橀柣妤佹皑缁辨帒螖鐎偄顏<E58184>
struct sockaddr_in serverAddr {}; // Server闂備線娼婚梽鍕熆濡警鐒介柛鎰典簽绾惧ジ鏌熼幆褜鍤熼柍褜鍓﹂崹閬嶅箯閸涘瓨鏅搁柨鐕傛嫹
// 闂備礁鎲敮妤冪矙閹寸姷纾介柟缁樼睄cket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
zlog_error(zct, "Failed to create socket.");
return 1;
}
// 闂佽崵濮崇粈浣规櫠娴犲鍋柛婵堝瀬rver闂備線娼婚梽鍕熆濡警鐒介柛鎰ㄦ櫇閳瑰秹鏌嶉埡浣告殨缂佹唻鎷<E594BB>
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(18393); // TCP濠殿喗甯楃粙鎺撶仚濡炪倖鎹佸畷鐢靛垝閳哄拋鏁嶆慨姗嗗墰缁嬪姊洪崨濠勬噯婵炴挸婀遍幏褰掓晸閿燂拷80
inet_pton(AF_INET, "192.168.1.147", &serverAddr.sin_addr);
// 闂佸搫顦弲婵嬪磻閻愬灚鏆滈柟缁㈠枛缁€鍡涙煟瑜庣槐纾杤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;
}
// 闂備礁鎲¢悷锕傚垂閸ф鐒垫い鎴f硶椤︼妇绱掗崫鍕挃闁圭懓瀚伴幖褰掝敃閿濆棭鍟€闂備胶顢婇鏍窗閺嶎偀鍋撶喊澶嬪
const char heartbeat[] = "Heartbeat";
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;
}
// 闂備胶枪缁绘垶绻涙繝鍋芥稓鍠婇埡鐜瀔et闂佸搫顦弲婵嬪磻閻愬灚鏆滈柨鐕傛嫹
close(sockfd);
return 0;
}
// Ping闂備礁鎲¢崹鍏兼叏閵堝姹查柣鏂垮悑閺咁剟鎮楅崷顓炰氦meout濠电偞鍨堕幑鍥╃磽濮樿京鐭撻柟缁㈠枛缁秹鏌ょ粙璺ㄤ粵妞は佸洦鈷掗柛灞剧箖瑜把呯磼鏉堛劎绠炵€规洩绻濆鏉戭潩鏉堚敩銏ゆ⒑閸濆嫬顏俊顐ゎ攳,10000 婵犳鍣紞鍡涘磻閸℃冻缍栭柨鐕傛嫹=10 缂傚倷绀侀¨鈧柟鍑ゆ嫹
//闂備胶鎳撻悺銊╁礉閺囩喐鍙忔繛鎴欏灪閺咁剚鎱ㄥΟ铏癸紞缂佺姵鐓¢弻娑㈠Ψ椤栨稑顏<E7A891>0闂備焦瀵х粙鎴︽嚐椤栫偛桅闁瑰濮电€氬鏌曟径妯虹仯缂佹劖顨婂鍫曞煛閸屾稓鍙嗗┑鐐额嚋閹凤拷1闂備胶顢婇幓顏堝箯閿燂拷-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;
// 闂佽崵濮抽悞锕傚磿閹惰姤鍋╃紓宥庢櫦濠电儑绲藉ú鐘诲礈濠靛洤顕遍柨鐕傛嫹
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(ips);
int sockfd;
// 闂備礁鎲¢悷锕傛偋閺囩姵顐介柣顏呂朿ket 闂備線娼уΛ鎾箯閿燂拷 濠电姷顣介埀顒€鍟块埀顒€缍婇幃妯诲緞婵炵偓鐓㈤梺鐐藉劚閸熷潡锝為·绠刣o 闂佸搫顦弲婊堟偡閳哄懎闂梺鍨儏椤曡鲸鎱ㄥ鍡楀箹鐞氭岸姊绘担绋跨殹闁瑰嚖鎷<E59A96>
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (sockfd < 0) {
zlog_error(zct, "ip:%s,socket error", ips);
return -1;
}
struct timeval timeo;
// 闂佽崵濮抽悞锕傚磿閹惰姤鍋╃紓宥囨¥meOut闂備礁鎼崯顐︽偉閻撳宫娑㈡晸閿燂拷
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];
// 闂佽崵濮抽悞锕傚磿閹惰姤鍋╃紓宥囧皫ng闂備礁鎲¢悧顓㈠箯閿燂拷
memset(sendpacket, 0, sizeof(sendpacket));
pid_t pid;
// 闂備礁鎲¢悷锕傛偋閺囩姵顐介柣鈺婃D闂備焦瀵х粙鎴炵附閺冨倻绀婇柡鍐亾缂佸顦卞褍銆掓刊妾婇梻浣圭湽閸斿矂宕甸悮鐖島ence ID
pid = getpid();
struct ip *iph;
struct icmp *icmp;
icmp = (struct icmp *)sendpacket;
icmp->icmp_type = ICMP_ECHO; //闂備焦鎮堕崕鎶藉磻閻愬弬鐔稿緞鐏炴儳鐝伴梻浣哥仢椤戝洤锕㈤敓锟<E69593>
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)); //闂備礁鎼粙鍕崲濠靛鍋橀柨鐕傛嫹
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;
}
// 闂備浇顫夋禍浠嬪磿鏉堫偁浜归柨鐕傛嫹
// 闂備焦鐪归崹纭呫亹婢跺矁濮虫い鎺戝閻銇勯弽銊х畵闁告ɑ鎸抽弻鐔煎箒閹烘垵濮庨悷婊勬緲閻楁挸鐣峰璺虹骇闁割煈鍠栫欢顓熺箾鐎电ǹ校婵犫偓椤級g闂備焦鐪归崝宀€鈧凹鍓涢懞閬嶆嚑椤掑倿鈹忛梺鍝勫暊閸嬫挾绱掓径灞藉幋妤犵偘绶氶、娑㈠Χ閸モ晩妲烽梻浣告贡椤粙宕戦幘瓒佸綊鎮╅鐓庡Г缂備胶绮悧鐘诲蓟鐏炵晫鏆嗛柛鎰亾閻姊洪悜鈺佷壕闁告柨鐭傞獮鍡樼節閸ャ劌浠㈤梺璺ㄥ櫐閹凤拷
int cnt = 0;
while (1) {
// 闂佽崵濮抽悞锕傚磿閹惰姤鍋╃紓宥囨¥meOut闂備礁鎼崯顐︽偉閻撳宫娑㈠锤濡や焦娅栭悗鍏夊亾闁告劦浜為鎰攽閻愬弶顥戦柛鎾寸箖閺呭爼鎮╃拠鎻掑挤濡炪倖鐗楃划宥夊春閸屾稒鍙忔繝鍨尵缁夘剟鏌熼惂鍝ョɑ闁瑰嘲鎳庨オ浼村川椤旇姤顓归梻浣规た閻撳骞忛敓锟<E69593>
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;
}
// 闂備浇顫夋禍浠嬪磿鏉堫偁浜归柨鐕傛嫹
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);
// 闂備礁鎲敮鍥磹閺嶎厼钃熼柛銉墮閸欏﹥銇勯弽銊ь暡闁稿骸锕弻锟犲礋闂堟稓浠撮梺鎼炲€栫划宀勵敊韫囨稒鍎庢い锕€绱歡闂備焦鐪归崝宀€鈧凹鍓欑叅闁哄秲鍔岀欢鐐烘煥閻曞倹瀚<E580B9>
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);
// 闂備礁鎲敮鍥磹閺嶎厼钃熼柛銏¤抗ng闂備焦鎮堕崕鎶藉磻濞戔懞鍥蓟閵夈儳顦遍梺鍛婁緱閸ㄩ亶鎮鹃柆宥嗙厽婵☆垰鐏濋悡鎰版煃瑜滈崜銊╁箯閿燂拷
if (icmp->icmp_type == ICMP_ECHOREPLY && icmp->icmp_id == pid) // ICMP_ECHOREPLY闂備焦鎮堕崕鎶藉磻閻愬弬鐔稿緞鐎偄鍔呴梺鍝勫暙閸婂骞楅敓锟<E69593>
{
// 婵犳鍠楃换鎰緤娴犲鍋夐柛鎾叉閻掑﹪姊洪鈧粔顕€宕戦幘璇茬劦妞ゆ帒瀚粈鍕煕濠靛棗顏柛搴㈡礋閺岋絽饪伴幇顓烆伓
zlog_info(zct, "icmp succecss ............. \n");
break;
} else if (cnt < 3) {
// 闂備礁鎲¢悢顒傜不閹达箑鍨傛い鏍ㄧ矌绾捐偐鎲歌箛娑欏仺闁煎鍊楁す鎶芥煥閻曞倹瀚<E580B9>
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;
}
// 闂佽绻愮换鎰涘☉娆愭珷婵°倕鎳庣€氬銇勯幒鍡椾壕閻熸粍濯藉▔鏇㈠焵椤掍胶鈯曟い銊ョ墦椤㈡牗鎷呴崷顓涙灃闂佸憡鐟ラˇ顖烆敁閺囥垺鐓曢柟鐑樺灦椤ユ瑩鎮归幇顔兼灈鐎殿噮鍋嗛埀顒佺⊕钃辨繛鍫濆缁辨挻鎷呯粙娆句痪闂佹悶鍔嶅畝鎼佸箚閸愵喖绀嬫い鎰剁到閳ь剙顭峰铏规嫚瑜庣€氾拷
std::vector<int> splitVersion(const std::string &version) {
std::vector<int> parts;
std::stringstream ss(version);
std::string part;
// 闂備胶鍎甸崑鎾诲礉鎼淬劌纾婚柨婵嗘婵瓨绻濇繛鎯т壕闁荤姵鍔楅崰鏍х暦濮樿泛骞㈡繛鎴炵懐閸氭绱撴担璇℃閻犱緤绲垮Σ鎰攽鐎n亞顦梺绯曞墲椤ㄥ懘藟韫囨稒鐓熸俊銈傚亾闁绘锕ら敃銏″閺夋垹鐓戦梺璺ㄥ櫐閹凤拷
while (std::getline(ss, part, '.')) {
parts.push_back(std::stoi(part)); // 闂佽绻愮换鎰涘Δ鍛瀭閹兼番鍔岀粈鍫ユ煙缂佹ê绗氶柛濠勬暬閺岋綁濡搁妷銉純闂佺ǹ瀛╅幐鍐茬暦濮樿泛骞㈡慨姗嗗幘閵堫噣姊虹涵鍜佸殐婵犫懇鍋撻柣鐘冲姉閸犳牕顕i銈傚亾濞戞鎴濃枔閿燂拷
}
return parts;
}
// 婵犳鍣徊鎯涙担鐑橆偨婵犻潧娲ㄩ埢鏃堟煏閸繂顏柛銈咁儔閺岋絽螖閳ь剟鎮ф繝鍌﹁€垮ù鍏兼綑閻鏌ㄩ悤鍌涘
int compareVersions(const std::string &version1, const std::string &version2) {
std::vector<int> v1 = splitVersion(version1);
std::vector<int> v2 = splitVersion(version2);
// 闂備胶鎳撻悘姘跺磿閹惰棄鏄ョ€光偓閸曨偄鐝橀梺閫炲苯澧存慨濠傛贡閹瑰嫰濡搁敂鐐闂備胶绮〃鍛存偋婵犲偊鑰垮ù鍏兼綑閻鏌幋锝嗩棄闁告柣鍎甸弻娑㈠箳閹寸儐妫﹂梺鍝勬妞存悂骞嗛弮鍫熸櫢闁跨噦鎷<E599A6>
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; // 濠电姷顣介埀顒€鍟块埀顒€缍婇幃妯诲緞閹邦剝鎽曢梺鍦濠㈡﹢宕濋妷鈺傜厱闁圭儤鍨堕ˉ娆戠磼濡も偓椤﹂亶鍩€椤掍胶鈯曢柨姘節閳ь剟顢旈崼鐔告珫閻庡厜鍋撻柛鎰亾缂嶅﹥绻涢幋鐐存儓闁瑰嚖鎷<E59A96>0
int num2 = i < v2.size() ? v2[i] : 0;
if (num1 > num2) return 1; // version1 濠电姰鍨归悥銏ゅ磼濠婂棗顥<E6A397> version2
if (num1 < num2) return -1; // version1 闂佽绻愮换鎰崲鐎n剝濮抽柨鐕傛嫹 version2
}
return 0; // 闂備胶绮〃鍛存偋婵犲偊鑰垮ù鍏兼綑閻顪冪€亜顒㈢紒浣圭叀閺屾稑顫濋悙顒€顏<E282AC>
}
void Binary_Bit(unsigned char *p_data, unsigned char position, int flag) {
//濠电偛鐡ㄧ划宀勬儗娴儤宕叉慨妞诲亾鐎规洘宀搁幊婊堟偨闂堟稑绂忓┑鐐舵彧缁茬晫绮旈崼鏇熷仾闁糕剝绋掗埛鏍煠閹间焦娑ч柣蹇旑殜閺屻倝寮堕幐搴℃缂備焦妫戦幏锟<E5B98F> position濠电偞鍨堕幑浣割浖閵娧呯闁告稒娼欓弸渚€鏌ㄩ悤鍌涘(濠电偛顕刊鎾箯閿燂拷0 闁诲孩顔栭崰鎺楀磻閹炬枼鏀芥い鏇炴鐎氾拷)
if (flag) {
*p_data |= 0x01 << (position);
} else {
*p_data &= ~(0x01 << (position));
}
}