| #include <stdbool.h> | |
| #include <unistd.h> | |
| #include <dlfcn.h> | |
| #include <time.h> | |
| #include "gsw_nw_interface.h" | |
| #include "gsw_log_interface.h" | |
| #define MBTK_BUFF_TEMP_SIZE_32 32 | |
| #define MBTK_ERR_OK 0 | |
| #define MBTK_ERR_FAIL -1 | |
| #define GSW_SIM_ICCID_LENGTH 15+1 | |
| #define GSW_SIM_IMSI_LENGTH 15+1 | |
| #define GSW_SIM_MSISDN_LENGTH 15+1 | |
| //mbtk include | |
| typedef unsigned int uint32; | |
| typedef unsigned char uint8; | |
| typedef unsigned short uint16; | |
| typedef void (*mbtk_info_callback_func)(const void* data, int data_len); | |
| typedef struct | |
| { | |
| int client_fd; | |
| pthread_t read_thread_id; | |
| int exit_fd[2]; | |
| bool is_waitting; | |
| pthread_cond_t cond; | |
| pthread_mutex_t mutex; | |
| pthread_mutex_t send_mutex; | |
| // Temp response data. | |
| uint16 info_err; | |
| uint16 data_len; | |
| void *data; | |
| //mbtk wyq for server_ready_status add start | |
| char server_ready_status; | |
| //mbtk wyq for server_ready_status add end | |
| mbtk_info_callback_func net_state_cb; | |
| mbtk_info_callback_func call_state_cb; | |
| mbtk_info_callback_func sms_state_cb; | |
| mbtk_info_callback_func radio_state_cb; | |
| mbtk_info_callback_func sim_state_cb; | |
| mbtk_info_callback_func pdp_state_cb; | |
| //add signal by xr | |
| mbtk_info_callback_func signal_state_cb; | |
| } mbtk_info_handle_t; | |
| typedef enum { | |
| MBTK_SIM_ABSENT = 0, | |
| MBTK_SIM_NOT_READY = 1, | |
| MBTK_SIM_READY = 2, | |
| MBTK_SIM_PIN = 3, | |
| MBTK_SIM_PUK = 4, | |
| MBTK_SIM_NETWORK_PERSONALIZATION = 5 | |
| } mbtk_sim_state_enum; | |
| typedef enum | |
| { | |
| MBTK_DEV_MODEM_MIN_FUN, //Modem 最小功能 | |
| MBTK_DEV_MODEM_FULL_FUN, //Modem 全功能 | |
| MBTK_DEV_MODEM_DISABLE_RECEIVE_RF_CIRCUITS = 3, //Modem 禁用射频接收电路 | |
| MBTK_DEV_MODEM_DISABLE_TRANSMIT_AND_RECEIVE_RF_CIRCUITS, //Modem禁用射频发射和接收电路 | |
| MBTK_DEV_MODEM_DISABLE_SIM, //Modem 禁用(U)SIM 卡 | |
| MBTK_DEV_MODEM_TURN_OFF_FULL_SECONDARY_RECEIVE, //Modem 完全禁用辅助接收 | |
| }MBTK_DEV_MODEM_FUNCTION; | |
| typedef struct | |
| { | |
| MBTK_DEV_MODEM_FUNCTION fun; | |
| int rst; | |
| } mbtk_modem_info_t; | |
| //api | |
| static mbtk_info_handle_t* (*mbtk_info_handle_get)(void); | |
| #define lib_mbtk_path "/lib/libmbtk_lib.so" | |
| static int sim_init_flag = 0; | |
| mbtk_info_handle_t* sim_info_handle = NULL; | |
| static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle); | |
| int (*mbtk_sim_state_get)(mbtk_info_handle_t* handle, mbtk_sim_state_enum *sim_state); | |
| int (*mbtk_imsi_get)(mbtk_info_handle_t* handle, void *imsi); | |
| int (*mbtk_iccid_get)(mbtk_info_handle_t* handle, void *iccid); | |
| int (*mbtk_phone_number_get)(mbtk_info_handle_t* handle, void *phone_number); | |
| int (*mbtk_set_modem_fun)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info); | |
| int (*mbtk_sim_power_set)(int power); | |
| #define GSW_SIM "[HAL][GSW_SIM]" | |
| static void *dlHandle_mbtk; | |
| static int gsw_sim_api_import() | |
| { | |
| dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW); | |
| if (dlHandle_mbtk == NULL) | |
| { | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get"); | |
| if (mbtk_info_handle_get == NULL) | |
| { | |
| LOGE(GSW_SIM,"mbtk_info_handle_get dlsym fail\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free"); | |
| if (mbtk_info_handle_free == NULL) | |
| { | |
| LOGE(GSW_SIM,"mbtk_info_handle_free dlsym fail\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| mbtk_imsi_get = (int (*)(mbtk_info_handle_t* handle, void *imsi))dlsym(dlHandle_mbtk, "mbtk_imsi_get"); | |
| if (mbtk_imsi_get == NULL) | |
| { | |
| LOGE(GSW_SIM,"mbtk_imsi_get dlsym fail\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| mbtk_iccid_get = (int (*)(mbtk_info_handle_t* handle, void *iccid))dlsym(dlHandle_mbtk, "mbtk_iccid_get"); | |
| if (mbtk_iccid_get == NULL) | |
| { | |
| LOGE(GSW_SIM,"mbtk_iccid_get dlsym fail\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| mbtk_phone_number_get = (int (*)(mbtk_info_handle_t* handle, void *phone_number))dlsym(dlHandle_mbtk, "mbtk_phone_number_get"); | |
| if (mbtk_phone_number_get == NULL) | |
| { | |
| LOGE(GSW_SIM,"mbtk_phone_number_get dlsym fail\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| mbtk_sim_state_get = (int (*)(mbtk_info_handle_t* handle, mbtk_sim_state_enum *sim_state))dlsym(dlHandle_mbtk, "mbtk_sim_state_get"); | |
| if (mbtk_sim_state_get == NULL) | |
| { | |
| LOGE(GSW_SIM,"mbtk_sim_state_get dlsym fail\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| mbtk_set_modem_fun = (int (*)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info))dlsym(dlHandle_mbtk, "mbtk_set_modem_fun"); | |
| if (mbtk_set_modem_fun == NULL) | |
| { | |
| LOGE(GSW_SIM,"mbtk_set_modem_fun dlsym fail\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| mbtk_sim_power_set = (int (*)(int power))dlsym(dlHandle_mbtk, "mbtk_sim_power_set"); | |
| if (mbtk_sim_power_set == NULL) | |
| { | |
| LOGE(GSW_SIM,"mbtk_sim_power_set dlsym fail\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| LOGD(GSW_SIM,"gsw_sim_api_import end\n"); | |
| return GSW_HAL_SUCCESS; | |
| } | |
| /** | |
| * @brief sim sdk init | |
| * @param [in] token usr id define by who use | |
| * @retval 0: success | |
| * @retval other: fail | |
| */ | |
| int gsw_sim_sdk_init(int32_t token) | |
| { | |
| int ret = GSW_HAL_NORMAL_FAIL; | |
| if(sim_init_flag == 1 && sim_info_handle != NULL) | |
| { | |
| return GSW_HAL_SUCCESS; | |
| } | |
| ret = gsw_sim_api_import(); | |
| if(ret != GSW_HAL_SUCCESS) | |
| { | |
| LOGE(GSW_SIM,"gsw_sim_import fail\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| sim_info_handle = mbtk_info_handle_get(); | |
| if(sim_info_handle == NULL) | |
| { | |
| LOGE(GSW_SIM,"mbtk_info_handle_get fail\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| sim_init_flag = 1; | |
| return GSW_HAL_SUCCESS; | |
| } | |
| /** | |
| * @brief sim sdk deinit | |
| * @param | |
| * @retval 0: success | |
| * @retval other: fail | |
| */ | |
| int gsw_sim_sdk_deinit(void) | |
| { | |
| int ret = -1; | |
| if(sim_init_flag == 0 || sim_info_handle == NULL) | |
| { | |
| printf("sim sdk has been deinit\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| ret = mbtk_info_handle_free(&sim_info_handle); | |
| if(ret != GSW_HAL_SUCCESS) | |
| { | |
| LOGE(GSW_SIM,"mbtk_info_handle_free fail\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| sim_init_flag = 0; | |
| sim_info_handle = NULL; | |
| dlclose(dlHandle_mbtk); | |
| return GSW_HAL_SUCCESS; | |
| } | |
| /** | |
| * @brief get sim state | |
| * @param [out] sim_state sim status as sim_status_e_type | |
| * @retval 0: success | |
| * @retval other: fail | |
| */ | |
| int gsw_get_sim_status(int *sim_state) | |
| { | |
| printf("gsw_get_sim_status enter\n"); | |
| int ret = -1; | |
| if(sim_init_flag == 0 || sim_info_handle == NULL) | |
| { | |
| printf("sim sdk has been deinit\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| mbtk_sim_state_enum sim = MBTK_SIM_ABSENT; | |
| LOGD(GSW_SIM,"mbtk_get_sim_status start\n"); | |
| ret = mbtk_sim_state_get(sim_info_handle, &sim); | |
| if(ret) | |
| { | |
| LOGE(GSW_SIM,"[gsw_get_sim_status] mbtk_sim_state_get fail [err = %d].", ret); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| else | |
| { | |
| LOGD(GSW_SIM,"[gsw_get_sim_status] sim = %d\n", sim); | |
| switch (sim) | |
| { | |
| case MBTK_SIM_ABSENT: | |
| { | |
| *sim_state = SIM_STATUS_ABSENT; | |
| break; | |
| } | |
| case MBTK_SIM_NOT_READY: | |
| { | |
| *sim_state = SIM_STATUS_ERROR;// not SIM_STATUS_PRESENT, changed for gsw requirement, hq at 250606 | |
| break; | |
| } | |
| case MBTK_SIM_READY: | |
| { | |
| *sim_state = SIM_STATUS_PRESENT;// not SIM_STATUS_READY, changed for gsw requirement, hq at 250606 | |
| break; | |
| } | |
| case MBTK_SIM_PIN: | |
| { | |
| *sim_state = SIM_STATUS_PIN; | |
| break; | |
| } | |
| case MBTK_SIM_PUK: | |
| { | |
| break; | |
| } | |
| case MBTK_SIM_NETWORK_PERSONALIZATION: | |
| { | |
| break; | |
| } | |
| } | |
| } | |
| return GSW_HAL_SUCCESS; | |
| } | |
| /** | |
| * @brief get iccid function | |
| * @param [in] len iccid length,max is 20 | |
| * @param [out] iccid return iccid from this func | |
| * @retval 0: success | |
| * @retval other: fail | |
| */ | |
| int gsw_get_sim_iccid(int len, char *iccid) | |
| { | |
| int ret = -1; | |
| if(sim_init_flag == 0 || sim_info_handle == NULL) | |
| { | |
| printf("sim sdk has been deinit\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| if(iccid == NULL) | |
| { | |
| LOGE(GSW_SIM,"iccid is NULL."); | |
| return GSW_HAL_ARG_INVALID; | |
| } | |
| if(len < GSW_SIM_ICCID_LENGTH) | |
| { | |
| LOGE(GSW_SIM,"iccid len is too short,len = %d\n", len); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| ret = mbtk_iccid_get(sim_info_handle, (void *)iccid); | |
| if(ret != MBTK_ERR_OK) | |
| { | |
| LOGE(GSW_SIM,"[gsw_sim] mbtk_iccid_get fail [err = %d].", ret); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| return GSW_HAL_SUCCESS; | |
| } | |
| /** | |
| * @brief get imsi function | |
| * @param [in] len imsi length,max is 20 | |
| * @param [out] iccid return imsi from this func | |
| * @retval 0: success | |
| * @retval other: fail | |
| */ | |
| int gsw_get_sim_imsi(int len, char *imsi) | |
| { | |
| int ret = -1; | |
| if(sim_init_flag == 0 || sim_info_handle == NULL) | |
| { | |
| printf("sim sdk has been deinit\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| if(imsi == NULL) | |
| { | |
| LOGE(GSW_SIM,"imsi is NULL."); | |
| return GSW_HAL_ARG_INVALID; | |
| } | |
| if(len < GSW_SIM_IMSI_LENGTH) | |
| { | |
| LOGE(GSW_SIM,"imsi len is too short,len = %d\n", len); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| ret = mbtk_imsi_get(sim_info_handle, (void *)imsi); | |
| if(ret != MBTK_ERR_OK) | |
| { | |
| LOGE(GSW_SIM,"[gsw_sim] mbtk_imsi_get fail [err = %d].", ret); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| return GSW_HAL_SUCCESS; | |
| } | |
| /** | |
| * @brief get sim msisdn function | |
| * @param [in] len msisdn length,max is 20 | |
| * @param [out] msisdn msisdn length,max is 20 | |
| * @retval 0: success | |
| * @retval other: fail | |
| */ | |
| int gsw_get_sim_msisdn(int len, char *msisdn) | |
| { | |
| int ret = -1; | |
| if(sim_init_flag == 0 || sim_info_handle == NULL) | |
| { | |
| printf("sim sdk has been deinit\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| if(msisdn == NULL) | |
| { | |
| printf("msisdn is NULL."); | |
| return GSW_HAL_ARG_INVALID; | |
| } | |
| if(len < GSW_SIM_MSISDN_LENGTH) | |
| { | |
| printf("msisdn len is too short,len = %d\n", len); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| ret = mbtk_phone_number_get(sim_info_handle, (void *)msisdn); | |
| if(ret != MBTK_ERR_OK) | |
| { | |
| LOGE(GSW_SIM,"[gsw_sim] mbtk_phone_number_get fail [err = %d].", ret); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| return GSW_HAL_SUCCESS; | |
| } | |
| /** | |
| * @brief set sim power down | |
| * @param | |
| * @retval 0: success | |
| * @retval other: fail | |
| */ | |
| int gsw_set_sim_power_down(void) | |
| { | |
| int ret = -1; | |
| if(sim_init_flag == 0 || sim_info_handle == NULL) | |
| { | |
| printf("sim sdk has been deinit\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| mbtk_modem_info_t info; | |
| info.fun = MBTK_DEV_MODEM_DISABLE_SIM; | |
| info.rst = 0; | |
| ret = mbtk_set_modem_fun(sim_info_handle, &info); | |
| if(ret) | |
| { | |
| LOGE(GSW_SIM,"mbtk_set_modem_fun() fail [err = %d].", ret); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| return GSW_HAL_SUCCESS; | |
| } | |
| /** | |
| * @brief set sim power up | |
| * @param | |
| * @retval 0: success | |
| * @retval other: fail | |
| */ | |
| int gsw_set_sim_power_up(void) | |
| { | |
| int ret = -1; | |
| if(sim_init_flag == 0 || sim_info_handle == NULL) | |
| { | |
| printf("sim sdk has been deinit\n"); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| mbtk_modem_info_t info; | |
| info.fun = MBTK_DEV_MODEM_FULL_FUN; | |
| info.rst = 0; | |
| ret = mbtk_set_modem_fun(sim_info_handle, &info); | |
| if(ret) | |
| { | |
| LOGE(GSW_SIM,"mbtk_set_modem_fun() fail [err = %d].", ret); | |
| return GSW_HAL_NORMAL_FAIL; | |
| } | |
| return GSW_HAL_SUCCESS; | |
| } |