mirror of https://github.com/ARMmbed/mbed-os.git
Cellular: Quectel BC95 TCP socket support
parent
0cd43157d1
commit
1f1b5d3a5a
|
@ -41,6 +41,36 @@ nsapi_error_t QUECTEL_BC95_CellularStack::socket_accept(void *server, void **soc
|
||||||
return NSAPI_ERROR_UNSUPPORTED;
|
return NSAPI_ERROR_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsapi_error_t QUECTEL_BC95_CellularStack::socket_connect(nsapi_socket_t handle, const SocketAddress &address)
|
||||||
|
{
|
||||||
|
CellularSocket *socket = (CellularSocket *)handle;
|
||||||
|
|
||||||
|
_at.lock();
|
||||||
|
if (!socket->created) {
|
||||||
|
const nsapi_error_t error_create = create_socket_impl(socket);
|
||||||
|
if (error_create != NSAPI_ERROR_OK) {
|
||||||
|
return error_create;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_at.cmd_start("AT+NSOCO=");
|
||||||
|
_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.unlock();
|
||||||
|
|
||||||
|
if (_at.get_last_error() == NSAPI_ERROR_OK) {
|
||||||
|
socket->remoteAddress = address;
|
||||||
|
socket->connected = true;
|
||||||
|
return NSAPI_ERROR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NSAPI_ERROR_NO_CONNECTION;
|
||||||
|
}
|
||||||
|
|
||||||
void QUECTEL_BC95_CellularStack::urc_nsonmi()
|
void QUECTEL_BC95_CellularStack::urc_nsonmi()
|
||||||
{
|
{
|
||||||
int sock_id = _at.read_int();
|
int sock_id = _at.read_int();
|
||||||
|
@ -63,7 +93,7 @@ int QUECTEL_BC95_CellularStack::get_max_socket_count()
|
||||||
|
|
||||||
bool QUECTEL_BC95_CellularStack::is_protocol_supported(nsapi_protocol_t protocol)
|
bool QUECTEL_BC95_CellularStack::is_protocol_supported(nsapi_protocol_t protocol)
|
||||||
{
|
{
|
||||||
return (protocol == NSAPI_UDP);
|
return (protocol == NSAPI_UDP || protocol == NSAPI_TCP);
|
||||||
}
|
}
|
||||||
|
|
||||||
nsapi_error_t QUECTEL_BC95_CellularStack::socket_close_impl(int sock_id)
|
nsapi_error_t QUECTEL_BC95_CellularStack::socket_close_impl(int sock_id)
|
||||||
|
@ -85,8 +115,32 @@ nsapi_error_t QUECTEL_BC95_CellularStack::create_socket_impl(CellularSocket *soc
|
||||||
bool socketOpenWorking = false;
|
bool socketOpenWorking = false;
|
||||||
|
|
||||||
if (socket->proto == NSAPI_UDP) {
|
if (socket->proto == NSAPI_UDP) {
|
||||||
|
|
||||||
_at.cmd_start("AT+NSOCR=DGRAM,17,");
|
_at.cmd_start("AT+NSOCR=DGRAM,17,");
|
||||||
|
} else if (socket->proto == NSAPI_TCP) {
|
||||||
|
_at.cmd_start("AT+NSOCR=STREAM,6,");
|
||||||
|
} 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();
|
||||||
|
_at.resp_start();
|
||||||
|
_at.resp_stop();
|
||||||
|
|
||||||
|
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(socket->localAddress.get_port());
|
||||||
_at.write_int(1);
|
_at.write_int(1);
|
||||||
_at.cmd_stop();
|
_at.cmd_stop();
|
||||||
|
@ -95,23 +149,6 @@ nsapi_error_t QUECTEL_BC95_CellularStack::create_socket_impl(CellularSocket *soc
|
||||||
_at.resp_stop();
|
_at.resp_stop();
|
||||||
|
|
||||||
socketOpenWorking = (_at.get_last_error() == NSAPI_ERROR_OK);
|
socketOpenWorking = (_at.get_last_error() == NSAPI_ERROR_OK);
|
||||||
|
|
||||||
if (!socketOpenWorking) {
|
|
||||||
_at.cmd_start("AT+NSOCL=0");
|
|
||||||
_at.cmd_stop();
|
|
||||||
_at.resp_start();
|
|
||||||
_at.resp_stop();
|
|
||||||
|
|
||||||
_at.cmd_start("AT+NSOCR=DGRAM,17,");
|
|
||||||
_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)) {
|
if (!socketOpenWorking || (sock_id == -1)) {
|
||||||
|
@ -145,11 +182,22 @@ nsapi_size_or_error_t QUECTEL_BC95_CellularStack::socket_sendto_impl(CellularSoc
|
||||||
int hexlen = char_str_to_hex_str((const char *)data, size, hexstr);
|
int hexlen = char_str_to_hex_str((const char *)data, size, hexstr);
|
||||||
// NULL terminated for write_string
|
// NULL terminated for write_string
|
||||||
hexstr[hexlen] = 0;
|
hexstr[hexlen] = 0;
|
||||||
_at.cmd_start("AT+NSOST=");
|
|
||||||
_at.write_int(socket->id);
|
if (socket->proto == NSAPI_UDP) {
|
||||||
_at.write_string(address.get_ip_address(), false);
|
_at.cmd_start("AT+NSOST=");
|
||||||
_at.write_int(address.get_port());
|
_at.write_int(socket->id);
|
||||||
_at.write_int(size);
|
_at.write_string(address.get_ip_address(), false);
|
||||||
|
_at.write_int(address.get_port());
|
||||||
|
_at.write_int(size);
|
||||||
|
} else if (socket->proto == NSAPI_TCP) {
|
||||||
|
_at.cmd_start("AT+NSOSD=");
|
||||||
|
_at.write_int(socket->id);
|
||||||
|
_at.write_int(size);
|
||||||
|
} else {
|
||||||
|
delete hexstr;
|
||||||
|
return NSAPI_ERROR_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
_at.write_string(hexstr, false);
|
_at.write_string(hexstr, false);
|
||||||
_at.cmd_stop();
|
_at.cmd_stop();
|
||||||
_at.resp_start();
|
_at.resp_start();
|
||||||
|
|
|
@ -36,6 +36,8 @@ protected: // NetworkStack
|
||||||
virtual nsapi_error_t socket_accept(nsapi_socket_t server,
|
virtual nsapi_error_t socket_accept(nsapi_socket_t server,
|
||||||
nsapi_socket_t *handle, SocketAddress *address = 0);
|
nsapi_socket_t *handle, SocketAddress *address = 0);
|
||||||
|
|
||||||
|
virtual nsapi_error_t socket_connect(nsapi_socket_t handle, const SocketAddress &address);
|
||||||
|
|
||||||
protected: // AT_CellularStack
|
protected: // AT_CellularStack
|
||||||
|
|
||||||
virtual int get_max_socket_count();
|
virtual int get_max_socket_count();
|
||||||
|
|
Loading…
Reference in New Issue