Просмотр исходного кода

1、增加轮询线程,ram和rom检查放在里面进行
2、整理数据库写入接口,将传感器数据也纳入循环写的模式

guohui лет назад: 2
Родитель
Сommit
9825b72ee7
10 измененных файлов с 334 добавлено и 188 удалено
  1. 29 33
      pro/src/app.c
  2. 2 0
      pro/src/common.h
  3. 26 1
      pro/src/dflt.c
  4. 1 23
      pro/src/main.c
  5. 4 27
      pro/src/mqtt.c
  6. 93 15
      pro/src/sqlite_handle.c
  7. 3 2
      pro/src/sqlite_handle.h
  8. 174 85
      pro/src/sys.c
  9. 1 1
      pro/src/sys.h
  10. 1 1
      pro/src/thread.h

+ 29 - 33
pro/src/app.c

@@ -29,16 +29,6 @@
 #include <unistd.h>
 
 
-#define DISK_THRESHOLD    (50*MB)
-static int disk_is_full(void)
-{
-    int xMB=sys_get_disk_ava_MB("/");
-    if(xMB>=DISK_THRESHOLD) {
-        return 0;
-    }
-    return 1;
-}
-
 static void get_time(char *ts)
 {
     struct timeval tv;
@@ -48,23 +38,33 @@ static void get_time(char *ts)
     tm = localtime(&tv.tv_sec);
     sprintf(ts, "%04d-%02d-%02d %02d:%02d:%02d.%03ld", tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, tv.tv_usec/1000);
 }
-static void db_ow_test(GlobalDeviceManager *dm, int *index, int *index3)
+static void db_ow_test(sqlite3 *db, int *index, int *index3)
 {
     int i,ow_flag=0;
     GlobalPowerInfo info;
     GlobalTreeACManager info3;
+    int idx=1;
+    char temp[100];
 
-    for(i=0; i<2000; i++) {
+    dev_sql_set_overwrite(0);
+    for(i=0; i<200; i++) {
         get_time(info.samp_time);
-        dev_insert_power_info(dm->db, &info, index, ow_flag);
-        dev_insert_t_ac_power_info(dm->db, &info3, index3, info.samp_time, ow_flag);
+        dev_insert_power_info(db, &info, index);
+        dev_insert_t_ac_power_info(db, &info3, index3, info.samp_time);
+
+        sprintf(temp, "alarm %d", idx++);
+        dev_insert_alarm_info(db, 0, ALARM_TYPE_POWER, info.samp_time, temp);
     }
-    ow_flag = 1;
+    dev_sql_set_overwrite(1);
 
-    for(i=0; i<100; i++) {
+    for(i=0; i<10; i++) {
         get_time(info.samp_time);
-        dev_insert_power_info(dm->db, &info, index, ow_flag);
-        dev_insert_t_ac_power_info(dm->db, &info3, index3, info.samp_time, ow_flag);
+
+        dev_insert_power_info(db, &info, index);
+        dev_insert_t_ac_power_info(db, &info3, index3, info.samp_time);
+
+        sprintf(temp, "alarm %d", idx++);
+        dev_insert_alarm_info(db, 0, ALARM_TYPE_POWER, info.samp_time, temp);
     }
 }
 
@@ -86,7 +86,7 @@ void* power_thread(void* arg)
     struct tm* t ;
     struct timeval tv;
     struct timezone tz ;
-    int lastIndex=0,lastIndex3=0,overwrite_flag=0;
+    int lastIndex=0,lastIndex3=0;
     char *tabPower="Table_PowerInfo",*tabPower3="Table_PhasePowerInfo";
     thread_handle_t *h=(thread_handle_t*)arg;
     GlobalDeviceManager* _globalDeviceManager = (GlobalDeviceManager*)h->arg;
@@ -120,6 +120,8 @@ void* power_thread(void* arg)
         //usleep(300000);
     }
 
+    //db_ow_test(_globalDeviceManager->db, &lastIndex, &lastIndex3);
+
     //采集线程
     while (h->quit==0)
     {
@@ -128,12 +130,6 @@ void* power_thread(void* arg)
             sleep(1);
             continue;
         }
-
-        if(overwrite_flag==0) {
-            if(disk_is_full()) {
-                overwrite_flag = 1;
-            }
-        }
         
 #if (1)
         memset(&_globalTotalPowerInfo, 0, sizeof(GlobalPowerInfo));
@@ -285,7 +281,7 @@ void* power_thread(void* arg)
                         SaveDBFlag=true;
                         /* code */
                         //插入数据库
-                        if(dev_insert_power_info(_globalDeviceManager->db,&_globalPowerInfo,&lastIndex, overwrite_flag)!=0)
+                        if(dev_insert_power_info(_globalDeviceManager->db,&_globalPowerInfo,&lastIndex)!=0)
                         {
                             log_d("ch%d insert data error.\n",_globalPowerMangerTemp->product_ch_id);
                         }
@@ -418,7 +414,7 @@ void* power_thread(void* arg)
                                 _pTreeACPowerMangerTemp->product_log_time = now;
                                 /* code */
                                 // 插入数据库
-                                if (dev_insert_t_ac_power_info(_globalDeviceManager->db, _pTreeACPowerMangerTemp, &lastIndex3, _globalPowerInfo.samp_time, overwrite_flag) != 0)
+                                if (dev_insert_t_ac_power_info(_globalDeviceManager->db, _pTreeACPowerMangerTemp, &lastIndex3, _globalPowerInfo.samp_time) != 0)
                                 {
                                     log_d("ph_ch%d insert data error.\n", _pTreeACPowerMangerTemp->product_ch_id);
                                 }
@@ -507,7 +503,7 @@ void* power_thread(void* arg)
                         SaveDBFlag=true;
                         /* code */
                         //插入数据库
-                        if(dev_insert_power_info(_globalDeviceManager->db,&_globalPowerInfo,&lastIndex, overwrite_flag)!=0)
+                        if(dev_insert_power_info(_globalDeviceManager->db,&_globalPowerInfo,&lastIndex)!=0)
                         {
                             log_d("ch%d insert data error.\n",_globalPowerMangerTemp->product_ch_id);
                         }
@@ -628,7 +624,7 @@ void* power_thread(void* arg)
                             _pTreeACPowerMangerTemp->product_log_time = now;
                             /* code */
                             // 插入数据库
-                            if (dev_insert_t_ac_power_info(_globalDeviceManager->db, _pTreeACPowerMangerTemp, &lastIndex3,_globalPowerInfo.samp_time, overwrite_flag) != 0)
+                            if (dev_insert_t_ac_power_info(_globalDeviceManager->db, _pTreeACPowerMangerTemp, &lastIndex3,_globalPowerInfo.samp_time) != 0)
                             {
                                 log_d("ph_ch%d insert data error.\n", _pTreeACPowerMangerTemp->product_ch_id);
                             }
@@ -723,7 +719,7 @@ void* power_thread(void* arg)
                         SaveDBFlag=true;                       
                         /* code */
                         //插入数据库
-                        if(dev_insert_power_info(_globalDeviceManager->db,&_globalPowerInfo,&lastIndex, overwrite_flag)!=0)
+                        if(dev_insert_power_info(_globalDeviceManager->db,&_globalPowerInfo,&lastIndex)!=0)
                         {
 
                             log_d("ch%d insert data error.\n",_globalPowerMangerTemp->product_ch_id);
@@ -924,7 +920,7 @@ void* power_thread(void* arg)
                     _pTreeACPowerMangerTemp->product_log_time = now;
                     /* code */
                     // 插入数据库
-                    if (dev_insert_t_ac_power_info(_globalDeviceManager->db, _pTreeACPowerMangerTemp, &lastIndex3, _globalPowerInfo.samp_time, overwrite_flag) != 0)
+                    if (dev_insert_t_ac_power_info(_globalDeviceManager->db, _pTreeACPowerMangerTemp, &lastIndex3, _globalPowerInfo.samp_time) != 0)
                     {
                         log_d("ph_ch%d insert data error.\n", _pTreeACPowerMangerTemp->product_ch_id);
                     }
@@ -968,7 +964,7 @@ void* power_thread(void* arg)
                     _pTreeACPowerMangerTemp->product_log_time = now;
                     /* code */
                     // 插入数据库
-                    if (dev_insert_t_ac_power_info(_globalDeviceManager->db, _pTreeACPowerMangerTemp, &lastIndex3, _globalPowerInfo.samp_time, overwrite_flag) != 0)
+                    if (dev_insert_t_ac_power_info(_globalDeviceManager->db, _pTreeACPowerMangerTemp, &lastIndex3, _globalPowerInfo.samp_time) != 0)
                     {
                         log_d("ph_ch%d insert data error.\n", _pTreeACPowerMangerTemp->product_ch_id);
                     }
@@ -992,7 +988,7 @@ void* power_thread(void* arg)
         //插入数据库
         if (SaveDBFlag)
         {
-            if (dev_insert_power_info(_globalDeviceManager->db, &_globalTotalPowerInfo, &lastIndex, overwrite_flag) != 0)
+            if (dev_insert_power_info(_globalDeviceManager->db, &_globalTotalPowerInfo, &lastIndex) != 0)
             {
                 log_d("ch%d insert data error.\n", _globalTotalPowerInfo.product_ch_id);
             }

+ 2 - 0
pro/src/common.h

@@ -637,12 +637,14 @@ typedef struct
 typedef struct {
     int                 id;    		                    //id
     int                 mode;    				        //0: open   1: close
+    char                proto[10];                      //mqtt, mqtts, ws, wss
     char                server[512];                    //server
     char                ip[48]; 		                //server ip
     char                port[10]; 			            //server port
     char                cid[32];    		            //client ID
     char                user[32];    			        //认证方式  
     char                password[32];
+    char                *cert;
 }mqtt_server_t;
 typedef struct {
     #define MQTT_SER_MAX   10

+ 26 - 1
pro/src/dflt.c

@@ -56,15 +56,40 @@ mqtt_server_t DFLT_MQTT={
 
     .id = 0,
     .mode = 1,
-    .cid = "mqtt_928507fe",
+    .cid = "",
 #if 0
+    .proto = "mqtt",
     .server = "192.168.1.12",
     .ip = "",
     .port = "1883",
+    .cert = "",
 #else
+    .proto = "mqtts",
     .server = "gaae4d7b.ala.cn-hangzhou.emqxsl.cn",
     .ip = "",
     .port = "8883",
+    .cert = "-----BEGIN CERTIFICATE-----\r\n"
+            "MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\r\n"
+            "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n"
+            "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\r\n"
+            "QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\r\n"
+            "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\r\n"
+            "b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\r\n"
+            "9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\r\n"
+            "CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\r\n"
+            "nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\r\n"
+            "43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\r\n"
+            "T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\r\n"
+            "gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\r\n"
+            "BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\r\n"
+            "TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\r\n"
+            "DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\r\n"
+            "hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\r\n"
+            "06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\r\n"
+            "PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\r\n"
+            "YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\r\n"
+            "CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\r\n"
+            "-----END CERTIFICATE-----\r\n",
 #endif
     .user = "gowone100",
     .password = "gowone100",

+ 1 - 23
pro/src/main.c

@@ -1,37 +1,15 @@
 #include <stdio.h>
 #include "app.h"
 #include "sys.h"
-#include "thread.h"
 
-//#define MEM_DEBUG
-
-#ifdef MEM_DEBUG
-    #define MEM_THRD        177
-    #define MEM_PERIOD      1
-#else
-    #define MEM_THRD        50
-    #define MEM_PERIOD      60
-#endif
 
 int main(int argc,char* argv[])
 {
-    int avaMB;
-    uint32_t cnt=0;
-    
     sys_init();
     _global_device_manage_init(&__globalDeviceManage);
 
     while(1) {
-        cnt++;
-        if(cnt%MEM_PERIOD==0) {
-            avaMB = sys_get_mem_ava_MB();
-            printf("___ available mem:  %dMB, threshold: %dMB\n", avaMB, MEM_THRD);
-            if(avaMB<MEM_THRD) {
-                printf("___ free mem less than %dMB, reboot now ...\n", MEM_THRD);
-                sys_reboot();
-            }
-        }
-        sleep(1);
+        sleep(10);
     }
 
     return 0;

+ 4 - 27
pro/src/mqtt.c

@@ -84,32 +84,6 @@ static int post_stat(int type, int id);
 static uint32_t get_serv(char *json);
 static void post_once(void);
 
-//emqx serttle
-const char *ca_cert=
-"-----BEGIN CERTIFICATE-----\r\n"
-"MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\r\n"
-"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n"
-"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\r\n"
-"QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\r\n"
-"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\r\n"
-"b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\r\n"
-"9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\r\n"
-"CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\r\n"
-"nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\r\n"
-"43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\r\n"
-"T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\r\n"
-"gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\r\n"
-"BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\r\n"
-"TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\r\n"
-"DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\r\n"
-"hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\r\n"
-"06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\r\n"
-"PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\r\n"
-"YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\r\n"
-"CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\r\n"
-"-----END CERTIFICATE-----\r\n";
-
-
 enum {
     SERV_NTP=0,
     SERV_SMTP,
@@ -357,6 +331,7 @@ static int my_conn(mqtt_handle_t *h)
             h->conn[i].c = mg_mqtt_connect(&h->mgr, url, &opts, mqtt_fn, &h->conn[i]);
             if(h->conn[i].c) {
                 h->conn[i].ser = ser[i];
+                sprintf(h->conn[i].ser.cid, "smartPDU_%d\n", h->prod_id);
                 my_sub(h->conn[i].c, h->prod_id);
             }
         }
@@ -422,7 +397,7 @@ static void mqtt_fn(mg_conn_t *c, int ev, void *ev_data)
             //sys_get_path(path, "emqxsl-ca.crt");
             if (mg_url_is_ssl(mc->ser.server)) {
 
-                struct mg_tls_opts opts = {.ca = mg_str(ca_cert),
+                struct mg_tls_opts opts = {.ca = mg_str(mc->ser.cert),
                                            .name = mg_url_host(mc->ser.server)};
                 mg_tls_init(c, &opts);
             }
@@ -494,6 +469,8 @@ int mqtt_init(void)
     
     h->dm = &__globalDeviceManage;
     h->prod_id = h->dm->_globalDevInfo.product_id;
+    //sys_get_chip_id(&h->prod_id);
+
     h->mgr.dns4.url = "udp://114.114.114.114:53";
     //h->mgr.dns6.url = "udp://114.114.114.114:53";
 

+ 93 - 15
pro/src/sqlite_handle.c

@@ -12,13 +12,17 @@
 
 #define	TOTAL_COUNT	60//统计总数
 
+enum{
+    DB_MIN=0,
+    DB_MAX,
+};
 
 typedef struct {
     sqlite3             *db;
     pthread_mutex_t     mutex;
 }sql_handle_t;
 static sql_handle_t sqlHandle={0};
-
+static int overwrite_flag=0;
 
 
 static int get_count(sqlite3 *db, char *table)
@@ -42,6 +46,33 @@ static int get_count(sqlite3 *db, char *table)
 
     return count;
 }
+static int get_key(sqlite3 *db, char *table, char *key, int mm)
+{
+    int r,id=-1;
+    char temp[1024];
+    sqlite3_stmt *stmt=NULL;
+
+    if(mm==DB_MIN) {
+        sprintf(temp, "SELECT MIN(%s) FROM %s;", key, table);
+    }
+    else {
+        sprintf(temp, "SELECT MAX(%s) FROM %s;", key, table);
+    }
+
+    r = sqlite3_prepare_v2(db, temp, -1, &stmt, 0);
+    if (r != SQLITE_OK) {
+        log_e("___get_extr_key, sqlite3_prepare_v2 failed, %s\n", sqlite3_errmsg(db));
+        return -1;
+    }
+    
+    while (sqlite3_step(stmt) == SQLITE_ROW) {
+        id = sqlite3_column_int(stmt, 0);
+        break;
+    }
+    sqlite3_finalize(stmt);
+
+    return id;
+}
 
 
 
@@ -59,12 +90,11 @@ int sqlite_init(sqlite3** db,pthread_mutex_t* pDBMutex, const char* daba_name)
         log_d("DB Mutex init has failed\n");  
         return -1;  
     }  
-    //paras_load();       //通过文件加载配置参数
     
     ret = sqlite3_open(daba_name,db);
     if(ret != SQLITE_OK)
         return -1 ;
-    char SetData[]="PRAGMA cache_size = 0;";
+    char SetData[]="PRAGMA cache_size = 0; VACUUM;";
     ret = sqlite3_exec(*db,SetData,NULL,NULL,&errorMsg);
     return 0;
 }
@@ -309,6 +339,7 @@ int dev_change_last_Index(sqlite3 *db,int* nIndex,int nDeleteNumber,char* tableN
         return -1 ;  
     }    
     sqlite3_free_table(pResult);
+    dev_sql_VACCUM(db);
 
     sprintf(select_sql,"UPDATE %s SET product_Index = product_Index - %d;",tableName,nDeleteNumber);
     res = sqlite3_get_table(db, select_sql, &pResult, &nrow, &ncolumn, &err_msg);
@@ -319,13 +350,14 @@ int dev_change_last_Index(sqlite3 *db,int* nIndex,int nDeleteNumber,char* tableN
     }    
     *nIndex-=nDeleteNumber;
     sqlite3_free_table(pResult);
+
     return 0;
 }
 /// @brief 插入一条电源监控信息
 /// @param db 
 /// @param _globalPowerChnInfo 
 /// @return 
-int dev_insert_power_info(sqlite3 *db,GlobalPowerInfo* _globalPowerChnInfo,int* nIndex, int overwrite)
+int dev_insert_power_info(sqlite3 *db,GlobalPowerInfo* _globalPowerChnInfo,int* nIndex)
 {
     int res ;
     char select_sql[1024] = {0};
@@ -337,7 +369,7 @@ int dev_insert_power_info(sqlite3 *db,GlobalPowerInfo* _globalPowerChnInfo,int*
     char *table="Table_PowerInfo";
     GlobalPowerInfo *pInfo=_globalPowerChnInfo;
     
-    if(overwrite) {
+    if(overwrite_flag) {
         sprintf(select_sql,"UPDATE %s SET product_Index=%d,product_id=%d,product_ch_id=%d,product_ch_status=%d,"
                                           "product_ch_voltage=%.2f,product_ch_current=%.2f,product_ch_power=%.2f,product_ch_power_freq=%.2f,"
                                           "product_ch_consumption=%.2f,product_ch_power_factor=%.2f,product_samp_time='%s' "
@@ -613,8 +645,8 @@ int dev_delete_power_info_all(sqlite3 *db)
         log_e("sqlite handle error: %s\n%s\n", err_msg,delete_sql); sqlite3_free(err_msg);
         return -1 ; 
     }
-         
     sqlite3_free_table(pResult);
+    dev_sql_VACCUM(db);
 
     return 0;
 }
@@ -1304,6 +1336,7 @@ int dev_check_power_manage_info(sqlite3 *db, int cnt)
             sqlite3_free(errmsg);
             r = -1;
         }
+        dev_sql_VACCUM(db);
     }
     return r;
 }
@@ -1713,7 +1746,7 @@ int dev_update_t_ac_power_manage_over_info(sqlite3 *db,GlobalTreeACManager* _glo
 /// @param product_id 
 /// @param _globalPowerManger 
 /// @return 
-int dev_insert_t_ac_power_info(sqlite3 *db,GlobalTreeACManager* _globalPowerChnInfo,int* nIndex,char* pTimeData, int overwrite)
+int dev_insert_t_ac_power_info(sqlite3 *db,GlobalTreeACManager* _globalPowerChnInfo,int* nIndex,char* pTimeData)
 {
     int res ;
     char select_sql[1024] = {0};
@@ -1725,7 +1758,7 @@ int dev_insert_t_ac_power_info(sqlite3 *db,GlobalTreeACManager* _globalPowerChnI
     char *table="Table_PhasePowerInfo";
     GlobalTreeACManager *pInfo=_globalPowerChnInfo;
     
-    if(overwrite) {
+    if(overwrite_flag) {
         sprintf(select_sql,"UPDATE %s SET product_index=%d,product_id=%d,product_ph_id=%d,product_ch_id_belong=%d,"
                                           "product_ph_voltage=%.2f,product_ph_current=%.2f,product_ph_power=%.2f,product_ph_power_freq=%.2f,"
                                           "product_ph_consumption=%.2f,product_ph_power_factor=%.2f,product_ph_samp_time='%s' "
@@ -1796,8 +1829,8 @@ int dev_delete_ac_power_info_all(sqlite3 *db)
         log_e("sqlite handle error: %s\n%s\n", err_msg,delete_sql); sqlite3_free(err_msg);
         return -1 ; 
     }
-         
     sqlite3_free_table(pResult);
+    dev_sql_VACCUM(db);
 
     return 0;
 }
@@ -2006,6 +2039,8 @@ int dev_delete_breaker_manage(sqlite3 *db,int product_id,int breaker_id)
         return -1 ;
     }
     sqlite3_free_table(pResult);
+    dev_sql_VACCUM(db);
+
     return 0;
 }
 
@@ -2359,6 +2394,8 @@ int dev_delete_sensor_manage(sqlite3 *db,int product_id,int sensor_id)
         return -1 ;
     }
     sqlite3_free_table(pResult);
+    dev_sql_VACCUM(db);
+
     return 0;
 }
 int dev_delete_sensor_info_all(sqlite3 *db)
@@ -2378,6 +2415,8 @@ int dev_delete_sensor_info_all(sqlite3 *db)
         return -1 ;
     }
     sqlite3_free_table(pResult);
+    dev_sql_VACCUM(db);
+
     return 0;
 }
 
@@ -2556,12 +2595,34 @@ int dev_insert_alarm_info(sqlite3* db,int product_id,int alarm_type,char* date_t
     char** pResult = NULL;  //用来指向sql执行结果的指针
     char* err_msg=NULL;
     char select_sql[1024] = {0};
+    char *table="Table_AlarmManage";
+
+    if(overwrite_flag) {
+        int alarmNumber=get_key(db, table, "alarmNumber", DB_MAX);
+        if(alarmNumber<0) {
+            return -1;
+        }
+        alarmNumber++;
+
+        sprintf(select_sql,"UPDATE %s SET alarmNumber=%d,alarmDate='%s',alarmType=%d,product_id=%d,alarmContent='%s' "
+                                          "WHERE alarmNumber=(SELECT MIN(alarmNumber) FROM %s);",
+                table,
+                alarmNumber,
+                date_time,
+                alarm_type,
+                product_id,
+                alarm_content,
+                table);
+    }
+    else {
+        sprintf(select_sql,"INSERT INTO %s (alarmDate,alarmType,product_id,alarmContent) VALUES ('%s',%d,%d,'%s');",
+            table,
+            date_time,
+            alarm_type,
+            product_id,
+            alarm_content);
+    }
 
-    sprintf(select_sql,"INSERT INTO Table_AlarmManage (alarmDate,alarmType,product_id,alarmContent) VALUES ('%s',%d,%d,'%s');",
-        date_time,
-        alarm_type,
-        product_id,
-        alarm_content);
     res = sqlite_SQL_RUN(db, select_sql, &pResult, &nrow, &ncolumn, &err_msg);
     if(res != SQLITE_OK) {
         log_e("sqlite handle error: %s\n%s\n", err_msg,select_sql); sqlite3_free(err_msg);
@@ -2792,6 +2853,8 @@ int dev_delete_alarm_info_all(sqlite3* db,int alarm_type)
         return -1 ;   
     }
     sqlite3_free_table(pResult);
+    dev_sql_VACCUM(db);
+
     return 0;
 }
 int dev_get_ntp_info(sqlite3 *db,NTPManager* _globalNTPInfo)
@@ -3016,6 +3079,8 @@ int dev_delete__group_info(sqlite3 *db,int product_id)
         return -1 ;
     }
     sqlite3_free_table(pResult);
+    dev_sql_VACCUM(db);
+
     return 0;
 }
 
@@ -3219,6 +3284,8 @@ int dev_delete_user_info(sqlite3 *db,int userID)
         return -1 ;
     }
     sqlite3_free_table(pResult);
+    dev_sql_VACCUM(db);
+
     return 0;
 }
 
@@ -3488,6 +3555,8 @@ int dev_delete_power_ds(sqlite3 *db,int product_id,int nChn,_PowerDSManage_t* _p
         return -1;
     }
     sqlite3_free_table(pResult);
+    dev_sql_VACCUM(db);
+
     return 0;
 }
 
@@ -4227,7 +4296,7 @@ quit:
 
 int dev_smtp_update_recv(sqlite3 *db, smtp_recv_t *recv)
 {
-    int i,r=0,exist=0,cnt=0;
+    int i,r=-1,exist=0,cnt=0;
 
 #ifdef USE_SMTP
     char temp[1024];
@@ -4420,3 +4489,12 @@ int dev_sql_VACCUM(sqlite3 *db)
     return 0;
 }
 
+
+int dev_sql_set_overwrite(int flag)
+{
+    overwrite_flag = flag;
+    return 0;
+}
+
+
+

+ 3 - 2
pro/src/sqlite_handle.h

@@ -19,7 +19,7 @@ int dev_update_device_modus_info(sqlite3 *db,GlobalDeviceInfo* _globalDeviceInfo
 
 int dev_search_last_Index(sqlite3 *db,int* nIndex,char* tableName);
 int dev_change_last_Index(sqlite3 *db,int* nIndex,int nDeleteNumber,char* tableName);
-int dev_insert_power_info(sqlite3 *db,GlobalPowerInfo* _globalPowerChnInfo,int* nIndex, int overwrite);
+int dev_insert_power_info(sqlite3 *db,GlobalPowerInfo* _globalPowerChnInfo,int* nIndex);
 int dev_search_latest_power_info(sqlite3 *db,int product_id,int product_ch_id,GlobalPowerInfo* _globalPowerInfo);
 int dev_search_latest_power_All_info(GlobalDeviceManager* globalDeviceManger,_OverChnPwrAckInfo* __overChnPwrAckInfo, int dev_addr);
 int dev_delete_power_info_all(sqlite3 *db);
@@ -49,7 +49,7 @@ int dev_get_power_manage_info_by_ID(sqlite3 *db,int product_id,int product_addr,
 
 int dev_get_t_ac_power_manage_info(sqlite3 *db,int product_id,int product_addr,int product_ch_id,int product_ph_type,GlobalTreeACManager* _globalPowerChnManger);
 int dev_insert_t_ac_power_manage_info(sqlite3 *db,int product_id,int product_ch_id,GlobalTreeACManager* _globalPowerChnManger);
-int dev_insert_t_ac_power_info(sqlite3 *db,GlobalTreeACManager* _globalPowerChnInfo,int* nIndex,char* pTimeData, int overwrite);
+int dev_insert_t_ac_power_info(sqlite3 *db,GlobalTreeACManager* _globalPowerChnInfo,int* nIndex,char* pTimeData);
 int dev_update_t_ac_power_manage_info(sqlite3 *db,GlobalTreeACManager* _globalPowerChnInfo);
 int dev_update_t_ac_power_manage_over_info(sqlite3 *db,GlobalTreeACManager* _globalPowerChnManger);
 int dev_delete_ac_power_info_all(sqlite3 *db);
@@ -153,5 +153,6 @@ int dev_mqtt_init(sqlite3 *db, mqtt_server_t *ser);
 int dev_mqtt_update(sqlite3 *db, mqtt_server_t *ser);
 
 int dev_sql_VACCUM(sqlite3 *db);
+int dev_sql_set_overwrite(int flag);
 
 #endif

+ 174 - 85
pro/src/sys.c

@@ -904,6 +904,128 @@ int sys_get_net(NetworkInfo_t *para, int ipVersion)
 }
 
 
+int sys_is_running(char *prog)
+{
+    FILE *fp;
+    int pid=0;
+    char buf[20]={0};
+    char command[200];
+
+    snprintf(command, sizeof(command), "ps -ef | grep -v grep | grep -w -c %s", prog);
+    fp = popen(command, "r");
+    if (fp == NULL) {
+        LOGE("execute %s failed: %s", command, strerror(errno));
+        return 0;
+    }
+
+    if (fgets(buf, sizeof(buf), fp)) {
+        pid = atoi(buf);
+    }
+    pclose(fp);
+    
+    return (pid)?1:0;
+}
+
+
+int sys_get_disk_ava_MB(char *path)
+{
+    int r;
+    struct statvfs st;
+
+    r = statvfs(path, &st);
+    if(r) {
+        return -1;
+    }
+
+    int avaMB = (st.f_frsize*st.f_bavail)/(1024*1024);
+    //int freeMB = (st.f_frsize*st.f_bfree)/(1024*1024);
+    //printf("____ava: %dMB, free %dMB\n", avaMB, freeMB);
+
+    return avaMB;
+}
+
+
+int sys_get_mem_ava_MB(void)
+{
+    int r,value=0;
+    char buff[32];
+    struct sysinfo info;
+
+#if 0
+    r = sysinfo(&info);
+    if(r) {
+        return -1;
+    }
+    value = (info.freeram*info.mem_unit)/(1014*1024);
+#else
+
+    FILE *fp = fopen("/proc/meminfo", "r");
+    if(!fp) {
+        return -1;
+    }
+
+    fscanf(fp, "MemTotal: %s kB\n", buff);
+    fscanf(fp, "MemFree: %s kB\n", buff);
+    fscanf(fp, "MemAvailable: %s kB\n", buff);
+    value = atol(buff)/1024;
+    fclose(fp);
+#endif
+
+    return value;
+}
+
+
+int sys_get_mac(char *mac, int maclen)
+{
+    int sock;
+    struct ifreq ifr;
+
+    if(!mac || maclen<6) {
+        return -1;
+    }
+
+    sock = socket(AF_INET, SOCK_DGRAM, 0);
+    if (sock == -1){
+        return -1;
+    }
+
+    strcpy(ifr.ifr_name, "eth0");
+    if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0){
+        close(sock); return -1;
+    }
+    close(sock);
+
+    uint8_t *p = (uint8_t*)ifr.ifr_hwaddr.sa_data;
+    snprintf(mac, maclen, "%02x%02x%02x%02x%02x%02x", p[0], p[1], p[2], p[3], p[4], p[5]);
+
+    return 0;
+}
+
+int sys_get_chip_id(int *id)
+{
+    int sock;
+    struct ifreq ifr;
+
+    if(!id) {
+        return -1;
+    }
+
+    sock = socket(AF_INET, SOCK_DGRAM, 0);
+    if (sock == -1){
+        return -1;
+    }
+
+    strcpy(ifr.ifr_name, "eth0");
+    if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0){
+        close(sock); return -1;
+    }
+    close(sock);
+
+    *id = *((int*)ifr.ifr_hwaddr.sa_data);
+    return 0;
+}
+
+///////////////////////////////////////////////////////////////////////
 #define MAX_BUFFER_SIZE 4096
 static void* plug_thread(void *arg)
 {
@@ -912,6 +1034,7 @@ static void* plug_thread(void *arg)
     struct nlmsghdr *nlMsg;
     char buffer[MAX_BUFFER_SIZE];
     int plug_in=0,plug_out=0;
+    thread_handle_t *h=(thread_handle_t*)arg;
 
     printf("___plug_thread start\n");
 
@@ -934,7 +1057,7 @@ static void* plug_thread(void *arg)
 	int flags = fcntl(nlSock, F_GETFL, 0);
     fcntl(nlSock, F_SETFL, flags | O_NONBLOCK);
 
-    while (1) {
+    while (h->quit==0) {
         fd_set readSet;
         FD_ZERO(&readSet);
         FD_SET(nlSock, &readSet);
@@ -1015,112 +1138,78 @@ quit:
     printf("___plug_thread exit\n");
     pthread_exit(NULL);
 }
+///////////////////////////////////////////////////////////
 
-int sys_is_running(char *prog)
-{
-    FILE *fp;
-    int pid=0;
-    char buf[20]={0};
-    char command[200];
-
-    snprintf(command, sizeof(command), "ps -ef | grep -v grep | grep -w -c %s", prog);
-    fp = popen(command, "r");
-    if (fp == NULL) {
-        LOGE("execute %s failed: %s", command, strerror(errno));
-        return 0;
-    }
+//#define RAM_DEBUG
+//#define ROM_DEBUG
 
-    if (fgets(buf, sizeof(buf), fp)) {
-        pid = atoi(buf);
-    }
-    pclose(fp);
-    
-    return (pid)?1:0;
-}
+#ifdef RAM_DEBUG
+    #define RAM_THRD        177
+    #define RAM_PERIOD      1
+#else
+    #define RAM_THRD        50
+    #define RAM_PERIOD      60
+#endif
 
+#ifdef ROM_DEBUG
+    #define ROM_THRD        500
+    #define ROM_PERIOD      1
+#else
+    #define ROM_THRD        50
+    #define ROM_PERIOD      1
+#endif
 
-int sys_get_disk_ava_MB(char *path)
+static void ram_spack_check(void)
 {
-    int r;
-    struct statvfs st;
-
-    r = statvfs(path, &st);
-    if(r) {
-        return -1;
+    int avaMB;
+    static uint32_t ram_cnt=0;
+
+    ram_cnt++;
+    if(ram_cnt%RAM_PERIOD==0) {
+        avaMB = sys_get_mem_ava_MB();
+        printf("___ available mem:  %dMB, threshold: %dMB\n", avaMB, RAM_THRD);
+        if(avaMB<RAM_THRD) {
+            printf("___ free mem less than %dMB, reboot now ...\n", RAM_THRD);
+            sys_reboot();
+        }
     }
-
-    int avaMB = (st.f_frsize*st.f_bavail)/(1024*1024);
-    //int freeMB = (st.f_frsize*st.f_bfree)/(1024*1024);
-    //printf("____ava: %dMB, free %dMB\n", avaMB, freeMB);
-
-    return avaMB;
 }
-
-
-int sys_get_mem_ava_MB(void)
+static void rom_space_check(void)
 {
-    int r,value=0;
-    char buff[32];
-    struct sysinfo info;
-
-#if 0
-    r = sysinfo(&info);
-    if(r) {
-        return -1;
-    }
-    value = (info.freeram*info.mem_unit)/(1014*1024);
-#else
-
-    FILE *fp = fopen("/proc/meminfo", "r");
-    if(!fp) {
-        return -1;
+    int avaMB,flag=0;
+    static uint32_t rom_cnt=0;
+
+    rom_cnt++;
+    if(rom_cnt%ROM_PERIOD==0) {
+        avaMB = sys_get_disk_ava_MB("/");
+        printf("___ available rom: %dMB\n", avaMB);
+        if(avaMB<ROM_THRD) {
+            flag = 1;
+        }
+        dev_sql_set_overwrite(flag);
     }
-
-    fscanf(fp, "MemTotal: %s kB\n", buff);
-    fscanf(fp, "MemFree: %s kB\n", buff);
-    fscanf(fp, "MemAvailable: %s kB\n", buff);
-    value = atol(buff)/1024;
-    fclose(fp);
-#endif
-
-    return value;
 }
-
-
-int sys_get_mac(char *mac, int maclen)
+static void* polling_thread(void *arg)
 {
-    int sock;
-    struct ifreq ifr;
-
-    if(!mac || maclen<6) {
-        return -1;
-    }
-
-    sock = socket(AF_INET, SOCK_DGRAM, 0);
-    if (sock == -1){
-        return -1;
-    }
+    thread_handle_t *h=(thread_handle_t*)arg;
 
-    strcpy(ifr.ifr_name, "eth0");
-    if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0){
-        close(sock); return -1;
+    while(h->quit==0) {
+        ram_spack_check();
+        rom_space_check();
+        sleep(1);
     }
-    close(sock);
-
-    uint8_t *p = (uint8_t*)ifr.ifr_hwaddr.sa_data;
-    snprintf(mac, maclen, "%02x%02x%02x%02x%02x%02x", p[0], p[1], p[2], p[3], p[4], p[5]);
-
-    return 0;
+    pthread_exit(NULL);
 }
 
 
+
 int sys_init(void)
 {
     //userShellInit();
     initLogger();
     lock_s_init();
     
-    //thread_start(THREAD_ID_PLUG, plug_thread, NULL, 4*MB, 0);
+    thread_start(THREAD_ID_POLLING, polling_thread, NULL, 4*MB, 0);
 
     return 0;
 }

+ 1 - 1
pro/src/sys.h

@@ -28,6 +28,6 @@ int sys_get_path(char *path, char *name);
 int sys_get_net(NetworkInfo_t *para, int ipVersion);
 int sys_set_net(NetworkInfo_t *para, int ipVersion);
 int sys_get_mac(char *mac, int maclen);
-
+int sys_get_chip_id(int *id);
 
 #endif

+ 1 - 1
pro/src/thread.h

@@ -20,7 +20,7 @@ enum {
     THREAD_ID_SNMP,
     THREAD_ID_POWER,
     THREAD_ID_SENSOR,
-    THREAD_ID_PLUG,
+    THREAD_ID_POLLING,
     THREAD_ID_CASCADE,
     THREAD_ID_SCAN,
     THREAD_ID_SHMW,