diff --git a/mbtk/libgsw_lib/gsw_nw_interface.c b/mbtk/libgsw_lib/gsw_nw_interface.c
index b63690d..b613a1a 100755
--- a/mbtk/libgsw_lib/gsw_nw_interface.c
+++ b/mbtk/libgsw_lib/gsw_nw_interface.c
@@ -2,7 +2,10 @@
 #include <dlfcn.h>
 #include <time.h>
 #include <pthread.h>
+#include <cutils/properties.h>
 #define SIG_TIMER 5
+#define MODEM_TIMER 5
+
 //mbtk include
 #define LYNQ_AIR_PLANE_MODE_OFF      1    //at+cfun = 1
 #define LYNQ_AIR_PLANE_MODE_ON     4   // at+cfun = 4
@@ -35,6 +38,21 @@
 typedef unsigned short uint16;
 typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
 
+#define MBTK_READY_UCI "persist.mbtk.sdk.state"
+#define MBTK_READY_STRING_SIZE_MAX (3+1)
+
+
+typedef enum{
+    MBTK_READY_INIT = -1,
+    MBTK_READY_SUCCESS,
+    MBTK_READY_MODEM_FAIL,
+    MBTK_READY_RESPONSE_FAIL,
+    MBTK_READY_SOCKET_FAIL,
+    MBTK_READY_RIL_FAIL
+}mbtk_ready_status_type;
+
+bool str_empty(const void *str);
+
 typedef enum
 {
     MBTK_DEV_MODEM_MIN_FUN,                                   //Modem 最小功能
@@ -1247,6 +1265,48 @@
 
 }
 
+/*
+typedef enum{
+    MBTK_READY_INIT = -1,
+    MBTK_READY_SUCCESS,
+    MBTK_READY_MODEM_FAIL,
+    MBTK_READY_RESPONSE_FAIL,
+    MBTK_READY_SOCKET_FAIL,
+    MBTK_READY_RIL_FAIL
+}mbtk_ready_status_type;
+
+typedef enum gsw_hal_nw_mode_state_type
+{
+    GSW_MODEM_STATE_UNKNOWN = 0,
+    GSW_MODEM_STATE_ONLINE,
+    GSW_MODEM_STATE_OFFLINE,
+    GSW_SDK_STATE_SERVICE_DOWN,
+    GSW_SDK_STATE_SERVICE_UP,// service down->up 需要routectl 重启
+    GSW_SDK_STATE_GPS_DOWN,
+    GSW_SDK_STATE_GPS_UP,
+} gsw_mode_state_e;
+
+*/
+
+static void convert_uci_to_gsw_modem_state(int uci, int *state)
+{
+    switch(uci)
+	{
+        case MBTK_READY_SUCCESS:
+            *state=GSW_MODEM_STATE_ONLINE;
+            return;
+        case MBTK_READY_INIT:
+             *state=GSW_MODEM_STATE_UNKNOWN;
+            return;
+    }
+     *state=GSW_MODEM_STATE_OFFLINE;
+    return;
+}
+
+
+
+
+
 
 static void gsw_serving_info_callback_thread()
 {
@@ -1437,23 +1497,57 @@
         if(ret != 0)
         {
             LOGE("mbtk_net_signal_get fail, ret is %d\n",ret);
+           
         }
-
         else
         {
             convert_mbtk_sig_info_to_gsw_sig_info(&signal,&sig_strength);
-           
+            if(sig_cb != NULL)
+            {
+                sig_cb(sig_strength);
+            }
         }
-        
-        if(sig_cb != NULL)
-        {
-            sig_cb(sig_strength);
-        }
-
         sleep(SIG_TIMER);
     }
 }
 
+int gsw_get_modem_state(int *state)
+{
+    char buf[MBTK_READY_STRING_SIZE_MAX];
+    if(property_get(MBTK_READY_UCI, buf, "") > 0 && !str_empty(buf))
+    {
+        int uci_value=atoi(buf);
+        convert_uci_to_gsw_modem_state(uci_value,state);
+        return GSW_HAL_SUCCESS;
+    }
+    return GSW_HAL_NORMAL_FAIL;
+}
+
+int g_mode_state=((int)(GSW_MODEM_STATE_UNKNOWN))-1;
+void gsw_modem_state_timer()
+{ 
+    while(nw_init_flag)
+    {
+        if(modem_cb != NULL)
+        {
+            int state;
+            int ret = gsw_get_modem_state(&state);
+            if(ret != 0)
+            {
+                LOGE("gsw_get_modem_state fail, ret is %d",ret);
+            }
+            else if(state!=g_mode_state)
+            {
+                LOGE("modem state changed from %d to %d",g_mode_state,state);
+                g_mode_state=state;
+                modem_cb(state);
+            }
+         }
+         sleep(MODEM_TIMER);
+    }
+}
+
+
 
 /**
  * @brief SDK interface to call back serving info
@@ -1497,7 +1591,8 @@
     if(handle_ptr == NULL)
     {
         LOGE("handle_ptr is NULL\n");
-        return GSW_HAL_NORMAL_FAIL;
+        sig_cb=NULL;
+        return GSW_HAL_SUCCESS;
     }
 
     sig_cb = handle_ptr;
@@ -1587,14 +1682,24 @@
         return GSW_HAL_NORMAL_FAIL;
     }
 
+    nw_init_flag = 1;
+
     ret = pthread_create(&nw_info_thread, NULL, (void*)gsw_sig_info_timer, NULL);
     if (ret != 0)
     {
-        LOGE("pthread_create fail\n");
-        return GSW_HAL_NORMAL_FAIL;
+        LOGE("pthread_create fail，ret is %d", ret);
+        nw_init_flag = 0;
+        return GSW_HAL_ERROR_GNSS_NO_THRESHOLDS;
     }
 
-    nw_init_flag = 1;
+    
+    ret = pthread_create(&nw_info_thread, NULL, (void*)gsw_modem_state_timer, NULL);
+    if (ret != 0)
+    {
+        LOGE("pthread_create fail 2，ret is %d", ret);
+        nw_init_flag = 0;
+        return GSW_HAL_ERROR_GNSS_NO_THRESHOLDS;
+    }
 
     return GSW_HAL_SUCCESS;
 }
@@ -2478,7 +2583,8 @@
     if(handle_ptr == NULL)
     {
         LOGE("handle_ptr is NULL\n");
-        return GSW_HAL_NORMAL_FAIL;
+        modem_cb=NULL;
+        return GSW_HAL_SUCCESS;
     }
 
     modem_cb = handle_ptr;
