diff --git a/components/net/at/at_socket/at_socket.c b/components/net/at/at_socket/at_socket.c index f754ad52a703f113bf3015ee1beaaa3bf6378706..c21d0197175f026f4506a9dc109c5223304a1b8c 100644 --- a/components/net/at/at_socket/at_socket.c +++ b/components/net/at/at_socket/at_socket.c @@ -385,6 +385,9 @@ int at_closesocket(int socket) return -1; } + /* deal with TCP server actively disconnect */ + rt_thread_delay(rt_tick_from_millisecond(100)); + sock = at_get_socket(socket); if (sock == RT_NULL) { @@ -401,10 +404,13 @@ int at_closesocket(int socket) if (at_dev_ops->at_closesocket(socket) != 0) { LOG_E("AT socket (%d) closesocket failed!", socket); + free_socket(sock); + return -1; } } - return free_socket(sock); + free_socket(sock); + return 0; } int at_shutdown(int socket, int how) @@ -427,10 +433,13 @@ int at_shutdown(int socket, int how) if (at_dev_ops->at_closesocket(socket) != 0) { LOG_E("AT socket (%d) shutdown failed!", socket); + free_socket(sock); + return -1; } } - return free_socket(sock); + free_socket(sock); + return 0; } int at_bind(int socket, const struct sockaddr *name, socklen_t namelen) diff --git a/components/net/at/include/at.h b/components/net/at/include/at.h index 6f4836fa214c079272c565409050140bdcafd23c..2601562019b6fc2ea3938cf864c160da75238ac2 100644 --- a/components/net/at/include/at.h +++ b/components/net/at/include/at.h @@ -31,7 +31,8 @@ #ifdef __cplusplus extern "C" { #endif -#define AT_SW_VERSION "1.0.0" + +#define AT_SW_VERSION "1.0.1" #define AT_SW_VERSION_NUM 0x10000 #define DBG_ENABLE diff --git a/components/net/at/src/at_client.c b/components/net/at/src/at_client.c index 9a515f4e8f4a3307d89decc0bb4f82f962d707e6..42a6f4b980972a9f6042ca37a8f463c5abde7adb 100644 --- a/components/net/at/src/at_client.c +++ b/components/net/at/src/at_client.c @@ -290,9 +290,14 @@ int at_obj_exec_cmd(at_client_t client, at_response_t resp, const char *cmd_expr rt_err_t result = RT_EOK; const char *cmd = RT_NULL; - RT_ASSERT(client); RT_ASSERT(cmd_expr); + if (client == RT_NULL) + { + LOG_E("input AT Client object is NULL, please create or get AT Client object!"); + return -RT_ERROR; + } + rt_mutex_take(client->lock, RT_WAITING_FOREVER); client->resp_status = AT_RESP_OK; @@ -348,8 +353,8 @@ int at_client_obj_wait_connect(at_client_t client, rt_uint32_t timeout) if (client == RT_NULL) { - LOG_E("Input AT Client is NULL, please create or get AT Client!"); - return RT_NULL; + LOG_E("input AT Client object is NULL, please create or get AT Client object!"); + return -RT_ERROR; } resp = at_create_resp(16, 0, rt_tick_from_millisecond(500)); @@ -400,13 +405,19 @@ int at_client_obj_wait_connect(at_client_t client, rt_uint32_t timeout) * @param buf send data buffer * @param size send fixed data size * - * @return send data size + * @return >0: send data size + * =0: send failed */ rt_size_t at_client_obj_send(at_client_t client, const char *buf, rt_size_t size) { - RT_ASSERT(client); RT_ASSERT(buf); + if (client == RT_NULL) + { + LOG_E("input AT Client object is NULL, please create or get AT Client object!"); + return 0; + } + #ifdef AT_PRINT_RAW_CMD at_print_raw_cmd("send", buf, size); #endif @@ -436,16 +447,22 @@ static char at_client_getchar(at_client_t client) * * @note this function can only be used in execution function of URC data * - * @return success receive data size + * @return >0: receive data size + * =0: receive failed */ rt_size_t at_client_obj_recv(at_client_t client, char *buf, rt_size_t size) { rt_size_t read_idx = 0; char ch; - RT_ASSERT(client); RT_ASSERT(buf); + if (client == RT_NULL) + { + LOG_E("input AT Client object is NULL, please create or get AT Client object!"); + return 0; + } + while (1) { if (read_idx < size) @@ -475,7 +492,11 @@ rt_size_t at_client_obj_recv(at_client_t client, char *buf, rt_size_t size) */ void at_obj_set_end_sign(at_client_t client, char ch) { - RT_ASSERT(client); + if (client == RT_NULL) + { + LOG_E("input AT Client object is NULL, please create or get AT Client object!"); + return; + } client->end_sign = ch; } @@ -491,6 +512,12 @@ void at_obj_set_urc_table(at_client_t client, const struct at_urc *urc_table, rt { rt_size_t idx; + if (client == RT_NULL) + { + LOG_E("input AT Client object is NULL, please create or get AT Client object!"); + return; + } + for (idx = 0; idx < table_sz; idx++) { RT_ASSERT(urc_table[idx].cmd_prefix);