#include "thread_func.hpp" #include #include #include #include #include #include #include #include "../uart/uart.hpp" #include "../common/common_func.hpp" #include "../wifi/wpa_client.h" #include namespace { LocalServer *cidwServer = LocalServer::instance(); } void CheckThread() { print_info("ENTER CHECK THREAD \n"); std::string runinfo = "ENTER CHECK THREAD "; LOG_INFO(runinfo.c_str()); int heart_count = 0; int time_check = 0; int reset_flag = 0; int online_check = 0; int HardStatus = 0; int logClean = 0; int Battery = 0; int UpdateZigbee = 0; int commSignal = 0; int loose_check = 0; int mqttresend = 0; int rebootsystem = 0; int ModifyAddr = 0; int wifi_reconnect_count = 0; int checkNet0 = 0; int connectCount = 0; while (GlobalConfig::QuitFlag_G) { GlobalConfig::threadStatus = 1; sleep(1); if (GlobalConfig::EnterZigBeeWaveTransmittingFlag_G == ENTER_TRANSMITTING_STATUS) { GlobalConfig::EnterZigBeeWaveTransmittingCnt_G++; if (GlobalConfig::EnterZigBeeWaveTransmittingCnt_G >= 180) { GlobalConfig::EnterZigBeeWaveTransmittingFlag_G = NO_ENTER_TRANSMITTING_STATUS; GlobalConfig::EnterZigBeeWaveTransmittingCnt_G = 0; LOG_ERROR("[---- ZigBee error--!] ZigBee PanID is 9999 over time for 3 minutes !\n"); // 重新写入 0x8888 unsigned short shortAddr = 0x8888; uart_inst::instance().modify_LocalAddr(0x8888); GlobalConfig::Zigbee_G.MyAddr = 0x8888; // 延时1秒 sleep(1); // 重新读回 GlobalConfig::ZigbeeInfo_G.PanID uart_inst::instance().UpdateZigbeeInfoCtrl(); uart_inst::instance().bUpdateconfig = false; uart_inst::instance().bUpdate = false; uart_inst::instance().bSendTimeStamp = false; // 延时1秒 sleep(1); std::string str("8888"); if (GlobalConfig::ZigbeeInfo_G.MyAddr.compare(str) == 0) { LOG_INFO("[---- ZigBee INFO ----!] ZigBee PanID come back to be 8888 !\n"); } else { LOG_ERROR("[---- ZigBee error--!] ZigBee PanID cannot come back to be 8888 !\n"); } } continue; } if (10 == heart_count) { if (GlobalConfig::LinkCount > 30) { LOG_ERROR("MQTT connect failed\n"); #ifdef IMX6UL_GATEWAY char connect[10] = {0x00}; readStringValue("config", "connect", connect, (char *)GlobalConfig::Config_G.c_str()); if (atoi(connect)) { LOG_ERROR("MQTT connect failed,reboot\n"); exit(0); } #endif } std::string ipTemp = IpAddrInit(); GlobalConfig::IpAddr_G = ipTemp; if (0 != ipTemp.compare(GlobalConfig::IpAddr_G)) { } heart_count = 0; } #ifdef G2UL_GATEWAY if (checkNet0 == 5) { checkNet0 = 0; int iStatus = get_netlink_status("eth0"); if (iStatus == 1 && GlobalConfig::net0Status == 0) { system("ifconfig eth0:1 192.168.188.188 netmask 255.255.255.0"); } GlobalConfig::net0Status = iStatus; } #endif if (7200 == time_check) { // 2h char buf[256] = {0}; char buf2[256] = {0}; sprintf(buf, "{\"dataNodeGatewayNo\":\"%s\",\"cmd\":\"12\",\"status\":\"REQ\"}", GlobalConfig::MacAddr_G.c_str()); sprintf(buf2, "{\"dataWatchNo\":\"%s\",\"cmd\":\"12\",\"status\":\"REQ\"}", GlobalConfig::MacAddr_G.c_str()); std::string str = std::string(buf); std::string str2 = std::string(buf2); time_check = 0; int iRet = data_publish(str.c_str(), GlobalConfig::Topic_G.mPubTiming.c_str()); iRet = data_publish(str.c_str(), GlobalConfig::Topic_G.mPubCmd.c_str()); iRet = data_publish(str2.c_str(), GlobalConfig::Topic_G.mPubTiming.c_str()); iRet = data_publish(str2.c_str(), GlobalConfig::Topic_G.mPubCmd.c_str()); if (iRet != 0) { LOG_ERROR("MQTT connect failed ,time check\n"); #ifdef IMX6UL_GATEWAY char connect[10] = {0x00}; readStringValue("config", "connect", connect, (char *)GlobalConfig::Config_G.c_str()); if (atoi(connect)) { LOG_ERROR("MQTT connect failed,time check ,reboot\n"); exit(0); } #endif #ifdef NR5G_MODULE #ifdef IMX6UL_GATEWAY dial.closePort(); gpio_set(GlobalConfig::GPIO_G.commRest, 0); LOG_DEBUG("GPIO 8 start\n"); sleep(2); gpio_set(GlobalConfig::GPIO_G.commRest, 1); LOG_DEBUG("GPIO 8 End\n"); sleep(20); dial.openPort("/dev/ttyUSB2"); dial.setState(); #endif #ifdef G2UL_GATEWAY dial.closePort(); gpio_set(GlobalConfig::GPIO_G.commPower, 0); LOG_DEBUG("commPower start\n"); sleep(2); gpio_set(GlobalConfig::GPIO_G.commPower, 1); LOG_DEBUG("commPower End\n"); sleep(20); connectCount++; if (connectCount > 10) { LOG_ERROR("5G reset error ,reboot!\n"); system("reboot"); } #ifndef NR5G_MEIGE dial.openPort("/dev/ttyUSB2"); dial.setState(); #else char szquectel[100] = {0x00}; std::string strAPN = ReadStrByOpt(SERVERCONFIG, "Server", "APN"); sprintf(szquectel, "/opt/quectel-CM/Meig-CM -s %s &", strAPN.c_str()); system(szquectel); #endif #endif #endif #ifdef WIFI_MODULE LOG_ERROR("WiFi reset!\n"); #ifdef IMX6UL_GATEWAY gpio_set(GlobalConfig::GPIO_G.wifiReset, 0); sleep(5); gpio_set(GlobalConfig::GPIO_G.wifiReset, 1); sleep(5); wifi::WPAClient wpa; wpa.ReconnectWiFi(); system("/etc/init.d/wpa_restart"); system("udhcpc -i wlan2 &"); #endif #ifdef G2UL_GATEWAY system("/etc/init.d/wpa_restart"); sleep(5); string strip = GetGwIp_("wlan0"); print_info("strip = %s\n", strip.c_str()); if (strip.compare("0.0.0.0") != 0) { } else { gpio_set(GlobalConfig::GPIO_G.wifiReset, 1); sleep(5); gpio_set(GlobalConfig::GPIO_G.wifiReset, 0); sleep(30); wifi::WPAClient wpa; wpa.ReconnectWiFi(); system("/etc/init.d/wpa_restart"); sleep(5); system("udhcpc -b -i wlan0 &"); } #endif #endif } else { connectCount = 0; } } if (HardStatus == 3600) { // one hour 3600 JsonData jd; std::string data = jd.JsonCmd_07(); data_publish(data.c_str(), GlobalConfig::Topic_G.mPubStatus.c_str()); HardStatus = 0; int hour = 0; struct tm *tm_info = get_current_date(); hour = tm_info->tm_hour; print_info("hour = %d\n", hour); int statistics = readIntValue("config", "statistics", (char *)GlobalConfig::Config_G.c_str()); if (statistics == 0 && hour > 13) { writeIntValue("config", "statistics", 1, (char *)GlobalConfig::Config_G.c_str()); sqlite_db_ctrl::instance().CalculateData(); } else if (statistics == 1 && hour < 13) { writeIntValue("config", "statistics", 0, (char *)GlobalConfig::Config_G.c_str()); } } if (mqttresend == 7200) { mqttresend = 0; LOG_INFO("mqttresend check\n"); Json::Value jsHeart; Json::FastWriter fw; jsHeart["dataNodeGatewayNo"] = GlobalConfig::MacAddr_G; jsHeart["status"] = "online_V" + GlobalConfig::Version; jsHeart["IP"] = GlobalConfig::IpAddr_G; std::string strJson = fw.write(jsHeart); int iRet = data_publish(strJson.c_str(), GlobalConfig::Topic_G.mPubHeart.c_str()); if (iRet == 0) { sqlite_db_ctrl::instance().QueryofflineData(); } } if (600 == online_check) { online_check = 0; int Count = sqlite_db_ctrl::instance().GetTableRows(T_SENSOR_INFO(TNAME), NULL); if (Count > 0) { JsonData jd; jd.DataNodeStatusCheck(); Param_29 param; std::string cmd29 = jd.JsonCmd_29(param); int iRet = data_publish(cmd29.c_str(), GlobalConfig::Topic_G.mPubCmd.c_str()); char localtimestamp[32] = {0}; GetTimeNet(localtimestamp, 1); std::string nowTimetamp = std::string(localtimestamp); char selectCon[128] = {0}; sprintf(selectCon, " sendMsg <> '' ORDER BY timeStamp DESC LIMIT 0,1"); sleep(1); std::string strTime = sqlite_db_ctrl::instance().GetData(T_DATASTATIC_INFO(TNAME), "timeStamp", selectCon); long lTime = atol(nowTimetamp.c_str()) - atol(strTime.c_str()); LOG_INFO("online check = %d\n", lTime); if (lTime > 1800) { LOG_ERROR("nowTimetamp = %s,lastTime = %s,lTime = %d\n", nowTimetamp.c_str(), strTime.c_str(), lTime); } } } if (7200 == Battery) { Battery = 0; LOG_INFO("Battery\n"); sqlite_db_ctrl::instance().CalculateBattery(); } if (3500 == loose_check) { LOG_INFO("loosecheck\n"); loose_check = 0; sqlite_db_ctrl::instance().CalculateDip(); } if (ModifyAddr == 3600) { LOG_INFO("ModifyAddr check\n"); ModifyAddr = 0; if (uart_inst::instance().bModifyAddr) { LOG_ERROR("ModifyAddr failed \n"); exit(0); } } if (18000 == commSignal) { // 5h Json::Value jsBody, jsonVal; Json::FastWriter showValue; if (GlobalConfig::NetStatus == "\"NOCONN\"" || GlobalConfig::NetStatus == "\"CONNECT\"") { if (GlobalConfig::NetSignal == 0) { jsBody["communicationSignal"] = "未知"; } else if (GlobalConfig::NetSignal > -80) { jsBody["commSignal"] = "优"; } else if (GlobalConfig::NetSignal > -90 && GlobalConfig::NetSignal < -80) { jsBody["commSignal"] = "良"; } else if (GlobalConfig::NetSignal > -105 && GlobalConfig::NetSignal < -90) { jsBody["commSignal"] = "一般"; } else if (GlobalConfig::NetSignal < -105) { jsBody["commSignal"] = "弱"; } else if (GlobalConfig::NetSignal < -115) { jsBody["commSignal"] = "不稳定"; } } else if (GlobalConfig::NetStatus == "\"SEARCH\"") { jsBody["commSignal"] = "搜索网络"; } else if (GlobalConfig::NetStatus == "\"LIMSRV\"") { jsBody["commSignal"] = "未插卡"; } else { jsBody["commSignal"] = "未知"; } jsonVal["cmd"] = "53"; std::string dataBody = showValue.write(jsBody); jsonVal["cmdBody"] = dataBody; data_publish(showValue.write(jsonVal).c_str(), GlobalConfig::Topic_G.mPubConfig.c_str()); } if (21600 == logClean) { logClean = 0; DIR *dp; //创建一个指向root路径下每个文件的指针 struct dirent *dirp; string root = "/opt/log/"; if ((dp = opendir(root.c_str())) == NULL) cout << "can't open" << root << endl; while ((dirp = readdir(dp)) != NULL) { if ((!strcmp(dirp->d_name, ".") || (!strcmp(dirp->d_name, "..")))) continue; struct timeval curTime; gettimeofday(&curTime, NULL); char buffer[80] = {0}; char fileMonth[11] = {0}; char todayMonth[11] = {0}; char fileDay[11] = {0}; char todayDay[11] = {0}; struct tm nowTime; localtime_r(&curTime.tv_sec, &nowTime); //把得到的值存入临时分配的内存中,线程安全 strftime(buffer, sizeof(buffer), "%Y-%m-%d", &nowTime); memcpy(fileDay, dirp->d_name + 8, 2); memcpy(todayDay, buffer + 8, 2); memcpy(fileMonth, dirp->d_name + 5, 2); memcpy(todayMonth, buffer + 5, 2); string filename = root + string(dirp->d_name); if (atoi(fileMonth) == atoi(todayMonth) ? abs(atoi(todayDay) - atoi(fileDay)) > 15 : abs(abs(30 - (atoi(fileDay)) + atoi(todayDay))) > 15) { LOG_INFO("filename = %s\n", filename.c_str()); remove(filename.c_str()); } } char localtimestamp[32] = {0}; GetTimeNet(localtimestamp, 1); char whereCon[1024] = {0}; #ifdef G2UL_GATEWAY sprintf(whereCon, " timestamp < '%ld' ", atol(localtimestamp) - 2592000 * 2); //删除2个月前的数据 #endif #ifdef IMX6UL_GATEWAY sprintf(whereCon, " timestamp < '%ld' ", atol(localtimestamp) - 2592000); //删除1个月前的数据 #endif sqlite_db_ctrl::instance().DeleteTableData(" t_battery_history ", whereCon); } #ifdef WIFI_MODULE if (wifi_reconnect_count == 600) { // 每 10分钟,重连WiFi网络 wifi_reconnect_count = 0; wifi::WPAClient wpa; std::string netssid = wpa.GetNetSsid(); std::string currentssid = ""; if (0 == netssid.compare("")) { netssid = wpa.GetNetSsid(); } if (netssid.length() > 0) { currentssid = wpa.GetCurrentSSID(); if (currentssid.length() > 0) { char buf[64] = {0}; std::string rssiSend = ""; #ifdef G2UL_GATEWAY rssiSend = "/usr/sbin/wpa_cli signal_poll|grep RSSI | cut -f 2 -d '='"; #endif #ifdef IMX6UL_GATEWAY rssiSend = "/opt/Cidn/wpa_cli signal_poll|grep RSSI | cut -f 2 -d '='"; #endif system_custom(rssiSend.c_str(), buf); std::string Rssi = std::string(buf); memset(buf, 0, 64); sprintf(buf, "wifi:true Rssi:%s", Rssi.c_str()); print_info("%s\n", buf); LOG_INFO("%s\n", buf); } else { std::string runinfo = "wifi:false\n"; print_info("%s\n", runinfo.c_str()); } } if (wpa.ReconnectWiFi()) { print_info("wifi reconnect ok\n"); } } #endif if (reset_flag > 7200) { reset_flag = 0; // exit(0); } Battery++; reset_flag++; time_check++; heart_count++; online_check++; HardStatus++; logClean++; loose_check++; ModifyAddr++; mqttresend++; #ifdef G2UL_GATEWAY checkNet0++; #endif #ifdef WIFI_MODULE wifi_reconnect_count++; #endif } }