|
20 | 20 |
|
21 | 21 | using namespace mbed;
|
22 | 22 |
|
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) |
24 | 25 | {
|
25 | 26 | _at.set_urc_handler("+QIURC: \"recv", mbed::Callback<void()>(this, &QUECTEL_BG96_CellularStack::urc_qiurc_recv));
|
26 | 27 | _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)); |
27 | 29 | }
|
28 | 30 |
|
29 | 31 | QUECTEL_BG96_CellularStack::~QUECTEL_BG96_CellularStack()
|
@@ -102,6 +104,39 @@ void QUECTEL_BG96_CellularStack::urc_qiurc_closed()
|
102 | 104 | urc_qiurc(URC_CLOSED);
|
103 | 105 | }
|
104 | 106 |
|
| 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 | + |
105 | 140 | void QUECTEL_BG96_CellularStack::urc_qiurc(urc_type_t urc_type)
|
106 | 141 | {
|
107 | 142 | _at.lock();
|
@@ -299,3 +334,57 @@ nsapi_size_or_error_t QUECTEL_BG96_CellularStack::socket_recvfrom_impl(CellularS
|
299 | 334 |
|
300 | 335 | return recv_len;
|
301 | 336 | }
|
| 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 | +} |
0 commit comments