[Bugfix][T108][bug-view-1994]Add long-short message reassembly function
Only Configure: No
Affected branch: GSW_V1453
Affected module: sms
Is it affected on IC: only ASR
Self-test: yes
Doc Update: no
Change-Id: I6f7ce9b3fb1c4452f8cc429cdecc4298359464d6
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);
}
-
}