498 lines
9.7 KiB
C
498 lines
9.7 KiB
C
#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(strstr(result,"lte no match") != NULL)
|
||
{
|
||
return RET_LTE_NO_MATCH_ERR;
|
||
}
|
||
|
||
else if(strstr(result,"no found lte module") != NULL)
|
||
{
|
||
return RET_NO_LTE_MODULE_ERR;
|
||
}
|
||
|
||
else if(strstr(result,"4g init done") != NULL)
|
||
{
|
||
return RET_OK;
|
||
}
|
||
|
||
else
|
||
{
|
||
return RET_UNKNOWN;
|
||
}
|
||
}
|
||
|
||
|
||
ret_code LTE_config_init()
|
||
{
|
||
ret_code ret = RET_OK;
|
||
char result[RESULT_LENGTH] = {0};
|
||
FILE *f = NULL;
|
||
f = popen("/etc/ppp/ppp-4g init","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)
|
||
{
|
||
rpc_log_info("%s\n",result);
|
||
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;
|
||
}
|
||
|
||
rpc_log_info("operate is %s\n",operate->valuestring);
|
||
|
||
if(strcmp(operate->valuestring,"set") == 0)
|
||
{
|
||
*conf_type = CM_CONFIG_SET;
|
||
}
|
||
else if(strcmp(operate->valuestring,"getall") == 0)
|
||
{
|
||
*conf_type = CM_CONFIG_GET_ALL;
|
||
cJSON_Delete(json_obj);
|
||
return RET_OK;
|
||
}
|
||
else
|
||
{
|
||
cJSON_Delete(json_obj);
|
||
return RET_INPUTERR;
|
||
}
|
||
|
||
rpc_log_info("config type is %d\n",*conf_type);
|
||
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
|
||
{
|
||
rpc_log_info("action is %s\n",action_type->valuestring);
|
||
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,"init") == 0)
|
||
{
|
||
g_action = INIT;
|
||
}
|
||
else
|
||
{
|
||
cJSON_Delete(json_obj);
|
||
return RET_INPUTERR;
|
||
}
|
||
}
|
||
|
||
rpc_log_info("action type is %d\n",g_action);
|
||
cJSON_Delete(json_obj);
|
||
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("/etc/ppp/ppp-4g start","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);
|
||
|
||
rpc_log_info("%s\n",result);
|
||
|
||
if(strstr(result,"not install lte") != NULL )
|
||
{
|
||
pclose(f);
|
||
return RET_NO_LTE_MODULE_ERR;
|
||
}
|
||
|
||
else if(strstr(result,"pppd apparently already active")
|
||
!= NULL)
|
||
{
|
||
pclose(f);
|
||
return RET_ALREADY_START_ERR;
|
||
}
|
||
else if(strstr(result,"start pppd ppp0") != NULL)
|
||
{
|
||
pclose(f);
|
||
return RET_OK;
|
||
/* while(i < 120)
|
||
{
|
||
if(access(file_path,0) != -1)
|
||
{
|
||
sleep(1000);
|
||
i
|
||
++;
|
||
}
|
||
else
|
||
{
|
||
pclose(f);
|
||
return RET_OK;
|
||
}
|
||
}
|
||
|
||
pclose(f);
|
||
//ɱ<><C9B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
killpid();
|
||
rpc_log_info("please check the sim card\n");
|
||
return RET_EXEC_SHELL_ERR;*/
|
||
}
|
||
else
|
||
{
|
||
pclose(f);
|
||
return RET_EXEC_SHELL_ERR;
|
||
}
|
||
}
|
||
|
||
ret_code stop_lte()
|
||
{
|
||
char result[RESULT_LENGTH] = {0};
|
||
|
||
FILE *f = NULL;
|
||
f = popen("/etc/ppp/ppp-4g stop","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);
|
||
|
||
rpc_log_info("%s\n",result);
|
||
|
||
if(strstr(result,"pppd may be sotped already") != NULL)
|
||
{
|
||
pclose(f);
|
||
return RET_ALREADY_STOP_ERR;
|
||
}
|
||
|
||
else if((strstr(result,"stop pppd ppp0") != NULL) && access(file_path,0) != -1)
|
||
{
|
||
pclose(f);
|
||
return RET_OK;
|
||
}
|
||
else
|
||
{
|
||
pclose(f);
|
||
return RET_EXEC_SHELL_ERR;
|
||
}
|
||
|
||
}
|
||
|
||
ret_code restart_lte()
|
||
{
|
||
char result[RESULT_LENGTH] = {0};
|
||
int i = 0;
|
||
|
||
FILE *f = NULL;
|
||
f = popen("/etc/ppp/ppp-4g restart","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);
|
||
|
||
rpc_log_info("%s\n",result);
|
||
|
||
if(strstr(result,"not install lte! ") != NULL)
|
||
{
|
||
pclose(f);
|
||
return RET_NO_LTE_MODULE_ERR;
|
||
}
|
||
|
||
else if(strstr(result,"pppd apparently already active") != NULL)
|
||
{
|
||
pclose(f);
|
||
return RET_ALREADY_START_ERR;
|
||
}
|
||
else if(strstr(result,"start pppd ppp0") != NULL)
|
||
{
|
||
pclose(f);
|
||
return RET_OK;
|
||
/* while(i < 120)
|
||
{
|
||
if(access(file_path,0) != -1)
|
||
{
|
||
sleep(1000);
|
||
i
|
||
++;
|
||
}
|
||
else
|
||
{
|
||
pclose(f);
|
||
return RET_OK;
|
||
}
|
||
}
|
||
pclose(f);
|
||
//ɱ<><C9B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
killpid();
|
||
rpc_log_info("please check the sim card\n");
|
||
return RET_EXEC_SHELL_ERR;*/
|
||
}
|
||
|
||
else
|
||
{
|
||
pclose(f);
|
||
return RET_EXEC_SHELL_ERR;
|
||
}
|
||
|
||
}
|
||
|
||
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("/etc/ppp/ppp-4g status","r");
|
||
if(NULL == f)
|
||
{
|
||
rpc_log_info("execuate cmd fail\n");
|
||
return RET_EXEC_SHELL_ERR;
|
||
}
|
||
|
||
fgets(result,sizeof(result),f);
|
||
rpc_log_info("%s\n",result);
|
||
if(strstr(result,"off") != NULL)
|
||
{
|
||
strcpy(status,"off");
|
||
//<2F><>װjson
|
||
ret = lte_to_json(status,connect_time,output,output_len);
|
||
pclose(f);
|
||
return ret;
|
||
}
|
||
else if(strstr(result,"on") != NULL)
|
||
{
|
||
strcpy(status,"on");
|
||
memset(result,0,sizeof(result));
|
||
fgets(result,sizeof(result),f);
|
||
rpc_log_info("%s\n",result);
|
||
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;
|
||
case INIT:
|
||
ret = LTE_config_init();
|
||
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;
|
||
|
||
}
|
||
|
||
|