diff --git a/Makefile b/Makefile index 6f0fdd7adf04217583edcc60ca931aa8974cb4ab..afd6488eb3e87ac2fb369dbaecc764c70b33b500 100644 --- a/Makefile +++ b/Makefile @@ -1,23 +1,35 @@ -CC = gcc +CC = gcc +XMLFLAG = "-I$(STAGING_DIR)/usr/include/libxml2/" CFLAGS = -g -Wall -LIBS = -ljson-c -lubox -lubus -lcurl -lmobile_zte -lblobmsg_json +LIBS = -ljson-c -lubox -lubus -lcurl -lmobile_zte -lmobile_hilink -lblobmsg_json -all: libmobile1_zte libmobile2_zte common stack dongle_apn dongle_pin dongle_network dongle_infrastructure dongle +all: libmobile1_zte libmobile2_zte libmobile1_hilink libmobile2_hilink common stack dongle_apn dongle_pin dongle_network dongle_infrastructure dongle -MOBJS = libmobile_zte.o -MSRCS = libmobile_zte.c -libmobile1_zte: ${MOBJS} - ${CC} -c -fPIC ${MSRCS} -o ${MOBJS} +ZOBJS = libmobile_zte.o +ZSRCS = libmobile_zte.c +libmobile1_zte: ${ZOBJS} + ${CC} -c -fPIC ${ZSRCS} -o ${ZOBJS} -MOBJS = libmobile_zte.o -MSRCS = libmobile_zte.c -libmobile2_zte: ${MOBJS} +libmobile2_zte: ${ZOBJS} ${CC} ${MOBJS} -shared -o libmobile_zte.so -COBJS = common.o -CSRCS = common.c -common: ${COBJS} - ${CC} -c ${CSRCS} -o ${COBJS} +HOBJS = common_hilink.o +HSRCS = common_hilink.c +common_hilink: ${HOBJS} + ${CC} -c ${HSRCS} -o ${HOBJS} ${XMLFLAG} + +HLOBJS = libmobile_hilink.o +HLSRCS = libmobile_hilink.c +libmobile1_hilink: ${HLOBJS} + ${CC} -c -fPIC ${HLSRCS} -o ${HLOBJS} + +libmobile2_hilink: ${HLOBJS} + ${CC} ${HLOBJS} -shared -o libmobile_hilink.so + +ZCOBJS = common_zte.o +ZCSRCS = common_zte.c +common_zte: ${ZCOBJS} + ${CC} -c ${ZCSRCS} -o ${ZCOBJS} STOBJS = stack.o STSRCS = stack.c diff --git a/common_hilink.c b/common_hilink.c new file mode 100644 index 0000000000000000000000000000000000000000..f68439654f20a414f8b59af2289ff7f660feff5a --- /dev/null +++ b/common_hilink.c @@ -0,0 +1,104 @@ +#include "common.h" + +//need to free tag content.. +char *xml_parser(struct write_result *result, char *tag) +{ + char *tag_content; + + tag_content = malloc(TAG_CONTENT_SIZE); + if (!tag_content) + goto leave; + + xmlDocPtr doc_ptr = NULL; + xmlXPathContextPtr xpathctx_ptr; + xmlXPathObjectPtr xpathobj_ptr; + + doc_ptr = xmlParseMemory(result->data, result->pos); + xpathctx_ptr = doc_ptr ? xmlXPathNewContext(doc_ptr) : NULL; + + xpathobj_ptr = xpathctx_ptr ? xmlXPathEvalExpression((xmlChar *)tag, xpathctx_ptr) : NULL; + if (xpathobj_ptr) { + int n; + xmlNodeSetPtr nodeset_ptr = xpathobj_ptr->nodesetval; + for (n = 0; nodeset_ptr && n < xmlXPathNodeSetGetLength(nodeset_ptr); n++) { + //if (DEBUG) + //printf("n value: %d\n", n); + xmlNodePtr node_ptr = nodeset_ptr->nodeTab[n]; + if (node_ptr->type != XML_ATTRIBUTE_NODE && node_ptr->type != XML_ELEMENT_NODE && node_ptr->type != XML_CDATA_SECTION_NODE) + continue; + if (node_ptr->children) { + //tag_content = (char*) node_ptr->children->content; + strcpy(tag_content, (char *)node_ptr->children->content); + if (DEBUG) + printf("tag content: %s\n", tag_content); + break; + } + + } + } + + if (xpathobj_ptr) + xmlXPathFreeObject(xpathobj_ptr); + if (xpathctx_ptr) + xmlXPathFreeContext(xpathctx_ptr); + if (doc_ptr) + xmlFreeDoc(doc_ptr); + + return tag_content; + +leave: + return NULL; + +} + +void xml_to_json(xmlNode *anode, json_object *jobj) +{ + xmlNodePtr cur_node = NULL; + json_object *cur_jstr = NULL; + + for (cur_node = anode; cur_node; cur_node = cur_node->next) { + if (DEBUG_COMMON) { + printf("child address: %p\n", cur_node); + printf("next addres: %p\n", cur_node->next); + printf("root child content: %s\n", (uint8_t *)xmlNodeGetContent(cur_node)); + } + + if (cur_node->type == XML_ELEMENT_NODE) { + if (xmlChildElementCount(cur_node) == 0) { + cur_jstr = json_object_new_string((char *)xmlNodeGetContent(cur_node)); + if (DEBUG_COMMON) { + printf ("xmlNodeGet name: %sn", (char *)cur_node->name); + printf ("xmlNodeGetContent: %sn", (char *)xmlNodeGetContent(cur_node)); + } + + json_object_object_add(jobj, (char *)cur_node->name, cur_jstr); + } + } + + xml_to_json(cur_node->children, jobj); + } +} + + + +void xml_to_json_converter(struct write_result *result) +{ + json_object *jobj; + xmlDocPtr doc_ptr = NULL; + xmlNode *origin_node = NULL; + + jobj = json_object_new_object(); + + doc_ptr = xmlParseMemory(result->data, result->pos); + origin_node = doc_ptr ? xmlDocGetRootElement(doc_ptr) : NULL; + + jobj = json_object_new_object(); + xml_to_json(origin_node, jobj); + if (DEBUG_COMMON) { + printf ("The json object created: %s\n",json_object_to_json_string(jobj)); + } + +} + + + diff --git a/common_hilink.h b/common_hilink.h new file mode 100644 index 0000000000000000000000000000000000000000..78f68396e88ea08ff275e5a82f94be05c2340b0e --- /dev/null +++ b/common_hilink.h @@ -0,0 +1,20 @@ +#ifndef COMMON_H +#define COMMON_H + +#include "libmobile.h" + + +#include <libxml2/libxml/parser.h> +#include <libxml/xpath.h> +#include <libxml/xpathInternals.h> + +#include <json-c/json.h> + +#define DEBUG_COMMON 0 + +char *xml_parser(struct write_result *result, char *tag); +void xml_to_json_converter(struct write_result *result); + + + +#endif diff --git a/common.c b/common_zte.c similarity index 100% rename from common.c rename to common_zte.c diff --git a/common.h b/common_zte.h similarity index 100% rename from common.h rename to common_zte.h diff --git a/libmobile_hilink.c b/libmobile_hilink.c new file mode 100644 index 0000000000000000000000000000000000000000..d6f41922128df07f0ace6a50bab84e6df8170f98 --- /dev/null +++ b/libmobile_hilink.c @@ -0,0 +1,527 @@ +/*************************************************************************** + * + * Project: dongle + * + * + ***************************************************************************/ + +#include "libmobile.h" + + +//global varibales +char *home_url = "http://192.168.8.1/html/index.html"; +char *sess_tok_url = "http://192.168.8.1/api/webserver/SesTokInfo"; + +//free mem. +char *parser(char *data, char *keyword) +{ + char *session_token; + char *ptr = NULL; + + session_token = (char *)calloc(1024, sizeof(char)); + if (!session_token) + goto leave_token; + + //parse keyword.. + ptr = strstr(data, keyword); + if (ptr == NULL) + { + goto leave_not_found; + } + + int strl = strlen(keyword); + ptr += strl; + sscanf(ptr, "%[^<]", session_token); + + return session_token; + +leave_not_found: + free(session_token); +leave_token: + + return NULL; +} + + +static size_t write_response(void *ptr, size_t size, size_t nmemb, void *stream) +{ + size_t total_size = size * nmemb; + + struct write_result *result = (struct write_result *)stream; + + if (result->pos + total_size >= BUFFER_SIZE - 1) { + fprintf(stderr, "error: too small buffer\n"); + return 0; + } + + memcpy(result->data + result->pos, ptr, total_size); + result->pos += total_size; + + return total_size; +} + + + +struct write_result *memalloc_write_result(void) +{ + struct write_result *wr = (struct write_result *) calloc(1, sizeof(struct write_result)); + if (!wr) + goto leave; + + wr->data = calloc(BUFFER_SIZE, sizeof(char)); + if (!wr->data) + goto leave; + + wr->pos = 0; + + return wr; + +leave: + if (wr) + free(wr); + + if (wr->data) + free(wr->data); + + return NULL; +} + + +void free_write_result(struct write_result *result) +{ + if (result) { + free(result); + } +} + + + +int check_cookie_status(CURLcode status, CURL *curl) +{ + long code; + + if (status != 0) { + if (DEBUG) + printf(": %s\n", curl_easy_strerror(status)); + return 1; + } + + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); + if (code != 200) { + if (DEBUG) + printf("error: server responded with code %ld\n", code); + return 1; + } + + return 0; +} + + +void prepare_curl_write_callback(CURL *curl, const char *url, struct write_result *result) +{ + curl_easy_setopt(curl, CURLOPT_URL, url); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, result); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_response); +} + + + +//free mem +static struct write_result *get_request(const char *url, const char *api_url) +{ + CURL *curl = NULL; + CURLcode status; + struct write_result *result; + + curl = curl_easy_init(); + if (!curl) + goto leave; + + result = memalloc_write_result(); + if (!result) + goto leave; + + prepare_curl_write_callback(curl, url, result); + curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); //start the cookie engine .. + curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt"); //Save the cookie from the server to cookie.txt + + status = curl_easy_perform(curl); + if (check_cookie_status(status, curl)) + goto leave; + + //Prepare result struct to get next http response. + memset(result->data, 0, BUFFER_SIZE); + result->pos = 0; + + prepare_curl_write_callback(curl, api_url, result); + curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt"); //Read locally stored cookies + + status = curl_easy_perform(curl); + if (check_cookie_status(status, curl)) + goto leave; + + + result->data[result->pos] = '\0'; + if (DEBUG_RESULT) + printf("Http get request data is: %s\n", result->data); + + curl_easy_cleanup(curl); + + return result; + +leave: + if (curl) { + printf("error occured: easy cleanup curl"); + curl_easy_cleanup(curl); + } + if (result) + free_write_result(result); + + return NULL; +} + + +//free mem +static struct write_result *post_request(const char *url, const char *api_url, char *post_query) +{ + char token[1024] = {0}; + char session[1024] = {0}; + char *token_text = "__RequestVerificationToken:"; + char *session_text = "Cookie:SessionID="; + struct curl_slist *headers = NULL; + struct write_result *result; + CURL *curl = NULL; + CURLcode status; + + curl = curl_easy_init(); + if (!curl) + goto leave; + + result = memalloc_write_result(); + if (!result) + goto leave; + + prepare_curl_write_callback(curl, url, result); + + status = curl_easy_perform(curl); + if (check_cookie_status(status, curl)) + goto leave; + + result->data[result->pos] = '\0'; + + + char *session_id = parser(result->data, "SessionID="); + if (DEBUG) + printf("Session id is: %s\n", session_id); + char *token_id = parser(result->data, "<TokInfo>"); + if (DEBUG) + printf("Token is: %s\n", token_id); + + + //clean the memory to prepare write operation for next http response.. + memset(result->data, 0, BUFFER_SIZE); + result->pos = 0; + + //prepare http header with token & session. + sprintf(token, "%s%s", token_text, token_id); + sprintf(session, "%s%s", session_text, session_id); + + headers = curl_slist_append(headers, token); + headers = curl_slist_append(headers, session); + headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded; charset=UTF-8"); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + prepare_curl_write_callback(curl, api_url, result); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_query); + + status = curl_easy_perform(curl); + if (check_cookie_status(status, curl)) + goto leave; + + + curl_easy_cleanup(curl); + + result->data[result->pos] = '\0'; + if (DEBUG_RESULT) + printf("http post request data is: %s\n", result->data); + + //free the parser memeory.. + if (token_id) + { + free(token_id); + token_id = NULL; + } + + if (session_id) + { + free(session_id); + session_id = NULL; + } + + return result; + +leave: + if (curl) { + printf("error occured: easy cleanup curl\n"); + curl_easy_cleanup(curl); + } + + if (result) + free_write_result(result); + + if (headers) + curl_slist_free_all(headers); + + if (token_id) + free(token_id); + + if (session_id) + free(session_id); + + return NULL; +} + + +struct write_result *mobile_get_device_info() +{ + char *api_url = "http://192.168.8.1/api/device/information"; + + return get_request(home_url, api_url); +} + + +struct write_result *mobile_get_monitoring_status() +{ + char *api_url = "http://192.168.8.1/api/monitoring/status"; + + return get_request(home_url, api_url); +} + + +struct write_result *mobile_get_trafficstatistics() +{ + char *api_url = "http://192.168.8.1/api/monitoring/traffic-statistics"; + + return get_request(home_url, api_url); +} + + +struct write_result *mobile_get_provider() +{ + char *api_url = "http://192.168.8.1/api/net/current-plmn"; + + return get_request(home_url, api_url); +} + + +struct write_result *mobile_get_pin_status() +{ + char *api_url = "http://192.168.8.1/api/pin/status"; + + return get_request(home_url, api_url); +} + + +struct write_result *mobile_get_connection_status() +{ + char *api_url = "http://192.168.8.1/api/dialup/connection"; + + return get_request(home_url, api_url); +} + + +struct write_result *mobile_get_apn_profiles() +{ + char *api_url = "http://192.168.8.1/api/dialup/profiles"; + + return get_request(home_url, api_url); +} + + +struct write_result *mobile_get_notification() +{ + char *api_url = "http://192.168.8.1/api/monitoring/check-notifications"; + + return get_request(home_url, api_url); +} + + +struct write_result *mobile_get_sms_count() +{ + char *api_url = "http://192.168.8.1/api/sms/sms-count"; + + return get_request(home_url, api_url); +} + + +struct write_result *mobile_get_language() +{ + char *api_url = "http://192.168.8.1/api/language/current-language"; + + return get_request(home_url, api_url); +} + + /* post calls */ +struct write_result *mobile_create_apn_profile(char *name, char *apn_name, char *username, char *password) +{ + char *api_url = "http://192.168.8.1/api/dialup/profiles"; + char post_query[1024]; + + snprintf(post_query, 1023, "<request><Delete>0</Delete><SetDefault>0</SetDefault><Modify>1</Modify><Profile><Index></Index><IsValid>1</IsValid><Name>%s</Name><ApnIsStatic>1</ApnIsStatic><ApnName>%s</ApnName><DialupNum>*99#</DialupNum><Username>%s</Username><Password>%s</Password><AuthMode>0</AuthMode><IpIsStatic></IpIsStatic><IpAddress></IpAddress><DnsIsStatic></DnsIsStatic><PrimaryDns></PrimaryDns><SecondaryDns></SecondaryDns><ReadOnly>0</ReadOnly><iptype>2</iptype></Profile></request>", name, apn_name, username, password); + + return post_request(sess_tok_url, api_url, post_query); +} + + +struct write_result *mobile_set_apn_profile_default(char *name, char *apn_name, char *username, char *password) +{ + char *api_url = "http://192.168.8.1/api/dialup/profiles"; + char post_query[1024]; + + snprintf(post_query, 1023, "<request><Delete>0</Delete><SetDefault>3</SetDefault><Modify>2</Modify><Profile><Index>3</Index><IsValid>1</IsValid><Name>%s</Name><ApnIsStatic>1</ApnIsStatic><ApnName>%s</ApnName><DialupNum>*99#</DialupNum><Username>%s</Username><Password>%s</Password><AuthMode>0</AuthMode><IpIsStatic>0</IpIsStatic><IpAddress></IpAddress><DnsIsStatic>0</DnsIsStatic><PrimaryDns></PrimaryDns><SecondaryDns></SecondaryDns><ReadOnly>0</ReadOnly><iptype>0</iptype></Profile></request>", name, apn_name, username, password); + + return post_request(sess_tok_url, api_url, post_query); +} + + +struct write_result *mobile_delete_apn_profile(int profile_name_location) +{ + char *api_url = "http://192.168.8.1/api/dialup/profiles"; + char post_query[512]; + + sprintf(post_query, "<request><Delete>%d</Delete><SetDefault>1</SetDefault><Modify>0</Modify></request>", profile_name_location); + + return post_request(sess_tok_url, api_url, post_query); +} + + +struct write_result *mobile_sms_read(int sms_location) +{ + char *api_url = "http://192.168.8.1/api/sms/set-read"; + char post_query[256]; + + sprintf(post_query, "<request><Index>%d</Index></request>", sms_location); + + return post_request(sess_tok_url, api_url, post_query); +} + + +struct write_result *mobile_sms_delete(int sms_location) +{ + char *api_url = "http://192.168.8.1/api/sms/delete-sms"; + char post_query[256]; + + sprintf(post_query, "<request><Index>%d</Index></request>", sms_location); + + return post_request(sess_tok_url, api_url, post_query); +} + + +struct write_result *mobile_reset_traffic() +{ + char *api_url = "http://192.168.8.1/api/monitoring/clear-traffic"; + char *post_query = "<request><ClearTraffic>1</ClearTraffic></request>"; + + return post_request(sess_tok_url, api_url, post_query); +} + + /* mobile_LTE_register has to be called to enbale or disable LTE */ +struct write_result *mobile_LTE_register() +{ + char *api_url = "http://192.168.8.1/api/net/register"; + char *post_query = "<request><Mode>0</Mode><Plmn></Plmn><Rat></Rat></request>"; + + return post_request(sess_tok_url, api_url, post_query); +} + + +struct write_result *mobile_LTE_enable() +{ + char *api_url = "http://192.168.8.1/api/net/net-mode"; + char *post_query = "<request><NetworkMode>00</NetworkMode><NetworkBand>3FFFFFFF</NetworkBand><LTEBand>7FFFFFFFFFFFFFFF</LTEBand></request>"; + + return post_request(sess_tok_url, api_url, post_query); +} + + +struct write_result *mobile_LTE_disable() +{ + char *api_url = "http://192.168.8.1/api/net/net-mode"; + char *post_query = "<NetworkMode>0201</NetworkMode><NetworkBand>3FFFFFFF</NetworkBand><LTEBand>7FFFFFFFFFFFFFFF</LTEBand></request>"; + + return post_request(sess_tok_url, api_url, post_query); +} + + +/* 00 - default- 4g, 01 - 2g, 02 - 3g */ +struct write_result *mobile_set_connection_type(int connection_type) +{ + char *api_url = "http://192.168.8.1/api/dialup/connection"; + char post_query[256]; + + sprintf(post_query, "<request><NetworkMode>%d</NetworkMode><NetworkBand>3FFFFFFF</NetworkBand><LTEBand>7FFFFFFFFFFFFFFF</LTEBand></request>", connection_type); + + return post_request(sess_tok_url, api_url, post_query); +} + + +struct write_result *data_roaming(int action) +{ + char *api_url = "http://192.168.8.1/api/dialup/connection"; + char post_query[256]; + + sprintf(post_query, "<request><RoamAutoConnectEnable>%d</RoamAutoConnectEnable><MaxIdelTime>600</MaxIdelTime><ConnectMode>0</ConnectMode><MTU>1500</MTU><auto_dial_switch>1</auto_dial_switch><pdp_always_on>0</pdp_always_on></request>", action); + + return post_request(sess_tok_url, api_url, post_query); +} + + +struct write_result *mobile_data_roaming_enable() +{ + return data_roaming(ENABLE); +} + + +struct write_result *mobile_data_roaming_disable() +{ + return data_roaming(DISABLE); +} + +/* 00 -> enter pin, 01 -> activate pin, 02 ->disable pin, 03 -> change pin, 04 -> enter puk */ +struct write_result *pin_action(char *type, char *current_pin, char *new_pin, char *puk) +{ + char *api_url = "http://192.168.8.1/api/pin/operate"; + char post_query[256]; + + sprintf(post_query, "<request><OperateType>%s</OperateType><CurrentPin>%s</CurrentPin><NewPin>%s</NewPin><PukCode>%s</PukCode></request>", type, current_pin, new_pin, puk); + + return post_request(sess_tok_url, api_url, post_query); +} + + +struct write_result *mobile_pin_enable(char *current_pin) +{ + return pin_action("01", current_pin, "", ""); +} + + +struct write_result *mobile_pin_disable(char *current_pin) +{ + return pin_action("02", current_pin, "", ""); +} + + +struct write_result *mobile_pin_set(char *current_pin, char *new_pin) +{ + return pin_action("03", current_pin, new_pin, ""); +} + + +struct write_result *mobile_set_language(char *language_name) +{ + char *api_url = "http://192.168.8.1/api/language/current-language"; + char post_query[128]; + + snprintf(post_query, 128, "<request><CurrentLanguage>%s</CurrentLanguage></request>", language_name); + + return post_request(sess_tok_url, api_url, post_query); +} diff --git a/libmobile_hilink.h b/libmobile_hilink.h new file mode 100644 index 0000000000000000000000000000000000000000..5892cfffa580c1a9bc4a3ef89d775ca9ce05b1de --- /dev/null +++ b/libmobile_hilink.h @@ -0,0 +1,105 @@ +#ifndef LIBMOBILE_H +#define LIBMOBILE_H + + +#include <stdio.h> +#include <curl/curl.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> + + +#define BUFFER_SIZE (256 * 1024) //256kb +#define TAG_CONTENT_SIZE 100 +#define DEBUG 1 +#define DEBUG_RESULT 0 +#define ENABLE 1 +#define DISABLE 0 + + + +struct write_result { + char *data; + int pos; +}; + + + + + +//DeviceName, SerialNumber, Imei, Imsi, Iccid, Msisdn, HardwareVersion, SoftwareVersion, +//WebUIVersion, MacAddress1, MacAddress2, ProductFamily, Classify, supportmode, workmode +struct write_result *mobile_get_device_info(); + +//ConnectionStatus, WifiConnectionStatus, SignalStrength, SignalIcon, CurrentNetworkType, CurrentServiceDomain, RoamingStatus, BatteryStatus +//BatteryLevel, BatteryPercent, simlockStatus, WanIPAddress, WanIPv6Address, PrimaryDns, SecondaryDns, PrimaryIPv6Dns, SecondaryIPv6Dns, +//CurrentWifiUser, TotalWifiUser, currenttotalwifiuser, ServiceStatus, SimStatus, WifiStatus, CurrentNetworkTypeEx, maxsignal, wifiindooronly, wififrequence, +//classify, flymode, cellroam +struct write_result *mobile_get_monitoring_status(); + +//CurrentConnectTime, currentUpload, CurrentDownload, CurrentDownloadRate, CurrentUploadRate, TotalUpload, TotalDownload, TotalConnectTime, showtraffic +struct write_result *mobile_get_trafficstatistics(); + + +//State, FullName, ShortName, Numeric, Rat +struct write_result *mobile_get_provider(); + + +///SimState, PinOptState, SimPinTimes +struct write_result *mobile_get_pin_status(); + +//RoamAutoConnectEnable, MaxIdelTime, ConnectMode, MTU, auto_dial_switch, pdp_always_on +struct write_result *mobile_get_connection_status(); + + +struct write_result *mobile_get_apn_profiles(); + + +//UnreadMessage, SmsStorageFull, OnlineUpdateStatus +struct write_result *mobile_get_notification(); + + +//LocalUnread, LocalInbox, LocalOutbox, LocalDraft, LocalDeleted, SimUnread, SimInbox, SimOutbox +//SimDraft, LocalMax, SimMax, SimUsed, NewMsg +struct write_result *mobile_get_sms_count(); + +struct write_result *mobile_get_language(); + +struct write_result *mobile_create_apn_profile(char *name, char *apn_name, char *username, char *password); + +struct write_result *mobile_set_apn_profile_default(char *name, char *apn_name, char *username, char *password); + +struct write_result *mobile_delete_apn_profile(int profile_name_location); + +struct write_result *mobile_sms_read(int sms_location); + +struct write_result *mobile_sms_delete(int sms_location); + +struct write_result *mobile_reset_traffic(); + + /* mobile_LTE_register has to be called to enbale or disable LTE */ +struct write_result *mobile_LTE_register(); + +struct write_result *mobile_LTE_enable(); + +struct write_result *mobile_LTE_disable(); + +/* 00 - default- 4g, 01 - 2g, 02 - 3g */ +struct write_result *mobile_set_connection_type(int connection_type); + +struct write_result *mobile_data_roaming_enable(); + +struct write_result *mobile_data_roaming_disable(); + +/* 00 -> enter pin, 01 -> activate pin, 02 ->disable pin, 03 -> change pin, 04 -> enter puk */ +struct write_result *mobile_pin_enable(char *current_pin); + +struct write_result *mobile_pin_disable(char *current_pin); + +struct write_result *mobile_pin_set(char *current_pin, char *new_pin); + +struct write_result *mobile_set_language(char *language_name); + + +#endif +