Bläddra i källkod

Merge branch 'master' of http://jiecheng2024.tpddns.cn:3000/liyuezong/SmartPDCode

chenyuanjie 1 år sedan
förälder
incheckning
ced7304799
14 ändrade filer med 792 tillägg och 153 borttagningar
  1. BIN
      cust_data/qt/Qt_Test
  2. 2 1
      f407/applications/main.c
  3. 422 12
      f407/applications/snmp.c
  4. 16 0
      f407/applications/snmp.h
  5. 25 3
      pro/config/cfg.h
  6. 22 21
      pro/src/Cellular.c
  7. 30 5
      pro/src/app.c
  8. 0 9
      pro/src/appweb_handle.c
  9. 9 0
      pro/src/common.h
  10. 1 1
      pro/src/dflt.c
  11. 20 19
      pro/src/mail.c
  12. 97 53
      pro/src/mqtt.c
  13. 144 29
      pro/src/pduMIB_form.c
  14. 4 0
      pub

BIN
cust_data/qt/Qt_Test


+ 2 - 1
f407/applications/main.c

@@ -13,6 +13,7 @@
 #include "cfg.h"
 #include "cfg.h"
 #include "paras.h"
 #include "paras.h"
 #include "cascade.h"
 #include "cascade.h"
+#include "snmp.h"
 
 
 //https://embedded-rd.blog.csdn.net/article/details/109643188
 //https://embedded-rd.blog.csdn.net/article/details/109643188
 
 
@@ -97,7 +98,7 @@ static int user_init(void)
 {
 {
     paras_data_t *p=paras_get();
     paras_data_t *p=paras_get();
     modbus_data_t *cas=&p->cas;
     modbus_data_t *cas=&p->cas;
-    
+    snmp2_init();
     power_init();
     power_init();
     cascade_init();
     cascade_init();
     web_init();
     web_init();

+ 422 - 12
f407/applications/snmp.c

@@ -3,6 +3,402 @@
 #include "lwip/apps/snmp_mib2.h"
 #include "lwip/apps/snmp_mib2.h"
 #include "lwip/apps/snmp_opts.h"
 #include "lwip/apps/snmp_opts.h"
 #include "lwip/apps/snmpv3.h" // 如果使用 SNMP v3
 #include "lwip/apps/snmpv3.h" // 如果使用 SNMP v3
+#include "lwip/apps/snmp_opts.h"
+#include "lwip/apps/snmp_core.h"
+#include "lwip/apps/snmp_table.h"
+#include "lwip/apps/snmp_scalar.h"
+#include "string.h"
+
+
+
+
+
+
+#define SNMP_SMARTPDU_OID 										{1,3,6,1,4,1,2024}
+#define SNMP_SMARTPDU_DEVICE_OID							{1,3,6,1,4,1,2024,1}
+#define SNMP_SMARTPDU_CHANNEL_TABLE           {1,3,6,1,4,1,2024,1,3,9}
+
+typedef struct 
+{
+	uint8_t sysdescr[10];
+	uint8_t syscontact[5];
+	uint8_t sysname[3];
+	uint8_t syslocation[3];
+	struct snmp_obj_id device_enterprose_oid;
+//	char *id_manifacture;
+//	char *id_device;
+//	char *id_sn;
+//	char *id_version;	
+}snmp_smarpdu_t;
+
+static snmp_smarpdu_t snmp_smart={
+		.sysdescr={"Smart_pdu"},
+		.syscontact={"KyKy"},
+		.sysname={"Rt"},
+		.syslocation={"CN"},
+		.device_enterprose_oid={
+			.len = 7,
+			.id = SNMP_SMARTPDU_OID,
+		},
+//		.id_manifacture = "Gowone Industry",
+//		.id_device = "Smart_PDU",
+//		.id_sn = "SN123465",
+//		.id_version = "v1.0.0.0",
+};
+
+
+
+static s16_t sysinfo_get_value(const struct snmp_scalar_array_node_def *node, void *value)
+{
+    char *var = NULL;
+    s16_t var_len;
+		char buff[100]= {0};
+		switch(node->oid)
+		{
+			case 1:
+			{
+				sprintf(buff,"%d",0);
+			}
+			break;
+			case 2:
+			{
+					sprintf(buff,"%s","smart_pdu");
+			}
+			break;
+			case 3:
+			{
+					sprintf(buff,"%s","DC");			
+			}
+			break;
+			case 4:
+			{
+					sprintf(buff,"%s","SN1235");					
+			}
+			break;
+			case 5:
+			{
+				sprintf(buff,"%d",12);		
+			}				
+			break;
+			case 6:
+			{
+				sprintf(buff,"%d",7);	
+			}
+			break;
+			default:
+			{
+				  LOGE("sysinfo_get_value(): unknown id: %d\n", node->oid);
+					return 0;
+			}
+
+		}
+		var_len = strlen(buff);
+		memcpy(value, buff, var_len);
+		return var_len;
+}
+
+
+#define POWER_VALUE 4
+
+typedef struct power_data{
+	uint8_t 						id;
+	char  	 *				name;
+	uint8_t         status;
+	float  						v;
+	float             i;
+	float 						f;
+	float             c;
+	float             fa;
+	float             p;
+	float             r_p;
+	float             a_p;
+}p_data_t;
+
+
+
+static p_data_t p_data[POWER_VALUE]={
+	{
+		.id = 1,
+		.name = "smart_pdu",
+		.status = 1,
+		.v=220.0,
+		.i = 15.3,
+		.f = 48.95,
+		.c = 20.14,
+		.fa = 0.89,
+		.p = 480.12,
+		.r_p = 520.45,
+		.a_p = 600.12,
+	},
+		{
+		.id = 2,
+		.name = "smart_pdu",
+		.status = 1,
+		.v=218.0,
+		.i = 15.3,
+		.f = 49.95,
+		.c = 20.14,
+		.fa = 0.89,
+		.p = 480.12,
+		.r_p = 520.45,
+		.a_p = 600.12,
+	},
+			{
+		.id = 3,
+		.name = "smart_pdu",
+		.status = 1,
+		.v=219.0,
+		.i = 9.3,
+		.f = 48.95,
+		.c = 20.14,
+		.fa = 0.89,
+		.p = 100.12,
+		.r_p = 230.45,
+		.a_p = 460.12,
+	},
+	{
+		.id = 4,
+		.name = "smart_pdu",
+		.status = 0,
+		.v=220.0,
+		.i = 15.3,
+		.f = 48.95,
+		.c = 20.14,
+		.fa = 0.89,
+		.p = 480.12,
+		.r_p = 520.45,
+		.a_p = 600.12,
+	},
+};
+
+
+
+static const struct snmp_oid_range th_table_oid_ranges[] = {
+    {1, POWER_VALUE},
+};
+
+
+static snmp_err_t power_get_instance(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, struct snmp_node_instance *cell_instance)
+{
+	if (!snmp_oid_in_range(row_oid, row_oid_len, th_table_oid_ranges, LWIP_ARRAYSIZE(th_table_oid_ranges)))
+        return SNMP_ERR_NOSUCHINSTANCE;
+	cell_instance->reference.u32 = row_oid[0];
+
+	return SNMP_ERR_NOERROR;
+}
+
+
+static snmp_err_t power_get_next_instance(const u32_t *column, struct snmp_obj_id *row_oid, struct snmp_node_instance *cell_instance)
+{
+    u8_t i = 0;
+    struct snmp_next_oid_state state;
+    u32_t next_oid = 0;
+
+    snmp_next_oid_init(&state, row_oid->id, row_oid->len, &next_oid, 1);
+    for (i = 0; i < POWER_VALUE; i++)
+    {
+        u32_t test_oid = i + 1;
+        snmp_next_oid_check(&state, &test_oid, 1, NULL);
+    }
+
+    if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS)
+    {
+        snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
+        cell_instance->reference.u32 = *state.next_oid; /* 下个节点行OID */
+        return SNMP_ERR_NOERROR;
+    }
+
+    return SNMP_ERR_NOSUCHINSTANCE;
+}
+
+static s16_t power_get_value(struct snmp_node_instance *instance, void *value)
+{
+    u32_t row = instance->reference.u32;
+    u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
+    //s32_t *value_s32 = (s32_t *)value;
+
+    /* 第一列索引 */
+//    if (col == 1)
+//    {
+//        *(s32_t *)value = row;
+//        return sizeof(s32_t);
+//    } 
+//    if (col < 4)
+//         th_value[row - 1][col - 2] = row * 100 + col * 10 + rand() % 10 + th_value[row - 1][col];
+
+//    *value_s32 = p_data[row - 1][col - 2];
+		char buff[100]= {0};
+		switch (col)
+		{
+			case COLUMN_PDUCHANNELID:
+			{
+				*(s32_t *)value	= p_data[row-1].id;
+				return 4;
+			}
+				break;
+			case COLUMN_PDUCHANNELNAME:
+			{
+				sprintf(buff,"%s",p_data[row-1].name);
+			}
+				break;
+			case COLUMN_PDUCHANNELSTATUS:
+			{
+				//sprintf(buff,"%d",p_data[row].status);
+				*(s32_t *)value	= p_data[row-1].status;
+				return 4;
+			}
+				break;
+			case COLUMN_PDUCHANNELVOLTAGE:
+			{
+				sprintf(buff,"%.2f",p_data[row-1].v);
+			}
+				break;
+			case COLUMN_PDUCHANNELCURRENT:
+			{
+				sprintf(buff,"%.2f",p_data[row-1].i);
+			}
+				break;
+			case COLUMN_PDUCHANNELFREQUENCY:
+			{
+				sprintf(buff,"%.2f",p_data[row-1].f);
+			}
+				break;
+			case COLUMN_PDUCHANNELCONSUMPTION:
+			{
+				sprintf(buff,"%.2f",p_data[row-1].c);
+			}
+				break;
+			case COLUMN_PDUCHANNELPOWERFACTOR:
+			{
+				sprintf(buff,"%.2f",p_data[row-1].fa);
+			}
+				break;
+			case COLUMN_PDUCHANNELPACTIVEPOWER:
+			{
+				sprintf(buff,"%.2f",p_data[row-1].p);
+			}
+				break;
+			case COLUMN_PDUCHANNELREACTIVEPOWER:
+			{
+				sprintf(buff,"%.2f",p_data[row-1].r_p);
+			}
+				break;
+			case COLUMN_PDUCHANNELAPPARENTPOWER:
+			{
+				sprintf(buff,"%.2f",p_data[row-1].a_p);
+			}
+				break;
+			default:
+				return 0;
+		}
+		
+		memcpy(value,buff,strlen(buff));
+		
+    return strlen(buff);
+}
+static snmp_err_t th_set_test(struct snmp_node_instance *instance, u16_t len, void *value)
+{
+	LOGD("write test\n");
+	return SNMP_ERR_NOERROR;
+}
+
+static snmp_err_t  power_set_value (struct snmp_node_instance *instance, u16_t len, void *value)
+{
+	  u32_t row = instance->reference.u32;
+    u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
+		switch(col)
+		{
+			case  COLUMN_PDUCHANNELSTATUS:
+			{
+				p_data[row-1].status = *(uint32_t*)value;
+			}
+				break;
+			default:
+				return SNMP_ERR_NOTWRITABLE;
+		}
+		return SNMP_ERR_NOERROR;
+}
+
+
+static const struct snmp_scalar_array_node_def sysinfo_scalars_nodes[] = {
+    {1, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, 				/* product id  */
+    {2, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, 				/* product name */
+    {3, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, 				/* product type */
+    {4, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, 				/* product firmware */
+		{5, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, 				/* product channal number */
+		{6, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, 				/* product sensor number */
+		{0,0,0},
+};
+
+
+
+static const struct snmp_table_col_def power_table_channels[]={
+	{COLUMN_PDUCHANNELID,SNMP_ASN1_TYPE_INTEGER,SNMP_NODE_INSTANCE_READ_ONLY},
+	{COLUMN_PDUCHANNELNAME,SNMP_ASN1_TYPE_OCTET_STRING,SNMP_NODE_INSTANCE_READ_ONLY},
+	{COLUMN_PDUCHANNELSTATUS,SNMP_ASN1_TYPE_INTEGER,SNMP_NODE_INSTANCE_READ_ONLY},
+	{COLUMN_PDUCHANNELVOLTAGE,SNMP_ASN1_TYPE_OCTET_STRING,SNMP_NODE_INSTANCE_READ_ONLY},
+	{COLUMN_PDUCHANNELCURRENT,SNMP_ASN1_TYPE_OCTET_STRING,SNMP_NODE_INSTANCE_READ_ONLY},
+	{COLUMN_PDUCHANNELFREQUENCY,SNMP_ASN1_TYPE_OCTET_STRING,SNMP_NODE_INSTANCE_READ_ONLY},
+	{COLUMN_PDUCHANNELCONSUMPTION,SNMP_ASN1_TYPE_OCTET_STRING,SNMP_NODE_INSTANCE_READ_ONLY},
+	{COLUMN_PDUCHANNELPOWERFACTOR,SNMP_ASN1_TYPE_OCTET_STRING,SNMP_NODE_INSTANCE_READ_ONLY},
+	{COLUMN_PDUCHANNELPACTIVEPOWER,SNMP_ASN1_TYPE_OCTET_STRING,SNMP_NODE_INSTANCE_READ_ONLY},
+	{COLUMN_PDUCHANNELREACTIVEPOWER,SNMP_ASN1_TYPE_OCTET_STRING,SNMP_NODE_INSTANCE_READ_ONLY},
+	{COLUMN_PDUCHANNELAPPARENTPOWER,SNMP_ASN1_TYPE_OCTET_STRING,SNMP_NODE_INSTANCE_READ_ONLY},
+	{0,0,0},
+};
+
+
+const struct snmp_scalar_array_node sysinfo_scalars = SNMP_SCALAR_CREATE_ARRAY_NODE(1, sysinfo_scalars_nodes, sysinfo_get_value, NULL, NULL);
+static const struct snmp_table_node power_table = SNMP_TABLE_CREATE(9, power_table_channels, power_get_instance, power_get_next_instance, \
+	power_get_value, th_set_test, power_set_value);
+
+
+
+
+
+
+
+static const struct snmp_node *const power_subnodes[] = {
+    &power_table.node.node,
+};
+
+
+const struct snmp_tree_node power_treenode = SNMP_CREATE_TREE_NODE(3, power_subnodes);
+
+static const struct snmp_node *const mib2_nodes_dev[] =
+{
+    &sysinfo_scalars.node.node,
+		&power_treenode.node,
+};
+
+//static const struct snmp_node *const mib2_nodes_pw_dev[] ={
+//		&power_treenode.node,
+//};
+
+
+
+static const struct snmp_tree_node snmp_mib2_root_dev = SNMP_CREATE_TREE_NODE(1, mib2_nodes_dev);
+
+//static const struct snmp_tree_node snmp_mib2_pw_dev = SNMP_CREATE_TREE_NODE(11, mib2_nodes_pw_dev);
+
+
+
+
+static const u32_t prvmib_base_oid[] = SNMP_SMARTPDU_DEVICE_OID;
+//static const u32_t power_base_oid[] = SNMP_SMARTPDU_CHANNEL_TABLE;
+
+
+const struct snmp_mib mib2_dev = SNMP_MIB_CREATE(prvmib_base_oid, &snmp_mib2_root_dev.node);
+//const struct snmp_mib mib2_pw_dev = SNMP_MIB_CREATE(power_base_oid, &snmp_mib2_pw_dev.node);
+
+
+static const struct snmp_mib *dev_mibs[] = {&mib2, &mib2_dev};
+
+
+
+
+
+
 
 
 
 
 void netif_event_callback(struct netif *netif) {
 void netif_event_callback(struct netif *netif) {
@@ -11,22 +407,36 @@ void netif_event_callback(struct netif *netif) {
 }
 }
 
 
 static void mibs_init(void) {
 static void mibs_init(void) {
-    //snmp_mib2_set_syscontact("admin@example.com");
-    //snmp_mib2_set_syslocation("Basement");
-    //snmp_mib2_set_sysdescr("LwIP/SNMP Test Device", "");
-    //snmp_mib2_set_sysname("TestDevice");
+		uint16_t len = 0;
+		len= strlen((const char *)snmp_smart.sysdescr);
+    snmp_mib2_set_sysdescr(snmp_smart.sysdescr, &len);
+	
+		len= strlen((const char *)snmp_smart.syscontact);
+    snmp_mib2_set_syscontact(snmp_smart.syscontact, &len, 0);
+	
+		len= strlen((const char *)snmp_smart.sysname);
+    snmp_mib2_set_sysname(snmp_smart.sysname, &len, 0);
+	
+		len= strlen((const char *)snmp_smart.syslocation);
+    snmp_mib2_set_syslocation(snmp_smart.syslocation, &len, 0);	
+	
+	  snmp_set_device_enterprise_oid(&snmp_smart.device_enterprose_oid);
+    snmp_set_auth_traps_enabled(SNMP_AUTH_TRAPS_DISABLED);
+	
+    snmp_trap_dst_enable(0, 0);
+    //snmp_trap_dst_ip_set(0, &test_snmp_trap_ip);	
+
+    snmp_set_mibs(&dev_mibs[0], LWIP_ARRAYSIZE(dev_mibs));
+    snmp_set_community("public");
+    snmp_set_community_write("public");	
 }
 }
 
 
 int snmp2_init(void)
 int snmp2_init(void)
 {
 {
-    
-    snmp_init();
-    snmp_init_mib2();
-    //snmp_set_mibs(mibs, LWIP_ARRAYSIZE(mibs));
-    //snmp_trap_dst_enable(1, 1); // 启用SNMP陷阱
-    //snmp_set_device_enterprise_oid(device_enterprise_oid); // 设置设备的企业 OID
-    //snmp_asn1_enc_type_value(asn1Type, value); // 设置 MIB 的初始值等
-    //snmp_mib_node_add(&my_mib_node);
+	
+	mibs_init();
+  snmp_init();
+
     
     
     return 0;
     return 0;
 }
 }

+ 16 - 0
f407/applications/snmp.h

@@ -3,6 +3,22 @@
 
 
 #include "datadef.h"
 #include "datadef.h"
 
 
+/* column number definitions for table pduChannelTable */
+       #define COLUMN_PDUCHANNELID		1
+       #define COLUMN_PDUCHANNELNAME		2
+       #define COLUMN_PDUCHANNELSTATUS		3
+       #define COLUMN_PDUCHANNELVOLTAGE		4
+       #define COLUMN_PDUCHANNELCURRENT		5
+       #define COLUMN_PDUCHANNELFREQUENCY		6
+       #define COLUMN_PDUCHANNELCONSUMPTION		7
+       #define COLUMN_PDUCHANNELPOWERFACTOR		8
+       #define COLUMN_PDUCHANNELPACTIVEPOWER		9
+       #define COLUMN_PDUCHANNELREACTIVEPOWER		10
+       #define COLUMN_PDUCHANNELAPPARENTPOWER		11
+
+
+
+
 int snmp2_init(void);
 int snmp2_init(void);
 int snmp2_deinit(void);
 int snmp2_deinit(void);
 
 

+ 25 - 3
pro/config/cfg.h

@@ -2,8 +2,7 @@
 #define __CONFIG_Hx__
 #define __CONFIG_Hx__
 
 
 
 
-#define VERSION                                 "V0.0.2"
-#define PROD_ID                                 0
+#define VERSION                                 "V1.2.0"
 
 
 
 
 /////////////customer demannd//////////////////////
 /////////////customer demannd//////////////////////
@@ -25,6 +24,7 @@
 //#define PRJ_TEST_AC_I1_O1
 //#define PRJ_TEST_AC_I1_O1
 //#define PRJ_TEST_AC_I3_O1
 //#define PRJ_TEST_AC_I3_O1
 //#define PRJ_GOWONE_125A_AC_I3_O1
 //#define PRJ_GOWONE_125A_AC_I3_O1
+#define PRJ_Malaysia_AC_I3_O1
 //#define PRJ_TEST_AC_I3_O3
 //#define PRJ_TEST_AC_I3_O3
 //#define PRJ_ESOUTH_DC_I1_O4_RGB5
 //#define PRJ_ESOUTH_DC_I1_O4_RGB5
 
 
@@ -41,7 +41,7 @@
 //#define PRJ_IP_YUNNAN_AC_I1_O1
 //#define PRJ_IP_YUNNAN_AC_I1_O1
 //#define PRJ_IP_CHONGQING_AC_I1_O1
 //#define PRJ_IP_CHONGQING_AC_I1_O1
 //#define PRJ_IP_AOSENS_AC_I1_O1
 //#define PRJ_IP_AOSENS_AC_I1_O1
-#define PRJ_IP_AOSENS_DC_I_O
+//#define PRJ_IP_AOSENS_DC_I_O
 #define USE_MAIL
 #define USE_MAIL
 #define MAIL_SEND_BUILTIN
 #define MAIL_SEND_BUILTIN
 
 
@@ -264,6 +264,28 @@
 
 
     #define USE_BEEP                            1
     #define USE_BEEP                            1
     #define USE_LED                             1
     #define USE_LED                             1
+
+    #define BRD_MAX                             10
+
+#elif defined PRJ_Malaysia_AC_I3_O1
+    #define LANGUAGE 1      // //english
+    #define SMPLE_TIME 30   // ms
+    #define SAVE_TIME 60000 // ms
+    #define CASCADE_CNT 0
+
+    #define PHASE_GROUP 10
+    #define CHANNEL_DELAY 10
+
+    #define PROD_POWER_TYPE 5
+
+    #define USE_WATCHDOG
+    #define USE_LOGO_LITECH
+
+    #define USE_BEEP                            1
+    #define USE_LED                             1
+    
+    #define BRD_MAX                             10
+
 #elif defined PRJ_IP_AC_I3_O3
 #elif defined PRJ_IP_AC_I3_O3
     #define LANGUAGE                            0
     #define LANGUAGE                            0
     #define SMPLE_TIME                          30          //ms
     #define SMPLE_TIME                          30          //ms

+ 22 - 21
pro/src/Cellular.c

@@ -182,7 +182,7 @@ typedef struct {
     int             fd;
     int             fd;
     CellInfo_t      *pcell;
     CellInfo_t      *pcell;
     lock_t          lck;
     lock_t          lck;
-    int             prod_id;
+    char             prod_id[32];
 
 
     int             stat;
     int             stat;
     cell_all_t      all;
     cell_all_t      all;
@@ -1207,7 +1207,8 @@ int cell_send_sms_all(int type, int subtype, int alarm_type,char *txt)
 
 
     char temp[128];
     char temp[128];
     char *prod_name = h->dm->_globalDevInfo.product.name;
     char *prod_name = h->dm->_globalDevInfo.product.name;
-    int prod_id = h->dm->_globalDevInfo.product.id;
+    char  prod_id[32];
+    strcpy( prod_id,h->dm->_globalDevInfo.product.number);
     int langID = h->dm->_globalDevInfo.product.language;
     int langID = h->dm->_globalDevInfo.product.language;
 
 
     switch (type)
     switch (type)
@@ -1220,24 +1221,24 @@ int cell_send_sms_all(int type, int subtype, int alarm_type,char *txt)
             {
             {
             case ENABLE_TAC_V_UP:
             case ENABLE_TAC_V_UP:
             case ENABLE_TAC_V_DOWN:
             case ENABLE_TAC_V_DOWN:
-                snprintf(temp, sizeof(temp), "%s %d %s %s %s", prod_name, prod_id, language_alarm_V[langID], language_exceed[langID], language_alarm[langID]);
+                snprintf(temp, sizeof(temp), "%s %s %s %s %s", prod_name, prod_id, language_alarm_V[langID], language_exceed[langID], language_alarm[langID]);
                 break;
                 break;
 
 
             case ENABLE_TAC_A_UP:
             case ENABLE_TAC_A_UP:
-                snprintf(temp, sizeof(temp), "%s %d %s %s %s", prod_name, prod_id, language_alarm_A[langID], language_exceed[langID], language_alarm[langID]);
+                snprintf(temp, sizeof(temp), "%s %s %s %s %s", prod_name, prod_id, language_alarm_A[langID], language_exceed[langID], language_alarm[langID]);
                 break;
                 break;
 
 
             case ENABLE_TAC_W_UP:
             case ENABLE_TAC_W_UP:
-                snprintf(temp, sizeof(temp), "%s %d %s %s %s", prod_name, prod_id, language_alarm_W[langID], language_exceed[langID], language_alarm[langID]);
+                snprintf(temp, sizeof(temp), "%s %s %s %s %s", prod_name, prod_id, language_alarm_W[langID], language_exceed[langID], language_alarm[langID]);
                 break;
                 break;
 
 
             case ENABLE_TAC_P_UP:
             case ENABLE_TAC_P_UP:
-                snprintf(temp, sizeof(temp), "%s %d %s %s %s", prod_name, prod_id, language_alarm_P[langID], language_exceed[langID], language_alarm[langID]);
+                snprintf(temp, sizeof(temp), "%s %s %s %s %s", prod_name, prod_id, language_alarm_P[langID], language_exceed[langID], language_alarm[langID]);
                 break;
                 break;
 
 
             case ENABLE_TAC_STIME:
             case ENABLE_TAC_STIME:
             case ENABLE_TAC_ETIME:
             case ENABLE_TAC_ETIME:
-                snprintf(temp, sizeof(temp), "%s %d %s %s", prod_name, prod_id, language_alarm_phase_lose[langID], language_alarm[langID]);
+                snprintf(temp, sizeof(temp), "%s %s %s %s", prod_name, prod_id, language_alarm_phase_lose[langID], language_alarm[langID]);
                 break;
                 break;
 
 
             default:
             default:
@@ -1250,23 +1251,23 @@ int cell_send_sms_all(int type, int subtype, int alarm_type,char *txt)
             {
             {
             case WARNING_V_UP:
             case WARNING_V_UP:
             case WARNING_V_DOWN:
             case WARNING_V_DOWN:
-                snprintf(temp, sizeof(temp), "%s %d %s %s %s", prod_name, prod_id, language_alarm_V[langID], language_exceed[langID], language_alarm[langID]);
+                snprintf(temp, sizeof(temp), "%s %s %s %s %s", prod_name, prod_id, language_alarm_V[langID], language_exceed[langID], language_alarm[langID]);
                 break;
                 break;
 
 
             case WARNING_A_UP:
             case WARNING_A_UP:
-                snprintf(temp, sizeof(temp), "%s %d %s %s %s", prod_name, prod_id, language_alarm_A[langID], language_exceed[langID], language_alarm[langID]);
+                snprintf(temp, sizeof(temp), "%s %s %s %s %s", prod_name, prod_id, language_alarm_A[langID], language_exceed[langID], language_alarm[langID]);
                 break;
                 break;
 
 
             case WARNING_W_UP:
             case WARNING_W_UP:
-                snprintf(temp, sizeof(temp), "%s %d %s %s %s", prod_name, prod_id, language_alarm_W[langID], language_exceed[langID], language_alarm[langID]);
+                snprintf(temp, sizeof(temp), "%s %s %s %s %s", prod_name, prod_id, language_alarm_W[langID], language_exceed[langID], language_alarm[langID]);
                 break;
                 break;
 
 
             case WARNING_P_UP:
             case WARNING_P_UP:
-                snprintf(temp, sizeof(temp), "%s %d %s %s %s", prod_name, prod_id, language_alarm_P[langID], language_exceed[langID], language_alarm[langID]);
+                snprintf(temp, sizeof(temp), "%s %s %s %s %s", prod_name, prod_id, language_alarm_P[langID], language_exceed[langID], language_alarm[langID]);
                 break;
                 break;
 
 
             case 0 ... 2:
             case 0 ... 2:
-                snprintf(temp, sizeof(temp), "%s %d %s %s", prod_name, prod_id, language_alarm_phase_lose[langID], language_alarm[langID]);
+                snprintf(temp, sizeof(temp), "%s %s %s %s", prod_name, prod_id, language_alarm_phase_lose[langID], language_alarm[langID]);
                 break;
                 break;
 
 
             default:
             default:
@@ -1283,31 +1284,31 @@ int cell_send_sms_all(int type, int subtype, int alarm_type,char *txt)
         case SENSOR_TYPE_TEMP_DOUBLE:
         case SENSOR_TYPE_TEMP_DOUBLE:
         case SENSOR_TYPE_TEMP_HUMI:
         case SENSOR_TYPE_TEMP_HUMI:
         case SENSOR_TYPE_TEMP:
         case SENSOR_TYPE_TEMP:
-            snprintf(temp, sizeof(temp), "%s %d %s/%s %s", prod_name, prod_id, language_temperature[langID], language_humidity[langID], language_alarm[langID]);
+            snprintf(temp, sizeof(temp), "%s %s %s/%s %s", prod_name, prod_id, language_temperature[langID], language_humidity[langID], language_alarm[langID]);
             break;
             break;
 
 
         case SENSOR_TYPE_SMOKE:
         case SENSOR_TYPE_SMOKE:
-            snprintf(temp, sizeof(temp), "%s %d %s %s", prod_name, prod_id, language_sensor_smoke[langID], language_alarm[langID]);
+            snprintf(temp, sizeof(temp), "%s %s %s %s", prod_name, prod_id, language_sensor_smoke[langID], language_alarm[langID]);
             break;
             break;
 
 
         case SENSOR_TYPE_WATER:
         case SENSOR_TYPE_WATER:
-            snprintf(temp, sizeof(temp), "%s %d %s %s", prod_name, prod_id, language_humidity[langID], language_alarm[langID]);
+            snprintf(temp, sizeof(temp), "%s %s %s %s", prod_name, prod_id, language_humidity[langID], language_alarm[langID]);
             break;
             break;
 
 
         case SENSOR_TYPE_ACCESS:
         case SENSOR_TYPE_ACCESS:
-            snprintf(temp, sizeof(temp), "%s %d %s %s", prod_name, prod_id, language_sensor_access[langID], language_alarm[langID]);
+            snprintf(temp, sizeof(temp), "%s %s %s %s", prod_name, prod_id, language_sensor_access[langID], language_alarm[langID]);
             break;
             break;
 
 
         case SENSOR_TYPE_GAS:
         case SENSOR_TYPE_GAS:
-            snprintf(temp, sizeof(temp), "%s %d %s %s", prod_name, prod_id, language_atmosphere_gas[langID], language_alarm[langID]);
+            snprintf(temp, sizeof(temp), "%s %s %s %s", prod_name, prod_id, language_atmosphere_gas[langID], language_alarm[langID]);
             break;
             break;
 
 
         case SENSOR_TYPE_AIR_PRESS:
         case SENSOR_TYPE_AIR_PRESS:
-            snprintf(temp, sizeof(temp), "%s %d %s %s", prod_name, prod_id, language_atmosphere_pressure[langID], language_alarm[langID]);
+            snprintf(temp, sizeof(temp), "%s %s %s %s", prod_name, prod_id, language_atmosphere_pressure[langID], language_alarm[langID]);
             break;
             break;
 
 
         case SENSOR_TYPE_LEAK:
         case SENSOR_TYPE_LEAK:
-            snprintf(temp, sizeof(temp), "%s %d %s %s", prod_name, prod_id, language_sensor_leak[langID], language_alarm[langID]);
+            snprintf(temp, sizeof(temp), "%s %s %s %s", prod_name, prod_id, language_sensor_leak[langID], language_alarm[langID]);
             break;
             break;
 
 
         default:
         default:
@@ -1318,7 +1319,7 @@ int cell_send_sms_all(int type, int subtype, int alarm_type,char *txt)
 
 
     case ALARM_TYPE_NETWORK:
     case ALARM_TYPE_NETWORK:
     {
     {
-        snprintf(temp, sizeof(temp), "%s %d %s", prod_name, prod_id, language_alarm_Type_Network[langID]);
+        snprintf(temp, sizeof(temp), "%s %s %s", prod_name, prod_id, language_alarm_Type_Network[langID]);
     }
     }
     break;
     break;
 
 
@@ -1606,7 +1607,7 @@ int cellular_init(void)
 
 
         h->dm = &__globalDeviceManage;
         h->dm = &__globalDeviceManage;
         h->pcell = &h->dm->_globalDevInfo.cell;
         h->pcell = &h->dm->_globalDevInfo.cell;
-        h->prod_id = h->dm->_globalDevInfo.product.id;
+        strcpy( h->prod_id,h->dm->_globalDevInfo.product.number);
         h->lck = lock_d_init();
         h->lck = lock_d_init();
         nic_set(NIC_USB, 1);
         nic_set(NIC_USB, 1);
 
 

+ 30 - 5
pro/src/app.c

@@ -1966,6 +1966,16 @@ static void* sensor_thread(void* arg)
         }
         }
         if(sen.count > 0)
         if(sen.count > 0)
             qsort(sen.serser_addr,sen.count,sizeof(uint8_t),compare_uint8_s);
             qsort(sen.serser_addr,sen.count,sizeof(uint8_t),compare_uint8_s);
+
+        //_globalDeviceManager->g_modebus_read.temprature = 0;
+       // _globalDeviceManager->g_modebus_read.humidity = 0;
+      //  _globalDeviceManager->g_modebus_read.fCO2 = 0;
+
+        uint32_t Max_Temprature=0;
+        uint32_t Max_Temprature2=0;
+        uint32_t Max_humi=0;
+        uint32_t Max_CO2=0;
+
         lock_s_hold(LOCK_ID_SENSOR);
         lock_s_hold(LOCK_ID_SENSOR);
         list_for_each_entry(_globalSensorMangerTemp, &_globalDeviceManager->_globalSensorManger.list, list)
         list_for_each_entry(_globalSensorMangerTemp, &_globalDeviceManager->_globalSensorManger.list, list)
         {
         {
@@ -2040,8 +2050,10 @@ static void* sensor_thread(void* arg)
                     }
                     }
                 }
                 }
                 _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
                 _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
-                _globalDeviceManager->g_modebus_read.temprature=temperature*100;
-                _globalDeviceManager->g_modebus_read.humidity=humidity*100;
+
+                Max_Temprature=  _globalSensorInfo.val1*100>Max_Temprature? _globalSensorInfo.val1*100:Max_Temprature;
+                Max_humi=  _globalSensorInfo.val2*100>Max_humi? _globalSensorInfo.val2*100:Max_humi;
+
                 for(int i =0 ; i < NOARTH_MAX_SENSOR;i++)           //最多4个
                 for(int i =0 ; i < NOARTH_MAX_SENSOR;i++)           //最多4个
                 {
                 {
                     if(_globalSensorMangerTemp->sensor_addr == sen.serser_addr[i])
                     if(_globalSensorMangerTemp->sensor_addr == sen.serser_addr[i])
@@ -2134,7 +2146,9 @@ static void* sensor_thread(void* arg)
                     _globalSensorMangerTemp->sensor_check_count = 0;
                     _globalSensorMangerTemp->sensor_check_count = 0;
                 }
                 }
                 _globalSensorMangerTemp->Cur_sensor_info = _globalSensorInfo;
                 _globalSensorMangerTemp->Cur_sensor_info = _globalSensorInfo;
-                _globalDeviceManager->g_modebus_read.fCO2=CO2*100;
+
+                Max_CO2 = _globalSensorInfo.val1 * 100 > Max_CO2 ? _globalSensorInfo.val1 * 100 : Max_CO2;
+
                 for(int i = 0 ; i < NOARTH_MAX_SENSOR;i++)           //最多4个
                 for(int i = 0 ; i < NOARTH_MAX_SENSOR;i++)           //最多4个
                 {
                 {
                     if(_globalSensorMangerTemp->sensor_addr == sen.serser_addr[i])
                     if(_globalSensorMangerTemp->sensor_addr == sen.serser_addr[i])
@@ -2187,6 +2201,9 @@ static void* sensor_thread(void* arg)
                     _globalSensorMangerTemp->sensor_check_count = 0;
                     _globalSensorMangerTemp->sensor_check_count = 0;
                 }
                 }
                 _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
                 _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
+
+                Max_Temprature=  _globalSensorInfo.val1*100>Max_Temprature? _globalSensorInfo.val1*100:Max_Temprature;
+
                 set_sensor_val_modbus(_globalDeviceManager,&_globalSensorInfo,_globalSensorMangerTemp->sensor_addr);
                 set_sensor_val_modbus(_globalDeviceManager,&_globalSensorInfo,_globalSensorMangerTemp->sensor_addr);
             }
             }
             break;
             break;
@@ -2276,8 +2293,10 @@ static void* sensor_thread(void* arg)
                 // log_d("sensor val:%0.2f %0.2f\n",temperature,humidity);
                 // log_d("sensor val:%0.2f %0.2f\n",temperature,humidity);
                 // printf("get temperature=%f   humidity=%f\n",temperature,humidity);
                 // printf("get temperature=%f   humidity=%f\n",temperature,humidity);
                 _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
                 _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
-                _globalDeviceManager->g_modebus_read.temprature=temperature*100;
-                _globalDeviceManager->g_modebus_read.temprature2=temperature2*100;
+
+                Max_Temprature=  _globalSensorInfo.val1*100>Max_Temprature? _globalSensorInfo.val1*100:Max_Temprature;
+                Max_Temprature2=  _globalSensorInfo.val2*100>Max_Temprature2? _globalSensorInfo.val2*100:Max_Temprature2;
+
                 for(int i = 0 ; i < NOARTH_MAX_SENSOR;i++)           //最多4个
                 for(int i = 0 ; i < NOARTH_MAX_SENSOR;i++)           //最多4个
                 {
                 {
                     if(_globalSensorMangerTemp->sensor_addr == sen.serser_addr[i])
                     if(_globalSensorMangerTemp->sensor_addr == sen.serser_addr[i])
@@ -2326,6 +2345,12 @@ static void* sensor_thread(void* arg)
             else usleep(1000);
             else usleep(1000);
         }
         }
         lock_s_release(LOCK_ID_SENSOR);
         lock_s_release(LOCK_ID_SENSOR);
+
+        _globalDeviceManager->g_modebus_read.temprature = Max_Temprature;
+        _globalDeviceManager->g_modebus_read.temprature2 = Max_Temprature2;
+        _globalDeviceManager->g_modebus_read.humidity = Max_humi;
+        _globalDeviceManager->g_modebus_read.fCO2 = Max_CO2;
+
         sleep(1);
         sleep(1);
     }
     }
 #endif
 #endif

+ 0 - 9
pro/src/appweb_handle.c

@@ -87,15 +87,6 @@ static char* g_product_board_cpu[] = {
     "T113"
     "T113"
 };
 };
  
  
-static char* g_product_type_str[] = {
-    "SmartPDU(AC)",
-    "SmartPDU(DC)",
-    "SmartPDU",
-    "SmartPDU(AC_3P-IN & 3P-OUT)",
-    "SmartPDU(AC_3P-IN & 1P-OUT)",
-    "SmartPDU(AC_3P-IN & 1P-OUT)",
-    "SmartPDU(AC_3P-IN & 2P-OUT)",
-};
 
 
 static web_handle_t webHandle;
 static web_handle_t webHandle;
 static int webSetCallback(void);
 static int webSetCallback(void);

+ 9 - 0
pro/src/common.h

@@ -187,6 +187,15 @@ enum
     SENSOR_TYPE_LIST        //传感器类型1、2、3
     SENSOR_TYPE_LIST        //传感器类型1、2、3
 };
 };
 
 
+static char* g_product_type_str[] = {
+    "SmartPDU(AC)",
+    "SmartPDU(DC)",
+    "SmartPDU",
+    "SmartPDU(AC_3P-IN & 3P-OUT)",
+    "SmartPDU(AC_3P-IN & 1P-OUT)",
+    "SmartPDU(AC_3P-IN & 1P-OUT)",
+    "SmartPDU(AC_3P-IN & 2P-OUT)",
+};
 
 
 /// @brief 板子类型
 /// @brief 板子类型
 enum MODBUS_BOARD_TYPE
 enum MODBUS_BOARD_TYPE

+ 1 - 1
pro/src/dflt.c

@@ -6,7 +6,7 @@
 GlobalDeviceInfo DFLT_PARAS={
 GlobalDeviceInfo DFLT_PARAS={
 
 
         .product = {
         .product = {
-            .id         = PROD_ID,
+            .id         = 0,
             .pname      = "Smart PDU",
             .pname      = "Smart PDU",
             .pnumber    = "GCX00000X",
             .pnumber    = "GCX00000X",
             .number     = "X00001",
             .number     = "X00001",

+ 20 - 19
pro/src/mail.c

@@ -367,7 +367,8 @@ int mail_post_alarm(int type, int subtype, int alarm_type, char *content)
         return -1;
         return -1;
     }
     }
     char *prod_name=h->dm->_globalDevInfo.product.name;
     char *prod_name=h->dm->_globalDevInfo.product.name;
-    int prod_id=h->dm->_globalDevInfo.product.id;
+    char  prod_id[32];
+    strcpy( prod_id,h->dm->_globalDevInfo.product.number);
     int langID=h->dm->_globalDevInfo.product.language;
     int langID=h->dm->_globalDevInfo.product.language;
 
 
     switch(type) {
     switch(type) {
@@ -377,24 +378,24 @@ int mail_post_alarm(int type, int subtype, int alarm_type, char *content)
                 switch(alarm_type) {
                 switch(alarm_type) {
                     case ENABLE_TAC_V_UP:
                     case ENABLE_TAC_V_UP:
                     case ENABLE_TAC_V_DOWN:
                     case ENABLE_TAC_V_DOWN:
-                    snprintf(temp, sizeof(temp), "%s %d %s %s %s", prod_name, prod_id, language_alarm_V[langID], language_exceed[langID], language_alarm[langID]);
+                    snprintf(temp, sizeof(temp), "%s %s %s %s %s", prod_name, prod_id, language_alarm_V[langID], language_exceed[langID], language_alarm[langID]);
                     break;
                     break;
 
 
                     case ENABLE_TAC_A_UP:
                     case ENABLE_TAC_A_UP:
-                    snprintf(temp, sizeof(temp), "%s %d %s %s %s", prod_name, prod_id, language_alarm_A[langID], language_exceed[langID], language_alarm[langID]);
+                    snprintf(temp, sizeof(temp), "%s %s %s %s %s", prod_name, prod_id, language_alarm_A[langID], language_exceed[langID], language_alarm[langID]);
                     break;
                     break;
 
 
                     case ENABLE_TAC_W_UP:
                     case ENABLE_TAC_W_UP:
-                    snprintf(temp, sizeof(temp), "%s %d %s %s %s", prod_name, prod_id, language_alarm_W[langID], language_exceed[langID], language_alarm[langID]);
+                    snprintf(temp, sizeof(temp), "%s %s %s %s %s", prod_name, prod_id, language_alarm_W[langID], language_exceed[langID], language_alarm[langID]);
                     break;
                     break;
 
 
                     case ENABLE_TAC_P_UP:
                     case ENABLE_TAC_P_UP:
-                    snprintf(temp, sizeof(temp), "%s %d %s %s %s", prod_name, prod_id, language_alarm_P[langID], language_exceed[langID], language_alarm[langID]);
+                    snprintf(temp, sizeof(temp), "%s %s %s %s %s", prod_name, prod_id, language_alarm_P[langID], language_exceed[langID], language_alarm[langID]);
                     break;
                     break;
 
 
                     case ENABLE_TAC_STIME:
                     case ENABLE_TAC_STIME:
                     case ENABLE_TAC_ETIME:
                     case ENABLE_TAC_ETIME:
-                    snprintf(temp, sizeof(temp), "%s %d %s %s", prod_name, prod_id, language_alarm_phase_lose[langID], language_alarm[langID]);
+                    snprintf(temp, sizeof(temp), "%s %s %s %s", prod_name, prod_id, language_alarm_phase_lose[langID], language_alarm[langID]);
                     break;
                     break;
 
 
                     default:
                     default:
@@ -405,23 +406,23 @@ int mail_post_alarm(int type, int subtype, int alarm_type, char *content)
                 switch(alarm_type) {
                 switch(alarm_type) {
                     case WARNING_V_UP:
                     case WARNING_V_UP:
                     case WARNING_V_DOWN:
                     case WARNING_V_DOWN:
-                    snprintf(temp, sizeof(temp), "%s %d %s %s %s", prod_name, prod_id, language_alarm_V[langID], language_exceed[langID], language_alarm[langID]);
+                    snprintf(temp, sizeof(temp), "%s %s %s %s %s", prod_name, prod_id, language_alarm_V[langID], language_exceed[langID], language_alarm[langID]);
                     break;
                     break;
 
 
                     case WARNING_A_UP:
                     case WARNING_A_UP:
-                    snprintf(temp, sizeof(temp), "%s %d %s %s %s", prod_name, prod_id, language_alarm_A[langID], language_exceed[langID], language_alarm[langID]);
+                    snprintf(temp, sizeof(temp), "%s %s %s %s %s", prod_name, prod_id, language_alarm_A[langID], language_exceed[langID], language_alarm[langID]);
                     break;
                     break;
 
 
                     case WARNING_W_UP:
                     case WARNING_W_UP:
-                    snprintf(temp, sizeof(temp), "%s %d %s %s %s", prod_name, prod_id, language_alarm_W[langID], language_exceed[langID], language_alarm[langID]);
+                    snprintf(temp, sizeof(temp), "%s %s %s %s %s", prod_name, prod_id, language_alarm_W[langID], language_exceed[langID], language_alarm[langID]);
                     break;
                     break;
 
 
                     case WARNING_P_UP:
                     case WARNING_P_UP:
-                    snprintf(temp, sizeof(temp), "%s %d %s %s %s", prod_name, prod_id, language_alarm_P[langID], language_exceed[langID], language_alarm[langID]);
+                    snprintf(temp, sizeof(temp), "%s %s %s %s %s", prod_name, prod_id, language_alarm_P[langID], language_exceed[langID], language_alarm[langID]);
                     break;
                     break;
 
 
                     case 0 ... 2:
                     case 0 ... 2:
-                    snprintf(temp, sizeof(temp), "%s %d %s %s", prod_name, prod_id, language_alarm_phase_lose[langID], language_alarm[langID]);
+                    snprintf(temp, sizeof(temp), "%s %s %s %s", prod_name, prod_id, language_alarm_phase_lose[langID], language_alarm[langID]);
                     break;
                     break;
 
 
                     default:
                     default:
@@ -437,31 +438,31 @@ int mail_post_alarm(int type, int subtype, int alarm_type, char *content)
                 case SENSOR_TYPE_TEMP_DOUBLE:
                 case SENSOR_TYPE_TEMP_DOUBLE:
                 case SENSOR_TYPE_TEMP_HUMI:
                 case SENSOR_TYPE_TEMP_HUMI:
                 case SENSOR_TYPE_TEMP:
                 case SENSOR_TYPE_TEMP:
-                 snprintf(temp, sizeof(temp), "%s %d %s/%s %s", prod_name, prod_id, language_temperature[langID], language_humidity[langID], language_alarm[langID]);
+                 snprintf(temp, sizeof(temp), "%s %s %s/%s %s", prod_name, prod_id, language_temperature[langID], language_humidity[langID], language_alarm[langID]);
                 break;
                 break;
 
 
                 case SENSOR_TYPE_SMOKE:
                 case SENSOR_TYPE_SMOKE:
-                snprintf(temp, sizeof(temp), "%s %d %s %s", prod_name, prod_id, language_sensor_smoke[langID], language_alarm[langID]);
+                snprintf(temp, sizeof(temp), "%s %s %s %s", prod_name, prod_id, language_sensor_smoke[langID], language_alarm[langID]);
                 break;
                 break;
 
 
                 case SENSOR_TYPE_WATER:
                 case SENSOR_TYPE_WATER:
-                snprintf(temp, sizeof(temp), "%s %d %s %s", prod_name, prod_id, language_humidity[langID], language_alarm[langID]);
+                snprintf(temp, sizeof(temp), "%s %s %s %s", prod_name, prod_id, language_humidity[langID], language_alarm[langID]);
                 break;
                 break;
 
 
                 case SENSOR_TYPE_ACCESS:
                 case SENSOR_TYPE_ACCESS:
-                snprintf(temp, sizeof(temp), "%s %d %s %s", prod_name, prod_id, language_sensor_access[langID], language_alarm[langID]);
+                snprintf(temp, sizeof(temp), "%s %s %s %s", prod_name, prod_id, language_sensor_access[langID], language_alarm[langID]);
                 break;
                 break;
 
 
                 case SENSOR_TYPE_GAS:
                 case SENSOR_TYPE_GAS:
-                snprintf(temp, sizeof(temp), "%s %d %s %s", prod_name, prod_id, language_atmosphere_gas[langID], language_alarm[langID]);
+                snprintf(temp, sizeof(temp), "%s %s %s %s", prod_name, prod_id, language_atmosphere_gas[langID], language_alarm[langID]);
                 break;
                 break;
 
 
                 case SENSOR_TYPE_AIR_PRESS:
                 case SENSOR_TYPE_AIR_PRESS:
-                snprintf(temp, sizeof(temp), "%s %d %s %s", prod_name, prod_id, language_atmosphere_pressure[langID], language_alarm[langID]);
+                snprintf(temp, sizeof(temp), "%s %s %s %s", prod_name, prod_id, language_atmosphere_pressure[langID], language_alarm[langID]);
                 break;
                 break;
 
 
                 case SENSOR_TYPE_LEAK:
                 case SENSOR_TYPE_LEAK:
-                snprintf(temp, sizeof(temp), "%s %d %s %s", prod_name, prod_id, language_sensor_leak[langID], language_alarm[langID]);
+                snprintf(temp, sizeof(temp), "%s %s %s %s", prod_name, prod_id, language_sensor_leak[langID], language_alarm[langID]);
                 break;
                 break;
 
 
                 default:
                 default:
@@ -472,7 +473,7 @@ int mail_post_alarm(int type, int subtype, int alarm_type, char *content)
 
 
         case ALARM_TYPE_NETWORK:
         case ALARM_TYPE_NETWORK:
         {
         {
-            snprintf(temp, sizeof(temp), "%s %d %s", prod_name, prod_id, language_alarm_Type_Network[langID]);
+            snprintf(temp, sizeof(temp), "%s %s %s", prod_name, prod_id, language_alarm_Type_Network[langID]);
         }
         }
         break;
         break;
 
 

+ 97 - 53
pro/src/mqtt.c

@@ -34,7 +34,7 @@
 
 
 
 
 #define CONN_PERIOD         5000    //ms
 #define CONN_PERIOD         5000    //ms
-#define SEND_PERIOD         5000    //ms
+#define SEND_PERIOD         3000    //ms
 
 
 
 
 #define BGET(flag,mask)  ((flag)&(1<<(mask)))
 #define BGET(flag,mask)  ((flag)&(1<<(mask)))
@@ -62,7 +62,7 @@ typedef struct {
 }mqtt_conn_t;
 }mqtt_conn_t;
 typedef struct {
 typedef struct {
     int           inited;
     int           inited;
-    uint32_t      prod_id;
+    char      prod_id[32];
     
     
     mqtt_conn_t   conn[MQTT_SER_MAX];
     mqtt_conn_t   conn[MQTT_SER_MAX];
     handle_t      list;
     handle_t      list;
@@ -73,23 +73,23 @@ typedef struct {
 
 
 #ifdef USE_MQTT
 #ifdef USE_MQTT
 char *topic_sub[MQTT_SUB_MAX]={
 char *topic_sub[MQTT_SUB_MAX]={
-    "/pdu/%d/control/power/all_channel",
-    "/pdu/%d/control/power/+",
-    "/pdu/%d/control/sensor/+",
-    "/pdu/%d/control/device/restart",
-    "/pdu/%d/control/device/reset",
-    "/pdu/%d/control/service",
+    "/pdu/%s/control/power/all_channel",
+    "/pdu/%s/control/power/+",
+    "/pdu/%s/control/sensor/+",
+    "/pdu/%s/control/device/restart",
+    "/pdu/%s/control/device/reset",
+    "/pdu/%s/control/service",
 };
 };
 char *topic_pub[MQTT_PUB_MAX]={
 char *topic_pub[MQTT_PUB_MAX]={
-    "/pdu/%d/info/device",
-    "/pdu/%d/status/network",
-    "/pdu/%d/status/power/all_channel",
-    "/pdu/%d/status/power/%d",
-    "/pdu/%d/status/sensor/%d",
-    "/pdu/%d/alarm/network",
-    "/pdu/%d/alarm/power",
-    "/pdu/%d/alarm/sensor",
-    "/pdu/%d/status/service",
+    "/pdu/%s/info/device",
+    "/pdu/%s/status/network",
+    "/pdu/%s/status/power/all_channel",
+    "/pdu/%s/status/power/%d",
+    "/pdu/%s/status/sensor/%d",
+    "/pdu/%s/alarm/network",
+    "/pdu/%s/alarm/power",
+    "/pdu/%s/alarm/sensor",
+    "/pdu/%s/status/service",
 };
 };
 const char *serv_str[SERV_MAX]={
 const char *serv_str[SERV_MAX]={
     "ntp",
     "ntp",
@@ -202,7 +202,7 @@ static int sub_one(mg_conn_t *c, char *topic)
 
 
     return 0;
     return 0;
 }
 }
-static int my_sub(mg_conn_t *c, int prod_id)
+static int my_sub(mg_conn_t *c, char * prod_id)
 {
 {
     int i;
     int i;
     char topic[1024];
     char topic[1024];
@@ -388,7 +388,7 @@ static int conn_one(mqtt_conn_t *conn)
         if(conn->c) {
         if(conn->c) {
            //mg_mqtt_bind(conn->c);
            //mg_mqtt_bind(conn->c);
 
 
-            sprintf(conn->ser.cid, "smartPDU_%d\n", h->prod_id);
+            sprintf(conn->ser.cid, "smartPDU_%s\n", h->prod_id);
             my_sub(conn->c, h->prod_id);
             my_sub(conn->c, h->prod_id);
             r = 0;
             r = 0;
         }
         }
@@ -441,14 +441,14 @@ static int send_once(mqtt_conn_t *conn)
 {
 {
     send_stat(conn, MQTT_PUB_INFO_DEVICE);
     send_stat(conn, MQTT_PUB_INFO_DEVICE);
     send_stat(conn, MQTT_PUB_STAT_NETWORK);
     send_stat(conn, MQTT_PUB_STAT_NETWORK);
-    send_stat(conn, MQTT_PUB_STAT_SENSOR);
-    send_stat(conn, MQTT_PUB_STAT_SERVICE);
     return 0;
     return 0;
 }
 }
 static void send_period(mqtt_conn_t *conn)
 static void send_period(mqtt_conn_t *conn)
 {
 {
     send_stat(conn, MQTT_PUB_STAT_POWER_ALL);
     send_stat(conn, MQTT_PUB_STAT_POWER_ALL);
     send_stat(conn, MQTT_PUB_STAT_POWER_CHN);
     send_stat(conn, MQTT_PUB_STAT_POWER_CHN);
+    send_stat(conn, MQTT_PUB_STAT_SENSOR);
+    send_stat(conn, MQTT_PUB_STAT_SERVICE);
 }
 }
 
 
 static void timer_conn_fn(void *arg)
 static void timer_conn_fn(void *arg)
@@ -582,7 +582,7 @@ int mqtt_init(void)
     //mg_log_set(MG_LL_DEBUG);
     //mg_log_set(MG_LL_DEBUG);
     
     
     h->dm = &__globalDeviceManage;
     h->dm = &__globalDeviceManage;
-    h->prod_id = h->dm->_globalDevInfo.product.id;
+    strcpy( h->prod_id,h->dm->_globalDevInfo.product.number);
     //sys_get_chip_id(&h->prod_id);
     //sys_get_chip_id(&h->prod_id);
 
 
     list_cfg_t lc;
     list_cfg_t lc;
@@ -640,12 +640,27 @@ static int send_stat(mqtt_conn_t *conn, int type)
         {
         {
             cJSON* root=cJSON_CreateObject();
             cJSON* root=cJSON_CreateObject();
             if(root) {
             if(root) {
-                cJSON_AddStringToObject(root,"id", get_int_str(h->prod_id));
-                cJSON_AddStringToObject(root,"name", "Gowone smartPDU");
-                cJSON_AddStringToObject(root,"type", "smartPDU AC");
+
+                int nch = 0;
+                GlobalPowerManger *chiterator;
+                list_for_each_entry(chiterator, &h->dm->_globalPowerManger.list, list)
+                {
+                    nch++;
+                }
+
+                int nsen = 0;
+                GlobalSensorManger *sensoriterator;
+                list_for_each_entry(sensoriterator, &h->dm->_globalSensorManger.list, list)
+                {
+                    nsen++;
+                }
+
+                cJSON_AddStringToObject(root,"id", h->prod_id);
+                cJSON_AddStringToObject(root,"name",h->dm->_globalDevInfo.product.name);
+                cJSON_AddStringToObject(root,"type",g_product_type_str[h->dm->_globalDevInfo.product.pwr_type]);
                 cJSON_AddStringToObject(root,"firmware", VERSION);
                 cJSON_AddStringToObject(root,"firmware", VERSION);
-                cJSON_AddStringToObject(root,"channel_num", "8");
-                cJSON_AddStringToObject(root,"sensor_num", "10");
+                cJSON_AddStringToObject(root,"channel_num", get_int_str(nch));
+                cJSON_AddStringToObject(root,"sensor_num",  get_int_str(nsen));
 
 
                 get_date_time(date, time);
                 get_date_time(date, time);
                 cJSON_AddStringToObject(root,"date", date);
                 cJSON_AddStringToObject(root,"date", date);
@@ -733,19 +748,24 @@ static int send_stat(mqtt_conn_t *conn, int type)
 
 
                 cJSON* root=cJSON_CreateObject();
                 cJSON* root=cJSON_CreateObject();
                 if(root) {
                 if(root) {
-                    sprintf(buf, "L%d", i+1);
-                    cJSON_AddStringToObject(root,"phase", buf);
-                    cJSON_AddStringToObject(root,"voltage", get_float_str(info->voltage));
-                    cJSON_AddStringToObject(root,"current", get_float_str(info->current));
-                    cJSON_AddStringToObject(root,"power", get_float_str(info->power/1000));
-                    cJSON_AddStringToObject(root,"consumption", get_float_str(info->consumption));
-
-                    p1 = info->power;
-                    p3 = (info->factor?(p1/info->factor):0.0f);
-                    p2 = p3 - p1;
-                    cJSON_AddStringToObject(root,"pactive_power", get_float_str(p1));
-                    cJSON_AddStringToObject(root,"reactive_power", get_float_str(p2));
-                    cJSON_AddStringToObject(root,"apparent_power", get_float_str(p3));
+                    sprintf(buf, "L%d", i + 1);
+                    if (cnt == 3)
+                        cJSON_AddStringToObject(root, "phase", buf);
+                    cJSON_AddStringToObject(root, "voltage", get_float_str(info->voltage));
+                    cJSON_AddStringToObject(root, "current", get_float_str(info->current));
+                    cJSON_AddStringToObject(root, "power", get_float_str(info->power / 1000));
+                    cJSON_AddStringToObject(root, "consumption", get_float_str(info->consumption));
+                    if (h->dm->_globalDevInfo.product.pwr_type != SmartPDU_DC)
+                    {
+                        cJSON_AddStringToObject(root, "power_factor", get_float_str(info->factor));
+                        cJSON_AddStringToObject(root, "power_freq", get_float_str(info->freq));
+                        p1 = info->power;
+                        p3 = (info->factor ? (p1 / info->factor) : 0.0f);
+                        p2 = p3 - p1;
+                        cJSON_AddStringToObject(root, "pactive_power", get_float_str(p1));
+                        cJSON_AddStringToObject(root, "reactive_power", get_float_str(p2));
+                        cJSON_AddStringToObject(root, "apparent_power", get_float_str(p3));
+                    }
 
 
                     get_date_time(date, time);
                     get_date_time(date, time);
                     cJSON_AddStringToObject(root,"date", date);
                     cJSON_AddStringToObject(root,"date", date);
@@ -775,23 +795,47 @@ static int send_stat(mqtt_conn_t *conn, int type)
 
 
                 cJSON* root=cJSON_CreateObject();
                 cJSON* root=cJSON_CreateObject();
                 if(root) {
                 if(root) {
+                     cJSON_AddStringToObject(root,"id", get_int_str(tmp->product_ch_id));
                     sprintf(buf, "CH%d", tmp->product_ch_id);
                     sprintf(buf, "CH%d", tmp->product_ch_id);
                     cJSON_AddStringToObject(root,"name", buf);
                     cJSON_AddStringToObject(root,"name", buf);
                     cJSON_AddStringToObject(root,"status", get_int_str(tmp->_PowerInfo.status));
                     cJSON_AddStringToObject(root,"status", get_int_str(tmp->_PowerInfo.status));
                     cJSON_AddStringToObject(root,"voltage", get_float_str(tmp->_PowerInfo.voltage));
                     cJSON_AddStringToObject(root,"voltage", get_float_str(tmp->_PowerInfo.voltage));
-                    cJSON_AddStringToObject(root,"current", get_float_str(tmp->_PowerInfo.current));
-                    cJSON_AddStringToObject(root,"power", get_float_str(tmp->_PowerInfo.power));
-                    cJSON_AddStringToObject(root,"power_freq", get_float_str(tmp->_PowerInfo.freq));
-                    cJSON_AddStringToObject(root,"consumption", get_float_str(tmp->_PowerInfo.consumption));
-                    cJSON_AddStringToObject(root,"power_factor", get_float_str(tmp->_PowerInfo.factor));
-
-                    
-                    p1 = tmp->_PowerInfo.power;
-                    p3 = p1 / tmp->_PowerInfo.factor;
-                    p2 = p3 - p1;
-                    cJSON_AddStringToObject(root,"pactive_power", get_float_str(p1));
-                    cJSON_AddStringToObject(root,"reactive_power", get_float_str(p2));
-                    cJSON_AddStringToObject(root,"apparent_power", get_float_str(p3));
+                    cJSON_AddStringToObject(root, "current", get_float_str(tmp->_PowerInfo.current));
+                    cJSON_AddStringToObject(root, "power", get_float_str(tmp->_PowerInfo.power));
+                    cJSON_AddStringToObject(root, "consumption", get_float_str(tmp->_PowerInfo.consumption));
+                    if (h->dm->_globalDevInfo.product.pwr_type != SmartPDU_DC)
+                    {
+                        cJSON_AddStringToObject(root, "power_freq", get_float_str(tmp->_PowerInfo.freq));
+                        cJSON_AddStringToObject(root, "power_factor", get_float_str(tmp->_PowerInfo.factor));
+                        p1 = tmp->_PowerInfo.power;
+                        p3 = p1 / tmp->_PowerInfo.factor;
+                        p2 = p3 - p1;
+                        cJSON_AddStringToObject(root, "pactive_power", get_float_str(p1));
+                        cJSON_AddStringToObject(root, "reactive_power", get_float_str(p2));
+                        cJSON_AddStringToObject(root, "apparent_power", get_float_str(p3));
+                    }
+
+                     cJSON* data_root_array = cJSON_CreateArray();
+                    if (h->dm->_globalDevInfo.product.pwr_type == TREE_AC_TYPE|| h->dm->_globalDevInfo.product.pwr_type==DOUBLE_AC_TYPE|| h->dm->_globalDevInfo.product.pwr_type==SmartPDU_Tree_AC_One_B)
+                    {
+                        GlobalTreeACManager *_TreeACTemp = NULL;
+                        // 判断是否三相单输出情况下
+                        int phnum = 0;
+                        list_for_each_entry(_TreeACTemp, &tmp->list_Tree_AC, list_Tree_AC)
+                        {
+                            if(_TreeACTemp->product_ph_outputStatus == 1 &&_TreeACTemp->product_ph_type >= 0 && _TreeACTemp->product_ph_type < 3)
+                            {
+                                cJSON *data_filed = cJSON_CreateObject();
+                                cJSON_AddStringToObject(data_filed, "phase_type", g_product_t_ac_type_str[_TreeACTemp->product_ph_type]);
+                                cJSON_AddStringToObject(data_filed, "phase_voltage", get_float_str(_TreeACTemp->_PowerInfo.voltage));
+                                cJSON_AddStringToObject(data_filed, "phase_current", get_float_str(_TreeACTemp->_PowerInfo.current));
+                                cJSON_AddStringToObject(data_filed, "phase_power", get_float_str(_TreeACTemp->_PowerInfo.power));
+                                cJSON_AddStringToObject(data_filed, "phase_consumption", get_float_str(_TreeACTemp->_PowerInfo.consumption));
+                                 cJSON_AddItemToObject(data_root_array, "phase_data", data_filed);
+                            }
+                        }
+                    }
+                     cJSON_AddItemToObject(root, "phase_data", data_root_array);
 
 
                     get_date_time(date, time);
                     get_date_time(date, time);
                     cJSON_AddStringToObject(root,"date", date);
                     cJSON_AddStringToObject(root,"date", date);

+ 144 - 29
pro/src/pduMIB_form.c

@@ -522,12 +522,35 @@ pduChannelTable_handler(
       GlobalPowerManger* iterator;
       GlobalPowerManger* iterator;
       //GlobalPowerInfo powerInfo;
       //GlobalPowerInfo powerInfo;
       char buffer[16];
       char buffer[16];
+      oid begin_next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 3, 9, 1, 1, 1};
+      int max_clonum=11;
       switch(reqinfo->mode)
       switch(reqinfo->mode)
       {
       {
          case MODE_GET:
          case MODE_GET:
+         case MODE_GETNEXT:
                for (request = requests; request; request = request->next)
                for (request = requests; request; request = request->next)
                {
                {
                   table_info = netsnmp_extract_table_info(request);
                   table_info = netsnmp_extract_table_info(request);
+                   if (reqinfo->mode==MODE_GETNEXT)
+                   {
+                      if (table_info->index_oid[0] == 0)
+                      {
+                         table_info->index_oid[0] = 1;
+                         table_info->colnum = 1;
+                         snmp_set_var_objid(requests->requestvb, begin_next_oid, OID_LENGTH(begin_next_oid));
+                      }
+                      else
+                      {
+                        if (table_info->colnum > max_clonum)
+                        {
+                            table_info->index_oid[0] += 1;
+                            table_info->colnum =1;
+                        }
+                        oid next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 3, 9, 1, table_info->colnum, table_info->index_oid[0]};
+                         snmp_set_var_objid(requests->requestvb, next_oid, OID_LENGTH(next_oid));
+                      }
+                   }
+
                   int nIndex=1;
                   int nIndex=1;
                   list_for_each_entry(iterator, &__globalDeviceManage._globalPowerManger.list, list)
                   list_for_each_entry(iterator, &__globalDeviceManage._globalPowerManger.list, list)
                   {
                   {
@@ -762,12 +785,34 @@ pduGroupTable_handler(
     }
     }
 
 
     char buffer[16];
     char buffer[16];
+    oid begin_next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 3, 10, 1, 1, 1};
+    int max_clonum = 4;
     switch (reqinfo->mode)
     switch (reqinfo->mode)
     {
     {
     case MODE_GET:
     case MODE_GET:
+    case MODE_GETNEXT:
        for (request = requests; request; request = request->next)
        for (request = requests; request; request = request->next)
        {
        {
           table_info = netsnmp_extract_table_info(request);
           table_info = netsnmp_extract_table_info(request);
+          if (reqinfo->mode == MODE_GETNEXT)
+          {
+             if (table_info->index_oid[0] == 0)
+             {
+                table_info->index_oid[0] = 1;
+                table_info->colnum = 1;
+                snmp_set_var_objid(requests->requestvb, begin_next_oid, OID_LENGTH(begin_next_oid));
+             }
+             else
+             {
+                if (table_info->colnum > max_clonum)
+                {
+                   table_info->index_oid[0] += 1;
+                   table_info->colnum = 1;
+                }
+                oid next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 3, 10, 1, table_info->colnum, table_info->index_oid[0]};
+                snmp_set_var_objid(requests->requestvb, next_oid, OID_LENGTH(next_oid));
+             }
+          }
           int nIndex = 1;
           int nIndex = 1;
           list_for_each_entry(_GroupInfoTemp, &group_list.list, list)
           list_for_each_entry(_GroupInfoTemp, &group_list.list, list)
           {
           {
@@ -953,8 +998,7 @@ pduGroupTable_handler(
        /* we should never get here, so this is a really bad error */
        /* we should never get here, so this is a really bad error */
        snmp_log(LOG_ERR, "unknown mode (%d) in handle_pduType\n", reqinfo->mode);
        snmp_log(LOG_ERR, "unknown mode (%d) in handle_pduType\n", reqinfo->mode);
        return SNMP_ERR_GENERR;
        return SNMP_ERR_GENERR;
-      }
-
+    }
 
 
     return SNMP_ERR_NOERROR;
     return SNMP_ERR_NOERROR;
 }
 }
@@ -975,12 +1019,36 @@ pduSensorTable_handler(
     GlobalSensorManger *iterator = NULL;
     GlobalSensorManger *iterator = NULL;
     //
     //
     char buffer[16];
     char buffer[16];
+    oid begin_next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 4, 1, 1, 1, 1};
+    int max_clonum = 10;
     switch (reqinfo->mode)
     switch (reqinfo->mode)
     {
     {
     case MODE_GET:
     case MODE_GET:
+    case MODE_GETNEXT:
        for (request = requests; request; request = request->next)
        for (request = requests; request; request = request->next)
        {
        {
           table_info = netsnmp_extract_table_info(request);
           table_info = netsnmp_extract_table_info(request);
+
+          if (reqinfo->mode == MODE_GETNEXT)
+          {
+             if (table_info->index_oid[0] == 0)
+             {
+                table_info->index_oid[0] = 1;
+                table_info->colnum = 1;
+                snmp_set_var_objid(requests->requestvb, begin_next_oid, OID_LENGTH(begin_next_oid));
+             }
+             else
+             {
+                if (table_info->colnum > max_clonum)
+                {
+                   table_info->index_oid[0] += 1;
+                   table_info->colnum = 1;
+                }
+                oid next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 4, 1, 1, table_info->colnum, table_info->index_oid[0]};
+                snmp_set_var_objid(requests->requestvb, next_oid, OID_LENGTH(next_oid));
+             }
+          }
+
           int nIndex = table_info->index_oid[0];
           int nIndex = table_info->index_oid[0];
           bool findinstance = false;
           bool findinstance = false;
 
 
@@ -990,8 +1058,6 @@ pduSensorTable_handler(
              {
              {
                 continue;
                 continue;
              }
              }
-             findinstance = true;
-
              memset(buffer, 0, sizeof(buffer));
              memset(buffer, 0, sizeof(buffer));
              switch (table_info->colnum)
              switch (table_info->colnum)
              {
              {
@@ -1010,6 +1076,9 @@ pduSensorTable_handler(
              case COLUMN_PDUSENSORMODBUSADDRESS:
              case COLUMN_PDUSENSORMODBUSADDRESS:
                 snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->sensor_addr);
                 snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->sensor_addr);
                 break;
                 break;
+             case 6:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->sensor_node_number);
+                break;
              case COLUMN_PDUSENSORSTATUS:
              case COLUMN_PDUSENSORSTATUS:
                 snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->sensor_status);
                 snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->sensor_status);
                 break;
                 break;
@@ -1032,10 +1101,6 @@ pduSensorTable_handler(
              break;
              break;
           }
           }
 
 
-          if (!findinstance)
-          {
-             netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHINSTANCE);
-          }
        }
        }
        break;
        break;
     case MODE_SET_RESERVE1:
     case MODE_SET_RESERVE1:
@@ -1132,9 +1197,12 @@ pduAlarmHistoryTable_handler(
 
 
     //
     //
     char buffer[16];
     char buffer[16];
+    oid begin_next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 6, 1, 1, 1, 1};
+    int max_clonum = 7;
     switch (reqinfo->mode)
     switch (reqinfo->mode)
     {
     {
     case MODE_GET:
     case MODE_GET:
+    case MODE_GETNEXT:
     {
     {
        // 初始化表
        // 初始化表
        int nAlarmNumber = 0;
        int nAlarmNumber = 0;
@@ -1162,12 +1230,33 @@ pduAlarmHistoryTable_handler(
           log_e("get power alarm error.");
           log_e("get power alarm error.");
           return SNMP_ERR_GENERR;
           return SNMP_ERR_GENERR;
        }
        }
+    
 
 
        for (request = requests; request; request = request->next)
        for (request = requests; request; request = request->next)
        {
        {
           table_info = netsnmp_extract_table_info(request);
           table_info = netsnmp_extract_table_info(request);
+
+          if (reqinfo->mode == MODE_GETNEXT)
+          {
+             if (table_info->index_oid[0] == 0)
+             {
+                table_info->index_oid[0] = 1;
+                table_info->colnum = 1;
+                snmp_set_var_objid(requests->requestvb, begin_next_oid, OID_LENGTH(begin_next_oid));
+             }
+             else
+             {
+                if (table_info->colnum > max_clonum)
+                {
+                   table_info->index_oid[0] += 1;
+                   table_info->colnum = 1;
+                }
+                oid next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 6, 1, 1, table_info->colnum, table_info->index_oid[0]};
+                snmp_set_var_objid(requests->requestvb, next_oid, OID_LENGTH(next_oid));
+             }
+          }
+
           int nIndex = 1;
           int nIndex = 1;
-          bool findinstance = false;
           _AlarmAckInfo *_temp;
           _AlarmAckInfo *_temp;
           list_for_each_entry(_temp, &_alarm_ack_info.list, list)
           list_for_each_entry(_temp, &_alarm_ack_info.list, list)
           {
           {
@@ -1182,8 +1271,6 @@ pduAlarmHistoryTable_handler(
                 break;
                 break;
              }
              }
 
 
-             findinstance = true;
-
              memset(buffer, 0, sizeof(buffer));
              memset(buffer, 0, sizeof(buffer));
              switch (table_info->colnum)
              switch (table_info->colnum)
              {
              {
@@ -1215,11 +1302,6 @@ pduAlarmHistoryTable_handler(
              //}
              //}
              break;
              break;
           }
           }
-
-          if (!findinstance)
-          {
-             netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHINSTANCE);
-          }
        }
        }
 
 
        // 释放资源
        // 释放资源
@@ -1273,14 +1355,35 @@ pduChannelLimitTable_handler(
     GlobalPowerManger *iterator = NULL;
     GlobalPowerManger *iterator = NULL;
     //
     //
     char buffer[16];
     char buffer[16];
+    oid begin_next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 7, 2, 6, 1, 1, 1};
+    int max_clonum = 7;
     switch (reqinfo->mode)
     switch (reqinfo->mode)
     {
     {
     case MODE_GET:
     case MODE_GET:
+   case MODE_GETNEXT:
        for (request = requests; request; request = request->next)
        for (request = requests; request; request = request->next)
        {
        {
           table_info = netsnmp_extract_table_info(request);
           table_info = netsnmp_extract_table_info(request);
+          if (reqinfo->mode == MODE_GETNEXT)
+          {
+             if (table_info->index_oid[0] == 0)
+             {
+                table_info->index_oid[0] = 1;
+                table_info->colnum = 1;
+                snmp_set_var_objid(requests->requestvb, begin_next_oid, OID_LENGTH(begin_next_oid));
+             }
+             else
+             {
+                if (table_info->colnum > max_clonum)
+                {
+                   table_info->index_oid[0] += 1;
+                   table_info->colnum = 1;
+                }
+                oid next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 7, 2, 6, 1,table_info->colnum, table_info->index_oid[0]};
+                snmp_set_var_objid(requests->requestvb, next_oid, OID_LENGTH(next_oid));
+             }
+          }
           int nIndex = 1;
           int nIndex = 1;
-          bool findinstance = false;
 
 
           list_for_each_entry(iterator, &__globalDeviceManage._globalPowerManger.list, list)
           list_for_each_entry(iterator, &__globalDeviceManage._globalPowerManger.list, list)
           {
           {
@@ -1293,7 +1396,6 @@ pduChannelLimitTable_handler(
              {
              {
                 break;
                 break;
              }
              }
-             findinstance = true;
 
 
              memset(buffer, 0, sizeof(buffer));
              memset(buffer, 0, sizeof(buffer));
              switch (table_info->colnum)
              switch (table_info->colnum)
@@ -1331,11 +1433,6 @@ pduChannelLimitTable_handler(
              //}
              //}
              break;
              break;
           }
           }
-
-          if (!findinstance)
-          {
-             netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHINSTANCE);
-          }
        }
        }
        break;
        break;
     case MODE_SET_RESERVE1:
     case MODE_SET_RESERVE1:
@@ -1375,14 +1472,37 @@ pduSensorLimitTable_handler(
     GlobalSensorManger *iterator = NULL;
     GlobalSensorManger *iterator = NULL;
     //
     //
     char buffer[16];
     char buffer[16];
+    oid begin_next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 7, 3, 1, 1, 1, 1};
+    int max_clonum = 6;
     switch (reqinfo->mode)
     switch (reqinfo->mode)
     {
     {
     case MODE_GET:
     case MODE_GET:
+    case MODE_GETNEXT:
        for (request = requests; request; request = request->next)
        for (request = requests; request; request = request->next)
        {
        {
           table_info = netsnmp_extract_table_info(request);
           table_info = netsnmp_extract_table_info(request);
+
+          if (reqinfo->mode == MODE_GETNEXT)
+          {
+             if (table_info->index_oid[0] == 0)
+             {
+                table_info->index_oid[0] = 1;
+                table_info->colnum = 1;
+                snmp_set_var_objid(requests->requestvb, begin_next_oid, OID_LENGTH(begin_next_oid));
+             }
+             else
+             {
+                if (table_info->colnum > max_clonum)
+                {
+                   table_info->index_oid[0] += 1;
+                   table_info->colnum = 1;
+                }
+                oid next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 7, 3, 1, 1, table_info->colnum, table_info->index_oid[0]};
+                snmp_set_var_objid(requests->requestvb, next_oid, OID_LENGTH(next_oid));
+             }
+          }
+
           int nIndex = table_info->index_oid[0];
           int nIndex = table_info->index_oid[0];
-          bool findinstance = false;
 
 
           list_for_each_entry(iterator, &__globalDeviceManage._globalSensorManger.list, list)
           list_for_each_entry(iterator, &__globalDeviceManage._globalSensorManger.list, list)
           {
           {
@@ -1390,7 +1510,6 @@ pduSensorLimitTable_handler(
              {
              {
                 continue;
                 continue;
              }
              }
-             findinstance = true;
 
 
              memset(buffer, 0, sizeof(buffer));
              memset(buffer, 0, sizeof(buffer));
              switch (table_info->colnum)
              switch (table_info->colnum)
@@ -1421,10 +1540,6 @@ pduSensorLimitTable_handler(
              break;
              break;
           }
           }
 
 
-          if (!findinstance)
-          {
-             netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHINSTANCE);
-          }
        }
        }
        break;
        break;
     case MODE_SET_RESERVE1:
     case MODE_SET_RESERVE1:

+ 4 - 0
pub

@@ -27,6 +27,7 @@
 #PRJS="PRJ_YUNNAN_AC_I1_O1"
 #PRJS="PRJ_YUNNAN_AC_I1_O1"
 #PRJS="PRJ_GOWONE_125A_AC_I3_O1"
 #PRJS="PRJ_GOWONE_125A_AC_I3_O1"
 #PRJS="PRJ_DUALWIRES_AC_I3_O2"
 #PRJS="PRJ_DUALWIRES_AC_I3_O2"
+PRJS="PRJ_Malaysia_AC_I3_O1"
 
 
 #PRJS="PRJ_USASL_AC_I3_O1 PRJ_USASL_AC_I3_O3"
 #PRJS="PRJ_USASL_AC_I3_O1 PRJ_USASL_AC_I3_O3"
 #PRJS="PRJ_XIAN_AC_I1_O1_P4 PRJ_XIAN_AC_I1_O1_P8"
 #PRJS="PRJ_XIAN_AC_I1_O1_P4 PRJ_XIAN_AC_I1_O1_P8"
@@ -192,6 +193,9 @@ function do_copy()
     elif [ "$1" = "PRJ_IP_AOSENS_DC_I_O" ]; then
     elif [ "$1" = "PRJ_IP_AOSENS_DC_I_O" ]; then
         cp -f $custdir/logo/logo_aosens.png $appdir/image/logo.png
         cp -f $custdir/logo/logo_aosens.png $appdir/image/logo.png
         name=ip_dc_aosens_in1_out1_release
         name=ip_dc_aosens_in1_out1_release
+    elif [ "$1" = "PRJ_Malaysia_AC_I3_O1" ];then
+        name=ac_Malaysia_in3_out1_release
+	cp -f $custdir/logo/logo_litech.png $appdir/image/logo.png
     else
     else
         echo error! $RPJ not define!!!
         echo error! $RPJ not define!!!
         exit 1
         exit 1