New ATHandler functions taken into use

New ATHandler functions taken into use for rest of the targets (BG96 was updated initially) to reduce code size. This means basically that new functions using variadic list approach are taken into use and with those one can usually write AT commands in single line instead of multiple lines.
Only internal changes and API's are not modified.
pull/11306/head
Antti Kauppila 2019-08-23 13:20:50 +03:00
parent 101ae73b87
commit d08d55da88
26 changed files with 221 additions and 614 deletions

View File

@ -1225,7 +1225,7 @@ void ATHandler::handle_args(const char *format, std::va_list list)
{
while (*format != '\0') {
if (*format == 'd') {
int i = va_arg(list, int);
int32_t i = va_arg(list, int32_t);
write_int(i);
} else if (*format == 's') {
char *str = (char *)va_arg(list, char *);
@ -1292,10 +1292,14 @@ nsapi_error_t ATHandler::at_cmd_str(const char *cmd, const char *cmd_chr, char *
cmd_stop();
memcpy(_cmd_buffer, cmd, strlen(cmd));
_cmd_buffer[strlen(cmd)] = ':';
_cmd_buffer[strlen(cmd) + 1] = '\0';
resp_start(_cmd_buffer);
if (cmd && strlen(cmd) > 0) {
memcpy(_cmd_buffer, cmd, strlen(cmd));
_cmd_buffer[strlen(cmd)] = ':';
_cmd_buffer[strlen(cmd) + 1] = '\0';
resp_start(_cmd_buffer);
} else {
resp_start();
}
resp_buf[0] = '\0';
read_string(resp_buf, buf_size);

View File

@ -83,8 +83,7 @@ nsapi_error_t AT_CellularInformation::get_imsi(char *imsi, size_t buf_size)
return NSAPI_ERROR_PARAMETER;
}
_at.lock();
_at.cmd_start("AT+CIMI");
_at.cmd_stop();
_at.cmd_start_stop("+CIMI", "");
_at.resp_start();
_at.read_string(imsi, MAX_IMSI_LENGTH + 1);
_at.resp_stop();

View File

@ -25,13 +25,7 @@ GEMALTO_CINTERION_CellularInformation::GEMALTO_CINTERION_CellularInformation(ATH
nsapi_error_t GEMALTO_CINTERION_CellularInformation::get_iccid(char *buf, size_t buf_size)
{
_at.lock();
_at.cmd_start("AT^SCID");
_at.cmd_stop();
_at.resp_start("^SCID:");
_at.read_string(buf, buf_size);
_at.resp_stop();
return _at.unlock_return_error();
return _at.at_cmd_str("^SCID", "", buf, buf_size);
}
} /* namespace mbed */

View File

@ -144,16 +144,11 @@ nsapi_error_t GEMALTO_CINTERION_CellularStack::socket_close_impl(int sock_id)
_at.set_at_timeout(FAILURE_TIMEOUT);
_at.cmd_start("AT^SISC=");
_at.write_int(sock_id);
_at.cmd_stop_read_resp();
_at.at_cmd_discard("^SISC", "=", "%d", sock_id);
_at.clear_error(); // clear SISS even though SISC fails
_at.cmd_start("AT^SISS=");
_at.write_int(sock_id);
_at.write_string("srvType");
_at.write_string("none");
_at.cmd_stop_read_resp();
_at.at_cmd_discard("^SISS", "=", "%d%s%s", sock_id, "srvType", "none");
_at.restore_at_timeout();
@ -170,8 +165,7 @@ retry_open:
int internet_service_id = find_socket_index(socket);
bool foundSrvType = false;
bool foundConIdType = false;
_at.cmd_start("AT^SISS?");
_at.cmd_stop();
_at.cmd_start_stop("^SISS", "?");
_at.resp_start("^SISS:");
/*
* Profile is a list of tag-value map:
@ -211,19 +205,11 @@ retry_open:
_at.resp_stop();
if (!foundSrvType) {
_at.cmd_start("AT^SISS=");
_at.write_int(internet_service_id);
_at.write_string("srvType");
_at.write_string("Socket");
_at.cmd_stop_read_resp();
_at.at_cmd_discard("^SISS", "=", "%d%s%s", internet_service_id, "srvType", "Socket");
}
if (!foundConIdType) {
_at.cmd_start("AT^SISS=");
_at.write_int(internet_service_id);
_at.write_string("conId");
_at.write_int(connection_profile_id);
_at.cmd_stop_read_resp();
_at.at_cmd_discard("^SISS", "=", "%d%s%d", internet_service_id, "conId", connection_profile_id);
}
// host address (IPv4) and local+remote port is needed only for BGS2 which does not support UDP server socket
@ -249,9 +235,7 @@ retry_open:
_at.write_string(sock_addr);
_at.cmd_stop_read_resp();
_at.cmd_start("AT^SISO=");
_at.write_int(internet_service_id);
_at.cmd_stop_read_resp();
_at.at_cmd_discard("^SISO", "=", "%d", internet_service_id);
if (_at.get_last_error()) {
tr_error("Socket %d open failed!", socket->id);
@ -337,13 +321,8 @@ nsapi_size_or_error_t GEMALTO_CINTERION_CellularStack::socket_sendto_impl(Cellul
}
_at.set_at_timeout(FAILURE_TIMEOUT);
_at.cmd_start("AT^SISW=");
_at.write_int(socket->id);
_at.write_int(size);
if (GEMALTO_CINTERION::get_module() != GEMALTO_CINTERION::ModuleBGS2) {
_at.write_int(0);
// UDP requires Udp_RemClient
if (socket->proto == NSAPI_UDP) {
char socket_address[NSAPI_IPv6_SIZE + sizeof("[]:12345") - 1 + 1];
@ -352,12 +331,14 @@ nsapi_size_or_error_t GEMALTO_CINTERION_CellularStack::socket_sendto_impl(Cellul
} else {
std::sprintf(socket_address, "[%s]:%u", address.get_ip_address(), address.get_port());
}
_at.write_string(socket_address);
_at.cmd_start_stop("^SISW", "=", "%d%d%d%s", socket->id, size, 0, socket_address);
} else {
_at.cmd_start_stop("^SISW", "=", "%d%d%d", socket->id, size, 0);
}
} else {
_at.cmd_start_stop("^SISW", "=", "%d%d", socket->id, size);
}
_at.cmd_stop();
sisw_retry:
_at.resp_start("^SISW:");
if (!_at.info_resp()) {
@ -418,10 +399,7 @@ nsapi_size_or_error_t GEMALTO_CINTERION_CellularStack::socket_recvfrom_impl(Cell
size = UDP_PACKET_SIZE;
}
_at.cmd_start("AT^SISR=");
_at.write_int(socket->id);
_at.write_int(size);
_at.cmd_stop();
_at.cmd_start_stop("^SISR", "=", "%d%d", socket->id, size);
sisr_retry:
_at.resp_start("^SISR:");
@ -516,8 +494,8 @@ nsapi_error_t GEMALTO_CINTERION_CellularStack::create_connection_profile(int con
char conParamType[sizeof("GPRS0") + 1];
std::sprintf(conParamType, "GPRS%d", (_stack_type == IPV4_STACK) ? 0 : 6);
_at.cmd_start("AT^SICS?");
_at.cmd_stop();
_at.cmd_start_stop("^SICS", "?");
bool found_connection = false;
_at.resp_start("^SICS:");
while (_at.info_resp()) {
@ -543,46 +521,25 @@ nsapi_error_t GEMALTO_CINTERION_CellularStack::create_connection_profile(int con
// connection profile is bound to a PDP context and it can not be changed
if (!found_connection) {
_at.cmd_start("AT^SICS=");
_at.write_int(connection_profile_id);
_at.write_string("conType");
_at.write_string(conParamType);
_at.cmd_stop_read_resp();
_at.at_cmd_discard("^SICS", "=", "%d%s%s", connection_profile_id, "conType", conParamType);
if (_apn && strlen(_apn) > 0) {
_at.cmd_start("AT^SICS=");
_at.write_int(connection_profile_id);
_at.write_string("apn");
_at.write_string(_apn);
_at.cmd_stop_read_resp();
_at.at_cmd_discard("^SICS", "=", "%d%s%s", connection_profile_id, "apn", _apn);
}
if (_user && strlen(_user) > 0) {
_at.cmd_start("AT^SICS=");
_at.write_int(connection_profile_id);
_at.write_string("user");
_at.write_string(_user);
_at.cmd_stop_read_resp();
_at.at_cmd_discard("^SICS", "=", "%d%s%s", connection_profile_id, "user", _user);
}
if (_password && strlen(_password) > 0) {
_at.cmd_start("AT^SICS=");
_at.write_int(connection_profile_id);
_at.write_string("passwd");
_at.write_string(_password);
_at.cmd_stop_read_resp();
_at.at_cmd_discard("^SICS", "=", "%d%s%s", connection_profile_id, "passwd", _password);
}
// set maximum inactivity timeout
_at.cmd_start("AT^SICS=");
_at.write_int(connection_profile_id);
_at.write_string("inactTO");
_at.write_int(0xffff); // 2^16-1
_at.cmd_stop_read_resp();
_at.at_cmd_discard("^SICS", "=", "%d%s%d", connection_profile_id, "inactTO", 0xffff);
// use URC mode ON
_at.cmd_start("AT^SCFG=\"Tcp/withURCs\",\"on\"");
_at.cmd_stop_read_resp();
_at.at_cmd_discard("^SCFG", "=", "%s%s", "Tcp/withURCs", "on");
}
tr_debug("Cinterion profile %d, %s (err %d)", connection_profile_id, (_stack_type == IPV4_STACK) ? "IPv4" : "IPv6", _at.get_last_error());
@ -598,15 +555,10 @@ void GEMALTO_CINTERION_CellularStack::close_connection_profile(int connection_pr
// To clear connection profile need to detach from packet data.
// After detach modem sends PDP disconnected event to network class,
// which propagates network disconnected to upper layer to start reconnecting.
_at.cmd_start("AT+CGATT=0");
_at.cmd_stop_read_resp();
_at.at_cmd_discard("+CGATT", "=0");
_at.clear_error();
_at.cmd_start("AT^SICS=");
_at.write_int(connection_profile_id);
_at.write_string("conType");
_at.write_string("none");
_at.cmd_stop_read_resp();
_at.at_cmd_discard("^SICS", "=", "%d%s%s", connection_profile_id, "conType", "none");
_at.clear_error();
}

View File

@ -55,17 +55,16 @@ nsapi_error_t QUECTEL_BC95::get_sim_state(SimState &state)
{
_at->lock();
_at->flush();
_at->cmd_start("AT+NCCID?");
_at->cmd_stop();
_at->resp_start("+NCCID:");
if (_at->info_resp()) {
state = SimStateReady;
} else {
nsapi_error_t err = _at->at_cmd_discard("+NCCID", "?");
_at->unlock();
state = SimStateReady;
if (err != NSAPI_ERROR_OK) {
tr_warn("SIM not readable.");
state = SimStateUnknown; // SIM may not be ready yet
state = SimStateUnknown;
}
_at->resp_stop();
return _at->unlock_return_error();
return err;
}
AT_CellularNetwork *QUECTEL_BC95::open_network_impl(ATHandler &at)
@ -87,12 +86,9 @@ nsapi_error_t QUECTEL_BC95::init()
{
_at->lock();
_at->flush();
_at->cmd_start("AT");
_at->cmd_stop_read_resp();
_at->at_cmd_discard("", ""); //Send AT
_at->cmd_start("AT+CMEE="); // verbose responses
_at->write_int(1);
_at->cmd_stop_read_resp();
_at->at_cmd_discard("+CMEE", "=1"); // verbose responses
return _at->unlock_return_error();
}

View File

@ -29,13 +29,7 @@ QUECTEL_BC95_CellularInformation::~QUECTEL_BC95_CellularInformation()
// According to BC95_AT_Commands_Manual_V1.9
nsapi_error_t QUECTEL_BC95_CellularInformation::get_iccid(char *buf, size_t buf_size)
{
_at.lock();
_at.cmd_start("AT+NCCID?");
_at.cmd_stop();
_at.resp_start("+NCCID:");
_at.read_string(buf, buf_size);
_at.resp_stop();
return _at.unlock_return_error();
return _at.at_cmd_str("+NCCID", "?", buf, buf_size);
}
} /* namespace mbed */

View File

@ -62,9 +62,8 @@ nsapi_error_t QUECTEL_BC95_CellularStack::socket_connect(nsapi_socket_t handle,
_at.write_int(socket->id);
_at.write_string(address.get_ip_address(), false);
_at.write_int(address.get_port());
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
_at.cmd_stop_read_resp();
_at.unlock();
if (_at.get_last_error() == NSAPI_ERROR_OK) {
@ -130,13 +129,11 @@ nsapi_error_t QUECTEL_BC95_CellularStack::socket_close_impl(int sock_id)
if (sock && sock->closed) {
return NSAPI_ERROR_OK;
}
_at.cmd_start("AT+NSOCL=");
_at.write_int(sock_id);
_at.cmd_stop_read_resp();
nsapi_error_t err = _at.at_cmd_discard("+NSOCL", "=", "%d", sock_id);
tr_info("Close socket: %d error: %d", sock_id, _at.get_last_error());
tr_info("Close socket: %d error: %d", sock_id, err);
return _at.get_last_error();
return err;
}
nsapi_error_t QUECTEL_BC95_CellularStack::create_socket_impl(CellularSocket *socket)
@ -145,54 +142,23 @@ nsapi_error_t QUECTEL_BC95_CellularStack::create_socket_impl(CellularSocket *soc
bool socketOpenWorking = false;
if (socket->proto == NSAPI_UDP) {
_at.cmd_start("AT+NSOCR=DGRAM,17,");
_at.cmd_start_stop("+NSOCR", "=DGRAM,", "%d%d%d", 17, socket->localAddress.get_port(), 1);
} else if (socket->proto == NSAPI_TCP) {
_at.cmd_start("AT+NSOCR=STREAM,6,");
_at.cmd_start_stop("+NSOCR", "=STREAM,", "%d%d%d", 6, socket->localAddress.get_port(), 1);
} else {
return NSAPI_ERROR_PARAMETER;
}
_at.write_int(socket->localAddress.get_port());
_at.write_int(1);
_at.cmd_stop();
_at.resp_start();
sock_id = _at.read_int();
_at.resp_stop();
socketOpenWorking = (_at.get_last_error() == NSAPI_ERROR_OK);
if (!socketOpenWorking) {
_at.cmd_start("AT+NSOCL=0");
_at.cmd_stop_read_resp();
if (socket->proto == NSAPI_UDP) {
_at.cmd_start("AT+NSOCR=DGRAM,17,");
} else if (socket->proto == NSAPI_TCP) {
_at.cmd_start("AT+NSOCR=STREAM,6,");
}
_at.write_int(socket->localAddress.get_port());
_at.write_int(1);
_at.cmd_stop();
_at.resp_start();
sock_id = _at.read_int();
_at.resp_stop();
socketOpenWorking = (_at.get_last_error() == NSAPI_ERROR_OK);
}
if (!socketOpenWorking || (sock_id == -1)) {
tr_error("Socket create failed!");
return NSAPI_ERROR_NO_SOCKET;
}
// Check for duplicate socket id delivered by modem
for (int i = 0; i < BC95_SOCKET_MAX; i++) {
CellularSocket *sock = _socket[i];
if (sock && sock->id != -1 && sock->id == sock_id) {
tr_error("Duplicate socket index: %d, sock_id: %d", i, sock_id);
return NSAPI_ERROR_NO_SOCKET;
}
}
tr_info("Socket create id: %d", sock_id);
socket->id = sock_id;
@ -261,10 +227,8 @@ nsapi_size_or_error_t QUECTEL_BC95_CellularStack::socket_recvfrom_impl(CellularS
int port;
char ip_address[NSAPI_IP_SIZE];
_at.cmd_start("AT+NSORF=");
_at.write_int(socket->id);
_at.write_int(size <= PACKET_SIZE_MAX ? size : PACKET_SIZE_MAX);
_at.cmd_stop();
_at.cmd_start_stop("+NSORF", "=", "%d%d", socket->id, size < PACKET_SIZE_MAX ? size : PACKET_SIZE_MAX);
_at.resp_start();
// receiving socket id
_at.skip_param();

View File

@ -136,8 +136,7 @@ nsapi_error_t QUECTEL_BG96::soft_power_on()
// check if modem was silently powered on
_at->clear_error();
_at->set_at_timeout(100);
_at->cmd_start("AT");
_at->cmd_stop_read_resp();
_at->at_cmd_discard("", ""); //Send AT
_at->restore_at_timeout();
}
return _at->unlock_return_error();
@ -161,11 +160,9 @@ nsapi_error_t QUECTEL_BG96::init()
_at->lock();
_at->flush();
_at->cmd_start("ATE0"); // echo off
_at->cmd_stop_read_resp();
_at->at_cmd_discard("E0", ""); // echo off
_at->cmd_start("AT+CMEE=1"); // verbose responses
_at->cmd_stop_read_resp();
_at->at_cmd_discard("+CMEE", "=1"); // verbose responses
if (_at->get_last_error() != NSAPI_ERROR_OK) {
return _at->unlock_return_error();
@ -173,8 +170,7 @@ nsapi_error_t QUECTEL_BG96::init()
do {
_at->clear_error();
_at->cmd_start("AT+CFUN=1"); // set full functionality
_at->cmd_stop_read_resp();
_at->at_cmd_discard("+CFUN", "=1"); // set full functionality
if (_at->get_last_error() == NSAPI_ERROR_OK) {
break;
}

View File

@ -20,8 +20,7 @@ nsapi_size_or_error_t QUECTEL_BG96_ControlPlane_netif::recv(void *buffer, nsapi_
{
_at.lock();
_at.cmd_start("AT+QCFGEXT=\"nipdr\",0");
_at.cmd_stop();
_at.cmd_start_stop("QCFGEXT", "=", "%s%d", "nipdr", 0);
_at.resp_start("+QCFGEXT: ");
// skip 3 params: "nipdr",<total_receive_length>,<have_read_length>
_at.skip_param(3);
@ -34,9 +33,7 @@ nsapi_size_or_error_t QUECTEL_BG96_ControlPlane_netif::recv(void *buffer, nsapi_
return NSAPI_ERROR_WOULD_BLOCK;
}
_at.cmd_start("AT+QCFGEXT=\"nipdr\",");
_at.write_int(unread_length);
_at.cmd_stop();
_at.cmd_start_stop("QCFGEXT", "=", "%s%d", "nipdr", unread_length);
_at.resp_start("+QCFGEXT:");
// skip "nipdr"

View File

@ -52,34 +52,28 @@ nsapi_error_t QUECTEL_M26::get_sim_state(SimState &state)
char buf[13];
_at->lock();
_at->cmd_start("AT+CPIN?");
_at->cmd_stop();
_at->resp_start("+CPIN:");
if (_at->info_resp()) {
_at->read_string(buf, 13);
tr_debug("CPIN: %s", buf);
if (memcmp(buf, "READY", 5) == 0) {
state = SimStateReady;
} else if (memcmp(buf, "SIM PIN", 7) == 0) {
state = SimStatePinNeeded;
} else if (memcmp(buf, "SIM PUK", 7) == 0) {
state = SimStatePukNeeded;
} else if (memcmp(buf, "PH_SIM PIN", 10) == 0) {
state = SimStatePinNeeded;
} else if (memcmp(buf, "PH_SIM PUK", 10) == 0) {
state = SimStatePukNeeded;
} else if (memcmp(buf, "SIM PIN2", 8) == 0) {
state = SimStatePinNeeded;
} else if (memcmp(buf, "SIM PUK2", 8) == 0) {
state = SimStatePukNeeded;
} else {
state = SimStateUnknown; // SIM may not be ready yet
}
nsapi_error_t err = _at->at_cmd_str("+CPIN", "?", buf, 13);
tr_debug("CPIN: %s", buf);
if (memcmp(buf, "READY", 5) == 0) {
state = SimStateReady;
} else if (memcmp(buf, "SIM PIN", 7) == 0) {
state = SimStatePinNeeded;
} else if (memcmp(buf, "SIM PUK", 7) == 0) {
state = SimStatePukNeeded;
} else if (memcmp(buf, "PH_SIM PIN", 10) == 0) {
state = SimStatePinNeeded;
} else if (memcmp(buf, "PH_SIM PUK", 10) == 0) {
state = SimStatePukNeeded;
} else if (memcmp(buf, "SIM PIN2", 8) == 0) {
state = SimStatePinNeeded;
} else if (memcmp(buf, "SIM PUK2", 8) == 0) {
state = SimStatePukNeeded;
} else {
state = SimStateUnknown; // SIM may not be ready yet
}
_at->resp_stop();
return _at->unlock_return_error();
return err;
}
AT_CellularContext *QUECTEL_M26::create_context_impl(ATHandler &at, const char *apn, bool cp_req, bool nonip_req)
@ -89,13 +83,7 @@ AT_CellularContext *QUECTEL_M26::create_context_impl(ATHandler &at, const char *
nsapi_error_t QUECTEL_M26::shutdown()
{
_at->lock();
_at->cmd_start("AT+QPOWD=0");
_at->cmd_stop();
_at->resp_start();
_at->resp_stop();
return _at->unlock_return_error();;
return _at->at_cmd_discard("+QPOWD", "=0");
}

View File

@ -36,22 +36,17 @@ NetworkStack *QUECTEL_M26_CellularContext::get_stack()
nsapi_error_t QUECTEL_M26_CellularContext::do_user_authentication()
{
_at.cmd_start("AT+QICSGP=");
_at.write_int(1); /*GPRS MODE = 1, CSD MODE = 0*/
_at.write_string(_apn);
nsapi_error_t err = NSAPI_ERROR_OK;
if (_pwd && _uname) {
_at.write_string(_uname);
_at.write_string(_pwd);
err = _at.at_cmd_discard("^SISO", "=", "%d%s%s%s", 1, _apn, _uname, _pwd);
} else {
err = _at.at_cmd_discard("^SISO", "=", "%d%s", 1, _apn);
}
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
if (_at.get_last_error() != NSAPI_ERROR_OK) {
if (err != NSAPI_ERROR_OK) {
return NSAPI_ERROR_AUTH_FAILURE;
}
return NSAPI_ERROR_OK;
return err;
}
} /* namespace mbed */

View File

@ -27,11 +27,5 @@ QUECTEL_M26_CellularInformation::QUECTEL_M26_CellularInformation(ATHandler &atHa
// According to M26_AT_Commands_Manual_V1.9
nsapi_error_t QUECTEL_M26_CellularInformation::get_iccid(char *buf, size_t buf_size)
{
_at.lock();
_at.cmd_start("AT+CCID");
_at.cmd_stop();
_at.resp_start("+CCID:");
_at.read_string(buf, buf_size);
_at.resp_stop();
return _at.unlock_return_error();
return _at.at_cmd_str("+CCID", "", buf, buf_size);
}

View File

@ -137,11 +137,7 @@ nsapi_error_t QUECTEL_M26_CellularStack::socket_stack_init()
_at.lock();
/*AT+QIFGCNT=0*/
_at.cmd_start("AT+QIFGCNT=");
_at.write_int(0); /* Set the Context 0 as the foreground context.*/
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
_at.at_cmd_discard("+QIFGCNT", "=", "%d", 0);
ret_val = _at.get_last_error();
if (ret_val != NSAPI_ERROR_OK) {
@ -149,17 +145,12 @@ nsapi_error_t QUECTEL_M26_CellularStack::socket_stack_init()
return NSAPI_ERROR_DEVICE_ERROR;
}
#if 0
/*AT+QICSGP=1*/
_at.cmd_start("AT+QICSGP=");
_at.write_int(1); /* mode: 0-CSD, 1-GPRS */
_at.write_string(_apn);
if (_pwd && _uname) {
_at.write_string(_uname);
_at.write_string(_pwd);
_at.at_cmd_discard("+QICSGP", "=", "%d%s%s%s", 1, _apn, _uname, _pwd);
} else {
_at.at_cmd_discard("+QICSGP", "=", "%d%s", 1, _apn);
}
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
#endif
ret_val = _at.get_last_error();
if (ret_val != NSAPI_ERROR_OK) {
@ -168,19 +159,15 @@ nsapi_error_t QUECTEL_M26_CellularStack::socket_stack_init()
}
/*AT+QIMODE=0 Set transparent mode*/
_at.cmd_start("AT+QIMODE?");
_at.cmd_stop();
_at.cmd_start_stop("+QIMODE", "?");
_at.resp_start("+QIMODE:");
if (_at.info_resp()) {
tcpip_mode = _at.read_int();
}
_at.resp_stop();
if (tcpip_mode) {
_at.cmd_start("AT+QIMOD=");
_at.write_int(0); /* 0-Disable, 1-Enable */
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
_at.at_cmd_discard("+QIMODE", "=", "%d", 0);
}
ret_val = _at.get_last_error();
if (ret_val != NSAPI_ERROR_OK) {
@ -189,19 +176,15 @@ nsapi_error_t QUECTEL_M26_CellularStack::socket_stack_init()
}
/*AT+QIMUX=1*/
_at.cmd_start("AT+QIMUX?");
_at.cmd_stop();
_at.cmd_start_stop("+QIMUX", "?");
_at.resp_start("+QIMUX:");
if (_at.info_resp()) {
mux_mode = _at.read_int();
}
_at.resp_stop();
if (!mux_mode) {
_at.cmd_start("AT+QIMUX=");
_at.write_int(1); /* 0-Disable, 1-Enable */
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
_at.at_cmd_discard("+QIMUX", "=", "%d", 1);
}
ret_val = _at.get_last_error();
if (ret_val != NSAPI_ERROR_OK) {
@ -210,19 +193,15 @@ nsapi_error_t QUECTEL_M26_CellularStack::socket_stack_init()
}
/*AT+QINDI=2*/
_at.cmd_start("AT+QINDI?");
_at.cmd_stop();
_at.cmd_start_stop("+QINDI", "?");
_at.resp_start();
if (_at.info_resp()) {
cache_mode = _at.read_int();
}
_at.resp_stop();
if (cache_mode != 2) {
_at.cmd_start("AT+QINDI=");
_at.write_int(2); /* 0-Disable, 1-Single Cache, 2-Multi Cache */
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
_at.at_cmd_discard("+QINDI", "=", "%d", 2);
}
ret_val = _at.get_last_error();
@ -251,13 +230,7 @@ nsapi_error_t QUECTEL_M26_CellularStack::socket_close_impl(int sock_id)
{
tr_debug("QUECTEL_M26_CellularStack:%s:%u:", __FUNCTION__, __LINE__);
_at.cmd_start("AT+QICLOSE=");
_at.write_int(sock_id);
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
return _at.get_last_error();
return _at.at_cmd_discard("+QICLOSE", "=", "%d", sock_id);
}
void QUECTEL_M26_CellularStack::handle_open_socket_response(int &modem_connect_id, int &err)
@ -312,28 +285,16 @@ nsapi_error_t QUECTEL_M26_CellularStack::socket_connect(nsapi_socket_t handle, c
_at.lock();
if (socket->proto == NSAPI_TCP) {
_at.cmd_start("AT+QIOPEN=");
_at.write_int(request_connect_id);
_at.write_string("TCP");
_at.write_string(address.get_ip_address());
_at.write_int(address.get_port());
_at.cmd_stop();
_at.cmd_start_stop("+QIOPEN", "=", "%d%s%s%d", request_connect_id, "TCP",
address.get_ip_address(), address.get_port());;
handle_open_socket_response(modem_connect_id, err);
if ((_at.get_last_error() == NSAPI_ERROR_OK) && err) {
_at.cmd_start("AT+QICLOSE=");
_at.write_int(modem_connect_id);
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
_at.at_cmd_discard("+QICLOSE", "=", "%d", modem_connect_id);
_at.cmd_start("AT+QIOPEN=");
_at.write_int(request_connect_id);
_at.write_string("TCP");
_at.write_string(address.get_ip_address());
_at.write_int(address.get_port());
_at.cmd_stop();
_at.cmd_start_stop("+QIOPEN", "=", "%d%s%s%d", request_connect_id, "TCP",
address.get_ip_address(), address.get_port());
handle_open_socket_response(modem_connect_id, err);
}
@ -341,11 +302,7 @@ nsapi_error_t QUECTEL_M26_CellularStack::socket_connect(nsapi_socket_t handle, c
// If opened successfully BUT not requested one, close it
if (!err && (modem_connect_id != request_connect_id)) {
_at.cmd_start("AT+QICLOSE=");
_at.write_int(modem_connect_id);
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
_at.at_cmd_discard("+QICLOSE", "=", "%d", modem_connect_id);
}
nsapi_error_t ret_val = _at.get_last_error();
@ -391,40 +348,24 @@ nsapi_error_t QUECTEL_M26_CellularStack::create_socket_impl(CellularSocket *sock
tr_debug("QUECTEL_M26_CellularStack:%s:%u:[%d,%d]", __FUNCTION__, __LINE__, socket->proto, socket->connected);
if (socket->connected) {
_at.cmd_start("AT+QIOPEN=");
_at.write_int(request_connect_id);
_at.write_string((socket->proto == NSAPI_TCP) ? "TCP" : "UDP");
_at.write_string(socket->remoteAddress.get_ip_address());
_at.write_int(socket->remoteAddress.get_port());
_at.cmd_stop();
_at.cmd_start_stop("+QIOPEN", "=", "%d%s%s%d", request_connect_id, (socket->proto == NSAPI_TCP) ? "TCP" : "UDP",
socket->remoteAddress.get_ip_address(), socket->remoteAddress.get_port());
handle_open_socket_response(modem_connect_id, err);
/* Close and retry if socket create fail */
if ((_at.get_last_error() != NSAPI_ERROR_OK) || err) {
_at.cmd_start("AT+QICLOSE=");
_at.write_int(modem_connect_id);
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
_at.at_cmd_discard("+QICLOSE", "=", "%d", modem_connect_id);
_at.cmd_start("AT+QIOPEN=");
_at.write_int(request_connect_id);
_at.write_string((socket->proto == NSAPI_TCP) ? "TCP" : "UDP");
_at.write_string(socket->remoteAddress.get_ip_address());
_at.write_int(socket->remoteAddress.get_port());
_at.cmd_stop();
_at.cmd_start_stop("+QIOPEN", "=", "%d%s%s%d", request_connect_id, (socket->proto == NSAPI_TCP) ? "TCP" : "UDP",
socket->remoteAddress.get_ip_address(), socket->remoteAddress.get_port());
handle_open_socket_response(modem_connect_id, err);
}
/* If opened successfully BUT not requested one, close it */
if (!err && (modem_connect_id != request_connect_id)) {
_at.cmd_start("AT+QICLOSE=");
_at.write_int(modem_connect_id);
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
_at.at_cmd_discard("+QICLOSE", "=", "%d", modem_connect_id);
}
ret_val = _at.get_last_error();
@ -472,9 +413,7 @@ nsapi_size_or_error_t QUECTEL_M26_CellularStack::socket_sendto_impl(CellularSock
bool ready_to_send = false;
uint64_t start_time = rtos::Kernel::get_ms_count();
while (!ready_to_send && start_time < rtos::Kernel::get_ms_count() + SOCKET_SEND_READY_TIMEOUT) {
_at.cmd_start("AT+QISACK=");
_at.write_int(socket->id);
_at.cmd_stop();
_at.cmd_start_stop("+QISACK", "=", "%d", socket->id);
_at.resp_start("+QISACK:");
sent_len_before = _at.read_int();
sent_acked = _at.read_int();
@ -494,10 +433,7 @@ nsapi_size_or_error_t QUECTEL_M26_CellularStack::socket_sendto_impl(CellularSock
}
}
_at.cmd_start("AT+QISEND=");
_at.write_int(socket->id);
_at.write_int(sent_len);
_at.cmd_stop();
_at.cmd_start_stop("+QISEND", "=", "%d%d", socket->id, sent_len);
_at.resp_start(">");
_at.write_bytes((uint8_t *)data, sent_len);
@ -510,9 +446,7 @@ nsapi_size_or_error_t QUECTEL_M26_CellularStack::socket_sendto_impl(CellularSock
}
if (socket->proto == NSAPI_TCP) {
_at.cmd_start("AT+QISACK=");
_at.write_int(socket->id);
_at.cmd_stop();
_at.cmd_start_stop("+QISACK", "=", "%d", socket->id);
_at.resp_start("+QISACK:");
sent_len_after = _at.read_int();
@ -555,12 +489,8 @@ nsapi_size_or_error_t QUECTEL_M26_CellularStack::socket_recvfrom_impl(CellularSo
nsapi_size_t len = 0;
for (; len < size;) {
unsigned int read_len = (size - len > M26_RECV_BYTE_MAX) ? M26_RECV_BYTE_MAX : size - len;
_at.cmd_start("AT+QIRD=");
_at.write_int(0); /* at+qifgcnt 0-1 */
_at.write_int(1); /* 1-Client, 2-Server */
_at.write_int(socket->id);
_at.write_int(read_len);
_at.cmd_stop();
_at.cmd_start_stop("+QIRD", "=", "%d%d%d%d", 0, 1, socket->id, read_len);
nsapi_size_t recv_len = 0;
_at.resp_start("+QIRD:");

View File

@ -29,23 +29,16 @@ QUECTEL_UG96_CellularContext::~QUECTEL_UG96_CellularContext()
nsapi_error_t QUECTEL_UG96_CellularContext::do_user_authentication()
{
nsapi_error_t err = NSAPI_ERROR_OK;
if (_pwd && _uname) {
_at.cmd_start("AT+QICSGP=");
_at.write_int(_cid);
_at.write_int(1); // context type 1=IPv4
_at.write_string(_apn);
_at.write_string(_uname);
_at.write_string(_pwd);
_at.write_int(_authentication_type);
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
if (_at.get_last_error() != NSAPI_ERROR_OK) {
err = _at.at_cmd_discard("+QICSGP", "=", "%d%d%s%s%s%d", _cid, 1, _apn,
_uname, _pwd, _authentication_type);
if (err != NSAPI_ERROR_OK) {
return NSAPI_ERROR_AUTH_FAILURE;
}
}
return NSAPI_ERROR_OK;
return err;
}
} /* namespace mbed */

View File

@ -71,18 +71,14 @@ nsapi_error_t RM1000_AT::init()
_at->lock();
_at->flush();
_at->cmd_start("ATE0"); // echo off
_at->cmd_stop_read_resp();
_at->at_cmd_discard("E0", ""); // echo off
_at->cmd_start("AT+SIM=physical");
_at->cmd_stop_read_resp();
_at->at_cmd_discard("+SIM", "=physical");
_at->set_at_timeout(5000);
_at->cmd_start("AT+CFUN=1"); // set full functionality
_at->cmd_stop_read_resp();
_at->at_cmd_discard("+CFUN", "=1"); // set full functionality
_at->cmd_start("AT+VERBOSE=0"); // verbose responses
_at->cmd_stop_read_resp();
_at->at_cmd_discard("+VERBOSE", "=0"); // verbose responses
return _at->unlock_return_error();
}

View File

@ -103,29 +103,17 @@ nsapi_error_t RM1000_AT_CellularStack::create_socket_impl(CellularSocket *socket
int sock_id = SOCKET_UNUSED;
_at.lock();
nsapi_error_t err = NSAPI_ERROR_OK;
if (socket->proto == NSAPI_UDP) {
_at.cmd_start("AT+RSOCR=0");
_at.cmd_stop();
_at.resp_start("+RSOCR:");
sock_id = _at.read_int();
_at.resp_stop();
err = _at.at_cmd_int("+RSOCR", "=0", sock_id);
} else if (socket->proto == NSAPI_TCP) {
_at.cmd_start("AT+RSOCR=1");
_at.cmd_stop();
_at.resp_start("+RSOCR:");
sock_id = _at.read_int();
_at.resp_stop();
err = _at.at_cmd_int("+RSOCR", "=1", sock_id);
} // Unsupported protocol is checked in "is_protocol_supported" function
if ((_at.get_last_error() != NSAPI_ERROR_OK) || (sock_id == -1)) {
_at.unlock();
tr_error("RM1000_AT_CellularStack::create_socket_impl error sock_id=%d err=%d", sock_id, _at.get_last_error());
if ((err != NSAPI_ERROR_OK) || (sock_id == -1)) {
tr_error("RM1000_AT_CellularStack::create_socket_impl error sock_id=%d err=%d", sock_id, err);
return NSAPI_ERROR_NO_SOCKET;
}
_at.unlock();
// Check for duplicate socket id delivered by modem
for (int i = 0; i < RM1000_MAX_SOCKET; i++) {
@ -137,7 +125,7 @@ nsapi_error_t RM1000_AT_CellularStack::create_socket_impl(CellularSocket *socket
socket->id = sock_id;
return NSAPI_ERROR_OK;
return err;
}
nsapi_error_t RM1000_AT_CellularStack::socket_connect(nsapi_socket_t handle, const SocketAddress &addr)
@ -258,10 +246,7 @@ nsapi_size_or_error_t RM1000_AT_CellularStack::socket_recvfrom_impl(CellularSock
read_blk = size;
}
if (socket->pending_bytes > 0) {
_at.cmd_start("AT+RSORCV=");
_at.write_int(socket->id);
_at.write_int(read_blk);
_at.cmd_stop();
_at.cmd_start_stop("+RSORCV", "=", "%d%d", socket->id, read_blk);
_at.resp_start("+RSORCV:");
_at.skip_param(); // receiving socket id
@ -323,11 +308,7 @@ nsapi_error_t RM1000_AT_CellularStack::socket_close_impl(int sock_id)
{
tr_debug("RM1000_AT_CellularStack::socket_close_impl");
_at.cmd_start("AT+RSOCL=");
_at.write_int(sock_id);
_at.cmd_stop_read_resp();
return _at.get_last_error();
return _at.at_cmd_discard("+RSOCL", "=", "%d", sock_id);
}
// Clear out the storage for a socket

View File

@ -55,11 +55,7 @@ nsapi_error_t TELIT_HE910::init()
if (err != NSAPI_ERROR_OK) {
return err;
}
_at->lock();
_at->cmd_start("AT&K0;&C1;&D0");
_at->cmd_stop_read_resp();
return _at->unlock_return_error();
return _at->at_cmd_discard("&K0;&C1;&D0", "");
}
#if MBED_CONF_TELIT_HE910_PROVIDE_DEFAULT

View File

@ -89,11 +89,10 @@ nsapi_error_t TELIT_ME910::init()
}
_at->lock();
#if defined (MBED_CONF_TELIT_ME910_RTS) && defined (MBED_CONF_TELIT_ME910_CTS)
_at->cmd_start("AT&K3;&C1;&D0");
_at->at_cmd_discard("&K3;&C1;&D0", "");
#else
_at->cmd_start("AT&K0;&C1;&D0");
_at->at_cmd_discard("&K0;&C1;&D0", "");
#endif
_at->cmd_stop_read_resp();
// AT#QSS=1
// Enable the Query SIM Status unsolicited indication in the ME. The format of the
@ -104,8 +103,7 @@ nsapi_error_t TELIT_ME910::init()
// <status> values:
// - 0: SIM not inserted
// - 1: SIM inserted
_at->cmd_start("AT#QSS=1");
_at->cmd_stop_read_resp();
_at->at_cmd_discard("#QSS", "=1");
// AT#PSNT=1
// Set command enables unsolicited result code for packet service network type (PSNT)
@ -115,8 +113,7 @@ nsapi_error_t TELIT_ME910::init()
// - 0: GPRS network
// - 4: LTE network
// - 5: unknown or not registered
_at->cmd_start("AT#PSNT=1");
_at->cmd_stop_read_resp();
_at->at_cmd_discard("#PSNT", "=1");
// AT+CMER=2
// Set command enables sending of unsolicited result codes from TA to TE in the case of
@ -124,8 +121,7 @@ nsapi_error_t TELIT_ME910::init()
// Current setting: buffer +CIEV Unsolicited Result Codes in the TA when TA-TE link is
// reserved (e.g. on-line data mode) and flush them to the TE after
// reservation; otherwise forward them directly to the TE
_at->cmd_start("AT+CMER=2");
_at->cmd_stop_read_resp();
_at->at_cmd_discard("+CMER", "=2");
// AT+CMEE=2
// Set command disables the use of result code +CME ERROR: <err> as an indication of an
@ -133,16 +129,14 @@ nsapi_error_t TELIT_ME910::init()
// ERROR: <err> final result code instead of the default ERROR final result code. ERROR is returned
// normally when the error message is related to syntax, invalid parameters or DTE functionality.
// Current setting: enable and use verbose <err> values
_at->cmd_start("AT+CMEE=2");
_at->cmd_stop_read_resp();
_at->at_cmd_discard("+CMEE", "=2");
// AT&W&P
// - AT&W: Execution command stores on profile <n> the complete configuration of the device. If
// parameter is omitted, the command has the same behavior of AT&W0.
// - AT&P: Execution command defines which full profile will be loaded at startup. If parameter
// is omitted, the command has the same behavior as AT&P0
_at->cmd_start("AT&W&P");
_at->cmd_stop_read_resp();
_at->at_cmd_discard("&W&P", "");
return _at->unlock_return_error();
}

View File

@ -36,8 +36,8 @@ bool TELIT_ME910_CellularContext::get_context()
{
bool modem_supports_ipv6 = get_property(PROPERTY_IPV6_PDP_TYPE);
bool modem_supports_ipv4 = get_property(PROPERTY_IPV4_PDP_TYPE);
_at.cmd_start("AT+CGDCONT?");
_at.cmd_stop();
_at.cmd_start_stop("+CGDCONT", "?");
_at.resp_start("+CGDCONT:");
_cid = -1;
int cid_max = 0; // needed when creating new context

View File

@ -92,32 +92,24 @@ nsapi_error_t UBLOX_AT::init()
{
_at->lock();
_at->flush();
_at->cmd_start("AT");
_at->cmd_stop_read_resp();
_at->at_cmd_discard("", "");
#ifdef TARGET_UBLOX_C027
_at->cmd_start("AT+CFUN=0");
_at->cmd_stop_read_resp();
_at->at_cmd_discard("+CFUN", "=0");
if (_at->get_last_error() == NSAPI_ERROR_OK) {
_at->cmd_start("ATE0"); // echo off
_at->cmd_stop_read_resp();
_at->cmd_start("AT+CMEE=1"); // verbose responses
_at->cmd_stop_read_resp();
_at->at_cmd_discard("E0", ""); // echo off
_at->at_cmd_discard("+CMEE", "=1"); // verbose responses
config_authentication_parameters();
_at->cmd_start("AT+CFUN=1"); // set full functionality
_at->cmd_stop_read_resp();
_at->at_cmd_discard("+CFUN", "=1"); // set full functionality
}
#else
_at->cmd_start("AT+CFUN=4");
_at->cmd_stop_read_resp();
_at->at_cmd_discard("+CFUN", "=4");
if (_at->get_last_error() == NSAPI_ERROR_OK) {
_at->cmd_start("ATE0"); // echo off
_at->cmd_stop_read_resp();
_at->cmd_start("AT+CMEE=1"); // verbose responses
_at->cmd_stop_read_resp();
_at->at_cmd_discard("E0", ""); // echo off
_at->at_cmd_discard("+CMEE", "=1"); // verbose responses
config_authentication_parameters();
_at->cmd_start("AT+CFUN=1"); // set full functionality
_at->cmd_stop_read_resp();
_at->at_cmd_discard("+CFUN", "=1"); // set full functionality
}
#endif
@ -156,59 +148,27 @@ nsapi_error_t UBLOX_AT::set_authentication_parameters(const char *apn,
{
int modem_security = ubx_context->nsapi_security_to_modem_security(auth);
_at->cmd_start("AT+CGDCONT=1,\"IP\",");
_at->write_string(apn);
_at->cmd_stop();
_at->resp_start();
_at->resp_stop();
nsapi_error_t err = _at->at_cmd_discard("+CGDCONT", "=", "%d%s%s", 1, "IP", apn);
if (_at->get_last_error() == NSAPI_ERROR_OK) {
if (err == NSAPI_ERROR_OK) {
#ifdef TARGET_UBLOX_C030_R41XM
if (modem_security == CellularContext::CHAP) {
_at->cmd_start("AT+UAUTHREQ=1,");
_at->write_int(modem_security);
_at->write_string(password);
_at->write_string(username);
_at->cmd_stop();
_at->resp_start();
_at->resp_stop();
err = _at->at_cmd_discard("+UAUTHREQ", "=", "%d%d%s%s", 1, modem_security, password, username);
} else if (modem_security == CellularContext::NOAUTH) {
_at->cmd_start("AT+UAUTHREQ=1,");
_at->write_int(modem_security);
_at->cmd_stop();
_at->resp_start();
_at->resp_stop();
err = _at->at_cmd_discard("+UAUTHREQ", "=", "%d%d", 1, modem_security);
} else {
_at->cmd_start("AT+UAUTHREQ=1,");
_at->write_int(modem_security);
_at->write_string(username);
_at->write_string(password);
_at->cmd_stop();
_at->resp_start();
_at->resp_stop();
err = _at->at_cmd_discard("+UAUTHREQ", "=", "%d%d%s%s", 1, modem_security, username, password);
}
#else
_at->cmd_start("AT+UAUTHREQ=1,");
_at->write_int(modem_security);
_at->write_string(username);
_at->write_string(password);
_at->cmd_stop();
_at->resp_start();
_at->resp_stop();
err = _at->at_cmd_discard("+UAUTHREQ", "=", "%d%d%s%s", 1, modem_security, username, password);
#endif
}
return _at->get_last_error();
return err;
}
nsapi_error_t UBLOX_AT::get_imsi(char *imsi)
{
_at->lock();
_at->cmd_start("AT+CIMI");
_at->cmd_stop();
_at->resp_start();
_at->read_string(imsi, MAX_IMSI_LENGTH + 1);
_at->resp_stop();
return _at->unlock_return_error();
//Special case: Command put in cmd_chr to make a 1 liner
return _at->at_cmd_str("", "+CIMI", imsi, MAX_IMSI_LENGTH + 1);
}

View File

@ -62,13 +62,9 @@ void UBLOX_AT_CellularContext::do_connect()
if (rat == CellularNetwork::RadioAccessTechnology::RAT_EGPRS) {
if (!_is_context_active) {
_at.set_at_timeout(150 * 1000);
_at.cmd_start("AT+CGACT=1,1");
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
_at.at_cmd_discard("+CGACT", "=", "%d%d", 1, 1);
_at.cmd_start("AT+CGACT?");
_at.cmd_stop();
_at.cmd_start_stop("+CGACT", "?");
_at.resp_start("+CGACT:");
_at.skip_param(1);
_is_context_activated = _at.read_int();
@ -117,8 +113,7 @@ nsapi_error_t UBLOX_AT_CellularContext::define_context()
return err;
}
_at.cmd_start("AT+UPSND=" PROFILE ",8");
_at.cmd_stop();
_at.cmd_start_stop("+UPSND", "=", "%d%d", PROFILE, 8);
_at.resp_start("+UPSND:");
_at.skip_param(2);
active = _at.read_int();
@ -164,70 +159,41 @@ bool UBLOX_AT_CellularContext::activate_profile(const char *apn,
// Set up the APN
if (apn) {
success = false;
_at.cmd_start("AT+UPSD=" PROFILE ",1,");
_at.write_string(apn);
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
if (_at.get_last_error() == NSAPI_ERROR_OK) {
if (_at.at_cmd_discard("+UPSD", "=", "%d%d%s", PROFILE, 1, apn) == NSAPI_ERROR_OK) {
success = true;
}
}
// Set up the UserName
if (success && username) {
success = false;
_at.cmd_start("AT+UPSD=" PROFILE ",2,");
_at.write_string(username);
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
if (_at.get_last_error() == NSAPI_ERROR_OK) {
if (_at.at_cmd_discard("+UPSD", "=", "%d%d%s", PROFILE, 2, username) == NSAPI_ERROR_OK) {
success = true;
}
}
// Set up the Password
if (success && password) {
success = false;
_at.cmd_start("AT+UPSD=" PROFILE ",3,");
_at.write_string(password);
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
if (_at.get_last_error() == NSAPI_ERROR_OK) {
if (_at.at_cmd_discard("+UPSD", "=", "%d%d%s", PROFILE, 3, password) == NSAPI_ERROR_OK) {
success = true;
}
}
if (success) {
_at.cmd_start("AT+UPSD=" PROFILE ",7,\"0.0.0.0\"");
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
_at.at_cmd_discard("+UPSD", "=", "%d%d%s", PROFILE, 7, "0.0.0.0");
_at.cmd_start("AT+UPSD=" PROFILE ",6,");
_at.write_int(nsapi_security_to_modem_security(auth));
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
if (_at.get_last_error() == NSAPI_ERROR_OK) {
if (_at.at_cmd_discard("+UPSD", "=", "%d%d%d", PROFILE, 6, nsapi_security_to_modem_security(auth)) == NSAPI_ERROR_OK) {
// Activate, wait upto 30 seconds for the connection to be made
_at.set_at_timeout(30000);
_at.cmd_start("AT+UPSDA=" PROFILE ",3");
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
nsapi_error_t err = _at.at_cmd_discard("+UPSDA", "=", "%d%d", PROFILE, 3);
_at.restore_at_timeout();
if (_at.get_last_error() == NSAPI_ERROR_OK) {
if (err == NSAPI_ERROR_OK) {
Timer t1;
t1.start();
while (!(t1.read() >= 180)) {
_at.cmd_start("AT+UPSND=" PROFILE ",8");
_at.cmd_stop();
_at.cmd_start_stop("+UPSND", "=", "%d%d", PROFILE, 8);
_at.resp_start("+UPSND:");
_at.skip_param(2);
_at.read_int() ? activated = true : activated = false;
@ -282,27 +248,19 @@ int UBLOX_AT_CellularContext::nsapi_security_to_modem_security(AuthenticationTyp
// Disconnect the on board IP stack of the modem.
bool UBLOX_AT_CellularContext::disconnect_modem_stack()
{
bool success = false;
if (get_ip_address() != NULL) {
_at.cmd_start("AT+UPSDA=" PROFILE ",4");
_at.cmd_stop();
_at.resp_start();
_at.resp_stop();
if (_at.get_last_error() == NSAPI_ERROR_OK) {
success = true;
if (_at.at_cmd_discard("+UPSDA", "=", "%d%d", PROFILE, 4) == NSAPI_ERROR_OK) {
return true;
}
}
return success;
return false;
}
nsapi_error_t UBLOX_AT_CellularContext::get_imsi(char *imsi)
{
_at.lock();
_at.cmd_start("AT+CIMI");
_at.cmd_stop();
_at.cmd_start_stop("+CIMI", "");
_at.resp_start();
_at.read_string(imsi, MAX_IMSI_LENGTH + 1);
_at.resp_stop();
@ -351,11 +309,7 @@ CellularNetwork::RadioAccessTechnology UBLOX_AT_CellularContext::read_radio_tech
int act;
CellularNetwork::RadioAccessTechnology rat;
_at.cmd_start("AT+URAT?");
_at.cmd_stop();
_at.resp_start("+URAT:");
act = _at.read_int();
_at.resp_stop();
_at.at_cmd_int("+URAT", "?", act);
switch (act) {
case 0:

View File

@ -46,30 +46,25 @@ nsapi_error_t UBLOX_AT_CellularNetwork::set_access_technology_impl(RadioAccessTe
switch (opRat) {
case RAT_EGPRS:
#if defined (TARGET_UBLOX_C030_R412M)
_at.cmd_start("AT+URAT=9,8");
_at.cmd_stop_read_resp();
_at.at_cmd_discard("+URAT", "=", "%d%d", 9, 8);
break;
#endif
#if defined(TARGET_UBLOX_C030_U201)
case RAT_GSM:
_at.cmd_start("AT+URAT=0,0");
_at.cmd_stop_read_resp();
_at.at_cmd_discard("+URAT", "=", "%d%d", 0, 0);
break;
case RAT_UTRAN:
case RAT_HSDPA:
case RAT_HSUPA:
case RAT_HSDPA_HSUPA:
_at.cmd_start("AT+URAT=2,2");
_at.cmd_stop_read_resp();
_at.at_cmd_discard("+URAT", "=", "%d%d", 2, 2);
break;
#elif defined(TARGET_UBLOX_C030_R41XM)
case RAT_CATM1:
_at.cmd_start("AT+URAT=7,8");
_at.cmd_stop_read_resp();
_at.at_cmd_discard("+URAT", "=", "%d%d", 7, 8);
break;
case RAT_NB1:
_at.cmd_start("AT+URAT=8,7");
_at.cmd_stop_read_resp();
_at.at_cmd_discard("+URAT", "=", "%d%d", 8, 7);
break;
#endif
default:
@ -86,22 +81,22 @@ nsapi_error_t UBLOX_AT_CellularNetwork::set_access_technology_impl(RadioAccessTe
nsapi_error_t UBLOX_AT_CellularNetwork::ubx_reboot()
{
_at.lock();
_at.cmd_start("AT+CFUN=15");
_at.cmd_stop_read_resp();
_at.at_cmd_discard("+CFUN", "=15");
nsapi_error_t err = NSAPI_ERROR_OK;
Timer t1;
t1.start();
while (!(t1.read() >= 30)) {
_at.cmd_start("ATE0"); // echo off
_at.cmd_stop_read_resp();
if (_at.get_last_error() == NSAPI_ERROR_OK) {
err = _at.at_cmd_discard("E0", "");
if (err == NSAPI_ERROR_OK) {
break;
} else {
//Don't clear err here so that we get some error in case of failure
_at.clear_error();
wait_ms(1000);
}
}
t1.stop();
_at.unlock();
return _at.get_last_error();
return err;
}

View File

@ -122,28 +122,16 @@ nsapi_error_t UBLOX_AT_CellularStack::create_socket_impl(CellularSocket *socket)
{
int sock_id = SOCKET_UNUSED;
_at.lock();
nsapi_error_t err = NSAPI_ERROR_OK;
if (socket->proto == NSAPI_UDP) {
_at.cmd_start("AT+USOCR=17");
_at.cmd_stop();
_at.resp_start("+USOCR:");
sock_id = _at.read_int();
_at.resp_stop();
err = _at.at_cmd_int("+USOCR", "=17", sock_id);
} else if (socket->proto == NSAPI_TCP) {
_at.cmd_start("AT+USOCR=6");
_at.cmd_stop();
_at.resp_start("+USOCR:");
sock_id = _at.read_int();
_at.resp_stop();
err = _at.at_cmd_int("+USOCR", "=6", sock_id);
} // Unsupported protocol is checked in "is_protocol_supported" function
if ((_at.get_last_error() != NSAPI_ERROR_OK) || (sock_id == -1)) {
_at.unlock();
if ((err != NSAPI_ERROR_OK) || (sock_id == -1)) {
return NSAPI_ERROR_NO_SOCKET;
}
_at.unlock();
// Check for duplicate socket id delivered by modem
for (int i = 0; i < UBLOX_MAX_SOCKET; i++) {
@ -156,7 +144,7 @@ nsapi_error_t UBLOX_AT_CellularStack::create_socket_impl(CellularSocket *socket)
socket->started = true;
socket->id = sock_id;
return NSAPI_ERROR_OK;
return err;
}
nsapi_error_t UBLOX_AT_CellularStack::socket_connect(nsapi_socket_t handle, const SocketAddress &addr)
@ -174,14 +162,7 @@ nsapi_error_t UBLOX_AT_CellularStack::socket_connect(nsapi_socket_t handle, cons
return NSAPI_ERROR_DEVICE_ERROR;
}
_at.lock();
_at.cmd_start("AT+USOCO=");
_at.write_int(socket->id);
_at.write_string(addr.get_ip_address());
_at.write_int(addr.get_port());
_at.cmd_stop_read_resp();
nsapi_error_t err = _at.get_last_error();
_at.unlock();
nsapi_error_t err = _at.at_cmd_discard("+USOCO", "=", "%d%s%d", socket->id, addr.get_ip_address(), addr.get_port());
if (err == NSAPI_ERROR_OK) {
socket->remoteAddress = addr;
@ -206,12 +187,8 @@ nsapi_size_or_error_t UBLOX_AT_CellularStack::socket_sendto_impl(CellularSocket
if (size > UBLOX_MAX_PACKET_SIZE) {
return NSAPI_ERROR_PARAMETER;
}
_at.cmd_start("AT+USOST=");
_at.write_int(socket->id);
_at.write_string(address.get_ip_address());
_at.write_int(address.get_port());
_at.write_int(size);
_at.cmd_stop();
_at.cmd_start_stop("+USOST", "=", "%d%s%d%d", socket->id, address.get_ip_address(), address.get_port(), size);
(void)poll(&fhs, 1, 50);
_at.write_bytes((uint8_t *)data, size);
@ -233,10 +210,8 @@ nsapi_size_or_error_t UBLOX_AT_CellularStack::socket_sendto_impl(CellularSocket
if (count < blk) {
blk = count;
}
_at.cmd_start("AT+USOWR=");
_at.write_int(socket->id);
_at.write_int(blk);
_at.cmd_stop();
_at.cmd_start_stop("+USOWR", "=", "%d%d", socket->id, blk);
(void)poll(&fhs, 1, 50);
_at.write_bytes((uint8_t *)buf, blk);
@ -293,10 +268,7 @@ nsapi_size_or_error_t UBLOX_AT_CellularStack::socket_recvfrom_impl(CellularSocke
read_blk = size;
}
if (socket->pending_bytes > 0) {
_at.cmd_start("AT+USORF=");
_at.write_int(socket->id);
_at.write_int(read_blk);
_at.cmd_stop();
_at.cmd_start_stop("+USORF", "=", "%d%d", socket->id, read_blk);
_at.resp_start("+USORF:");
_at.skip_param(); // receiving socket id
@ -343,10 +315,7 @@ nsapi_size_or_error_t UBLOX_AT_CellularStack::socket_recvfrom_impl(CellularSocke
read_blk = size;
}
if (socket->pending_bytes > 0) {
_at.cmd_start("AT+USORD=");
_at.write_int(socket->id);
_at.write_int(read_blk);
_at.cmd_stop();
_at.cmd_start_stop("+USORD", "=", "%d%d", socket->id, read_blk);
_at.resp_start("+USORD:");
_at.skip_param(); // receiving socket id
@ -405,12 +374,7 @@ nsapi_size_or_error_t UBLOX_AT_CellularStack::socket_recvfrom_impl(CellularSocke
nsapi_error_t UBLOX_AT_CellularStack::socket_close_impl(int sock_id)
{
_at.lock();
_at.cmd_start("AT+USOCL=");
_at.write_int(sock_id);
_at.cmd_stop_read_resp();
return _at.unlock_return_error();
return _at.at_cmd_discard("+USOCL", "=", "%d", sock_id);
}
// Find or create a socket from the list.
@ -448,8 +412,7 @@ void UBLOX_AT_CellularStack::clear_socket(CellularSocket *socket)
const char *UBLOX_AT_CellularStack::get_ip_address()
{
_at.lock();
_at.cmd_start("AT+UPSND=" PROFILE ",0");
_at.cmd_stop();
_at.cmd_start_stop("+UPSND", "=", "%d%d", PROFILE, 0);
_at.resp_start("+UPSND:");
if (_at.info_resp()) {
@ -487,9 +450,7 @@ nsapi_error_t UBLOX_AT_CellularStack::gethostbyname(const char *host, SocketAddr
err = NSAPI_ERROR_OK;
} else {
// This interrogation can sometimes take longer than the usual 8 seconds
_at.cmd_start("AT+UDNSRN=0,");
_at.write_string(host);
_at.cmd_stop();
_at.cmd_start_stop("+UDNSRN", "=0,", "%s", host);
#ifdef TARGET_UBLOX_C030_R41XM
_at.set_at_timeout(70000);
#else

View File

@ -45,7 +45,7 @@ protected: // AT_CellularStack
/** The profile to use (on board the modem).
*/
#define PROFILE "0"
#define PROFILE 0
/** Socket "unused" value.
*/

View File

@ -68,11 +68,9 @@ nsapi_error_t UBLOX_N2XX::init()
{
_at->lock();
_at->flush();
_at->cmd_start("AT");
_at->cmd_stop_read_resp();
_at->at_cmd_discard("", "");
_at->cmd_start("AT+CMEE=1"); // verbose responses
_at->cmd_stop_read_resp();
_at->at_cmd_discard("+CMEE", "=1"); // verbose responses
#ifdef MBED_CONF_NSAPI_DEFAULT_CELLULAR_SIM_PIN
set_pin(MBED_CONF_NSAPI_DEFAULT_CELLULAR_SIM_PIN);
@ -86,12 +84,8 @@ nsapi_error_t UBLOX_N2XX::get_sim_state(SimState &state)
_at->lock();
_at->flush();
_at->cmd_start("AT+CFUN=1");
_at->cmd_stop();
_at->resp_start();
_at->read_string(simstr, sizeof(simstr));
_at->resp_stop();
//Special case: Command put in cmd_chr to make a 1 liner
_at->at_cmd_str("", "+CFUN=1", simstr, sizeof(simstr));
error = _at->unlock_return_error();
int len = strlen(simstr);
@ -143,11 +137,7 @@ nsapi_error_t UBLOX_N2XX::set_pin(const char *sim_pin)
return NSAPI_ERROR_PARAMETER;
}
_at->lock();
_at->cmd_start("AT+NPIN=0,");
_at->write_string(sim_pin);
_at->cmd_stop_read_resp();
return _at->unlock_return_error();
return _at->at_cmd_discard("+NPIN", "=", "%d%s", 0, sim_pin);
}
#if MBED_CONF_UBLOX_N2XX_PROVIDE_DEFAULT

View File

@ -84,10 +84,7 @@ nsapi_error_t UBLOX_N2XX_CellularStack::create_socket_impl(CellularSocket *socke
}
_at.lock();
_at.cmd_start("AT+NSOCR=\"DGRAM\",17,");
_at.write_int(localport);
_at.write_int(1);
_at.cmd_stop();
_at.cmd_start_stop("+NSOCR", "=", "%s%d%d%d", "DGRAM", 17, localport, 1);
_at.resp_start();
sock_id = _at.read_int();
@ -129,13 +126,8 @@ nsapi_size_or_error_t UBLOX_N2XX_CellularStack::socket_sendto_impl(CellularSocke
}
char_str_to_hex_str((const char *)data, size, dataStr);
_at.cmd_start("AT+NSOST=");
_at.write_int(socket->id);
_at.write_string(address.get_ip_address());
_at.write_int(address.get_port());
_at.write_int(size);
_at.write_string(dataStr);
_at.cmd_stop();
_at.cmd_start_stop("+NSOST", "=", "%d%s%d%d%s", socket->id, address.get_ip_address(),
address.get_port(), size, dataStr);
_at.resp_start();
_at.skip_param(); // skip socket id
@ -176,10 +168,7 @@ nsapi_size_or_error_t UBLOX_N2XX_CellularStack::socket_recvfrom_impl(CellularSoc
read_blk = length;
}
if (socket->pending_bytes > 0) {
_at.cmd_start("AT+NSORF=");
_at.write_int(socket->id);
_at.write_int(read_blk);
_at.cmd_stop();
_at.cmd_start_stop("+NSORF", "=", "%d%d", socket->id, read_blk);
_at.resp_start();
_at.skip_param(); // receiving socket id
@ -237,10 +226,5 @@ nsapi_size_or_error_t UBLOX_N2XX_CellularStack::socket_recvfrom_impl(CellularSoc
nsapi_error_t UBLOX_N2XX_CellularStack::socket_close_impl(int sock_id)
{
_at.lock();
_at.cmd_start("AT+NSOCL=");
_at.write_int(sock_id);
_at.cmd_stop_read_resp();
return _at.unlock_return_error();
return _at.at_cmd_discard("+NSOCL", "=", "%d", sock_id);
}