|
|
|
@ -35,9 +35,63 @@ static uint8_t socket_tx_buffer[LTE_SOCKET_TX_CHUNK_SIZE]; |
|
|
|
static uint8_t socket_rx_buffer[LTE_SOCKET_RX_CHUNK_SIZE]; |
|
|
|
static rt_size_t socket_tx_pending = 0; |
|
|
|
static rt_tick_t last_ack_query_tick = 0; |
|
|
|
static rt_tick_t socket_tx_retry_tick = 0; |
|
|
|
static rt_uint8_t socket_tx_retry_count = 0; |
|
|
|
|
|
|
|
typedef struct { |
|
|
|
rt_tick_t tick; |
|
|
|
rt_uint32_t fmu_rx_bytes; |
|
|
|
rt_uint32_t socket_tx_bytes; |
|
|
|
rt_uint32_t send_ok; |
|
|
|
rt_uint32_t send_fail; |
|
|
|
rt_uint32_t acked_bytes; |
|
|
|
rt_uint32_t queue_drops; |
|
|
|
rt_uint32_t prompt_timeouts; |
|
|
|
} tx_stat_baseline_t; |
|
|
|
|
|
|
|
static tx_stat_baseline_t tx_stat_baseline; |
|
|
|
|
|
|
|
static void lte_diag_finish_disconnect(void); |
|
|
|
|
|
|
|
static void tx_stat_reset(void) { |
|
|
|
tx_stat_baseline.tick = rt_tick_get(); |
|
|
|
tx_stat_baseline.fmu_rx_bytes = lte_diag.fmu_rx_bytes; |
|
|
|
tx_stat_baseline.socket_tx_bytes = lte_diag.socket_tx_bytes; |
|
|
|
tx_stat_baseline.send_ok = lte_diag.socket_send_ok; |
|
|
|
tx_stat_baseline.send_fail = lte_diag.socket_send_fail; |
|
|
|
tx_stat_baseline.acked_bytes = lte_diag.socket_acked_bytes; |
|
|
|
tx_stat_baseline.queue_drops = lte_diag.tx_queue_drops; |
|
|
|
tx_stat_baseline.prompt_timeouts = lte_diag.socket_prompt_timeouts; |
|
|
|
} |
|
|
|
|
|
|
|
static rt_uint32_t tx_stat_rate(rt_uint32_t delta, rt_tick_t elapsed) { |
|
|
|
return elapsed == 0 ? 0 : delta * RT_TICK_PER_SECOND / elapsed; |
|
|
|
} |
|
|
|
|
|
|
|
static void tx_stat_log(void) { |
|
|
|
rt_tick_t now = rt_tick_get(); |
|
|
|
rt_tick_t elapsed = now - tx_stat_baseline.tick; |
|
|
|
rt_uint32_t fmu_delta; |
|
|
|
rt_uint32_t socket_delta; |
|
|
|
|
|
|
|
if (elapsed < RT_TICK_PER_SECOND * 5) return; |
|
|
|
|
|
|
|
fmu_delta = lte_diag.fmu_rx_bytes - tx_stat_baseline.fmu_rx_bytes; |
|
|
|
socket_delta = lte_diag.socket_tx_bytes - tx_stat_baseline.socket_tx_bytes; |
|
|
|
LOG_I("[TXSTAT] in=%uB/s out=%uB/s q=%u/%u pending=%u drops=%u", |
|
|
|
tx_stat_rate(fmu_delta, elapsed), tx_stat_rate(socket_delta, elapsed), |
|
|
|
fmu_net_queue_data_len(), fmu_net_queue_capacity(), socket_tx_pending, |
|
|
|
lte_diag.tx_queue_drops - tx_stat_baseline.queue_drops); |
|
|
|
LOG_I("[TXSTAT] ok=%u fail=%u retry=%u ack_delta=%u unacked=%u prompt_to=%u", |
|
|
|
lte_diag.socket_send_ok - tx_stat_baseline.send_ok, |
|
|
|
lte_diag.socket_send_fail - tx_stat_baseline.send_fail, |
|
|
|
socket_tx_retry_count, |
|
|
|
lte_diag.socket_acked_bytes - tx_stat_baseline.acked_bytes, |
|
|
|
lte_diag.socket_unacked_bytes, |
|
|
|
lte_diag.socket_prompt_timeouts - tx_stat_baseline.prompt_timeouts); |
|
|
|
tx_stat_reset(); |
|
|
|
} |
|
|
|
|
|
|
|
no_carrier_match_t _no_carrier_t = {0}; |
|
|
|
|
|
|
|
/*关闭TCP连接*/ |
|
|
|
@ -53,6 +107,8 @@ void client_tcp_close(Cclient_t *client) { |
|
|
|
BSP_LTE_ClearSocketEvents(); |
|
|
|
fmu_net_queue_reset(); |
|
|
|
socket_tx_pending = 0; |
|
|
|
socket_tx_retry_tick = 0; |
|
|
|
socket_tx_retry_count = 0; |
|
|
|
rt_snprintf(close_cmd, sizeof(close_cmd), AT_QICLOSE, client->connect_ID); |
|
|
|
BSP_LTE_SendCmd(close_cmd, DEFAULT_EXPECT, DEFAULT_ERROR, |
|
|
|
LTE_CMD_WAIT_QICLOSE); |
|
|
|
@ -412,8 +468,11 @@ int16_t client_tcp_connect(Cclient_t *client) { |
|
|
|
BSP_LTE_ClearSocketEvents(); |
|
|
|
fmu_net_queue_reset(); |
|
|
|
socket_tx_pending = 0; |
|
|
|
socket_tx_retry_tick = 0; |
|
|
|
socket_tx_retry_count = 0; |
|
|
|
BSP_LTE_SetDataTxPaused(false); |
|
|
|
lte_diag_connect_success(); |
|
|
|
tx_stat_reset(); |
|
|
|
last_ack_query_tick = lte_diag.connect_tick; |
|
|
|
client->error_cnt = 0; |
|
|
|
lte_dev.reset_flag = DTU_CF_NO_NEED_RESET; |
|
|
|
@ -593,28 +652,44 @@ void client_yield(CLte_dev_t *pLte_dev) { |
|
|
|
socket_tx_pending = fmu_net_queue_get(socket_tx_buffer, |
|
|
|
sizeof(socket_tx_buffer)); |
|
|
|
} |
|
|
|
if (socket_tx_pending > 0) { |
|
|
|
if (socket_tx_pending > 0 && |
|
|
|
(socket_tx_retry_tick == 0 || |
|
|
|
(rt_int32_t)(rt_tick_get() - socket_tx_retry_tick) >= 0)) { |
|
|
|
socket_result = BSP_LTE_SendSocketData( |
|
|
|
pLte_dev->client1->connect_ID, socket_tx_buffer, |
|
|
|
(uint16_t)socket_tx_pending); |
|
|
|
if (socket_result == 0) { |
|
|
|
socket_tx_pending = 0; |
|
|
|
socket_tx_retry_tick = 0; |
|
|
|
socket_tx_retry_count = 0; |
|
|
|
} else if (socket_result < 0) { |
|
|
|
lte_diag_disconnect(LTE_DISC_SOCKET_SEND); |
|
|
|
client_tcp_close(pLte_dev->client1); |
|
|
|
continue; |
|
|
|
} else { |
|
|
|
rt_thread_mdelay(50); |
|
|
|
rt_uint32_t retry_delay_ms; |
|
|
|
|
|
|
|
if (socket_tx_retry_count < 255) socket_tx_retry_count++; |
|
|
|
retry_delay_ms = socket_tx_retry_count <= 2 ? 100 : |
|
|
|
socket_tx_retry_count <= 5 ? 250 : 500; |
|
|
|
socket_tx_retry_tick = |
|
|
|
rt_tick_get() + rt_tick_from_millisecond(retry_delay_ms); |
|
|
|
LOG_W("[TX] retry=%u delay_ms=%u pending=%u", socket_tx_retry_count, |
|
|
|
retry_delay_ms, socket_tx_pending); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (rt_tick_get() - last_ack_query_tick >= RT_TICK_PER_SECOND * 5) { |
|
|
|
if (!pLte_dev->socket_recv_pending && |
|
|
|
rt_tick_get() - last_ack_query_tick >= RT_TICK_PER_SECOND * 5) { |
|
|
|
last_ack_query_tick = rt_tick_get(); |
|
|
|
BSP_LTE_QuerySocketSendStatus(pLte_dev->client1->connect_ID); |
|
|
|
} |
|
|
|
|
|
|
|
tx_stat_log(); |
|
|
|
|
|
|
|
#if LTE_SERVER_SILENCE_TIMEOUT_SEC > 0 |
|
|
|
if (rt_tick_get() - last_rx_tick > |
|
|
|
if (!pLte_dev->socket_recv_pending && |
|
|
|
rt_tick_get() - last_rx_tick > |
|
|
|
RT_TICK_PER_SECOND * LTE_SERVER_SILENCE_TIMEOUT_SEC) { |
|
|
|
lte_diag.server_silence_timeout_count++; |
|
|
|
LOG_W("server silence timeout, reconnect\n"); |
|
|
|
|