blob: 45525cf5ae0c6304f7ceb625305e61a662a7a569 [file] [log] [blame]
b.liu68a94c92025-05-24 12:53:41 +08001#include "lynq_qser_sms.h"
2#include "mbtk_type.h"
3#include "mbtk_pdu_sms.h"
4#include "mbtk_info_api.h"
5#include "lynq_sms.h"
6#include "mbtk_log.h"
7
8
9#include <stdio.h>
10#include <stdlib.h>
11
12
13#define TELEPHONE_NUM_MAX 16
14#define MSM_NUMBER_MAX 2048+1
15#define RES_NUM_MIN 128
16
17
18#define DSC_to_msg(DSC) (DSC == 0 ? "Bit7" : (DSC == 1 ? "Bit8" : "UCS2"))
19
20static mbtk_info_handle_t* sms_info_handle = NULL;
21static char sms_center_address[128] = {0};
22
23typedef struct
24{
25 QSER_SMS_RxMsgHandlerFunc_t handlerPtr;
26 void* contextPtr;
27} lynq_sms_cb_func;
28
29static lynq_sms_cb_func lynq_sms_func_cb_handle;
30
31sms_client_handle_type g_sms_val = -1;
32
33
34void lynq_sms_state_change_cb(const void* data, int data_len)
35{
36 LOGV("sms_state_change_cb()----------start\n");
37 uint8 *ptr = (uint8*)data;
38 //printf("3sms_state_change_cb() : %s\n", ptr);
39
40 if (!strncmp("+CMT:", (char*)ptr, 5))//丢弃无用消息
41 return ;
42
43 struct SMS_Struct s = PDUDecoding((char*)ptr);
44 /*
45 printf("服务中心地址: %s\n", s.SCA);
46 printf("发送方地址: %s\n", s.OA);
47 printf("服务中心时间戳: %s\n", s.SCTS);
48 printf("消息内容: %s\n", s.UD);
49 printf("数据编码方案: %s\n", DSC_to_msg(s.DCS));
50 */
51 QSER_SMS_Msg_t* tmp_data = NULL;
52
53 tmp_data = (QSER_SMS_Msg_t*)malloc(sizeof(QSER_SMS_Msg_t));
54 memset(tmp_data,0x00, sizeof(QSER_SMS_Msg_t));
55
56 tmp_data->format = s.DCS;
57 //printf("t数据编码方案: %d\n", tmp_data->format);
58 memcpy(tmp_data->src_addr, s.OA, strlen(s.OA));
59 //printf("t发送方地址: %s\n", tmp_data->src_addr);
60 memcpy(tmp_data->timestamp, s.SCTS, strlen(s.SCTS));
61 //printf("t服务中心时间戳: %s\n", tmp_data->timestamp);
62 tmp_data->sms_data_len = strlen(s.UD);
63 //printf("t消息内容长度: %d\n", tmp_data->sms_data_len);
64 memcpy(tmp_data->sms_data, s.UD, strlen(s.UD));
65 //printf("t消息内容: %s\n", tmp_data->sms_data);
66
67 lynq_sms_func_cb_handle.handlerPtr(tmp_data, NULL);
68
69 free(tmp_data);
70
71}
72
73
74int qser_sms_client_init(sms_client_handle_type *ph_sms)//out
75{
76 //UNUSED(ph_sms);
77
78 if(sms_info_handle == NULL)
79 {
80 sms_info_handle = mbtk_info_handle_get();
81 if(sms_info_handle)
82 {
83 LOGI("creat sms_info_handle is success");
84 *ph_sms = sms_info_handle->client_fd;
85 g_sms_val = sms_info_handle->client_fd;
86 }
87 else
88 {
89 LOGE("creat sms_info_handle is fail");
90 return -1;
91 }
92 }
93
94 return 0;
95}
96
97int qser_sms_client_deinit(sms_client_handle_type h_sms)//in
98{
99 //UNUSED(h_sms);
100 if (h_sms != g_sms_val || g_sms_val == -1)
101 {
102 LOGE("handle NULL\n");
103 return -1;
104 }
105
106 mbtk_sms_state_change_cb_reg(sms_info_handle, NULL);
107
108 if(sms_info_handle)
109 {
110 mbtk_info_handle_free(&sms_info_handle);
111 LOGI("deinit sms_info_handle is succuess");
112 }
113 else
114 {
115 LOGE("deinit sms_info_handle is fail");
116 return -1;
117 }
118
119 return 0;
120}
121
122int qser_sms_send_sms(sms_client_handle_type h_sms, QSER_sms_info_t *pt_sms_info)//in in 发送短信的内容、目的号码
123{
124 //UNUSED(h_sms);
125 //UNUSED(pt_sms_info);
126 if (h_sms != g_sms_val || g_sms_val == -1)
127 {
128 LOGE("handle NULL");
129 return -1;
130 }
131
132 if (pt_sms_info == NULL)
133 {
134 LOGE("QSER_sms_info_t NULL");
135 return -1;
136 }
137
138 if(sms_info_handle == NULL)
139 {
140 LOGE("qser_sms_send_sms sms_info_handle NULL");
141 return -1;
142 }
143
144 uint8_t *phone_num = NULL, *data = NULL;
145
146 char cmgs[MSM_NUMBER_MAX] = {0};
147 char resp[RES_NUM_MIN] = {0};
148 char pdu_data[512] = {0};
149// char phone_lenth[10] = {0};
150// char mem[10] = {0};
151 char *p = pdu_data;
152 int mode = 0;
153 int err = 0;
154 int i = 0;
155
156 data = (uint8_t*)pt_sms_info->sms_data;
157
158 phone_num = (uint8_t*)pt_sms_info->src_addr;
159
160 if (pt_sms_info->format == 0)//7
161 mode = 1;
162 else if (pt_sms_info->format == 1)//8
163 return SMS_ERR;
164 else if (pt_sms_info->format == 2)//USC2
165 mode = 0;
166 else
167 return -1;
168
169 //长短信配置当前仅支持text
170 if (pt_sms_info->user_data_head_valid == TRUE)
171 {
172 if (mode != 1)
173 {
174 LOGE("qser_sms_send_sms user_data_head_valid is TRUE for text only");
175 return -1;
176 }
177 }
178
179
180 //设置存储器
181/*
182 if (pt_sms_info->storage == 0)
183 {
184 strcpy(mem, "SM");
185 }
186 else if (pt_sms_info->storage == 1)
187 {
188 strcpy(mem, "ME");
189 }
190 else
191 {
192 LOGE("qser_sms_deletefromstorage storage is no Support");
193 return -1;
194 }
195
196 memset(resp, 0, sizeof(resp));
197 err = mbtk_sms_cpms_set(sms_info_handle, mem, resp);
198 if(err) {
199 LOGE("Error : %d", err);
200 } else {
201 LOGI("cpms set success. resp:%s", resp);
202 }
203*/
204 if(data == NULL)
205 {
206 LOGE("qser_sms_send_sms data NULL");
207 return -1;
208 }
209
210 if(phone_num == NULL)
211 {
212 LOGE("qser_sms_send_sms phone_num NULL");
213 return -1;
214 }
215
216 if(strlen((char*)data) > 512 || strlen((char*)data) == 0 || strlen((char*)phone_num) == 0)
217 {
218 LOGE("strlen(telephony_num):%d", strlen((char*)phone_num));
219 LOGE("strlen(msg):%d", strlen((char*)data));
220 return -1;
221 }
222
223 if (mode == 0)// PDU
224 {
225#if 1
226 if (sms_center_address[0] == '\0')
227 {
228 memset(sms_center_address, 0, sizeof(sms_center_address));
229 memcpy(sms_center_address, "+8613800280500", strlen("+8613800280500"));
230 }
231
232 //printf("phone_num:%s\n", phone_num);
233 //printf("sms_center_address:%s\n", sms_center_address);
234 //printf("data:%s\n", data);
235
236 char* pdu = NULL;
237 char* smsc = SCAEncoding(sms_center_address);
238 struct PDUS *pdus = PDUEncoding(sms_center_address, (char*)phone_num, (char*)data, NULL);
239
240 for (i = 0; i < pdus->count; i++)
241 {
242 LOGI("第 %d 条:", i + 1);
243 LOGI("%s\n", pdus->PDU[i]);
244 pdu = pdus->PDU[i];
245 }
246
247 sprintf(p, "%s",smsc);
248 LOGI("pdu_data:%s", pdu_data);
249 int sc = strlen(pdu_data);
250 sprintf(p+strlen(p), "%s", pdu);
251 LOGI("pdu_data:%s",pdu_data);
252
253 //sprintf(cmgs,"%d,%s",strlen(pdu_data), pdu_data);
254 int t = strlen(pdu_data);
255 sprintf(cmgs,"%d,%s",(t-sc)/2, pdu_data);
256 LOGI("cmgs:%s", cmgs);
257#else
258 char *tmp_t = "0891683108200805F011000D91688189914026F3000800044F60597D";
259 sprintf(cmgs,"%d,%s",19,tmp_t);
260 printf("cmgs:%s\n", cmgs);
261#endif
262
263 memset(resp, 0, sizeof(resp));
264
265 err = mbtk_sms_cmgf_set(sms_info_handle, mode);
266 if(err)
267 {
268 LOGE("cmgf set error : %d", err);
269 }
270 else
271 {
272 LOGI("cmgf set success");
273 }
274
275 err = mbtk_sms_cmgs_set(sms_info_handle, cmgs, resp);
276 if(err)
277 {
278 LOGE("Error : %d", err);
279 return -1;
280 }
281 else
282 {
283 LOGI("cmgs set success . resp:%s", resp);
284 }
285 }
286 else if (mode == 1) // text
287 {
288 err = mbtk_sms_cmgf_set(sms_info_handle, mode);
289 if(err)
290 {
291 LOGE("cmgf set error : %d", err);
292 }
293 else
294 {
295 LOGD("cmgf set success");
296 }
297
298 sprintf(cmgs,"%s,%s", (char*)phone_num, (char*)data);
299 LOGD("cmgs:%s", cmgs);
300
301 memset(resp, 0, sizeof(resp));
302
303 err = mbtk_sms_cmgs_set(sms_info_handle, cmgs, resp);
304 if(err)
305 {
306 LOGE("Error : %d", err);
307 return -1;
308 }
309 else
310 {
311 LOGD("cmgs set success . resp:%s", resp);
312 }
313 }
314 else
315 {
316 LOGE("Error : mode");
317 return -1;
318 }
319
320 return 0;
321}
322
323//注册接收新短信
324int qser_sms_addrxmsghandler(QSER_SMS_RxMsgHandlerFunc_t handlerPtr, void* contextPtr)//in sms电话状态回调函数 in 主要是获取 上报 的内容
325{
326 //UNUSED(handlerPtr);
327 //UNUSED(contextPtr);
328
329 if(sms_info_handle == NULL)
330 {
331 LOGE("qser_sms_addrxmsghandler sms_info_handle NULL");
332 return -1;
333 }
334
335 int err = mbtk_sms_cnmi_set(sms_info_handle);
336 if(err)
337 {
338 LOGE("set cnmi fail");
339 return -1;
340 }
341
342 lynq_sms_func_cb_handle.handlerPtr = handlerPtr;
343 lynq_sms_func_cb_handle.contextPtr = contextPtr;
344
345 mbtk_sms_state_change_cb_reg(sms_info_handle, lynq_sms_state_change_cb);
346
347 return 0;
348}
349
350//删除短信
351int qser_sms_deletefromstorage(sms_client_handle_type h_sms, QSER_sms_storage_info_t *pt_sms_storage)//in in 删除短信的信息
352{
353 //UNUSED(h_sms);
354 //UNUSED(pt_sms_storage);
355 char cmgd[128] = {0};
356 int err = 0;
357
358// int t_storage = 0;
359// char mem[10] = {0};
360// char resp[RES_NUM_MIN] = {0};
361
362 if (h_sms != g_sms_val || g_sms_val == -1)
363 {
364 LOGE("handle NULL");
365 return -1;
366 }
367
368 if(pt_sms_storage == NULL)
369 {
370 LOGE("qser_sms_deletefromstorage pt_sms_storage NULL");
371 return -1;
372 }
373
374 if(sms_info_handle == NULL)
375 {
376 LOGE("qser_sms_deletefromstorage sms_info_handle NULL");
377 return -1;
378 }
379/*
380 t_storage = pt_sms_storage->storage; //设置存储器
381
382 if (t_storage == 0)
383 {
384 strncpy(mem, "SM", 2);
385 }
386 else if (t_storage == 1)
387 {
388 strncpy(mem, "ME", 2);
389 }
390 else
391 {
392 LOGE("qser_sms_deletefromstorage storage is no Support");
393 return -1;
394 }
395
396 memset(resp, 0, sizeof(resp));
397 err = mbtk_sms_cpms_set(sms_info_handle, mem, resp);
398 if(err) {
399 LOGE("Error : %d", err);
400 } else {
401 LOGI("cpms set success. resp:%s", resp);
402 }
403*/
404 uint32_t id_x = 0; //若后面其他产品是int类型则用宏控制
405 id_x = pt_sms_storage->storage_idx;//获取idx的值
406
407 if(id_x == -1) //delete all
408 {
409 memcpy(cmgd, "0,4", strlen("0,4"));
410 }
411 else
412 {
413 sprintf(cmgd,"%d",id_x);
414 }
415
416 LOGI("cmgd:%s", cmgd);
417
418 err = mbtk_sms_cmgd_set(sms_info_handle, cmgd);
419 if(err)
420 {
421 LOGE("qser_sms_deletefromstorage Error : %d", err);
422 return -1;
423 }
424 else
425 {
426 LOGI("qser_sms_deletefromstorage set success");
427 }
428
429 return 0;
430}
431
432//获取短信中心号码
433int qser_sms_getsmscenteraddress( sms_client_handle_type h_sms,QSER_sms_service_center_cfg_t *set_sca_cfg)//in out
434{
435 //UNUSED(h_sms);
436 //UNUSED(set_sca_cfg);
437 char sms_center_addree[254] = {0};
438 int len_t;
439 char *p1, *p2 ,*substr;
440
441 if (h_sms != g_sms_val || g_sms_val == -1)
442 {
443 LOGE("handle NULL");
444 return -1;
445 }
446
447 if (set_sca_cfg == NULL)
448 {
449 LOGE("QSER_sms_service_center_cfg_t NULL");
450 return -1;
451 }
452
453 if(sms_info_handle == NULL)
454 {
455 LOGE("qser_sms_getsmscenteraddress sms_info_handle NULL");
456 return -1;
457 }
458
459 int err = mbtk_sms_csca_get(sms_info_handle, sms_center_addree);
460 if(sms_center_addree[0] == '\0')
461 {
462 LOGE("qser_sms_getsmscenteraddress Error : %d", err);
463 return -1;
464 }
465 else
466 {
467 p1 = strchr(sms_center_addree, '\"');
468 p2 = strrchr(sms_center_addree, '\"');
469 if (p1 && p2 && p2 > p1)
470 {
471 len_t = p2 - p1 - 1;
472 char substr_t[len_t + 1];
473 strncpy(substr_t, p1 + 1, len_t);
474 substr_t[len_t] = '\0';
475
476 substr = substr_t;
477
478 memcpy(set_sca_cfg->service_center_addr, substr, strlen(substr));
479 memcpy(sms_center_address, substr, strlen(substr));
480
481 LOGI("qser_sms_getsmscenteraddress success");
482 }
483 else
484 {
485 LOGE("String inside double quotes not found");
486 return -1;
487 }
488 }
489
490 return 0;
491}
492
493//设置短信中心号码
494int qser_sms_setsmscenteraddress( sms_client_handle_type h_sms, QSER_sms_service_center_cfg_t *get_sca_cfg)//in in
495{
496 //UNUSED(h_sms);
497 //UNUSED(get_sca_cfg);
498 char *destNum = NULL;
499
500 if (h_sms != g_sms_val || g_sms_val == -1)
501 {
502 LOGE("handle NULL");
503 return -1;
504 }
505
506 if(sms_info_handle == NULL)
507 {
508 LOGE("qser_sms_setsmscenteraddress sms_info_handle NULL");
509 return -1;
510 }
511
512 if(get_sca_cfg == NULL)
513 {
514 LOGE("qser_sms_setsmscenteraddress get_sca_cfg NULL");
515 return -1;
516 }
517
518 destNum = get_sca_cfg->service_center_addr;
519
520 //printf("1destNum:%s\n", destNum);
521 memset(sms_center_address, 0, sizeof(sms_center_address));
522 memcpy(sms_center_address, destNum, strlen(destNum));
523
524 if (destNum == NULL)
525 {
526 LOGE("qser_sms_setsmscenteraddress destNum NULL");
527 return -1;
528 }
529
530 int err = mbtk_sms_csca_set(sms_info_handle, destNum);
531 if(err)
532 {
533 LOGE("Error : %d", err);
534 return -1;
535 }
536 else
537 {
538 // memset(sms_center_address, 0, sizeof(sms_center_address));
539 // memcpy(sms_center_address, destNum, strlen(destNum));
540 //printf("destNum:%s\n", destNum);
541 LOGI("qser_sms_setsmscenteraddress success");
542 }
543
544 return 0;
545}
546
547
548//显示删除列表
549int qser_sms_deletefromstoragelist( sms_client_handle_type h_sms, char* del_list)//in out
550{
551 //UNUSED(h_sms);
552 //UNUSED(get_sca_cfg);
553
554 if (h_sms != g_sms_val || g_sms_val == -1)
555 {
556 LOGE("handle NULL");
557 return -1;
558 }
559
560 if(sms_info_handle == NULL)
561 {
562 LOGE("qser_sms_deletefromstoragelist sms_info_handle NULL");
563 return -1;
564 }
565
566 int err = mbtk_sms_cmgd_get(sms_info_handle, del_list);
567 if(err > 0 && err != 300)//MBTK_INFO_ERR_SUCCESS
568 {
569 LOGE("Error : %d", err);
570 return -1;
571 }
572
573 return 0;
574}
575