blob: ecb8229e1a6c51f89be80286fb7eb15a50f75f11 [file] [log] [blame]
hong.liud2417072025-06-27 07:10:37 -07001#include <stdbool.h>
b.liu68a94c92025-05-24 12:53:41 +08002#include <stdio.h>
3#include <stdlib.h>
4#include <stdint.h>
5#include <dlfcn.h>
6#include <time.h>
hong.liud2417072025-06-27 07:10:37 -07007#include "gsw_nw_interface.h"
lichengzhang7715b2f2025-07-19 10:18:21 +08008#include "gsw_log_interface.h"
b.liu68a94c92025-05-24 12:53:41 +08009typedef unsigned short uint16_t;
10typedef unsigned int uint32_t;
11typedef unsigned char uint8_t;
12typedef unsigned short uint16;
13typedef uint32_t sms_client_handle_type;
14typedef int kal_int32;
15
16
17//qser include
18
19
20
21//mbtk include
22typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
23typedef unsigned char uint8;
24
25typedef struct
26{
27 int client_fd;
28 pthread_t read_thread_id;
29 int exit_fd[2];
30 bool is_waitting;
31 pthread_cond_t cond;
32 pthread_mutex_t mutex;
33
34 pthread_mutex_t send_mutex;
35
36 // Temp response data.
37 uint16 info_err;
38 uint16 data_len;
39 void *data;
40
41 //mbtk wyq for server_ready_status add start
42 char server_ready_status;
43 //mbtk wyq for server_ready_status add end
44
45 mbtk_info_callback_func net_state_cb;
46 mbtk_info_callback_func call_state_cb;
47 mbtk_info_callback_func sms_state_cb;
48 mbtk_info_callback_func radio_state_cb;
49 mbtk_info_callback_func sim_state_cb;
50 mbtk_info_callback_func pdp_state_cb;
51 //add signal by xr
52 mbtk_info_callback_func signal_state_cb;
53} mbtk_info_handle_t;
54
55// PDU include
56enum EnumDCS {
57 BIT7 = 0, // GSM 字符集
58 BIT8 = 1, // ASCII字符集
59 UCS2 = 2 // Unicode 字符集
60};
61
62struct SMS_Struct {
63 char *SCA; // 服务中心地址
64 char *OA; // 发送方地址
65 char *SCTS; // 服务中心时间戳
66 struct UDHS *UDH; // 用户数据头
67 char *UD; // 用户数据
68
69 bool RP; // 应答路径
70 bool UDHI; // 用户数据头标识
71 bool SRI; // 状态报告指示
72 bool MMS; // 更多信息发送
73 int MTI; // 信息类型指示
74
75 char PID; // PID 协议标识
76
77 enum EnumDCS DCS; // 数据编码方案
78 bool TC; // 文本压缩指示 0: 未压缩 1:压缩
79 int MC; // 消息类型 -1: 无 1:移动设备特定类型 2:SIM特定类型 3:终端设备特定类型
80
81};
82
83struct PDUS {
84 unsigned int count;
85 char **PDU;
86};
87
88enum MDAPI_RET_e {
89 MDAPI_RET_SUCCESS = 0,
90 MDAPI_RET_ERROR = 1,
91 MDAPI_RET_TIMEOUT = 2,
92 MDAPI_RET_NOT_SUPPORT = 3,
93};
94
95#define MDAPI_TIME_STR_SIZE 22
96#define MDAPI_PHONE_NUMBER_SIZE 32
97#define MDAPI_MAX_PDU_SIZE 512
98#define MSM_NUMBER_MAX 2048+1
99#define RES_NUM_MIN 128
100#define MIN_MSM_PARAM_NUM 4
101#define MIN_IMS_MSM_PARAM_NUM 6
102#define MIN_WRITMSM_PARAM_NUM 5
103#define MSG_MAX_LEN 1024
104#define TELEPHONNUM_LEN 64
105#define STORAGSMS_MAX_SIZE 128
lichengzhang46a546c2025-06-17 16:24:55 +0800106#define SMSC_MAX_LEN 100
b.liu68a94c92025-05-24 12:53:41 +0800107#define SMS_NUM_MAX 255
108#define MAX_OUT_SIZE 512
109#define MAX_PDU_SIZE 512
110#define MAX_DATE_SIZE 32
111
b.liu68a94c92025-05-24 12:53:41 +0800112GSW_SMS_Callback_fun gsw_sms_callback = NULL;
113
114#define lib_mbtk_path "/lib/libmbtk_lib.so"
115#define lib_qser_sms_path "/lib/liblynq-qser-sms.so"
116
b.liu68a94c92025-05-24 12:53:41 +0800117
118static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
119int (*mbtk_sms_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
120static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
121struct SMS_Struct (*PDUDecoding)(const char *data);
122char *(*SCADecoding)(const char *data, int *EndIndex);
123char *(*SCAEncoding)(char *SCA);
124struct PDUS *(*PDUEncoding)(char *SCA, char *DA, char *UDC, struct UDHS *udhs);
125int (*mbtk_sms_cmgf_set)(mbtk_info_handle_t* handle, int mode);
126int (*mbtk_sms_cmgs_set)(mbtk_info_handle_t* handle, char * cmgs, char *resp);
127int (*mbtk_sms_csca_set)(mbtk_info_handle_t* handle, char * csca);
128int (*mbtk_sms_csca_get)(mbtk_info_handle_t* handle, char *buf);
129int (*mbtk_sms_cnmi_set)(mbtk_info_handle_t* handle);
lichengzhang7715b2f2025-07-19 10:18:21 +0800130// static void (*mbtk_log)(int level, const char *format, ...);
131// static void (*mbtk_log_init)(char *path, char *tag);
b.liu68a94c92025-05-24 12:53:41 +0800132int (*smsPduEncode)(const char *smsc, const char *da_num, const char *msg, int charset, char *smsc_pdu, char **pdu);
133int (*smsPduDecode)(const char *pdu_str, int pdu_len, char *da_num, char *smsc, char *msg, int *charset, int *curr_pack, int *total_pack, char *date);
134kal_int32 (*_mdapi_sms_get_msg_num)(const char *msg, int charset, kal_int32 *msg_num, kal_int32 *msg_len);
135
l.yang6a42e4d2025-05-28 01:04:20 -0700136#define GSW_SMS "[HAL][GSW_SMS]"
b.liu68a94c92025-05-24 12:53:41 +0800137
b.liu68a94c92025-05-24 12:53:41 +0800138static mbtk_info_handle_t* sms_info_handle = NULL;
139static sms_client_handle_type handle;
140static char sms_center_address[SMSC_MAX_LEN] = {0};
141static void *dlHandle_mbtk;
142static int init_flag = 0;
143
144static int mbtk_sms_import()
145{
146 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
147 if (dlHandle_mbtk == NULL)
148 {
xy.heb41615b2025-05-28 16:33:20 +0800149 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800150 }
151
lichengzhang7715b2f2025-07-19 10:18:21 +0800152 // mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
153 // if (mbtk_log_init == NULL)
154 // {
155 // return GSW_HAL_NORMAL_FAIL;
156 // }
b.liu68a94c92025-05-24 12:53:41 +0800157
lichengzhang7715b2f2025-07-19 10:18:21 +0800158 // mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
159 // if (mbtk_log == NULL)
160 // {
161 // return GSW_HAL_NORMAL_FAIL;
162 // }
b.liu68a94c92025-05-24 12:53:41 +0800163
164 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
165 if (mbtk_info_handle_get == NULL)
166 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800167 LOGE(GSW_SMS,"mbtk_info_handle_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800168 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800169 }
170
171 mbtk_sms_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_sms_state_change_cb_reg");
172 if (mbtk_sms_state_change_cb_reg == NULL)
173 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800174 LOGE(GSW_SMS,"mbtk_sms_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800175 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800176 }
177
178 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
179 if (mbtk_info_handle_free == NULL)
180 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800181 LOGE(GSW_SMS,"mbtk_info_handle_free dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800182 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800183 }
184
185 PDUDecoding = (struct SMS_Struct (*)(const char *data))dlsym(dlHandle_mbtk, "PDUDecoding");
186 if (PDUDecoding == NULL)
187 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800188 LOGE(GSW_SMS,"PDUDecoding dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800189 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800190 }
191
192 SCADecoding = (char *(*)(const char *data, int *EndIndex))dlsym(dlHandle_mbtk, "SCADecoding");
193 if (SCADecoding == NULL)
194 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800195 LOGE(GSW_SMS,"SCADecoding dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800196 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800197 }
198
199 SCAEncoding = (char *(*)(char *SCA))dlsym(dlHandle_mbtk, "SCAEncoding");
200 if (SCAEncoding == NULL)
201 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800202 LOGE(GSW_SMS,"SCAEncoding dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800203 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800204 }
205
206 PDUEncoding = (struct PDUS *(*)(char *SCA, char *DA, char *UDC, struct UDHS *udhs))dlsym(dlHandle_mbtk, "PDUEncoding");
207 if (PDUEncoding == NULL)
208 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800209 LOGE(GSW_SMS,"PDUEncoding dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800210 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800211 }
212
213 mbtk_sms_cmgf_set = (int (*)(mbtk_info_handle_t* handle, int mode))dlsym(dlHandle_mbtk, "mbtk_sms_cmgf_set");
214 if (mbtk_sms_cmgf_set == NULL)
215 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800216 LOGE(GSW_SMS,"mbtk_sms_cmgf_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800217 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800218 }
219
220 mbtk_sms_cmgs_set = (int (*)(mbtk_info_handle_t* handle, char * cmgs, char *resp))dlsym(dlHandle_mbtk, "mbtk_sms_cmgs_set");
221 if (mbtk_sms_cmgs_set == NULL)
222 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800223 LOGE(GSW_SMS,"mbtk_sms_cmgs_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800224 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800225 }
226
227 mbtk_sms_csca_set = (int (*)(mbtk_info_handle_t* handle, char * csca))dlsym(dlHandle_mbtk, "mbtk_sms_csca_set");
228 if (mbtk_sms_csca_set == NULL)
229 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800230 LOGE(GSW_SMS,"mbtk_sms_csca_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800231 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800232 }
233
234 mbtk_sms_csca_get = (int (*)(mbtk_info_handle_t* handle, char *buf))dlsym(dlHandle_mbtk, "mbtk_sms_csca_get");
235 if (mbtk_sms_csca_get == NULL)
236 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800237 LOGE(GSW_SMS,"mbtk_sms_csca_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800238 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800239 }
240
241 mbtk_sms_cnmi_set = (int (*)(mbtk_info_handle_t* handle))dlsym(dlHandle_mbtk, "mbtk_sms_cnmi_set");
242 if (mbtk_sms_cnmi_set == NULL)
243 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800244 LOGE(GSW_SMS,"mbtk_sms_cnmi_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800245 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800246 }
247
248 smsPduEncode = (int (*)(const char *smsc, const char *da_num, const char *msg, int charset, char *smsc_pdu, char **pdu))dlsym(dlHandle_mbtk, "smsPduEncode");
249 if (smsPduEncode == NULL)
250 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800251 LOGE(GSW_SMS,"smsPduEncode dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800252 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800253 }
254
255
256 smsPduDecode = (int (*)(const char *pdu_str, int pdu_len, char *da_num, char *smsc, char *msg, int *charset, int *curr_pack, int *total_pack, char *date))dlsym(dlHandle_mbtk,"smsPduDecode");
257 if (smsPduDecode == NULL)
258 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800259 LOGE(GSW_SMS,"smsPduDecode dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800260 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800261 }
262
263 _mdapi_sms_get_msg_num = (kal_int32 (*)(const char *msg, int charset, kal_int32 *msg_num, kal_int32 *msg_len))dlsym(dlHandle_mbtk,"_mdapi_sms_get_msg_num");
264 if (_mdapi_sms_get_msg_num == NULL)
265 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800266 LOGE(GSW_SMS,"_mdapi_sms_get_msg_num dlsym fail");
xy.heb41615b2025-05-28 16:33:20 +0800267 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800268 }
269
270 return GSW_HAL_SUCCESS;
271
272}
273
274void ArrayToStr(unsigned char *Buff, unsigned int BuffLen, char *OutputStr)
275{
276 int i = 0;
277 char TempBuff[MSG_MAX_LEN * 2 +1] = {0};
278 char strBuff[MSG_MAX_LEN * 2 +1] = {0};
279
280 for(i = 0; i<BuffLen;i++)
281 {
282 sprintf(TempBuff,"%02x",(unsigned char)Buff[i]);
lichengzhangdab5ee72025-07-21 18:03:00 +0800283 strncat(strBuff,TempBuff,2);
b.liu68a94c92025-05-24 12:53:41 +0800284 }
285 strncpy(OutputStr, strBuff, BuffLen*2);
286 return;
287}
288
289void gsw_sms_state_change_cb(const void* data, int data_len) {
lichengzhang7715b2f2025-07-19 10:18:21 +0800290 LOGD(GSW_SMS,"gsw_sms_state_change_cb -------start\n");
b.liu68a94c92025-05-24 12:53:41 +0800291
292 uint8 *ptr = (uint8*)data;
293
294 if (!strncmp("+CMT:", (const char *)ptr, 5))//丢弃无用消息
295 return ;
296
297 gsw_sms_msg_type_t gsw_sms_msg;
298 gsw_sms_date_t gsw_sms_date;
299
300 memset(&gsw_sms_msg, 0, sizeof(gsw_sms_msg_type_t));
301 memset(&gsw_sms_date, 0, sizeof(gsw_sms_date_t));
302
303 char smsc[MDAPI_MAX_PDU_SIZE] = {0};
304 char received_pdu[MDAPI_MAX_PDU_SIZE] = {0};
305 char msg[MDAPI_MAX_PDU_SIZE] = {0};
306 char num[MDAPI_MAX_PDU_SIZE] = {0};
307 char date[MAX_DATE_SIZE] = {0};
308 int charset = 0;
309 int ret = -1;
310 int curr_pack = 1;
311 int total_pack = 1;
312 if(ptr == NULL)
313 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800314 LOGE(GSW_SMS,"ptr is null");
b.liu68a94c92025-05-24 12:53:41 +0800315 }
lichengzhang7715b2f2025-07-19 10:18:21 +0800316 LOGE(GSW_SMS,"ptr: %s\n,data_len = %d\n", (char *)ptr, data_len);
b.liu68a94c92025-05-24 12:53:41 +0800317 if(data_len > MDAPI_MAX_PDU_SIZE)
318 {
319 strncpy(received_pdu, (const char *)ptr, MDAPI_MAX_PDU_SIZE-1);
320 }
321 else
322 {
323 strncpy(received_pdu, (const char *)ptr, data_len);
324 }
325 ret = smsPduDecode((const char *)received_pdu, data_len, num, smsc, msg, &charset, &curr_pack, &total_pack,date);
326 if(ret != 0)
327 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800328 LOGE(GSW_SMS,"smsPduDecode fail\n");
b.liu68a94c92025-05-24 12:53:41 +0800329 return ;
330 }
lichengzhang7715b2f2025-07-19 10:18:21 +0800331 LOGE(GSW_SMS,"smsPduDecode ret: %d\n", ret);
332 LOGE(GSW_SMS,"SMS :%s, %s, %d\n", __FILE__, __FUNCTION__, __LINE__);
333 LOGE(GSW_SMS,"[EVENT][MT_SMS]PDU decode:smsc: %s\n, phone number: %s\ncharset: %d\n msg_len: %d\n message content: %s\n curr_pack: %d\n total_pack: %d\n date: %s", smsc, num, charset, strlen(msg), msg, curr_pack, total_pack, date);
b.liu68a94c92025-05-24 12:53:41 +0800334
335 gsw_sms_msg.content_encode = charset;
336 memcpy(gsw_sms_msg.src_num, num, strlen(num));
337 gsw_sms_msg.content_len = strlen(msg);
338 memcpy(gsw_sms_msg.content, msg, strlen(msg));
339
340 if(sscanf(date, "%4[^-]-%2[^-]-%2[^ ] %2[^:]:%2[^:]:%2s", (char*)gsw_sms_date.year, (char*)gsw_sms_date.month, (char*)gsw_sms_date.day, (char*)gsw_sms_date.hour, (char*)gsw_sms_date.minutes, (char*)gsw_sms_date.seconds)<=0)
341 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800342 LOGE(GSW_SMS,"sscanf failed\n");
b.liu68a94c92025-05-24 12:53:41 +0800343 }
344
345 snprintf((char *)gsw_sms_date.timezone, sizeof(gsw_sms_date.timezone), "%s","+8");
346
lichengzhang7715b2f2025-07-19 10:18:21 +0800347 LOGE(GSW_SMS,"Year: %s\n", (char*)gsw_sms_date.year);
348 LOGE(GSW_SMS,"Month: %s\n", (char*)gsw_sms_date.month);
349 LOGE(GSW_SMS,"Day: %s\n", (char*)gsw_sms_date.day);
350 LOGE(GSW_SMS,"Hour: %s\n", (char*)gsw_sms_date.hour);
351 LOGE(GSW_SMS,"Minute: %s\n", (char*)gsw_sms_date.minutes);
352 LOGE(GSW_SMS,"Second: %s\n", (char*)gsw_sms_date.seconds);
b.liu68a94c92025-05-24 12:53:41 +0800353
354 gsw_sms_msg.date = gsw_sms_date;
355
356 if(gsw_sms_callback)
357 {
lichengzhang77046872025-07-07 11:45:51 +0800358 // if(total_pack > 1 && curr_pack < total_pack)
359 // {
b.liu68a94c92025-05-24 12:53:41 +0800360 gsw_sms_callback(GSW_SMS_RECEIVED_FLG, &gsw_sms_msg);
lichengzhang7715b2f2025-07-19 10:18:21 +0800361 LOGD(GSW_SMS,"the gsw_sms_state_e is %d\n",GSW_SMS_RECEIVED_FLG);
lichengzhang77046872025-07-07 11:45:51 +0800362 // }
363 // else
364 // {
365 // gsw_sms_callback(GSW_SMS_FULL_FLG, &gsw_sms_msg);
366 // }
b.liu68a94c92025-05-24 12:53:41 +0800367
368 }
369
370}
371
372
373/**
374 * @brief SDK interface to call back sms messages
375 * @param [in] handle_ptr
376 * @retval 0: success
377 * @retval other: fail
378 */
379int gsw_sms_reg_callback(GSW_SMS_Callback_fun handle_ptr)
380{
381 if(init_flag == 0)
382 {
383 return -1;
384 }
385
386 if(handle_ptr == NULL)
387 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800388 LOGE(GSW_SMS,"gsw_sms_reg_callback fail,handle_ptr is null\n");
b.liu68a94c92025-05-24 12:53:41 +0800389 return -1;
390 }
391 else
392 {
393 gsw_sms_callback = handle_ptr;
394 }
395 return GSW_HAL_SUCCESS;
396}
397
398/**
399 * @brief sms sdk init
400 * @param [in] token
401 * @retval 0: success
402 * @retval other: fail
403 */
hong.liud2417072025-06-27 07:10:37 -0700404int gsw_sms_sdk_init(int32_t token)
b.liu68a94c92025-05-24 12:53:41 +0800405{
406 handle = token;
407 int ret = -1;
408
409 if(init_flag == 1)
410 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800411 LOGE(GSW_SMS,"has init sms sdk,return\n");
b.liu68a94c92025-05-24 12:53:41 +0800412 return GSW_HAL_SUCCESS;
413 }
414
415 ret = mbtk_sms_import();
416 if(ret != 0)
417 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800418 // if(mbtk_log != NULL)
419 // {
420 // LOGE(GSW_SMS,"[gsw_sms_sdk_init]mbtk_sms_import fail\n");
421 // }
xy.heb41615b2025-05-28 16:33:20 +0800422 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800423 }
424
lichengzhang77046872025-07-07 11:45:51 +0800425 //mbtk_log_init("syslog", "MBTK_RIL");
b.liu68a94c92025-05-24 12:53:41 +0800426
427 sms_info_handle = mbtk_info_handle_get();
428 if(sms_info_handle == NULL)
429 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800430 LOGE(GSW_SMS,"[gsw_sms_sdk_init] mbtk handle init fail\n");
b.liu68a94c92025-05-24 12:53:41 +0800431 dlclose(dlHandle_mbtk);
xy.heb41615b2025-05-28 16:33:20 +0800432 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800433 }
434
435 ret = mbtk_sms_cnmi_set(sms_info_handle);
436 if(ret != 0)
437 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800438 LOGE(GSW_SMS,"mbtk_sms_cnmi_set fail.[%d]\n", ret);
xy.heb41615b2025-05-28 16:33:20 +0800439 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800440 }
441
442 ret = mbtk_sms_state_change_cb_reg(sms_info_handle, gsw_sms_state_change_cb);
443 if(ret != 0)
444 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800445 LOGE(GSW_SMS,"mbtk_sms_state_change_cb_reg fail.[%d]\n", ret);
b.liu68a94c92025-05-24 12:53:41 +0800446 if(sms_info_handle)
447 {
448 mbtk_info_handle_free(&sms_info_handle);
449 sms_info_handle = NULL;
450 }
xy.heb41615b2025-05-28 16:33:20 +0800451 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800452 }
453
lichengzhang7715b2f2025-07-19 10:18:21 +0800454 LOGD(GSW_SMS,"[gsw_sms_sdk_init]gsw_sms_sdk_init success\n");
b.liu68a94c92025-05-24 12:53:41 +0800455 init_flag = 1;
456 return GSW_HAL_SUCCESS;
457}
458
459/**
460 * @brief sms sdk deinit
461 * @param
462 * @retval 0: success
463 * @retval other: fail
464 */
465int gsw_sms_sdk_deinit(void)
466{
467 int ret = -1;
468
469 if(init_flag == 0)
470 {
471 return -1;
472 }
473
lichengzhang7715b2f2025-07-19 10:18:21 +0800474 LOGD(GSW_SMS,"callback clear\n");
b.liu68a94c92025-05-24 12:53:41 +0800475 gsw_sms_callback = NULL;
476
lichengzhang7715b2f2025-07-19 10:18:21 +0800477 LOGD(GSW_SMS,"handle_free\n");
b.liu68a94c92025-05-24 12:53:41 +0800478 if(sms_info_handle != NULL)
479 {
480 ret = mbtk_info_handle_free(&sms_info_handle);
481 if(ret != 0)
482 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800483 LOGE(GSW_SMS,"[gsw_sms_sdk_deinit]mbtk_info_handle_free fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800484 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800485 }
486 sms_info_handle = NULL;
487 }
488
lichengzhang7715b2f2025-07-19 10:18:21 +0800489 LOGD(GSW_SMS,"dlclose start\n");
b.liu68a94c92025-05-24 12:53:41 +0800490 if(dlHandle_mbtk == NULL)
491 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800492 LOGE(GSW_SMS,"[gsw_sms_sdk_deinit]dlHandle_sms is null\n");
b.liu68a94c92025-05-24 12:53:41 +0800493 }
494 else
495 {
496 dlclose(dlHandle_mbtk);
497 }
lichengzhang7715b2f2025-07-19 10:18:21 +0800498 LOGD(GSW_SMS,"dlclose end\n");
b.liu68a94c92025-05-24 12:53:41 +0800499 init_flag = 0;
500 return GSW_HAL_SUCCESS;
501}
502
503/**
504 * @brief send sms fuction *
505 * @param [in] phone_num dest phone num send sms
506 * @param [in] char_set encode format for sms 0 7bit 1 binary 2 usc2
507 * @param [in] msg sms content
508 * @param [in] msg_len send sms length,max is 1024
509 * @retval 0: success
510 * @retval other: fail
511 */
512int gsw_send_sms(char *phone_num, int char_set, char *msg, int msg_len)
513{
514
515 if(init_flag == 0)
516 {
xy.heb41615b2025-05-28 16:33:20 +0800517 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800518 }
519
520 if(phone_num == NULL || msg == NULL)
521 {
xy.heb41615b2025-05-28 16:33:20 +0800522 return GSW_HAL_ARG_INVALID;
b.liu68a94c92025-05-24 12:53:41 +0800523 }
524
lichengzhangdab5ee72025-07-21 18:03:00 +0800525 if(strlen((char *)msg) == 0 || strlen((char *)phone_num) == 0)
b.liu68a94c92025-05-24 12:53:41 +0800526 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800527 LOGE(GSW_SMS,"strlen(telephony_num):%d", strlen((char *)phone_num));
528 LOGE(GSW_SMS,"strlen(msg):%d", strlen((char *)msg));
xy.heb41615b2025-05-28 16:33:20 +0800529 return GSW_HAL_ARG_INVALID;
b.liu68a94c92025-05-24 12:53:41 +0800530 }
lichengzhangdab5ee72025-07-21 18:03:00 +0800531 if(strlen((char *)msg) > MSG_MAX_LEN || msg_len > MSG_MAX_LEN || strlen((char *)msg) != msg_len)
532 {
533 LOGE(GSW_SMS,"stelen is %d\n",strlen((char *)msg));
534 LOGE(GSW_SMS,"the lenth is error\n");
535 return GSW_HAL_NORMAL_FAIL;
536 }
b.liu68a94c92025-05-24 12:53:41 +0800537
538 int err = -1;
539
540 char smscPDU[30] = {0};
541 char **pdu = NULL;
542 char smsc[4] = {0};
543 char cmgs[MSM_NUMBER_MAX] = {0};
544 char resp[RES_NUM_MIN] = {0};
545 char msg_e_b[GSW_SMS_RECV_CONT_MAX+1] = {0};// +1 for end of string.*2:A char array contains two elements of a string for each value
546
547 kal_int32 msg_num = 0;
548 kal_int32 pdu_msg_len = 0;
549 kal_int32 status = MDAPI_RET_ERROR;
550 kal_int32 index = 0;
551
552 if(char_set == 1) //8bit
553 {
554 ArrayToStr((unsigned char *)msg, (unsigned int)msg_len, msg_e_b);
555 status = _mdapi_sms_get_msg_num(msg_e_b, char_set, &msg_num, &pdu_msg_len);
556 }
557
558 else //7bit usc2
559 {
560 status = _mdapi_sms_get_msg_num((char *)msg, char_set, &msg_num, &pdu_msg_len);
561 }
562
lichengzhang7715b2f2025-07-19 10:18:21 +0800563 LOGE(GSW_SMS,"%s, %s, %d, msg_len = [%d] ,msg_num=[%d]\n", __FILE__, __FUNCTION__, __LINE__, msg_len, msg_num);
b.liu68a94c92025-05-24 12:53:41 +0800564 if(status == MDAPI_RET_ERROR)
565 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800566 LOGE(GSW_SMS,"get message number failed\n");
xy.heb41615b2025-05-28 16:33:20 +0800567 //return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800568 }
569 else
570 {
571 //allocate memery for **pdu
572 pdu = (char **)malloc(sizeof(char *) * msg_num);
573 if(pdu == NULL)
574 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800575 LOGE(GSW_SMS,"%s, %s, %d, allocate memory for pdu failed\n", __FILE__, __FUNCTION__, __LINE__);
xy.heb41615b2025-05-28 16:33:20 +0800576 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800577 }
578
579 else
580 {
581 for(index = 0; index < msg_num; index++)
582 {
583 pdu[index] = (char *)malloc(sizeof(char)*MAX_PDU_SIZE);
584 if(pdu[index] == NULL)
585 {
586 for(int i = 0; i < index; i++)
587 {
588 free(pdu[i]);
589 pdu[i] = NULL;
590 }
591 free(pdu);
592 pdu = NULL;
lichengzhang7715b2f2025-07-19 10:18:21 +0800593 LOGE(GSW_SMS,"%s, %s, %d, allocate memory for pdu[%d] failed\n", __FILE__, __FUNCTION__, __LINE__,index);
xy.heb41615b2025-05-28 16:33:20 +0800594 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800595 }
596 else
597 {
598 memset(pdu[index], 0, MAX_PDU_SIZE);
lichengzhang7715b2f2025-07-19 10:18:21 +0800599 LOGE(GSW_SMS,"%s, %s, %d, pdu[%d} init value is: %s \n", __FILE__, __FUNCTION__, __LINE__, index, pdu[index]);
b.liu68a94c92025-05-24 12:53:41 +0800600 }
601 }
602 }
603 }
604
605 //allocate memory for **pdu success
606 if(index == msg_num)
607 {
608 if(char_set == 1)//8bit
609 {
610 smsPduEncode(smsc, (char *)phone_num, msg_e_b, char_set, smscPDU, pdu);
611 }
612 else
613 {
614 smsPduEncode(smsc, (char *)phone_num, (char *)msg, char_set, smscPDU, pdu);
615 }
616 for(index = 0; index < msg_num; index++)
617 {
618 char pdu_data[MAX_PDU_SIZE] = {0};
619 char *p = pdu_data;
620
lichengzhang7715b2f2025-07-19 10:18:21 +0800621 LOGE(GSW_SMS,"index:%d\n",index);
622 LOGE(GSW_SMS,"%s, %s, %d, smscPDU: %s, pdu: %s",__FILE__, __FUNCTION__, __LINE__, smscPDU, pdu[index]);
b.liu68a94c92025-05-24 12:53:41 +0800623 sprintf(p, "%s",smscPDU);
lichengzhang7715b2f2025-07-19 10:18:21 +0800624 LOGE(GSW_SMS,"pdu_data:%s\n", pdu_data);
b.liu68a94c92025-05-24 12:53:41 +0800625 int sc = strlen(pdu_data);
626 sprintf(p+strlen(p), "%s", pdu[index]);
lichengzhang7715b2f2025-07-19 10:18:21 +0800627 LOGE(GSW_SMS,"pdu_data:%s\n", pdu_data);
b.liu68a94c92025-05-24 12:53:41 +0800628
629 int t = strlen(pdu_data);
630 sprintf(cmgs, "%d,%s", (t-sc)/2, pdu_data);
lichengzhang7715b2f2025-07-19 10:18:21 +0800631 LOGE(GSW_SMS,"cmgs:%s\n", cmgs);
b.liu68a94c92025-05-24 12:53:41 +0800632 memset(resp, 0, sizeof(resp));
633
634 err = mbtk_sms_cmgf_set(sms_info_handle, 0);
635 if(err)
636 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800637 LOGE(GSW_SMS,"cmgf set error : %d\n", err);
b.liu68a94c92025-05-24 12:53:41 +0800638 for(index = 0; index < msg_num; index++){
639 free(pdu[index]);
640 pdu[index] = NULL;
641 }
642 free(pdu);
643 pdu = NULL;
xy.heb41615b2025-05-28 16:33:20 +0800644 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800645 }
646 else
647 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800648 LOGD(GSW_SMS,"cmgf set success\n");
b.liu68a94c92025-05-24 12:53:41 +0800649 }
650
651 err = mbtk_sms_cmgs_set(sms_info_handle, cmgs, resp);
652 if(err)
653 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800654 LOGE(GSW_SMS,"cmgs send fail\n");
b.liu68a94c92025-05-24 12:53:41 +0800655 for(index = 0; index < msg_num; index++){
656 free(pdu[index]);
657 pdu[index] = NULL;
658 }
659 free(pdu);
660 pdu = NULL;
xy.heb41615b2025-05-28 16:33:20 +0800661 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800662 }
663 else
664 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800665 LOGD(GSW_SMS,"cmgs send success, resp:%s\n", resp);
b.liu68a94c92025-05-24 12:53:41 +0800666 }
667
668 }
669 }
670
671 for(index = 0; index < msg_num; index++){
672 free(pdu[index]);
673 pdu[index] = NULL;
674 }
675 free(pdu);
676 pdu = NULL;
677
678 return GSW_HAL_SUCCESS;
679}
680
681
682/**
683 * @brief get smsc fuction *
684 * @param [in] len input buf len for smsc,max is 32
685 * @param [out] smsc address for smsc get from this func *
686 * @retval 0: success
687 * @retval other: fail
688 */
689int gsw_get_smsc_address(int len, char *smsc)
690{
691 int ret = -1;
692 int len_t = 0;
693 char smsc_temp[SMSC_MAX_LEN] = {0};
694 char *p1, *p2 ,*substr;
695
696 if(init_flag == 0)
697 {
xy.heb41615b2025-05-28 16:33:20 +0800698 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800699 }
700
701 if(smsc == NULL || len <= 0)
702 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800703 LOGE(GSW_SMS,"smsc is null or len = %d\n",len);
xy.heb41615b2025-05-28 16:33:20 +0800704 return GSW_HAL_ARG_INVALID;
b.liu68a94c92025-05-24 12:53:41 +0800705 }
706
707 ret = mbtk_sms_csca_get(sms_info_handle, smsc_temp);
708 if(smsc_temp[0] == '\0')
709 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800710 LOGE(GSW_SMS,"gsw_get_smsc_address Error : %d\n", ret);
xy.heb41615b2025-05-28 16:33:20 +0800711 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800712 }
713
714 else
715 {
716 p1 = strchr(smsc_temp, '\"');
717 p2 = strrchr(smsc_temp, '\"');
718 if (p1 && p2 && p2 > p1)
719 {
720 len_t = p2 - p1 - 1;
hong.liud2417072025-06-27 07:10:37 -0700721 substr = malloc(len_t + 1);
722 if (NULL == substr)
b.liu68a94c92025-05-24 12:53:41 +0800723 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800724 LOGE(GSW_SMS,"substr = NULL, malloc faill!!!\n");
hong.liud2417072025-06-27 07:10:37 -0700725 return GSW_HAL_NO_MEMORY;
b.liu68a94c92025-05-24 12:53:41 +0800726 }
hong.liud2417072025-06-27 07:10:37 -0700727 strncpy(substr, p1 + 1, len_t);
728 substr[len_t] = '\0';
lichengzhang12647e52025-07-21 17:23:10 +0800729 strncpy(smsc, substr, len);
730 strncpy(sms_center_address, substr, len);
b.liu68a94c92025-05-24 12:53:41 +0800731
lichengzhang7715b2f2025-07-19 10:18:21 +0800732 LOGE(GSW_SMS,"qser_sms_getsmscenteraddress success, smsc = %s\n", sms_center_address);
hong.liud2417072025-06-27 07:10:37 -0700733 free(substr);
734 substr = NULL;
b.liu68a94c92025-05-24 12:53:41 +0800735 }
736 else
737 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800738 LOGE(GSW_SMS,"String inside double quotes not found\n");
xy.heb41615b2025-05-28 16:33:20 +0800739 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800740 }
741 }
742
743
744 return GSW_HAL_SUCCESS;
745}
746
747/**
748 * @brief set smsc fuction
749 * @param [out] smsc string value for smsc,max length is 32 *
750 * @retval 0: success
751 * @retval other: fail
752 */
753int gsw_set_smsc_address(const char *smsc)
754{
755 int ret = -1;
756
757 if(init_flag == 0)
758 {
xy.heb41615b2025-05-28 16:33:20 +0800759 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800760 }
761
762 if(smsc == NULL || strlen((char *)smsc) == 0)
763 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800764 LOGE(GSW_SMS,"smsc is null or empty\n");
xy.heb41615b2025-05-28 16:33:20 +0800765 return GSW_HAL_ARG_INVALID;
b.liu68a94c92025-05-24 12:53:41 +0800766 }
767
768 ret = mbtk_sms_csca_set(sms_info_handle, (char *)smsc);
769
770 if(ret == 0)
771 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800772 LOGE(GSW_SMS,"set smsc success,smsc = %s\n",smsc);
b.liu68a94c92025-05-24 12:53:41 +0800773 }
774 else
775 {
lichengzhang7715b2f2025-07-19 10:18:21 +0800776 LOGE(GSW_SMS,"set smsc fail,ret = %d\n", ret);
xy.heb41615b2025-05-28 16:33:20 +0800777 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800778 }
779
780 return GSW_HAL_SUCCESS;
781}