diff --git a/mbtk/libgsw_lib/gsw_sms_interface.c b/mbtk/libgsw_lib/gsw_sms_interface.c
index ecb8229..70a85eb 100755
--- a/mbtk/libgsw_lib/gsw_sms_interface.c
+++ b/mbtk/libgsw_lib/gsw_sms_interface.c
@@ -114,6 +114,19 @@
 #define lib_mbtk_path "/lib/libmbtk_lib.so"
 #define lib_qser_sms_path "/lib/liblynq-qser-sms.so"
 
+// 短信分片管理器结构体
+typedef struct {
+    char msg_id[64];           // 短信唯一标识（号码+日期）
+    int total_segments;        // 总分片数
+    int received_count;        // 已接收分片数
+    char** segments;           // 分片内容数组
+    time_t last_received;      // 最后接收时间
+} SmsReassembler;
+
+#define MAX_SMS_REASSEMBLERS 10  // 最大同时处理的短信数量
+#define MAX_SEGMENTS 255         // 最大分片数
+#define SMS_TIMEOUT 300          // 5分钟超时(秒)
+static SmsReassembler g_sms_reassemblers[MAX_SMS_REASSEMBLERS] = {0};
 
 static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
 int (*mbtk_sms_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
@@ -271,6 +284,102 @@
 
 }
 
+static void generate_sms_id(char* dest, const char* num, const char* date) {
+    snprintf(dest, 64, "%.30s_%.30s", num, date);
+}
+
+// 查找或创建短信重组器
+static SmsReassembler* get_sms_reassembler(const char* num, const char* date, int total_segments)
+{
+    char msg_id[64];
+    generate_sms_id(msg_id, num, date);
+    
+    time_t current_time = time(NULL);
+    
+    for (int i = 0; i < MAX_SMS_REASSEMBLERS; i++)
+    {
+        if (g_sms_reassemblers[i].msg_id[0] != '\0')
+        {
+            // 检查超时
+            if (current_time - g_sms_reassemblers[i].last_received > SMS_TIMEOUT)
+            {
+                // 清理超时重组器
+                for (int j = 0; j < g_sms_reassemblers[i].total_segments; j++)
+                {
+                    if (g_sms_reassemblers[i].segments[j])
+                    {
+                        free(g_sms_reassemblers[i].segments[j]);
+                    }
+                }
+                free(g_sms_reassemblers[i].segments);
+                memset(&g_sms_reassemblers[i], 0, sizeof(SmsReassembler));
+            }
+            else if (strcmp(g_sms_reassemblers[i].msg_id, msg_id) == 0)
+            {
+                g_sms_reassemblers[i].last_received = current_time;
+                return &g_sms_reassemblers[i];
+            }
+        }
+    }
+    
+    // 创建新的重组器
+    for (int i = 0; i < MAX_SMS_REASSEMBLERS; i++)
+    {
+        if (g_sms_reassemblers[i].msg_id[0] == '\0')
+        {
+            strncpy(g_sms_reassemblers[i].msg_id, msg_id, sizeof(g_sms_reassemblers[i].msg_id) - 1);
+            g_sms_reassemblers[i].total_segments = total_segments;
+            g_sms_reassemblers[i].received_count = 0;
+            g_sms_reassemblers[i].last_received = current_time;
+            
+            // 分配分片数组内存
+            g_sms_reassemblers[i].segments = calloc(total_segments, sizeof(char*));
+            if (!g_sms_reassemblers[i].segments)
+            {
+                LOGE(GSW_SMS, "Memory allocation failed for segments array");
+                memset(&g_sms_reassemblers[i], 0, sizeof(SmsReassembler));
+                return NULL;
+            }
+            
+            return &g_sms_reassemblers[i];
+        }
+    }
+    
+    LOGE(GSW_SMS, "No free slots for new SMS reassembler");
+    return NULL;
+}
+
+// 重组短信
+static char* reassemble_sms(SmsReassembler* reassembler)
+{
+    size_t total_len = 0;
+    for (int i = 0; i < reassembler->total_segments; i++)
+    {
+        if (reassembler->segments[i])
+        {
+            total_len += strlen(reassembler->segments[i]);
+        }
+    }
+    
+    char* full_msg = malloc(total_len + 1);
+    if (!full_msg)
+    {
+        LOGE(GSW_SMS, "Memory allocation failed for full message");
+        return NULL;
+    }
+    
+    full_msg[0] = '\0';
+    for (int i = 0; i < reassembler->total_segments; i++)
+    {
+        if (reassembler->segments[i])
+        {
+            strcat(full_msg, reassembler->segments[i]);
+        }
+    }
+    
+    return full_msg;
+}
+
 void ArrayToStr(unsigned char *Buff, unsigned int BuffLen, char *OutputStr)
 {
     int i = 0;
@@ -286,7 +395,8 @@
     return;
 }
 
-void gsw_sms_state_change_cb(const void* data, int data_len) {
+void gsw_sms_state_change_cb(const void* data, int data_len)
+{
     LOGD(GSW_SMS,"gsw_sms_state_change_cb -------start\n");
 
     uint8 *ptr = (uint8*)data;
@@ -352,21 +462,74 @@
     LOGE(GSW_SMS,"Second: %s\n", (char*)gsw_sms_date.seconds);
 
     gsw_sms_msg.date = gsw_sms_date;
+    
 
     if(gsw_sms_callback)
     {
-        // if(total_pack > 1 && curr_pack < total_pack)
-        // {
-            gsw_sms_callback(GSW_SMS_RECEIVED_FLG, &gsw_sms_msg);
-            LOGD(GSW_SMS,"the gsw_sms_state_e is %d\n",GSW_SMS_RECEIVED_FLG);
-        // }
-        // else
-        // {
-        //     gsw_sms_callback(GSW_SMS_FULL_FLG, &gsw_sms_msg);
-        // }
-        
+        if(total_pack > 1)
+        {
+            SmsReassembler* reassembler = get_sms_reassembler(num, date, total_pack);
+            if (!reassembler)
+            {
+                LOGE(GSW_SMS, "Failed to get SMS reassembler");
+                return;
+            }
+            int seg_index = curr_pack - 1;
+    
+            // 如果该分片尚未接收
+            if (!reassembler->segments[seg_index])
+            {
+                reassembler->segments[seg_index] = strdup(msg);
+                if (!reassembler->segments[seg_index])
+                {
+                    LOGE(GSW_SMS, "Memory allocation failed for segment content");
+                    return;
+                }
+                reassembler->received_count++;
+            }
+    
+            // 检查是否所有分片都已接收
+            if (reassembler->received_count == reassembler->total_segments)
+            {
+                char* full_msg = reassemble_sms(reassembler);
+                if (full_msg)
+                {
+                    
+                    gsw_sms_msg.content_encode = charset;
+                    strncpy(gsw_sms_msg.src_num, num, sizeof(gsw_sms_msg.src_num) - 1);
+                    gsw_sms_msg.content_len = strlen(full_msg);
+                    
+                    size_t copy_size = (gsw_sms_msg.content_len < sizeof(gsw_sms_msg.content)) ? 
+                                    gsw_sms_msg.content_len : sizeof(gsw_sms_msg.content) - 1;
+                    strncpy(gsw_sms_msg.content, full_msg, copy_size);
+                    gsw_sms_msg.content[copy_size] = '\0';
+                    
+                    snprintf((char *)gsw_sms_date.timezone, sizeof(gsw_sms_date.timezone), "%s", "+8");
+                    
+                    if (gsw_sms_callback)
+                        gsw_sms_callback(GSW_SMS_FULL_FLG, &gsw_sms_msg);
+                    
+                    free(full_msg);
+                }
+                
+                for (int i = 0; i < reassembler->total_segments; i++)
+                {
+                    if (reassembler->segments[i])
+                    {
+                        free(reassembler->segments[i]);
+                        reassembler->segments[i] = NULL;
+                    }
+                }
+                free(reassembler->segments);
+                reassembler->segments = NULL;
+                reassembler->received_count = 0;
+                reassembler->total_segments = 0;
+                memset(reassembler->msg_id, 0, sizeof(reassembler->msg_id));
+            }
+        }
+        else
+            gsw_sms_callback(GSW_SMS_FULL_FLG, &gsw_sms_msg);
     }
-
 }
 
 
