[Feature][R307][task-view-604][webui] add network status

Change-Id: I0c809193dd428ac37dc5c3469408ead81f57a6a1
diff --git a/lynq/R307/ap/app/goahead/interface5.0/zte_web_interface.h b/lynq/R307/ap/app/goahead/interface5.0/zte_web_interface.h
index ee013a7..f6398ca 100755
--- a/lynq/R307/ap/app/goahead/interface5.0/zte_web_interface.h
+++ b/lynq/R307/ap/app/goahead/interface5.0/zte_web_interface.h
@@ -384,6 +384,7 @@
 
 #define GOFORM_SET_NETWORK_ADB "NETWORK_ADB"
 #define GOFORM_COMMAND "COMMAND"
+#define GOFORM_NETWORK_INFO "NETWORK_INFO"
 
 /****************************All the web pages' URL************************************/
 #define ZTE_WEB_PAGE_LOGIN_NAME   			"index.html"
@@ -1088,6 +1089,7 @@
 
 extern void zte_goform_set_network_adb(webs_t wp);
 extern void zte_goform_set_command(webs_t wp);
+extern void zte_goform_get_network_info(webs_t wp);
 
 /**
 * @brief Data to be decoded.
diff --git a/lynq/R307/ap/app/goahead/interface5.0/zte_web_mgmt.c b/lynq/R307/ap/app/goahead/interface5.0/zte_web_mgmt.c
index 3450804..35c9622 100755
--- a/lynq/R307/ap/app/goahead/interface5.0/zte_web_mgmt.c
+++ b/lynq/R307/ap/app/goahead/interface5.0/zte_web_mgmt.c
@@ -306,7 +306,7 @@
 	int sem_id = -1;
 
 	int rc = TRUE;
-	
+
 	sem_id = get_sem(TIME_SEM_KEY_2);
 	if (sem_id != -1) {
 		sem_p(sem_id);
@@ -318,11 +318,11 @@
 	{
 	    rc = FALSE; // kw 3
 	}
-	
+
 	if (sem_id != -1) {
 		sem_v(sem_id);
 	}
-	
+
 	return rc;
 }
 void zte_mgmt_login_timeout_check()
@@ -343,7 +343,7 @@
             luser_login_timemark = LONG_MAX;
 			slog(MISC_PRINT, SLOG_DEBUG, "zte_mgmt_login_timemark_check: user_login_timemark is out of range [0, LONG_MAX).");
 		}
-		
+
 		sem_id = get_sem(TIME_SEM_KEY_2);
 		if (sem_id != -1) {
 			sem_p(sem_id);
@@ -353,7 +353,7 @@
 		if (sem_id != -1) {
 			sem_v(sem_id);
 		}
-		
+
 		if ((time_now - luser_login_timemark) > LOGIN_TIMEOUT) {
 			slog(MISC_PRINT, SLOG_DEBUG, "zte_mgmt_login_timemark_check: the login is timeout .");
 			(void)zte_web_write(NV_USER_IP_ADDR, "");
@@ -452,7 +452,7 @@
 
 	char strCfgGetItem[16] = {0};
 	nv_get_item(NV_RO, "usb_modetype", strCfgGetItem, sizeof(strCfgGetItem));
-	
+
 	slog(MISC_PRINT, SLOG_NORMAL,"[goahead]debug_enable->%s current->%s\n", debug_enable, strCfgGetItem);
 	if((strcmp(strCfgGetItem,"user")== 0)&&(atoi(debug_enable) != 0))
 	{
@@ -463,7 +463,7 @@
 			return;
 	    }*/
 	}
-	
+
 	if ('\0' == (*debug_enable)) {
 		slog(MISC_PRINT, SLOG_ERR, "zte_mgmt_set_devicemode: web para:[debug_enable] is empty string.\n");
 		zte_write_result_to_web(wp, "set_devicemode fail:parameter debug_enable is empty!");
@@ -1346,7 +1346,7 @@
 	char *schedule_minute = NULL;
 
 	schedule_enable = websGetVar(wp, T("scheduleEnabled"), T(""));
-	
+
 	if(0 == strcmp("1", schedule_enable))
 	{
 		schedule_hour = websGetVar(wp, T("scheduleHour"), T(""));
@@ -1764,7 +1764,7 @@
 	if (NULL == ipv6profile) {
 		return;
 	}
-	
+
 	sprintf(cfg_name, "APN_configtmp%d", index);
 	cfg_get_item(cfg_name, cfg_value, sizeof(cfg_value));
 	pos_begin = cfg_value;
@@ -2075,7 +2075,7 @@
 	{
 		return -1;
 	}
-	
+
 	memset(&buf, 0, sizeof(buf));
 	cfg_get_item("manual_time_month", buf, sizeof(buf));
 	month = atoi(buf);
@@ -2211,7 +2211,7 @@
 	{
 	    mtime = 0;
 	}
-	
+
 	if (0 != mtime) {
 		mtime += (SynBeforeTime - ltime);
 	} else {
@@ -2240,7 +2240,7 @@
         	{
         	    ntime = 0;
         	}	
-			
+
 			mtime = SynBeforeTime - ntime;
 		}
 		sprintf(SynPppTotal, "%d", mtime);
@@ -2266,7 +2266,7 @@
 	if (0 != ret) {
 		slog(MISC_PRINT, SLOG_ERR, "send MSG_CMD_SNTP_SET_TIME to sntp fail!");
 	}
-    
+
 	ret = ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_SYCTIME_SET_REQ, 0, NULL, 0);
 	if (0 != ret) {
 		slog(MISC_PRINT, SLOG_ERR, "sync time to cp fail!");
@@ -3044,6 +3044,141 @@
 	}
 }
 
+static void parse_at_response(const char *response, char **params, int *param_count, char *at, int count)
+{
+	const char *start = strstr(response, at);
+	if (start == NULL)
+	{
+		printf("Response does not contain the expected prefix.\n");
+		return;
+	}
+
+	start += strlen(at);
+	char *token = strtok((char *)start, ",");
+	*param_count = 0;
+
+	while (token != NULL && *param_count < count)
+	{
+		params[(*param_count)++] = token;
+		token = strtok(NULL, ",");
+	}
+}
+
+#define MIN_RSRQ_VALUE -19.5  // „1¤7„1¤7§³dB0ö5
+#define STEP_SIZE 0.5          // 0‹7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤704„1¤7„1¤7„1¤7
+#define MAX_RSRQ_INDEX 34      // „1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7
+
+static float get_rsrq_db_value(int rsrq_index)
+{
+    if (rsrq_index < 0 || rsrq_index > MAX_RSRQ_INDEX)
+	{
+        return -1000.0;
+    }
+
+    float lower_bound = MIN_RSRQ_VALUE + rsrq_index * STEP_SIZE;
+
+    return lower_bound;
+}
+
+void zte_goform_get_network_info(webs_t wp)
+{
+	char response[1024];
+	char tmp[16] = {0};
+	char plmn[16] = {0};
+	char *params[15];
+	int param_count = 0;
+	int i = 0;
+	char rsrp[16] = {0};
+	char cell_id[16] = {0};
+
+	executeCommand("at at+ZSINR 2>&1", response, sizeof(response));
+	const char *start = strstr(response, "+ZSINR: ");
+	if (start != NULL)
+	{
+		start += strlen("+ZSINR: ");
+		char *sinr = strtok((char *)start, ",");
+		if (atoi(sinr) == -20)
+		{
+			cfg_set("lte_sinr", "--");
+			web_feedback_header(wp);
+			(void)websWrite(wp, T("{\"%s\":\"%s\","), "lte_sinr", "--");
+		}
+		else
+		{
+			cfg_set("lte_sinr", sinr);
+			web_feedback_header(wp);
+			(void)websWrite(wp, T("{\"%s\":\"%s dB\","), "lte_sinr", sinr);
+		}
+	}
+	else
+	{
+		cfg_set("lte_sinr", "--");
+		web_feedback_header(wp);
+		(void)websWrite(wp, T("{\"%s\":\"%s\","), "lte_sinr", "--");
+	}
+
+	executeCommand("at at+ZEMSCIQ=1 2>&1", response, sizeof(response));
+	if (strstr(response, "+CME ERROR:") != NULL)
+	{
+		printf("----No network\n");
+		cfg_set("lte_plmn", "--");
+		cfg_set("lte_pci", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_rsrp", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_rsrq", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_plmn", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_cellid", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_pci", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\"}"), "lte_band", "--");
+	}
+	else
+	{
+		parse_at_response(response, params, &param_count, "+ZEMSCIQ: ", 12);
+		for (i = 0; i < param_count; i++)
+		{
+			printf("Parameter[%d]: %s\n", i, params[i]);
+		}
+		printf("======set lte_plmn=%s lte_pci=%s lte_band=%s lte_rsrq=%s\n", params[5], params[6], params[8], params[10]);
+		float db_value = get_rsrq_db_value(atoi(params[10]));
+		if (db_value == -1000.0)
+		{
+			cfg_set("lte_rsrq", " ");
+		}
+		else
+		{
+			sprintf(tmp, "%d", (int)db_value);
+			cfg_set("lte_rsrq", tmp);
+		}
+
+		snprintf(plmn, strlen(params[5]) - 1, "%s", params[5] + 1);
+		cfg_set("lte_plmn", plmn);
+		cfg_set("lte_pci", params[6]);
+		cfg_get_item("cell_id", cell_id, sizeof(cell_id));
+		cfg_get_item("lte_rsrp", rsrp, sizeof(rsrp));
+		if (strlen(rsrp) == 0)
+		{
+			(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_rsrp", "--");
+		}
+		else
+		{
+			(void)websWrite(wp, T("\"%s\":\"%s dBm\","), "lte_rsrp", rsrp);
+		}
+		if (strlen(tmp) == 0)
+		{
+			(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_rsrq", "--");
+		}
+		else
+		{
+			(void)websWrite(wp, T("\"%s\":\"%s dB\","), "lte_rsrq", tmp);
+		}
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_plmn", plmn);
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_cellid", cell_id);
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_band", params[8]);
+		(void)websWrite(wp, T("\"%s\":\"%s\"}"), "lte_pci", params[6]);
+	}
+
+	return;
+}
+
 void zte_goform_set_command(webs_t wp)
 {
 	MSG_BUF stMsg = {0};
@@ -3087,7 +3222,7 @@
 				replace_slash_with_backslash(value);
 				printf("replace value:%s\n", value);
 			}
-			executeCommand(value, result);
+			executeCommand(value, result, sizeof(result));
 			printf("Command Output:\n%s\n", result);
 			zte_write_result_to_web(wp, result);
 			return;
@@ -3244,7 +3379,7 @@
     {
         login_times = 0;
     }
-	
+
 	login_times--;
 	sprintf(psw_fail_num_str, "%d", login_times);
 	(void)zte_web_write("psw_fail_num_str", psw_fail_num_str);
@@ -3469,7 +3604,7 @@
 {
 	int efuse_fd = -1;
 	T_ZDrvEfuse_Secure efuse = {0};
-	
+
 	memset(&efuse, 0, sizeof(efuse));
 	efuse_fd = open("/dev/efuse", O_RDWR);
 	if (efuse_fd < 0) {
@@ -3483,7 +3618,7 @@
 	}
 	close(efuse_fd);
 	memcpy(aes_key, efuse.pubKeyHash, k_len);
-	
+
 	return 1;
 }
 
@@ -3493,13 +3628,13 @@
 		printf("bs_aes_encrypt err in=%p out=%p key=%p len=%d key_len=%d\n",in,key,out,len,key_len);
         return 0;
     }
- 
+
     AES_KEY aes = {0}; //cov h
     if (AES_set_encrypt_key(key, key_len*8, &aes) < 0) {
 		printf("bs_aes_encrypt AES_set_encrypt_key err\n");
         return 0;
     }
- 
+
     int en_len = 0;
     while (en_len < len) {
         AES_encrypt((unsigned char*)in, (unsigned char*)out, &aes);
@@ -3507,7 +3642,7 @@
         out += AES_BLOCK_SIZE;
         en_len += AES_BLOCK_SIZE;
     }
- 
+
     return 1;
 }
 
@@ -3517,13 +3652,13 @@
 		printf("bs_aes_decrypt err in=%p out=%p key=%p len=%d key_len=%d\n",in,key,out,len,key_len);
         return 0;
     }
- 
+
     AES_KEY aes = {0}; //cov h
     if (AES_set_decrypt_key((unsigned char*)key, key_len*8, &aes) < 0) {
 		printf("bs_aes_decrypt AES_set_decrypt_key err\n");
         return 0;
     }
- 
+
     int en_len = 0;
     while (en_len < len) {
         AES_decrypt((unsigned char*)in, (unsigned char*)out, &aes);
@@ -3531,7 +3666,7 @@
         out += AES_BLOCK_SIZE;
         en_len += AES_BLOCK_SIZE;
     }
- 
+
     return 1;
 }
 
@@ -3541,7 +3676,7 @@
 		printf("bs_aes_encrypt err in=%p out=%p key=%p len=%d key_len=%d\n",in,key,out,len,key_len);
         return 0;
     }
- 
+
     AES_KEY aes = {0}; //cov h
     if (AES_set_encrypt_key(key, key_len*8, &aes) < 0) {
 		printf("bs_aes_encrypt AES_set_encrypt_key err\n");
@@ -3550,11 +3685,11 @@
 
 	unsigned char iv[AES_BLOCK_SIZE] = {0};
 	memcpy(iv, key, AES_BLOCK_SIZE);
-	
+
     AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, 
 			&aes, iv, AES_ENCRYPT);
 
- 
+
     return 1;
 }
 
@@ -3564,7 +3699,7 @@
 		printf("bs_aes_decrypt err in=%p out=%p key=%p len=%d key_len=%d\n",in,key,out,len,key_len);
         return 0;
     }
- 
+
     AES_KEY aes = {0}; //cov h
     if (AES_set_decrypt_key((unsigned char*)key, key_len*8, &aes) < 0) {
 		printf("bs_aes_decrypt AES_set_decrypt_key err\n");
@@ -3573,7 +3708,7 @@
 
 	unsigned char iv[AES_BLOCK_SIZE] = {0};
 	memcpy(iv, key, AES_BLOCK_SIZE);
-	
+
     AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, 
 			&aes, iv, AES_DECRYPT);
 
@@ -3793,7 +3928,7 @@
 		set_apn_prof_aes_by_index(index, &profile);
 //		printf("decrypt fota ppp_tmp[%d]=%s\n", index, profile.ppp_passwd);
 	}
-	
+
 	set_apn_profile_by_index(index, &profile);
 
 	return;
@@ -3973,7 +4108,7 @@
 {
     char rstr[10] = {0};
     unsigned int rnum = 0;
-   
+
     srand( (unsigned)time( NULL ) );
     rnum = rand();
     rnum %= 1000000000;   
@@ -3988,11 +4123,11 @@
 	size_t aes_len = 0;
 
 	char *out = NULL;
-	
+
 	char js_aes_key[24 + 1]={0};
 	char imei_buf[15 + 1] = {0};
 	char rnum_buf[9 + 1] = {0};
-	
+
 	aes_password = (char *)zte_base64_decode((const unsigned char *)src, len, (unsigned int*)&aes_len);
 	if (aes_password == NULL)
 		return NULL;
@@ -4008,7 +4143,7 @@
 	cfg_get_item("imei", imei_buf, sizeof(imei_buf));
 	cfg_get_item("rnum_js", rnum_buf, sizeof(rnum_buf));
 	snprintf(js_aes_key, sizeof(js_aes_key), "%s%sFFFFFFFFFFFFFFF", rnum_buf, imei_buf);
-	
+
 	bs_aes_cbc_decrypt(aes_password, aes_len, out, js_aes_key, sizeof(js_aes_key)-1);
 	//printf("decrypt js_aes_decode[%d]=%s\n", aes_len, out);
 
@@ -4020,7 +4155,7 @@
 	}
 
 	*out_len = strlen(out);
-	
+
 	return out;
 }
 #endif
diff --git a/lynq/R307/ap/app/goahead/interface5.0/zte_web_util.c b/lynq/R307/ap/app/goahead/interface5.0/zte_web_util.c
index a824754..2c3c467 100755
--- a/lynq/R307/ap/app/goahead/interface5.0/zte_web_util.c
+++ b/lynq/R307/ap/app/goahead/interface5.0/zte_web_util.c
@@ -127,6 +127,7 @@
 	{CMD_HTTPSHARE_GETCARD_VAULE, zte_httpShare_getcard_value},
 	{CMD_HTTPSHARE_GETCARD_NMEA, zte_httpShare_getcard_name},
 	{CMD_HTTPSHARE_AUTH_GET, zte_httpShare_auth_get},
+	{GOFORM_NETWORK_INFO, zte_goform_get_network_info},
 };
 
 
diff --git a/lynq/R307/ap/app/zte_webui/i18n/Messages_en.properties b/lynq/R307/ap/app/zte_webui/i18n/Messages_en.properties
index 9e8e08f..2f21e23 100755
--- a/lynq/R307/ap/app/zte_webui/i18n/Messages_en.properties
+++ b/lynq/R307/ap/app/zte_webui/i18n/Messages_en.properties
@@ -446,6 +446,14 @@
 dial_roaming_remind = Check here, you can connect to internet in the roaming status.

 dial_roaming_connect = Your device is roaming. Connecting to network may occur additional charges. Continue?

 

+#net_status

+net_info = Network Status

+pci = PCI

+rsrp = RSRP

+rsrq = RSRQ

+plmn = PLMN

+band = BAND

+

 #phonebook

 search = Search

 save_location = Save Location

diff --git a/lynq/R307/ap/app/zte_webui/i18n/Messages_zh-cn.properties b/lynq/R307/ap/app/zte_webui/i18n/Messages_zh-cn.properties
index fe8b933..52f1093 100755
--- a/lynq/R307/ap/app/zte_webui/i18n/Messages_zh-cn.properties
+++ b/lynq/R307/ap/app/zte_webui/i18n/Messages_zh-cn.properties
@@ -448,6 +448,14 @@
 dial_roaming_remind = 勾选此项,您可以在漫游状态下连接到网络,且可能会产生额外费用。

 dial_roaming_connect = 设备处于漫游状态,连接网络会使您的资费增加。确定继续?

 

+#net_status

+net_info = 网络状态

+pci = PCI

+rsrp = RSRP

+rsrq = RSRQ

+plmn = PLMN

+band = BAND

+

 #phonebook

 search = 搜索

 save_location = 存储位置

diff --git a/lynq/R307/ap/app/zte_webui/js/com.js b/lynq/R307/ap/app/zte_webui/js/com.js
index d6c718b..73e9c0d 100755
--- a/lynq/R307/ap/app/zte_webui/js/com.js
+++ b/lynq/R307/ap/app/zte_webui/js/com.js
@@ -497,6 +497,25 @@
             }

         }

     }

+    function getNetworkStatus() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "NETWORK_INFO";

+            return valueReq;

+        }

+        function deal(result) {

+            return {

+                sinr: result.lte_sinr,

+                rsrp: result.lte_rsrp,

+                rsrq: result.lte_rsrq,

+                plmn: result.lte_plmn,

+                pci: result.lte_pci,

+                cellid: result.lte_cellid,

+                band: result.lte_band

+            };

+       }

+    }

     function deleteApn() {

         return stuffMake(arguments, {}, prepare, deal, null, true);

         function prepare(values, isPost) {

@@ -5477,6 +5496,7 @@
         getLanInfo: getLanInfo,

         setLanInfo: setLanInfo,       

         getApnSettings: getApnSettings,

+        getNetworkStatus: getNetworkStatus,

         deleteApn: deleteApn,

         setDefaultApn: setDefaultApn,

         addOrEditApn: addOrEditApn,

diff --git a/lynq/R307/ap/app/zte_webui/js/ext/menu.js b/lynq/R307/ap/app/zte_webui/js/ext/menu.js
index 329eab5..dc3a4e4 100755
--- a/lynq/R307/ap/app/zte_webui/js/ext/menu.js
+++ b/lynq/R307/ap/app/zte_webui/js/ext/menu.js
@@ -145,8 +145,14 @@
             parent: '#network_set',

             requireLogin: needLogin,

             checkSIMStatus: true

-        },

-        {

+        }, {

+            hash: '#net_status',

+            path: 'network_info',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

             hash: '#wlan_station',

             path: 'wifi_ap_station',

             level: '2',

diff --git a/lynq/R307/ap/app/zte_webui/js/ext/menu_pppoe.js b/lynq/R307/ap/app/zte_webui/js/ext/menu_pppoe.js
index b467b2d..52fddf8 100755
--- a/lynq/R307/ap/app/zte_webui/js/ext/menu_pppoe.js
+++ b/lynq/R307/ap/app/zte_webui/js/ext/menu_pppoe.js
@@ -145,8 +145,14 @@
             parent: '#network_set',

             requireLogin: needLogin,

             checkSIMStatus: true

-        },

-        {

+        }, {

+            hash: '#net_status',

+            path: 'network_info',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

             hash: '#wlan_station',

             path: 'wifi_ap_station',

             level: '2',

diff --git a/lynq/R307/ap/app/zte_webui/js/main.js b/lynq/R307/ap/app/zte_webui/js/main.js
index a771f7d..fa447ca 100755
--- a/lynq/R307/ap/app/zte_webui/js/main.js
+++ b/lynq/R307/ap/app/zte_webui/js/main.js
@@ -24,7 +24,7 @@
         tmpl: '../subpg',

         underscore: '3rd/underscore',

         service: 'com',

-        

+

         CryptoJS: '3rd/crypto-js',

 

         menu: 'com',

@@ -56,6 +56,7 @@
         network_apn_set: 'net',

         network_dial_set: 'net',

         network_dial_set_cpe: 'net',

+		network_info: 'net',

         locknet: 'net',

         network_net_select: 'net',

         ddns: 'net',

diff --git a/lynq/R307/ap/app/zte_webui/js/net.js b/lynq/R307/ap/app/zte_webui/js/net.js
index 1a5b429..ac6b5c9 100755
--- a/lynq/R307/ap/app/zte_webui/js/net.js
+++ b/lynq/R307/ap/app/zte_webui/js/net.js
@@ -4232,3 +4232,30 @@
         init: initialize

     };

 });

+define("network_info","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+        function NetInfoVM() {

+            var target = this;

+            var network_status = service.getNetworkStatus();

+

+            target.pci = ko.observable(network_status.pci);

+            target.sinr = ko.observable(network_status.sinr);

+            target.rsrp = ko.observable(network_status.rsrp);

+            target.rsrq = ko.observable(network_status.rsrq);

+            target.plmn = ko.observable(network_status.plmn);

+            target.cellid = ko.observable(network_status.cellid);

+            target.band = ko.observable(network_status.band);

+        }

+

+        function initialize() {

+            var container = $('#container');

+            ko.cleanNode(container[0]);

+            var imVm = new NetInfoVM();

+            ko.applyBindings(imVm, container[0]);

+        }

+

+        return {

+            init: initialize

+        };

+});

diff --git a/lynq/R307/ap/app/zte_webui/subpg/network_apn_set.html b/lynq/R307/ap/app/zte_webui/subpg/network_apn_set.html
index c308b85..16cd939 100755
--- a/lynq/R307/ap/app/zte_webui/subpg/network_apn_set.html
+++ b/lynq/R307/ap/app/zte_webui/subpg/network_apn_set.html
@@ -18,6 +18,7 @@
 			    <li><a data-trans="dial_mode" href="#conn_set"></a></li>

 				<li><a data-trans="net_select" href="#network_choose"></a></li>

 				<li class="active"><a data-trans="apn_setting" href="#cgdcont_set"></a></li>

+				<li><a data-trans="net_info" href="#net_status"></a></li>

 			</ul>

 		</div>

 	    </div>

@@ -128,9 +129,9 @@
 						</div>

 					</div>

 				</div>

-				

+

 				<!-- 以下是ipv6 -->

-				

+

 				<div data-bind="visible: (selectedPdpType() == 'IPv4v6' && supportIpv4AndIpv6()) || selectedPdpType() == 'IPv6'">

 					<div class="row form-group">

 						<label for="apn_ipv6_apn" data-bind="attr:{'data-trans': transApnV6}" class="col-xs-3 side-right"></label>

@@ -159,7 +160,7 @@
 		                    <input id="apn_dns2_ipv6" type="text" name="apn_dns2_ipv6" data-bind="value: dns2V6, disable: checkInputDisable" class="ipv6 form-control"/>

 		                </div>

 					</div>

-					

+

 					<div class="row form-group">

 						<label for="authentication_ipv6" data-bind="attr:{'data-trans': transAuthV6}" class="col-xs-3 side-right"></label>

 		                <div class="col-xs-6">

@@ -217,4 +218,4 @@
 </form>

     </div>

 </div>

-</div>
\ No newline at end of file
+</div>

diff --git a/lynq/R307/ap/app/zte_webui/subpg/network_dial_set.html b/lynq/R307/ap/app/zte_webui/subpg/network_dial_set.html
index e59b1ca..a13017d 100755
--- a/lynq/R307/ap/app/zte_webui/subpg/network_dial_set.html
+++ b/lynq/R307/ap/app/zte_webui/subpg/network_dial_set.html
@@ -18,6 +18,7 @@
 			    <li class="active"><a data-trans="dial_mode" href="#conn_set"></a></li>

 				<li><a data-trans="net_select" href="#network_choose"></a></li>

 				<li><a data-trans="apn_setting" href="#cgdcont_set"></a></li>

+                <li><a data-trans="net_info" href="#net_status"></a></li>

 			</ul>

 		</div>

 	    </div>

@@ -65,4 +66,4 @@
 </form>

     </div>

 </div>

-</div>
\ No newline at end of file
+</div>

diff --git a/lynq/R307/ap/app/zte_webui/subpg/network_info.html b/lynq/R307/ap/app/zte_webui/subpg/network_info.html
new file mode 100755
index 0000000..84dabe4
--- /dev/null
+++ b/lynq/R307/ap/app/zte_webui/subpg/network_info.html
@@ -0,0 +1,64 @@
+<div id="innerContainer">

+    <div class="row header-row">

+        <div class="col-xs-1">

+            <a href="#main">

+                <img alt="" src="pic/direct-back.png">

+            </a>

+        </div>

+        <div class="col-xs-11">

+            <div class="form-title">

+                <h1 data-trans='net_setting'></h1>

+            </div>

+        </div>

+    </div>

+    <div class="row">

+        <div class="col-xs-2">

+            <div class="nav_right">

+                <ul>

+                    <li><a data-trans="dial_mode" href="#conn_set"></a></li>

+                    <li><a data-trans="net_select" href="#network_choose"></a></li>

+                    <li><a data-trans="apn_setting" href="#cgdcont_set"></a></li>

+                    <li class="active"><a data-trans="net_info" href="#net_status"></a></li>

+                </ul>

+            </div>

+	    </div>

+

+        <div class="col-xs-10">

+            <form role="form">

+                <div class="form-body">

+                    <h3 data-trans="net_info" class="form-title"></h3>

+                    <div class="content">

+                        <div class="row form-group">

+                            <label data-trans="pci" class="col-xs-5"></label>

+				            <label data-bind="text: pci" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="sinr" class="col-xs-5"></label>

+				            <label data-bind="text: sinr" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="rsrp" class="col-xs-5"></label>

+				            <label data-bind="text: rsrp" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="rsrq" class="col-xs-5"></label>

+				            <label data-bind="text: rsrq" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="plmn" class="col-xs-5"></label>

+				            <label data-bind="text: plmn" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="cellid" class="col-xs-5"></label>

+				            <label data-bind="text: cellid" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="band" class="col-xs-5"></label>

+				            <label data-bind="text: band" class="col-xs-7"></label>

+                        </div>

+                    </div>

+                </div>

+            </form>

+        </div>

+    </div>

+</div>
\ No newline at end of file
diff --git a/lynq/R307/ap/app/zte_webui/subpg/network_net_select.html b/lynq/R307/ap/app/zte_webui/subpg/network_net_select.html
index c7bb48c..b5552c1 100755
--- a/lynq/R307/ap/app/zte_webui/subpg/network_net_select.html
+++ b/lynq/R307/ap/app/zte_webui/subpg/network_net_select.html
@@ -18,6 +18,7 @@
 			    <li><a data-trans="dial_mode" href="#conn_set"></a></li>

 				<li class="active"><a data-trans="net_select" href="#network_choose"></a></li>

 				<li><a data-trans="apn_setting" href="#cgdcont_set"></a></li>

+                <li><a data-trans="net_info" href="#net_status"></a></li>

 			</ul>

 		</div>

 	    </div>

@@ -54,7 +55,7 @@
         <input type="button" data-bind='click: save, visible: selectMode() == "auto_select", enable: enableFlag, css: {disabled: !enableFlag()}' data-trans='apply' class="btn btn-primary"/>

         <input type="button" data-bind='click: search, visible: selectMode() != "auto_select", enable: enableFlag, css: {disabled: !enableFlag()}' data-trans='search' class="btn btn-primary"/>

     </div>

-    

+

     <div data-bind='visible: networkList().length > 0 && selectMode() == "manual_select"' class="content">

         <div class="form-title">

             <h2 data-trans='network_list'></h2>

@@ -103,4 +104,4 @@
 </form>

     </div>

 </div>

-</div>
\ No newline at end of file
+</div>