#include <stdio.h> | |
#include <stdlib.h> | |
#include <stdbool.h> | |
#include <dlfcn.h> | |
#include <stdint.h> | |
#include <string.h> | |
#define GSW_SMS_SEND_NUM_MAX 5 /**< dest num max count */ | |
#define GSW_SMS_ADDRESS_LEN 32 /**< one dest number max length*/ | |
#define GSW_SMS_CONCAT_SMS_COUNT_MAX 160 /**< one page max bytes*/ | |
#define GSW_SMS_MSG_CONTENT_LEN_MAX 3 /**< sms page max count*/ | |
#define GSW_SMS_CONTENT_LEN_MAX 3 /**< newmsg recv one page*/ | |
#define GSW_SMS_SEND_CONT_MAX (GSW_SMS_MSG_CONTENT_LEN_MAX*GSW_SMS_CONCAT_SMS_COUNT_MAX*2) /**< sms send max len*/ | |
#define GSW_SMS_RECV_CONT_MAX 1440 /**< sms receive max len*/ | |
#define GSW_HAL_SMS_ADDRESS_LEN GSW_SMS_ADDRESS_LEN | |
#define GSW_HAL_SMS_RECV_CONT_MAX GSW_SMS_RECV_CONT_MAX | |
typedef unsigned short uint16_t; | |
typedef unsigned int uint32_t; | |
typedef unsigned short uint16; | |
typedef uint32_t sms_client_handle_type; | |
typedef enum | |
{ | |
GSW_SMS_FULL_FLG, /**< sms full flag*/ | |
GSW_SMS_RECEIVED_FLG, /**<recv new sms flag*/ | |
}gsw_sms_state_e; | |
typedef enum | |
{ | |
SMS_FORMAT_GSM_7BIT = 0, /**< 7bit econde*/ | |
SMS_FORMAT_BINARY_DATA = 1, /**< 8bit binary encode*/ | |
SMS_FORMAT_UCS2 = 2, /**< ucs2 encode*/ | |
}gsw_sms_format_e; | |
typedef struct gsw_hal_sms_date | |
{ | |
unsigned char year[5]; /**< year of date*/ | |
unsigned char month[3]; /**< month of date*/ | |
unsigned char day[3]; /**< day of date*/ | |
unsigned char hour[3]; /**< hour of time*/ | |
unsigned char minutes[3]; /**< minute of time*/ | |
unsigned char seconds[3]; /**< second of time*/ | |
unsigned char timezone[4]; /**< timezone*/ | |
} gsw_sms_date_t; | |
typedef struct gsw_hal_sms_msg_type | |
{ | |
char src_num[GSW_SMS_ADDRESS_LEN+1]; /**< sms phone num send msg*/ | |
char dest_num[GSW_SMS_ADDRESS_LEN + 1]; /**< sms phone num recv msg*/ | |
gsw_sms_format_e content_encode; /**< sms content is 7bit or 8bit or Ucs2 encode*/ | |
unsigned int content_len; /**< sms content size*/ | |
char content[GSW_SMS_RECV_CONT_MAX + 1]; /**< sms content*/ | |
gsw_sms_date_t date; /**< message time*/ | |
} gsw_sms_msg_type_t; | |
typedef void (* GSW_HAL_SMS_CALLBACK_FUN)(gsw_sms_state_e state, gsw_sms_msg_type_t *report_info); | |
int (*gsw_sms_reg_callback)(GSW_HAL_SMS_CALLBACK_FUN handle_ptr); | |
int (*gsw_sms_sdk_init)(int32_t token); | |
int (*gsw_sms_sdk_deinit)(void); | |
int (*gsw_send_sms)(int8_t *phone_num, int32_t char_set, int8_t *msg, int32_t msg_len); | |
int (*gsw_get_smsc_address)(int32_t len, int8_t *smsc); | |
int (*gsw_set_smsc_address)(const int8_t *smsc); | |
#define lib_gsw_sms_path "/lib/libgsw_lib.so" | |
static void *dlHandle_sms; | |
void gsw_test_callback(gsw_sms_state_e state, gsw_sms_msg_type_t *report_info) | |
{ | |
printf("gsw_test_callback: state = %d\n", state); | |
printf("gsw_test_callback: report_info->src_num = %s\n", report_info->src_num); | |
printf("gsw_test_callback: report_info->dest_num = %s\n", report_info->dest_num); | |
printf("gsw_test_callback: report_info->content_encode = %d\n", report_info->content_encode); | |
printf("gsw_test_callback: report_info->content_len = %d\n", report_info->content_len); | |
printf("gsw_test_callback: report_info->content = %s\n", report_info->content); | |
printf("gsw_test_callback: report_info->date->year = %s\n", report_info->date.year); | |
printf("gsw_test_callback: report_info->date->month = %s\n", report_info->date.month); | |
printf("gsw_test_callback: report_info->date->day = %s\n", report_info->date.day); | |
printf("gsw_test_callback: report_info->date->hour = %s\n", report_info->date.hour); | |
printf("gsw_test_callback: report_info->date->minutes = %s\n", report_info->date.minutes); | |
printf("gsw_test_callback: report_info->date->seconds = %s\n", report_info->date.seconds); | |
printf("gsw_test_callback: report_info->date->timezone = %s\n", report_info->date.timezone); | |
} | |
static int gsw_sms_api_import() | |
{ | |
dlHandle_sms = dlopen(lib_gsw_sms_path, RTLD_NOW); | |
if (dlHandle_sms == NULL) { | |
printf("Failed to open %s\n", lib_gsw_sms_path); | |
return -1; | |
} | |
gsw_sms_sdk_init = (int(*)(int32_t token))dlsym(dlHandle_sms,"gsw_sms_sdk_init"); | |
if(gsw_sms_sdk_init == NULL) | |
{ | |
printf("gsw_sms_sdk_init fail\n"); | |
return -1; | |
} | |
gsw_sms_reg_callback = (int(*)(GSW_HAL_SMS_CALLBACK_FUN handle_ptr))dlsym(dlHandle_sms,"gsw_sms_reg_callback"); | |
if(gsw_sms_reg_callback == NULL) | |
{ | |
printf("gsw_sms_reg_callback fail\n"); | |
return -1; | |
} | |
gsw_send_sms = (int(*)(int8_t *phone_num, int32_t char_set, int8_t *msg, int32_t msg_len))dlsym(dlHandle_sms,"gsw_send_sms"); | |
if(gsw_send_sms == NULL) | |
{ | |
printf("gsw_send_sms fail\n"); | |
return -1; | |
} | |
gsw_get_smsc_address = (int(*)(int32_t len, int8_t *smsc))dlsym(dlHandle_sms,"gsw_get_smsc_address"); | |
if(gsw_get_smsc_address == NULL) | |
{ | |
printf("gsw_get_smsc_address fail\n"); | |
return -1; | |
} | |
gsw_set_smsc_address = (int(*)(const int8_t *smsc))dlsym(dlHandle_sms,"gsw_set_smsc_address"); | |
if(gsw_set_smsc_address == NULL) | |
{ | |
printf("gsw_set_smsc_address fail\n"); | |
return -1; | |
} | |
gsw_sms_sdk_deinit = (int(*)(void))dlsym(dlHandle_sms,"gsw_sms_sdk_deinit"); | |
if(gsw_sms_sdk_deinit == NULL) | |
{ | |
printf("gsw_sms_sdk_deinit fail\n"); | |
return -1; | |
} | |
return 0; | |
} | |
int main() | |
{ | |
int ret = -1; | |
int opt = -1; | |
char operator[10]; | |
char phone_number[GSW_HAL_SMS_ADDRESS_LEN] = {0}; | |
char serv_numer[GSW_HAL_SMS_ADDRESS_LEN] = {0}; | |
ret = gsw_sms_api_import(); | |
if(ret != 0) | |
{ | |
printf("gsw_sms_api_import fail\n"); | |
return -1; | |
} | |
while(1) | |
{ | |
printf("=========sms main=========\n" | |
"\t-1 exit\n" | |
"\t1 sms init\n" | |
"\t2 send text sms\n" | |
"\t3 wait receive new sms\n" | |
"\t4 send PDU sms\n" | |
"\t7 query service number\n" | |
"\t8 set service number\n" | |
"\t9 deinit sms\n" | |
"operator: >> \n"); | |
opt = -1; | |
ret = -1; | |
printf("%s\n",fgets(operator, sizeof(operator), stdin)); | |
fflush(stdin); | |
opt = atoi(operator); | |
switch (opt) | |
{ | |
case -1: | |
{ | |
printf("main exit\n"); | |
return 0; | |
} | |
case 1: | |
{ | |
printf("gsw_sms_sdk_init start"); | |
ret = gsw_sms_sdk_init(1234); | |
if(ret != 0) | |
{ | |
printf("gsw_sms_sdk_init fail,ret = %d\n",ret); | |
dlclose(dlHandle_sms); | |
continue; | |
} | |
break; | |
} | |
case 2: | |
{ | |
char *tmp = "all man hello world"; | |
printf("input phone number:\n"); | |
memset(phone_number, 0x0, GSW_HAL_SMS_ADDRESS_LEN); | |
//fgets(phone_number, MAX_LEN, stdin); | |
printf("%d\n",scanf("%15s", phone_number)); | |
fflush(stdin); | |
int len = strlen(tmp); | |
ret = gsw_send_sms((int8_t*)phone_number, 0, (int8_t*)tmp, len); | |
if(ret != 0) | |
{ | |
printf("gsw_send_sms fail,ret = %d\n",ret); | |
continue; | |
} | |
break; | |
} | |
case 3: | |
{ | |
printf("gsw_sms_reg_callback start\n"); | |
ret = gsw_sms_reg_callback(gsw_test_callback); | |
if(ret != 0) | |
{ | |
printf("gsw_sms_reg_callback fail,ret = %d\n",ret); | |
continue; | |
} | |
printf("gsw_sms_reg_callback end"); | |
break; | |
} | |
case 4: | |
{ | |
char *tmp = "你好"; | |
printf("input phone number:\n"); | |
memset(phone_number, 0x0, GSW_HAL_SMS_ADDRESS_LEN); | |
//fgets(phone_number, MAX_LEN, stdin); | |
printf("%d\n",scanf("%15s", phone_number)); | |
fflush(stdin); | |
int len = strlen(tmp); | |
ret = gsw_send_sms((int8_t*)phone_number, 2, (int8_t *)tmp, len); | |
if(ret != 0) | |
{ | |
printf("gsw_send_sms fail,ret = %d\n",ret); | |
continue; | |
} | |
break; | |
} | |
case 7: | |
{ | |
printf("gsw_get_smsc_address start\n"); | |
ret = gsw_get_smsc_address(GSW_HAL_SMS_ADDRESS_LEN, (int8_t *)serv_numer); | |
if(ret != 0) | |
{ | |
printf("gsw_get_smsc_address fail,ret = %d\n",ret); | |
continue; | |
} | |
printf("smsc: %s\n", serv_numer); | |
break; | |
} | |
case 8: | |
{ | |
printf("input phone number:\n"); | |
memset(phone_number, 0x0, GSW_HAL_SMS_ADDRESS_LEN); | |
//fgets(phone_number, MAX_LEN, stdin); | |
printf("%d\n",scanf("%15s", phone_number)); | |
fflush(stdin); | |
printf("start memcpy\n"); | |
memcpy(serv_numer, phone_number, GSW_HAL_SMS_ADDRESS_LEN); | |
ret = gsw_set_smsc_address((const int8_t *)serv_numer); | |
if(ret != 0) | |
{ | |
printf("gsw_set_smsc_address fail,ret = %d\n",ret); | |
continue; | |
} | |
printf("smsc: %s\n", serv_numer); | |
break; | |
} | |
case 9: | |
{ | |
printf("gsw_sms_sdk_deinit start\n"); | |
ret = gsw_sms_sdk_deinit(); | |
if(ret != 0) | |
{ | |
printf("gsw_sms_sdk_deinit fail,ret = %d\n",ret); | |
dlclose(dlHandle_sms); | |
continue; | |
} | |
break; | |
} | |
default: | |
{ | |
continue; | |
} | |
} | |
} | |
} | |