Skip to content

Commit 2da5679

Browse files
author
Ari Parkkila
committed
Cellular: Add BG96 AT driver with DNS support
1 parent 2f136b9 commit 2da5679

File tree

2 files changed

+103
-1
lines changed

2 files changed

+103
-1
lines changed

features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.cpp

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@
2020

2121
using namespace mbed;
2222

23-
QUECTEL_BG96_CellularStack::QUECTEL_BG96_CellularStack(ATHandler &atHandler, int cid, nsapi_ip_stack_t stack_type) : AT_CellularStack(atHandler, cid, stack_type)
23+
QUECTEL_BG96_CellularStack::QUECTEL_BG96_CellularStack(ATHandler &atHandler, int cid, nsapi_ip_stack_t stack_type) : AT_CellularStack(atHandler, cid, stack_type),
24+
_dns_callback(NULL), _dns_version(NSAPI_UNSPEC)
2425
{
2526
_at.set_urc_handler("+QIURC: \"recv", mbed::Callback<void()>(this, &QUECTEL_BG96_CellularStack::urc_qiurc_recv));
2627
_at.set_urc_handler("+QIURC: \"close", mbed::Callback<void()>(this, &QUECTEL_BG96_CellularStack::urc_qiurc_closed));
28+
_at.set_urc_handler("+QIURC: \"dnsgip\",", mbed::Callback<void()>(this, &QUECTEL_BG96_CellularStack::urc_qiurc_dnsgip));
2729
}
2830

2931
QUECTEL_BG96_CellularStack::~QUECTEL_BG96_CellularStack()
@@ -102,6 +104,39 @@ void QUECTEL_BG96_CellularStack::urc_qiurc_closed()
102104
urc_qiurc(URC_CLOSED);
103105
}
104106

107+
bool QUECTEL_BG96_CellularStack::read_dnsgip(SocketAddress &address, nsapi_version_t _dns_version)
108+
{
109+
if (_at.read_int() == 0) {
110+
int count = _at.read_int();
111+
_at.skip_param();
112+
for (; count > 0; count--) {
113+
_at.resp_start("+QIURC: \"dnsgip\",");
114+
char ipAddress[NSAPI_IP_SIZE];
115+
_at.read_string(ipAddress, sizeof(ipAddress));
116+
if (address.set_ip_address(ipAddress)) {
117+
if (_dns_version == NSAPI_UNSPEC || _dns_version == address.get_ip_version()) {
118+
return true;
119+
}
120+
}
121+
}
122+
}
123+
return false;
124+
}
125+
126+
void QUECTEL_BG96_CellularStack::urc_qiurc_dnsgip()
127+
{
128+
if (!_dns_callback) {
129+
return;
130+
}
131+
SocketAddress address;
132+
if (read_dnsgip(address, _dns_version)) {
133+
_dns_callback(NSAPI_ERROR_OK, &address);
134+
} else {
135+
_dns_callback(NSAPI_ERROR_DNS_FAILURE, NULL);
136+
}
137+
_dns_callback = NULL;
138+
}
139+
105140
void QUECTEL_BG96_CellularStack::urc_qiurc(urc_type_t urc_type)
106141
{
107142
_at.lock();
@@ -299,3 +334,57 @@ nsapi_size_or_error_t QUECTEL_BG96_CellularStack::socket_recvfrom_impl(CellularS
299334

300335
return recv_len;
301336
}
337+
338+
nsapi_error_t QUECTEL_BG96_CellularStack::gethostbyname(const char *host, SocketAddress *address,
339+
nsapi_version_t version, const char *interface_name)
340+
{
341+
MBED_ASSERT(host);
342+
MBED_ASSERT(address);
343+
344+
_at.lock();
345+
346+
if (_dns_callback) {
347+
_at.unlock();
348+
return NSAPI_ERROR_BUSY;
349+
}
350+
351+
if (!address->set_ip_address(host)) {
352+
_at.set_at_timeout(60 * 1000); // from BG96_TCP/IP_AT_Commands_Manual_V1.0
353+
_at.at_cmd_discard("+QIDNSGIP", "=", "%d%s", _cid, host);
354+
_at.resp_start("+QIURC: \"dnsgip\",");
355+
_at.restore_at_timeout();
356+
if (!read_dnsgip(*address, version)) {
357+
_at.unlock();
358+
return NSAPI_ERROR_DNS_FAILURE;
359+
}
360+
}
361+
362+
return _at.unlock_return_error();
363+
}
364+
365+
nsapi_value_or_error_t QUECTEL_BG96_CellularStack::gethostbyname_async(const char *host, hostbyname_cb_t callback,
366+
nsapi_version_t version, const char *interface_name)
367+
{
368+
MBED_ASSERT(host);
369+
MBED_ASSERT(callback);
370+
371+
_at.lock();
372+
373+
if (_dns_callback) {
374+
_at.unlock();
375+
return NSAPI_ERROR_BUSY;
376+
}
377+
378+
_at.at_cmd_discard("+QIDNSGIP", "=", "%d%s", _cid, host);
379+
if (!_at.get_last_error()) {
380+
_dns_callback = callback;
381+
_dns_version = version;
382+
}
383+
384+
return _at.unlock_return_error() ? NSAPI_ERROR_DNS_FAILURE : NSAPI_ERROR_OK;
385+
}
386+
387+
nsapi_error_t QUECTEL_BG96_CellularStack::gethostbyname_async_cancel(int id)
388+
{
389+
return NSAPI_ERROR_UNSUPPORTED;
390+
}

features/cellular/framework/targets/QUECTEL/BG96/QUECTEL_BG96_CellularStack.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ class QUECTEL_BG96_CellularStack : public AT_CellularStack {
4848

4949
virtual nsapi_error_t socket_connect(nsapi_socket_t handle, const SocketAddress &address);
5050

51+
virtual nsapi_error_t gethostbyname(const char *host, SocketAddress *address, nsapi_version_t version, const char *interface_name);
52+
virtual nsapi_value_or_error_t gethostbyname_async(const char *host, hostbyname_cb_t callback, nsapi_version_t version = NSAPI_UNSPEC,
53+
const char *interface_name = NULL);
54+
virtual nsapi_error_t gethostbyname_async_cancel(int id);
55+
5156
protected: // AT_CellularStack
5257

5358
virtual int get_max_socket_count();
@@ -71,8 +76,16 @@ class QUECTEL_BG96_CellularStack : public AT_CellularStack {
7176
void urc_qiurc_recv();
7277
// URC handler for socket being closed
7378
void urc_qiurc_closed();
79+
// URC handler for DNS query
80+
void urc_qiurc_dnsgip();
81+
82+
// read DNS query result
83+
bool read_dnsgip(SocketAddress &address, nsapi_version_t _dns_version);
7484

7585
void handle_open_socket_response(int &modem_connect_id, int &err);
86+
87+
hostbyname_cb_t _dns_callback;
88+
nsapi_version_t _dns_version;
7689
};
7790
} // namespace mbed
7891
#endif /* QUECTEL_BG96_CELLULARSTACK_H_ */

0 commit comments

Comments
 (0)