#include "configm.h" #include "rpc.h" #include "parsefile.h" #include "LTE_config.h" int g_action = 0; ret_code compare(char *result) { if(NULL == result) { return RET_NULL_INPUT_ERR; } if(strcmp(result,"lte no match") == 0) { return RET_LTE_NO_MATCH_ERR; } else if(strcmp(result,"no found lte module") == 0) { return RET_NO_LTE_MODULE_ERR; } else if(strcmp(result,"4g init done") == 0) { return RET_OK; } else { return RET_UNKNOWN; } } ret_code LTE_config_init(void) { ret_code ret = RET_OK; char result[RESULT_LENGTH] = {0}; FILE *f = NULL; f = popen(INIT_CMD,"r"); if (NULL == f) { rpc_log_info("execuate cmd fail\n"); return RET_EXEC_SHELL_ERR; } fseek(f,0,SEEK_SET); while(fgets(result,sizeof(result),f) != NULL) { ret = compare(result); memset(result,sizeof(result),0); fseek(f,0,SEEK_CUR); } pclose(f); return ret; } /* { "operate":set, "action":start } { "operate":getall } */ ret_code LTE_json_parse(pointer input, uint *conf_type, int action) { ret_code ret = RET_OK; if(NULL == input) { return RET_NULL_INPUT_ERR; } cJSON *json_obj = cJSON_Parse(input); if(NULL == json_obj) { rpc_log_info("json obj is NULL \n"); return RET_EMPTY_STRING; } rpc_json_print(json_obj); cJSON *operate = cJSON_GetObjectItem(json_obj,"operate"); if((NULL == operate) || (NULL == (operate->valuestring))) { cJSON_Delete(json_obj); return RET_EMPTY_STRING; } if(strcmp(operate->valuestring,"set") == 0) { *conf_type = CM_CONFIG_SET; } if(strcmp(operate->valuestring,"getall") == 0) { *conf_type = CM_CONFIG_GET_ALL; } else { cJSON_Delete(json_obj); return RET_INPUTERR; } cJSON *action_type; action_type = cJSON_GetObjectItem(json_obj,"action"); if((NULL == action_type) || (NULL == (action_type->valuestring))) { cJSON_Delete(json_obj); return RET_NULL_INPUT_ERR; } else { if(strcmp(action_type->valuestring,"start") == 0) { g_action = START; } else if(strcmp(action_type->valuestring,"restart") == 0) { g_action = RESTART; } else if(strcmp(action_type->valuestring,"stop") == 0) { g_action = STOP; } else if(strcmp(action_type->valuestring,"status") == 0) { g_action = STATUS; } else { cJSON_Delete(json_obj); return RET_INPUTERR; } } return ret; } void killpid() { char pid[10] = {0}; char cmd[20] = {0}; int pid_int; FILE *fp = NULL; fp = popen(GETPID,"r"); if(NULL == fp) { rpc_log_info("can not get pid\n"); return; } fgets(pid,sizeof(pid),fp); sscanf(pid,"%d",&pid_int); sprintf(cmd,"kill %d",pid_int); system(cmd); pclose(fp); } ret_code start_lte() { char result[RESULT_LENGTH] = {0}; int i = 0; FILE *f = NULL; f = popen(START_CMD,"r"); if (NULL == f) { rpc_log_info("execuate cmd fail\n"); return RET_EXEC_SHELL_ERR; } fseek(f,0,SEEK_SET); fgets(result,sizeof(result),f); if(strcmp(result,"not install lte! ") == 0) { pclose(f); return RET_NO_LTE_MODULE_ERR; } else if(strcmp(result,"pppd apparently already active, start aborted!") == 0) { pclose(f); return RET_ALREADY_START_ERR; } else if(strcmp(result,"start pppd ppp0") == 0) { while(i < 120) { if(access(file_path,0) != 0) { sleep(1000); i ++; } else { pclose(f); return RET_OK; } } pclose(f); //杀死进程 killpid; rpc_log_info("please check the sim card\n"); return RET_EXEC_SHELL_ERR; } else { pclose(f); return RET_UNKNOWN; } } ret_code stop_lte() { char result[RESULT_LENGTH] = {0}; FILE *f = NULL; f = popen(STOP_CMD,"r"); if (NULL == f) { rpc_log_info("execuate cmd fail\n"); return RET_EXEC_SHELL_ERR; } fseek(f,0,SEEK_SET); fgets(result,sizeof(result),f); if(strcmp(result,"pppd may be sotped already") == 0) { pclose(f); return RET_ALREADY_STOP_ERR; } else if((strcmp(result,"stop pppd ppp0") == 0) && access(file_path,0) != 0) { pclose(f); return RET_OK; } else { pclose(f); return RET_UNKNOWN; } } ret_code restart_lte() { char result[RESULT_LENGTH] = {0}; int i = 0; FILE *f = NULL; f = popen(RESTART_CMD,"r"); if (NULL == f) { rpc_log_info("execuate cmd fail\n"); return RET_EXEC_SHELL_ERR; } fseek(f,0,SEEK_SET); fgets(result,sizeof(result),f); memset(result,0,sizeof(result)); fseek(f,0,SEEK_CUR); fgets(result,sizeof(result),f); if(strcmp(result,"not install lte! ") == 0) { pclose(f); return RET_NO_LTE_MODULE_ERR; } else if(strcmp(result,"pppd apparently already active, start aborted!") == 0) { pclose(f); return RET_ALREADY_START_ERR; } else if(strcmp(result,"start pppd ppp0") == 0) { while(i < 120) { if(access(file_path,0) != 0) { sleep(1000); i ++; } else { pclose(f); return RET_OK; } } pclose(f); //杀死进程 killpid; rpc_log_info("please check the sim card\n"); return RET_EXEC_SHELL_ERR; } else { pclose(f); return RET_UNKNOWN; } } ret_code lte_to_json(char *status, int connect_time, pointer output, int *output_len) { if(NULL == status || NULL == output || NULL == output_len) { return RET_NULL_INPUT_ERR; } ret_code ret = RET_OK; cJSON *ret_root = cJSON_CreateObject(); if(ret_root == NULL) { cJSON_Delete(ret_root); return RET_EMPTY_STRING; } cJSON_AddStringToObject(ret_root,"status", status); if(connect_time != 0) { cJSON_AddNumberToObject(ret_root,"connect_time",connect_time); } rpc_json_print(ret_root); char *status_info = cJSON_PrintUnformatted(ret_root); *output_len = strlen(status_info) + 1; memcpy(output, status_info, *output_len); free(status_info); cJSON_Delete(ret_root); return ret; } ret_code status_lte(pointer output, int *output_len) { if((NULL == output) || (NULL == output_len)) { return RET_INPUTERR; } char result[RESULT_LENGTH] = {0}; char status[STATUS_LENGTH] = {0}; int connect_time = 0; ret_code ret = RET_OK; FILE *f = NULL; f = popen(STATUS_CMD,"r"); if(NULL == f) { rpc_log_info("execuate cmd fail\n"); return RET_EXEC_SHELL_ERR; } fgets(result,sizeof(result),f); if(strstr(result,"off") != NULL) { strcpy(status,"off"); //封装json ret = lte_to_json(status,connect_time,output,output_len); pclose(f); return ret; } else if(strstr(result,"on") != NULL) { strcpy(status,"on"); memcpy(result,0,sizeof(result)); fgets(result,sizeof(result),f); sscanf(result,"ppp_keep_time=%d",&connect_time); ret = lte_to_json(status,connect_time,output,output_len); pclose(f); return ret; } else { pclose(f); return RET_UNKNOWN; } } ret_code LTE_config_chk(uint source, uint *config_type, pointer input, int *input_len, pointer output, int *output_len) { if((NULL == config_type) || (NULL == input) || (NULL == input_len) || (NULL == output_len)) { return RET_NULL_INPUT_ERR; } ret_code ret = RET_OK; //int action = 0; ret = LTE_json_parse(input,config_type,g_action); return ret; } ret_code LTE_config_proc(uint source, uint config_type, pointer input, int input_len, pointer output, int *output_len) { ret_code ret = RET_OK; if(config_type == CM_CONFIG_SET) { switch(g_action){ case START: ret = start_lte(); break; case RESTART: ret = restart_lte(); break; case STOP: ret = stop_lte(); break; default: ret = RET_INPUTERR; break; } } else { ret = RET_INPUTERR; } return ret; } ret_code LTE_config_get_all(uint source, pointer output, int *output_len) { if((NULL == output) || (NULL == output_len)) { return RET_INPUTERR; } ret_code ret = RET_OK; *output_len = 0; ret = status_lte(output, output_len); rpc_log_info("status is %s\n",(char *)output); return ret; }