Selaa lähdekoodia

1、添加smtp,自测ok

guohui 2 vuotta sitten
vanhempi
commit
28026cf22e

+ 1 - 2
pro/config/cfg.h

@@ -46,7 +46,7 @@
 
 
 
 
 #ifdef CUST_ANDERSON
 #ifdef CUST_ANDERSON
-    //#define USE_SMTP
+    #define USE_SMTP
     #define USE_NETSWITCH
     #define USE_NETSWITCH
 
 
     #define SW_STATIC_PORT_START
     #define SW_STATIC_PORT_START
@@ -54,7 +54,6 @@
     #define SW_PORT_INDEX_END           21
     #define SW_PORT_INDEX_END           21
 
 
     //#define SW_STATIC_IP
     //#define SW_STATIC_IP
-
     #ifdef SW_STATIC_IP
     #ifdef SW_STATIC_IP
         #define SW_HOST_IP              "192.168.234.1"
         #define SW_HOST_IP              "192.168.234.1"
         #define SW_PDU_IP               "192.168.234.132"
         #define SW_PDU_IP               "192.168.234.132"

+ 21 - 0
pro/mongoose/mongoose.c

@@ -15218,6 +15218,27 @@ size_t mg_ws_send(struct mg_connection *c, const void *buf, size_t len,
   return header_len + len;
   return header_len + len;
 }
 }
 
 
+
+static void my_mask(uint8_t *data, size_t len) {
+    size_t i;
+    uint8_t *p=data, *mask=p-4;
+    for (i = 0; i < len; i++) p[i] ^= mask[i & 3];
+}
+size_t mg_ws_send2(struct mg_connection *c, const void *buf, size_t len,
+                  int op) {
+  uint8_t *p=malloc(len+100);
+  if(!p) return -1;
+  uint8_t header[14];
+  size_t header_len = mkhdr(len, op, c->is_client, p);
+  memcpy(p+header_len, buf, len);
+  //my_mask(p+header_len, len);
+  mg_io_send(c, p, header_len+len);
+  free(p);
+  
+  return header_len + len;
+}
+
+
 static bool mg_ws_client_handshake(struct mg_connection *c) {
 static bool mg_ws_client_handshake(struct mg_connection *c) {
   int n = mg_http_get_request_len(c->recv.buf, c->recv.len);
   int n = mg_http_get_request_len(c->recv.buf, c->recv.len);
   if (n < 0) {
   if (n < 0) {

+ 1 - 0
pro/mongoose/mongoose.h

@@ -2251,6 +2251,7 @@ struct mg_connection *mg_ws_connect(struct mg_mgr *, const char *url,
 void mg_ws_upgrade(struct mg_connection *, struct mg_http_message *,
 void mg_ws_upgrade(struct mg_connection *, struct mg_http_message *,
                    const char *fmt, ...);
                    const char *fmt, ...);
 size_t mg_ws_send(struct mg_connection *, const void *buf, size_t len, int op);
 size_t mg_ws_send(struct mg_connection *, const void *buf, size_t len, int op);
+size_t mg_ws_send2(struct mg_connection *, const void *buf, size_t len, int op);
 size_t mg_ws_wrap(struct mg_connection *, size_t len, int op);
 size_t mg_ws_wrap(struct mg_connection *, size_t len, int op);
 size_t mg_ws_printf(struct mg_connection *c, int op, const char *fmt, ...);
 size_t mg_ws_printf(struct mg_connection *c, int op, const char *fmt, ...);
 size_t mg_ws_vprintf(struct mg_connection *c, int op, const char *fmt,
 size_t mg_ws_vprintf(struct mg_connection *c, int op, const char *fmt,

+ 12 - 13
pro/src/appweb_handle.c

@@ -3042,29 +3042,28 @@ static void serviceManagement(void *conn)
     
     
     if(strcmp(_serviceManageRequestInfo.type,"listSmtpQuery")==0)
     if(strcmp(_serviceManageRequestInfo.type,"listSmtpQuery")==0)
     {
     {
-         ack_str = service_smtp_ack_to_json(&gdm->smtp_sett);
+         ack_str = service_smtp_ack_to_json(&gdm->smtpInfo);
     }   
     }   
     else if(strcmp(_serviceManageRequestInfo.type,"SmtpSave")==0)
     else if(strcmp(_serviceManageRequestInfo.type,"SmtpSave")==0)
     {
     {
         //_SMTP_ServerRequestInfo
         //_SMTP_ServerRequestInfo
-        //gdm->smtp_sett. 
-        smtp_manager_t *man=&gdm->smtp_sett.man;
-        smtp_recvs_t *rcv=&gdm->smtp_sett.rcv;
+        smtp_send_t *send=&gdm->smtpInfo.send;
+        smtp_recv_t *recv=gdm->smtpInfo.recv;
         _SMTP_ServerRequestInfo *info=&_serviceManageRequestInfo._smtp_info;
         _SMTP_ServerRequestInfo *info=&_serviceManageRequestInfo._smtp_info;
 
 
         if(info->mode && info->account && info->password && info->server && info->port && info->auth)  {
         if(info->mode && info->account && info->password && info->server && info->port && info->auth)  {
-            man->product_id = gdm->_globalDevInfo.product_id;
-            man->mode = atoi(info->mode);
-            strcpy(man->account, info->account);
-            strcpy(man->password, info->password);
-            strcpy(man->server, info->server);
-            strcpy(man->port, info->port);
-            strcpy(man->auth, info->auth);
+            send->product_id = gdm->_globalDevInfo.product_id;
+            send->mode = atoi(info->mode);
+            strcpy(send->account, info->account);
+            strcpy(send->password, info->password);
+            strcpy(send->server, info->server);
+            strcpy(send->port, info->port);
+            strcpy(send->auth, info->auth);
 
 
-            dev_smtp_update_man(gdm->db, man);
+            dev_smtp_update_send(gdm->db, send);
         }
         }
 
 
-        smtp_recv_t *pv,*recv=rcv->recv;
+        smtp_recv_t *pv=NULL;
         for(int i=0; i<SMTP_RECV_MAX; i++) {
         for(int i=0; i<SMTP_RECV_MAX; i++) {
             if(info->recvAccount[i]) {
             if(info->recvAccount[i]) {
                 pv = &recv[i];
                 pv = &recv[i];

+ 13 - 10
pro/src/common.h

@@ -198,6 +198,12 @@ enum {
 };
 };
 
 
 
 
+enum {
+    NETWORK_MAC_CHANGED=0,
+    NETWORK_IP_CHANGED,
+};
+
+
 /// @brief 报警动作
 /// @brief 报警动作
 enum ALARM_CTRL
 enum ALARM_CTRL
 {
 {
@@ -609,11 +615,6 @@ typedef struct
     int                 use;
     int                 use;
     char                account[64];
     char                account[64];
 }smtp_recv_t;
 }smtp_recv_t;
-typedef struct
-{
-    #define SMTP_RECV_MAX  10
-    smtp_recv_t         recv[SMTP_RECV_MAX];      //接收账号列表
-}smtp_recvs_t;
 typedef struct 
 typedef struct 
 {
 {
     int                 product_id;
     int                 product_id;
@@ -623,12 +624,14 @@ typedef struct
     char                server[64]; 			        //服务器
     char                server[64]; 			        //服务器
     char                port[10];    		            //端口
     char                port[10];    		            //端口
     char                auth[16];    			        //认证方式  
     char                auth[16];    			        //认证方式  
-}smtp_manager_t;
+}smtp_send_t;
 typedef struct
 typedef struct
 {
 {
-    smtp_manager_t      man;
-    smtp_recvs_t        rcv;
-}smtp_sett_t;
+    smtp_send_t         send;
+
+    #define SMTP_RECV_MAX  10
+    smtp_recv_t         recv[SMTP_RECV_MAX];      //接收账号列表
+}smtp_info_t;
 
 
 typedef struct 
 typedef struct 
 {
 {
@@ -942,7 +945,7 @@ typedef struct
     cascade_triphasic_mmap_t *triphasic_mmap;	
     cascade_triphasic_mmap_t *triphasic_mmap;	
 	GlobalBreakerManager g_new_global_breaker;
 	GlobalBreakerManager g_new_global_breaker;
 
 
-    smtp_sett_t          smtp_sett;
+    smtp_info_t          smtpInfo;
 }GlobalDeviceManager;
 }GlobalDeviceManager;
 
 
 extern GlobalDeviceManager __globalDeviceManage;
 extern GlobalDeviceManager __globalDeviceManage;

+ 8 - 0
pro/src/dflt.c

@@ -42,4 +42,12 @@ GlobalDeviceInfo DFLT_PARAS={
 };
 };
 
 
 
 
+smtp_send_t DFLT_SMTP_SEND={
 
 
+    .mode = 1,
+    .server = "smtp.163.com",
+    .port = "25",
+    .account = "rcp064867@163.com",
+    .password = "UODRIFWDFBTJTVLW",
+    .auth = "PLAIN",
+};

+ 24 - 17
pro/src/json_handle.c

@@ -4731,12 +4731,12 @@ char* service_snmp_ack_to_json(SNMPManager* __SNMPManager_t)
     return str;
     return str;
 }
 }
 
 
-char* service_smtp_ack_to_json(smtp_sett_t* sett)
+char* service_smtp_ack_to_json(smtp_info_t* info)
 {
 {
     int idx=0;
     int idx=0;
     char* str = NULL;
     char* str = NULL;
-    smtp_manager_t *man=&sett->man;
-    smtp_recv_t *recv=sett->rcv.recv;
+    smtp_send_t *send=&info->send;
+    smtp_recv_t *recv=info->recv;
     
     
     // 创建 JSON 对象
     // 创建 JSON 对象
     cJSON* root = cJSON_CreateObject();   
     cJSON* root = cJSON_CreateObject();   
@@ -4746,26 +4746,33 @@ char* service_smtp_ack_to_json(smtp_sett_t* sett)
     cJSON* data_filed = cJSON_CreateObject();
     cJSON* data_filed = cJSON_CreateObject();
     char buf[30];
     char buf[30];
     memset(buf, 0, sizeof(buf));
     memset(buf, 0, sizeof(buf));
-    sprintf(buf, "%d", man->mode);
+    sprintf(buf, "%d", send->mode);
     cJSON_AddStringToObject(data_filed,"mode", buf);
     cJSON_AddStringToObject(data_filed,"mode", buf);
-    cJSON_AddStringToObject(data_filed,"server", man->server);
-    cJSON_AddStringToObject(data_filed,"port", man->port);
-    cJSON_AddStringToObject(data_filed,"zh", man->account);
-    cJSON_AddStringToObject(data_filed,"mm", man->password);
-    cJSON_AddStringToObject(data_filed,"rzfs", man->auth);
+    cJSON_AddStringToObject(data_filed,"server", send->server);
+    cJSON_AddStringToObject(data_filed,"port", send->port);
+    cJSON_AddStringToObject(data_filed,"zh", send->account);
+    cJSON_AddStringToObject(data_filed,"mm", send->password);
+    cJSON_AddStringToObject(data_filed,"rzfs", send->auth);
+    
+    cJSON* array=NULL;
+    for(int i=0; i<SMTP_RECV_MAX; i++) {
+        if(recv[i].use) {
+            cJSON* tmp = cJSON_CreateObject();
+            if(tmp) {
+                cJSON_AddStringToObject(tmp,"receiveAccount", recv[i].account);
+                cJSON_AddNumberToObject(tmp,"idx", idx++);
+
+                if(array==NULL) {
+                    array = cJSON_CreateArray();
+                }
 
 
-    cJSON* array = cJSON_CreateArray();
-    if(array) {
-        for(int i=0; i<SMTP_RECV_MAX; i++) {
-            if(recv[i].use) {
-                cJSON* tmp = cJSON_CreateObject();
-                if(tmp) {
-                    cJSON_AddStringToObject(tmp,"receiveAccount", recv[i].account);
-                    cJSON_AddNumberToObject(tmp,"idx", idx++);
+                if(array) {
                     cJSON_AddItemToArray(array, tmp);
                     cJSON_AddItemToArray(array, tmp);
                 }
                 }
             }
             }
         }
         }
+    }
+    if(array) {
         cJSON_AddItemToObject(data_filed, "receiveAccountList", array);
         cJSON_AddItemToObject(data_filed, "receiveAccountList", array);
     }
     }
     
     

+ 1 - 1
pro/src/json_handle.h

@@ -591,7 +591,7 @@ char* service_ds_all_ack_to_json(char* pDate,char* Name,char* nchID,GlobalPowerM
 char* service_sx_ack_to_json(int product_id, GlobalPowerManger * __PowerManage_t);
 char* service_sx_ack_to_json(int product_id, GlobalPowerManger * __PowerManage_t);
 char* service_ntp_ack_to_json(NTPManager* __NTPManager_t);
 char* service_ntp_ack_to_json(NTPManager* __NTPManager_t);
 char* service_snmp_ack_to_json(SNMPManager* __SNMPManager_t);
 char* service_snmp_ack_to_json(SNMPManager* __SNMPManager_t);
-char* service_smtp_ack_to_json(smtp_sett_t* sett);
+char* service_smtp_ack_to_json(smtp_info_t* info);
 char* service_group_ack_to_json(GroupInfo* _globalgroupInfo);
 char* service_group_ack_to_json(GroupInfo* _globalgroupInfo);
 ///请求管理
 ///请求管理
 cJSON* json_to_sensor_manage(const char* str,_OverSensorRequest* _overSensorRequest);
 cJSON* json_to_sensor_manage(const char* str,_OverSensorRequest* _overSensorRequest);

+ 1 - 0
pro/src/lock.h

@@ -5,6 +5,7 @@
 enum {
 enum {
     LOCK_ID_DB=0,
     LOCK_ID_DB=0,
     LOCK_ID_MQTT,
     LOCK_ID_MQTT,
+    LOCK_ID_SMTP,
     LOCK_ID_PARAS,
     LOCK_ID_PARAS,
     
     
     
     

+ 2 - 1
pro/src/netswitch.c

@@ -8,7 +8,7 @@
 #include "thread.h"
 #include "thread.h"
 #include "cfg.h"
 #include "cfg.h"
 #include "lock.h"
 #include "lock.h"
-#include "sys.h"
+#include "smtp.h"
 #include "sqlite_handle.h"
 #include "sqlite_handle.h"
 #include "smtp.h"
 #include "smtp.h"
 
 
@@ -844,6 +844,7 @@ static int sw_alarm(netswitch_evts_t *evts, netswitch_info_t *old, netswitch_inf
 
 
     if(flag) {
     if(flag) {
         r = dev_insert_alarm_info(get_db(), get_prod_id(), 2, time_str, alarm_str);
         r = dev_insert_alarm_info(get_db(), get_prod_id(), 2, time_str, alarm_str);
+        smtp_post_alarm(ALARM_TYPE_NETWORK, 0, NETWORK_MAC_CHANGED, alarm_str);
     }
     }
 
 
     return r;
     return r;

+ 215 - 104
pro/src/smtp.c

@@ -3976,6 +3976,7 @@ smtp_attachment_clear_all(struct smtp *const smtp){
 #include "thread.h"
 #include "thread.h"
 #include "xlist.h"
 #include "xlist.h"
 #include "elog.h"
 #include "elog.h"
+#include "lock.h"
 #include "sqlite_handle.h"
 #include "sqlite_handle.h"
 
 
 #if 1
 #if 1
@@ -3992,112 +3993,93 @@ smtp_attachment_clear_all(struct smtp *const smtp){
 #define MAIL_FLAGS               (SMTP_DEBUG|SMTP_NO_CERT_VERIFY) /* Do not verify cert. */
 #define MAIL_FLAGS               (SMTP_DEBUG|SMTP_NO_CERT_VERIFY) /* Do not verify cert. */
 #define MAIL_CAFILE              NULL
 #define MAIL_CAFILE              NULL
 #define MAIL_AUTH                SMTP_AUTH_PLAIN
 #define MAIL_AUTH                SMTP_AUTH_PLAIN
+static int send_mail(smtp_send_t *send, void *addr, char *sub, char *body, int multi)
+{
+    int i,r=-1,flag=0;
+    struct smtp *smtp=NULL;
+    enum smtp_flag flags=(SMTP_DEBUG|SMTP_NO_CERT_VERIFY);
+    enum smtp_connection_security security=SMTP_SECURITY_STARTTLS;
+    enum smtp_authentication_method auth=SMTP_AUTH_PLAIN;
 
 
+    lock_s_hold(LOCK_ID_SMTP);
+    if(!sub || !body || send->mode==0) {
+        goto out;
+    }
 
 
-typedef struct {
-    char server[64];
-    char port[10];
-    
-    char user[32];
-    char passwd[32];
-    
-    char name_fr[64];
-    char mail_fr[64];
-    
-    char name_to[64];
-    char mail_to[64];
-    
-    char *sub;
-    char *body;
-}smtp_para_t;
-static int send_mail(smtp_para_t *para, enum smtp_authentication_method auth)
-{
-    int r;
-    struct smtp *smtp;
+    if(strcmp(send->auth, "LOGIN")==0) {
+        auth = SMTP_AUTH_LOGIN;
+    }
+    else if(strcmp(send->auth, "CRAM-MD5")==0) {
+        auth = SMTP_AUTH_CRAM_MD5;
+    }
+
+    if(strcmp(send->port,"465")==0) {
+        security = SMTP_SECURITY_TLS;
+    }
     
     
-    r = smtp_open(para->server, para->port, MAIL_CONNECTION_SECURITY, MAIL_FLAGS, MAIL_CAFILE, &smtp);
+    r = smtp_open(send->server, send->port, security, flags, NULL, &smtp);
     if(r != SMTP_STATUS_OK) {
     if(r != SMTP_STATUS_OK) {
-        LOGE("___ smtp_auth failed, %s\n", smtp_status_code_errstr(r));
+        LOGE("___ smtp_open failed, %s\n", smtp_status_code_errstr(r));
         return -1;
         return -1;
     }
     }
     
     
-    r = smtp_auth(smtp, auth, para->user, para->passwd);
+    r = smtp_auth(smtp, auth, send->account, send->password);
     if(r != SMTP_STATUS_OK) {
     if(r != SMTP_STATUS_OK) {
         LOGE("___ smtp_auth failed, %s\n", smtp_status_code_errstr(r));
         LOGE("___ smtp_auth failed, %s\n", smtp_status_code_errstr(r));
         goto quit;
         goto quit;
     }
     }
     
     
-    r = smtp_address_add(smtp, SMTP_ADDRESS_FROM, para->mail_fr, para->name_fr);
+    r = smtp_address_add(smtp, SMTP_ADDRESS_FROM, send->account, send->account);
     if(r != SMTP_STATUS_OK) {
     if(r != SMTP_STATUS_OK) {
         LOGE("___ smtp_address_add fr failed\n, %s", smtp_status_code_errstr(r));
         LOGE("___ smtp_address_add fr failed\n, %s", smtp_status_code_errstr(r));
         goto quit;
         goto quit;
     }
     }
     
     
-    r = smtp_address_add(smtp, SMTP_ADDRESS_TO, para->mail_to, para->name_to);
-    if(r != SMTP_STATUS_OK) {
-        LOGE("___ smtp_address_add to failed, %s\n", smtp_status_code_errstr(r));
-        goto quit;
+    if(multi) {
+      smtp_recv_t *recv=(smtp_recv_t*)addr;
+      for(i=0; i<SMTP_RECV_MAX; i++) {
+          if(recv[i].use && strlen(recv[i].account)>0) {
+              r = smtp_address_add(smtp, SMTP_ADDRESS_TO, recv[i].account, recv[i].account);
+              if(r != SMTP_STATUS_OK) {
+                  LOGE("___ smtp_address_add to %s failed, %s\n", recv[i].account, smtp_status_code_errstr(r));
+              }
+              else {
+                  flag = 1;
+              }
+          }
+      }
     }
     }
-    
-    r = smtp_header_add(smtp, "Subject", para->sub);
-    if(r != SMTP_STATUS_OK) {
-        LOGE("___ smtp_header_add failed, %s\n", smtp_status_code_errstr(r));
-        goto quit;
+    else {
+        char *sendto=(char*)addr;
+        r = smtp_address_add(smtp, SMTP_ADDRESS_TO, sendto, sendto);
+        if(r != SMTP_STATUS_OK) {
+            LOGE("___ smtp_address_add to %s failed, %s\n", sendto, smtp_status_code_errstr(r));
+        }
+        else {
+            flag = 1;
+        }
     }
     }
     
     
-    //r = smtp_attachment_add_mem(smtp, "test.txt", "Test email attachment.", -1);
-    r = smtp_mail(smtp, para->body);
-    if(r != SMTP_STATUS_OK) {
-        LOGE("___ smtp_mail failed, %s\n", smtp_status_code_errstr(r));
+    if(flag>0) {
+        r = smtp_header_add(smtp, "Subject", sub);
+        if(r != SMTP_STATUS_OK) {
+            LOGE("___ smtp_header_add failed, %s\n", smtp_status_code_errstr(r));
+            goto quit;
+        }
+    
+        //r = smtp_attachment_add_mem(smtp, "test.txt", "Test email attachment.", -1);
+        smtp_mail(smtp, body);
     }
     }
     
     
 quit:
 quit:
-    r = smtp_close(smtp);
+    smtp_close(smtp);
     if(r != SMTP_STATUS_OK){
     if(r != SMTP_STATUS_OK){
-        LOGE("smtp_close failed, %s\n", smtp_status_code_errstr(r));
-    }
-    
-    return r;
-}
-static int send_mails(smtp_sett_t *sett, char *sub, char *body)
-{
-    int i,r;
-    smtp_para_t para;
-    smtp_recv_t *recv=NULL;
-    enum smtp_authentication_method auth=SMTP_AUTH_PLAIN;
-
-    if(!sett || !sub || !body || sett->man.mode==0) {
-        return -1;
-    }
-
-    strcpy(para.name_fr, "smartPDU");
-    strcpy(para.mail_fr, sett->man.account);
-
-    strcpy(para.user, sett->man.account);
-    strcpy(para.passwd, sett->man.password);
-
-    strcpy(para.port, sett->man.port);
-    strcpy(para.server, sett->man.server);
-    para.sub = sub;
-    para.body = body;
-
-    if(strcmp(sett->man.auth, "LOGIN")) {
-        auth = SMTP_AUTH_LOGIN;
-    }
-    else if(strcmp(sett->man.auth, "CRAM-MD5")) {
-        auth = SMTP_AUTH_CRAM_MD5;
-    }
-
-    recv = sett->rcv.recv;
-    for(i=0; i<SMTP_RECV_MAX; i++) {
-        if(sett->rcv.recv[i].use && strlen(sett->rcv.recv[i].account)>0) {
-            strcpy(para.name_to, recv[i].account);
-            strcpy(para.mail_to, recv[i].account);
-            r = send_mail(&para, auth);
-        }
+        LOGE("___ send_mail failed, server: %s, port: %s failed\n", send->server, send->port);
     }
     }
 
 
-    return 0;
+out:
+    lock_s_release(LOCK_ID_SMTP);
+    return r;
 }
 }
 
 
 
 
@@ -4106,8 +4088,10 @@ typedef struct {
     char body[2048];
     char body[2048];
 }smtp_pkt_t;
 }smtp_pkt_t;
 typedef struct {
 typedef struct {
-    handle_t  list;
-    GlobalDeviceManager *gdm;
+    handle_t      list;
+    smtp_info_t   *info;
+
+    GlobalDeviceManager *dm;
 }smtp_handle_t;
 }smtp_handle_t;
 static smtp_handle_t smHandle;
 static smtp_handle_t smHandle;
 
 
@@ -4121,13 +4105,15 @@ static void* smtp_thread(void *arg)
     thread_handle_t *th=(thread_handle_t*)arg;
     thread_handle_t *th=(thread_handle_t*)arg;
     smtp_handle_t   *h=(smtp_handle_t*)th->arg;
     smtp_handle_t   *h=(smtp_handle_t*)th->arg;
     list_node_t     *ln=NULL;
     list_node_t     *ln=NULL;
+    smtp_pkt_t      *pkt=NULL;
+    smtp_send_t     *send=&h->info->send;
+    smtp_recv_t     *recv=h->info->recv;
 
 
-    smtp_sett_t *sett=&h->gdm->smtp_sett;
     while(th->quit==0) {
     while(th->quit==0) {
         r = xlist_take_node(h->list, &ln, 0);
         r = xlist_take_node(h->list, &ln, 0);
         if(r==0) {
         if(r==0) {
-            smtp_pkt_t *pkt=(smtp_pkt_t*)ln->data.buf;
-            send_mails(sett, pkt->sub, pkt->body);
+            pkt = (smtp_pkt_t*)ln->data.buf;
+            send_mail(send, recv, pkt->sub, pkt->body, 1);
         }
         }
         xlist_back_node(h->list, ln);
         xlist_back_node(h->list, ln);
 
 
@@ -4146,14 +4132,17 @@ int smtp_init(void)
 #ifdef USE_SMTP
 #ifdef USE_SMTP
     list_cfg_t lc;
     list_cfg_t lc;
     smtp_handle_t *h=&smHandle;
     smtp_handle_t *h=&smHandle;
+    GlobalDeviceManager *dm=&__globalDeviceManage;
 
 
     lc.mode = LIST_FULL_FIFO;
     lc.mode = LIST_FULL_FIFO;
     lc.max = 100;
     lc.max = 100;
     lc.log = 0;
     lc.log = 0;
     h->list = xlist_init(&lc);
     h->list = xlist_init(&lc);
-    h->gdm = &__globalDeviceManage;
 
 
-    dev_smtp_init(h->gdm->db, &h->gdm->smtp_sett);
+    h->dm = dm;
+    h->info = &h->dm->smtpInfo;
+
+    dev_smtp_init(dm->db, h->info);
     thread_start(THREAD_ID_SMTP, smtp_thread, h, 5*MB, 0);
     thread_start(THREAD_ID_SMTP, smtp_thread, h, 5*MB, 0);
 
 
     //smtp_test();
     //smtp_test();
@@ -4176,9 +4165,10 @@ int smtp_deinit(void)
 }
 }
 
 
 
 
-int smtp_send(char *sub, char *body)
+static int post_data(char *sub, char *body)
 {
 {
     int r=0;
     int r=0;
+
 #ifdef USE_SMTP
 #ifdef USE_SMTP
     smtp_pkt_t pkt;
     smtp_pkt_t pkt;
     smtp_handle_t *h=&smHandle;
     smtp_handle_t *h=&smHandle;
@@ -4192,41 +4182,162 @@ int smtp_send(char *sub, char *body)
 }
 }
 
 
 
 
+int smtp_send(char *sub, char *body)
+{
+    int r=0;
+
+#ifdef USE_SMTP
+    smtp_handle_t *h=&smHandle;
+
+    r = send_mail(&h->info->send, h->info->recv, sub, body, 1);
+#endif
+
+    return r;
+}
+
+int smtp_post(char *sub, char *body)
+{
+    int r=0;
+
+#ifdef USE_SMTP
+    r = post_data(sub, body);
+#endif
+
+    return r;
+}
+
+
+int smtp_post_alarm(int type, int subtype, int alarm_type, char *content)
+{
+    int r=0;
+
+#ifdef USE_SMTP
+    smtp_pkt_t pkt;
+
+    pkt.sub[0] = pkt.body[0] = 0;
+    switch(type) {
+        case ALARM_TYPE_POWER:
+        {
+            switch(alarm_type) {
+                case WARNING_V_UP:
+                //strcpy(pkt.sub, "");
+                break;
+
+                case WARNING_V_DOWN:
+                break;
+
+                case WARNING_A_UP:
+                break;
+
+                case WARNING_W_UP:
+                break;
+
+                case WARNING_P_UP:
+                break;
+
+                case 0 ... 2:
+                break;
+
+                default:
+                return -1;
+            }
+        }
+        break;
+
+        case ALARM_TYPE_SENSOR:
+        {
+            switch(subtype) {
+                case SENSOR_TYPE_TEMPERATURE:
+                break;
+
+                case SENSOR_TYPE_SMOKE:
+                break;
+
+                case SENSOR_TYPE_WATER:
+                break;
+
+                case SENSOR_TYPE_DOOR:
+                break;
+
+                case SENSOR_TYPE_GAS:
+                break;
+
+                case SENSOR_TYPE_AIR_PRESS:
+                break;
+
+                case SENSOR_TYPE_DoubleT:
+                break;
+
+                default:
+                return -1;
+            }
+        }
+        break;
+
+        case ALARM_TYPE_NETWORK:
+        {
+            //
+        }
+        break;
+
+        default:
+        return -1;
+    }
+
+    snprintf(pkt.sub, sizeof(pkt.sub), "ALARM");
+    snprintf(pkt.body, sizeof(pkt.body), content);
+
+    r = post_data(pkt.sub, pkt.body);
+#endif
+
+    return r;
+}
+
+
+
 int smtp_test(void)
 int smtp_test(void)
 {
 {
     int r=0,cnt=0;
     int r=0,cnt=0;
     char temp[200];
     char temp[200];
+    smtp_handle_t *h=&smHandle;
 
 
 #ifdef USE_SMTP
 #ifdef USE_SMTP
-  smtp_sett_t sett={
-    .man = {
+    smtp_info_t info={
+    .send = {
       .product_id = 0,
       .product_id = 0,
       .mode = 1,
       .mode = 1,
+
       .account = "rcp064867@163.com",
       .account = "rcp064867@163.com",
-      .password = "wanhong0219107X",
+      .password = "UODRIFWDFBTJTVLW",
       .server = "smtp.163.com",
       .server = "smtp.163.com",
+
       .port = "25",
       .port = "25",
+      //.port = "465",
+      //.port = "587",
+
       .auth = "PLAIN",
       .auth = "PLAIN",
+      //.auth = "LOGIN",
+      //.auth = "CRAM-MD5",
     },
     },
 
 
-    .rcv = {
       .recv = {
       .recv = {
           {0, 1, "1556907721@qq.com"},
           {0, 1, "1556907721@qq.com"},
-          {1, 1, "cijiu0219@sina.com"},
-          {2, 1, "jiuci4902@gmail.com"},
-          {3, 1, "cijiu0219@hotmail.com"},
-          {4, 1, "cijiu990219@outlook.com"},
+          {1, 1, "rcp064867@163.com"},
+          {2, 1, "cijiu0219@sina.com"},
+          {3, 1, "jiuci4902@gmail.com"},
+          {4, 1, "cijiu0219@hotmail.com"},
+          {5, 1, "cijiu990219@outlook.com"},
       }
       }
-    },
   };
   };
+  *h->info = info;
 
 
-    char *sub="123";
-    char *body="hello everyone";
-    while(cnt++<10) {
-        sprintf(temp, "%s %d", body, cnt);
-        r = smtp_send(sub, temp);
-        sleep(2);
-    }
+  char *sub="123";
+  char *body="hello everyone";
+  while(cnt++<5) {
+      sprintf(temp, "%s %d", body, cnt);
+      r = smtp_send(sub, temp);
+      sleep(2);
+  }
 #endif
 #endif
 
 
     return r;
     return r;

+ 3 - 1
pro/src/smtp.h

@@ -6,6 +6,8 @@ int smtp_deinit(void);
 
 
 int smtp_test(void);
 int smtp_test(void);
 int smtp_send(char *sub, char *body);
 int smtp_send(char *sub, char *body);
+int smtp_post(char *sub, char *body);
+int smtp_post_alarm(int type, int subtype, int alarm_type, char *content);
 
 
-#endif /* SMTP_H */
+#endif /* __SMTP_Hx__ */
 
 

+ 42 - 27
pro/src/sqlite_handle.c

@@ -3372,7 +3372,9 @@ int dev_Alarm_send_message(GlobalDeviceManager* globalDeviceManger,GlobalPowerMa
     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);    
     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);    
     dev_insert_alarm_info(globalDeviceManger->db,__globalPowerTemp->product_id,0,buffer,AlarmText);
     dev_insert_alarm_info(globalDeviceManger->db,__globalPowerTemp->product_id,0,buffer,AlarmText);
 
 
+
     // 超限动作
     // 超限动作
+    smtp_post_alarm(ALARM_TYPE_POWER, 0, _AlarmType, AlarmText);
     
     
     int ret = -1 ;
     int ret = -1 ;
     int nchID = __globalPowerTemp->product_ch_id;
     int nchID = __globalPowerTemp->product_ch_id;
@@ -3520,6 +3522,9 @@ int dev_Alarm_T_AC_message(GlobalDeviceManager* globalDeviceManger, GlobalTreeAC
     char buffer[80];
     char buffer[80];
     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);    
     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);    
     dev_insert_alarm_info(globalDeviceManger->db,__globalPowerTemp->product_id,0,buffer,AlarmText);
     dev_insert_alarm_info(globalDeviceManger->db,__globalPowerTemp->product_id,0,buffer,AlarmText);
+
+    smtp_post_alarm(ALARM_TYPE_POWER, 0, _AlarmType, AlarmText);
+
     return 0;
     return 0;
 }
 }
 /**
 /**
@@ -3601,6 +3606,10 @@ int dev_sensor_Alarm_send_message(GlobalDeviceManager* globalDeviceManger,Global
     char buffer[80];
     char buffer[80];
     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);    
     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);    
     dev_insert_alarm_info(globalDeviceManger->db,__globalPowerTemp->product_id,1,buffer,AlarmText);
     dev_insert_alarm_info(globalDeviceManger->db,__globalPowerTemp->product_id,1,buffer,AlarmText);
+
+    int subtype=__globalPowerTemp->sensor_type;
+    smtp_post_alarm(ALARM_TYPE_SENSOR, subtype, _AlarmType, AlarmText);
+
     return 0;
     return 0;
 }
 }
 int dev_Alarm_Run_message(GlobalDeviceManager* globalDeviceManger, const char* strRunMSG, const char *strOther)
 int dev_Alarm_Run_message(GlobalDeviceManager* globalDeviceManger, const char* strRunMSG, const char *strOther)
@@ -3812,7 +3821,7 @@ int dev_switch_update_all(sqlite3 *db, netswitch_info_t *sw)
 ////////////////smtp/////////////////////////////////////////////
 ////////////////smtp/////////////////////////////////////////////
 #define SMTP_MANAGER_TABLE   "Table_SMTPManage"
 #define SMTP_MANAGER_TABLE   "Table_SMTPManage"
 #define SMTP_RECVEIVE_TABLE  "Table_SMTPReceive"
 #define SMTP_RECVEIVE_TABLE  "Table_SMTPReceive"
-int dev_smtp_init(sqlite3 *db, smtp_sett_t *sett)
+int dev_smtp_init(sqlite3 *db, smtp_info_t *info)
 {
 {
     int i,r;
     int i,r;
     char temp[1024];
     char temp[1024];
@@ -3836,6 +3845,13 @@ int dev_smtp_init(sqlite3 *db, smtp_sett_t *sett)
             log_e("___ %s create failed, %s\n%s\n", table, temp, err_msg); sqlite3_free(err_msg);
             log_e("___ %s create failed, %s\n%s\n", table, temp, err_msg); sqlite3_free(err_msg);
             return -1;
             return -1;
         }
         }
+
+        extern smtp_send_t DFLT_SMTP_SEND;
+        dev_smtp_update_send(db, &DFLT_SMTP_SEND);
+    }
+
+    if(info) {
+        memset(info, 0, sizeof(smtp_info_t));
     }
     }
 
 
     nrow = ncol = 0;
     nrow = ncol = 0;
@@ -3846,16 +3862,16 @@ int dev_smtp_init(sqlite3 *db, smtp_sett_t *sett)
         return -1 ;
         return -1 ;
     }
     }
 
 
-    if(ncol>0) {
-        smtp_manager_t *man=&sett->man; 
-        memset(man, 0, sizeof(smtp_manager_t));
-        man->product_id = atoi(pResult[ncol+0]);
-        man->mode = atoi(pResult[ncol+1]);
-        strcpy(man->account, pResult[ncol+2]);
-        strcpy(man->password, pResult[ncol+3]);
-        strcpy(man->server, pResult[ncol+4]);
-        strcpy(man->port, pResult[ncol+5]);
-        strcpy(man->auth, pResult[ncol+6]);
+    if(info && ncol>0) {
+        smtp_send_t *send=&info->send; 
+        memset(send, 0, sizeof(smtp_send_t));
+        send->product_id = atoi(pResult[ncol+0]);
+        send->mode = atoi(pResult[ncol+1]);
+        strcpy(send->account, pResult[ncol+2]);
+        strcpy(send->password, pResult[ncol+3]);
+        strcpy(send->server, pResult[ncol+4]);
+        strcpy(send->port, pResult[ncol+5]);
+        strcpy(send->auth, pResult[ncol+6]);
     }
     }
     ////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////////////////////////////
 
 
@@ -3879,14 +3895,13 @@ int dev_smtp_init(sqlite3 *db, smtp_sett_t *sett)
         log_e("sqlite handle error: %s \n%s\n", temp, err_msg); sqlite3_free(err_msg);
         log_e("sqlite handle error: %s \n%s\n", temp, err_msg); sqlite3_free(err_msg);
         return -1 ;
         return -1 ;
     }
     }
-
-    smtp_recvs_t *rcv=&sett->rcv;
-    memset(rcv, 0, sizeof(smtp_recvs_t));
-    if(ncol>0) {
+    
+    if(info && ncol>0) {
+        smtp_recv_t *recv=info->recv;
         for(i=1; i<=nrow; i++) {
         for(i=1; i<=nrow; i++) {
-            rcv->recv[i-1].idx = i-1;
-            rcv->recv[i-1].use = atoi(pResult[i*ncol+0]);
-            strcpy(rcv->recv[i-1].account, pResult[i*ncol+1]);
+            recv[i-1].idx = atoi(pResult[i*ncol+0]);
+            recv[i-1].use = atoi(pResult[i*ncol+1]);
+            strcpy(recv[i-1].account, pResult[i*ncol+2]);
         }
         }
     }
     }
     sqlite3_free_table(pResult);
     sqlite3_free_table(pResult);
@@ -3895,7 +3910,7 @@ int dev_smtp_init(sqlite3 *db, smtp_sett_t *sett)
 }
 }
 
 
 
 
-int dev_smtp_update_man(sqlite3 *db, smtp_manager_t *man)
+int dev_smtp_update_send(sqlite3 *db, smtp_send_t *send)
 {
 {
     int i,r=0,exist=0,cnt=0;
     int i,r=0,exist=0,cnt=0;
     char temp[1024];
     char temp[1024];
@@ -3906,7 +3921,7 @@ int dev_smtp_update_man(sqlite3 *db, smtp_manager_t *man)
     cnt = get_count(db, table);
     cnt = get_count(db, table);
     if(cnt>0) {
     if(cnt>0) {
         sprintf(temp, "UPDATE %s SET product_id=%d, mode=%d, account='%s', password='%s', server='%s', port='%s', auth='%s' WHERE product_id=%d;", 
         sprintf(temp, "UPDATE %s SET product_id=%d, mode=%d, account='%s', password='%s', server='%s', port='%s', auth='%s' WHERE product_id=%d;", 
-                table, man->product_id, man->mode, man->account, man->password, man->server, man->port, man->auth, man->product_id);
+                table, send->product_id, send->mode, send->account, send->password, send->server, send->port, send->auth, send->product_id);
         r = sqlite3_exec(db, temp, NULL, 0, &err_msg);
         r = sqlite3_exec(db, temp, NULL, 0, &err_msg);
         if(r != SQLITE_OK) {
         if(r != SQLITE_OK) {
             log_e("___sw_update_port failed, %s, %s\n\n", temp, err_msg);
             log_e("___sw_update_port failed, %s, %s\n\n", temp, err_msg);
@@ -3925,13 +3940,13 @@ int dev_smtp_update_man(sqlite3 *db, smtp_manager_t *man)
             r = -1; goto quit;
             r = -1; goto quit;
         }
         }
 
 
-        sqlite3_bind_int(stmt,  1, man->product_id);
-        sqlite3_bind_int(stmt,  2, man->mode);
-        sqlite3_bind_text(stmt, 3, man->account,  -1, NULL);
-        sqlite3_bind_text(stmt, 4, man->password, -1, NULL);
-        sqlite3_bind_text(stmt, 5, man->server,   -1, NULL);
-        sqlite3_bind_text(stmt, 6, man->port,     -1, NULL);
-        sqlite3_bind_text(stmt, 7, man->auth,     -1, NULL);
+        sqlite3_bind_int(stmt,  1, send->product_id);
+        sqlite3_bind_int(stmt,  2, send->mode);
+        sqlite3_bind_text(stmt, 3, send->account,  -1, NULL);
+        sqlite3_bind_text(stmt, 4, send->password, -1, NULL);
+        sqlite3_bind_text(stmt, 5, send->server,   -1, NULL);
+        sqlite3_bind_text(stmt, 6, send->port,     -1, NULL);
+        sqlite3_bind_text(stmt, 7, send->auth,     -1, NULL);
 
 
         r = sqlite3_step(stmt);
         r = sqlite3_step(stmt);
         sqlite3_finalize(stmt);
         sqlite3_finalize(stmt);

+ 2 - 2
pro/src/sqlite_handle.h

@@ -140,8 +140,8 @@ int dev_switch_init(sqlite3 *db, netswitch_info_t *sw);
 int dev_switch_update_port(sqlite3 *db, port_info_t *pt);
 int dev_switch_update_port(sqlite3 *db, port_info_t *pt);
 int dev_switch_update_all(sqlite3 *db, netswitch_info_t *sw);
 int dev_switch_update_all(sqlite3 *db, netswitch_info_t *sw);
 
 
-int dev_smtp_init(sqlite3 *db, smtp_sett_t *sett);
-int dev_smtp_update_man(sqlite3 *db, smtp_manager_t *man);
+int dev_smtp_init(sqlite3 *db, smtp_info_t *info);
+int dev_smtp_update_send(sqlite3 *db, smtp_send_t *send);
 int dev_smtp_update_recv(sqlite3 *db, smtp_recv_t *recv);
 int dev_smtp_update_recv(sqlite3 *db, smtp_recv_t *recv);
 
 
 
 

+ 10 - 0
pro/src/websocket_handle.c

@@ -10,6 +10,7 @@
 #include "cascade.h"
 #include "cascade.h"
 
 
 
 
+//#define USE_WS2
 #define USE_ONE_CONN
 #define USE_ONE_CONN
 
 
 #define WS_MAX    10
 #define WS_MAX    10
@@ -44,7 +45,12 @@ static int ws_send(ws_handle_t *wh, void *data, int len, int isBinary)
     if(!wh->c) {
     if(!wh->c) {
         return -1;
         return -1;
     }
     }
+#ifdef USE_WS2
+    mg_ws_send2(wh->c, data, len, isBinary?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT);
+#else
     mg_ws_send(wh->c, data, len, isBinary?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT);
     mg_ws_send(wh->c, data, len, isBinary?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT);
+#endif
+
     return 0;
     return 0;
 }
 }
 static int ws_broadcast(ws_handle_t *wh, void *data, int len, int isBinary) 
 static int ws_broadcast(ws_handle_t *wh, void *data, int len, int isBinary) 
@@ -53,7 +59,11 @@ static int ws_broadcast(ws_handle_t *wh, void *data, int len, int isBinary)
     mg_conn_t *c;
     mg_conn_t *c;
 
 
     for (c=wh->mgr.conns; c!=NULL; c=c->next) {
     for (c=wh->mgr.conns; c!=NULL; c=c->next) {
+#ifdef USE_WS2
+        mg_ws_send2(c, data, len, isBinary?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT);
+#else
         mg_ws_send(c, data, len, isBinary?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT);
         mg_ws_send(c, data, len, isBinary?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT);
+#endif
         r = 0;
         r = 0;
     }
     }