|
|
|
@ -31,6 +31,66 @@ |
|
|
|
|
|
|
|
|
|
|
|
static char cmd_cmd[128] = {0}; |
|
|
|
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}; |
|
|
|
|
|
|
|
@ -39,6 +99,16 @@ void client_tcp_close(Cclient_t *client) { |
|
|
|
char close_cmd[24]; |
|
|
|
|
|
|
|
client->connect_sta = false; |
|
|
|
BSP_LTE_SetDataTxPaused(true); |
|
|
|
if (lte_diag.disconnect_report_pending) { |
|
|
|
BSP_LTE_CollectNetworkSnapshot(); |
|
|
|
lte_diag_finish_disconnect(); |
|
|
|
} |
|
|
|
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); |
|
|
|
@ -149,6 +219,8 @@ static const char *disconnect_reason_name(lte_disconnect_reason_t reason) { |
|
|
|
case LTE_DISC_AT_TIMEOUT: return "AT_TIMEOUT"; |
|
|
|
case LTE_DISC_QIOPEN_FAILED: return "QIOPEN_FAILED"; |
|
|
|
case LTE_DISC_MODULE_RESET: return "MODULE_RESET"; |
|
|
|
case LTE_DISC_SERVER_SILENCE: return "SERVER_SILENCE"; |
|
|
|
case LTE_DISC_SOCKET_SEND: return "SOCKET_SEND"; |
|
|
|
default: return "UNKNOWN"; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -167,6 +239,7 @@ void lte_diag_disconnect(lte_disconnect_reason_t reason) { |
|
|
|
lte_diag.disconnect_count++; |
|
|
|
lte_diag.last_disconnect_reason = reason; |
|
|
|
lte_diag.last_disconnect_tick = now; |
|
|
|
lte_diag.disconnect_report_pending = true; |
|
|
|
|
|
|
|
LOG_I("[DISC] reason=%s count=%u connected_ticks=%u", |
|
|
|
disconnect_reason_name(reason), lte_diag.disconnect_count, |
|
|
|
@ -176,10 +249,24 @@ void lte_diag_disconnect(lte_disconnect_reason_t reason) { |
|
|
|
lte_diag.uart2_rx_events, lte_diag.uart2_write_failures, |
|
|
|
lte_diag.uart2_error_count, lte_diag.uart3_error_count, |
|
|
|
lte_diag.last_uart_error_code); |
|
|
|
LOG_I("[DISC] fmu_rx=%u fmu_tx=%u server_rx=%u read_events=%u silence_timeout=%u", |
|
|
|
lte_diag.fmu_rx_bytes, lte_diag.fmu_tx_bytes, |
|
|
|
lte_diag.server_rx_bytes, lte_diag.server_rx_read_events, |
|
|
|
lte_diag.server_silence_timeout_count); |
|
|
|
LOG_I("[CONN] fmu_rx=%u fmu_tx=%u fmu_hb=%u server_rx=%u server_hb=%u events=%u", |
|
|
|
lte_diag.fmu_rx_bytes - lte_diag.conn_fmu_rx_base, |
|
|
|
lte_diag.fmu_tx_bytes - lte_diag.conn_fmu_tx_base, |
|
|
|
lte_diag.fmu_heartbeats - lte_diag.conn_fmu_heartbeat_base, |
|
|
|
lte_diag.server_rx_bytes - lte_diag.conn_server_rx_base, |
|
|
|
lte_diag.server_heartbeats - lte_diag.conn_server_heartbeat_base, |
|
|
|
lte_diag.server_rx_read_events - lte_diag.conn_server_events_base); |
|
|
|
LOG_I("[CONN] socket_tx=%u send_ok=%u send_fail=%u prompt_timeout=%u read_errors=%u", |
|
|
|
lte_diag.socket_tx_bytes - lte_diag.conn_socket_tx_base, |
|
|
|
lte_diag.socket_send_ok - lte_diag.conn_send_ok_base, |
|
|
|
lte_diag.socket_send_fail - lte_diag.conn_send_fail_base, |
|
|
|
lte_diag.socket_prompt_timeouts, |
|
|
|
lte_diag.socket_read_errors); |
|
|
|
LOG_I("[DISC] acked=%u unacked=%u ack_queries=%u ack_errors=%u", |
|
|
|
lte_diag.socket_acked_bytes, lte_diag.socket_unacked_bytes, |
|
|
|
lte_diag.socket_ack_queries, lte_diag.socket_ack_errors); |
|
|
|
LOG_I("[DISC] tx_queue_high=%u drops=%u", |
|
|
|
lte_diag.tx_queue_high_water, lte_diag.tx_queue_drops); |
|
|
|
LOG_I("[DISC] age_uart2_rx=%u age_uart2_tx=%u age_fmu_rx=%u age_server_rx=%u", |
|
|
|
diag_age(now, lte_diag.last_uart2_rx_tick), |
|
|
|
diag_age(now, lte_diag.last_uart2_tx_tick), |
|
|
|
@ -191,13 +278,91 @@ void lte_diag_disconnect(lte_disconnect_reason_t reason) { |
|
|
|
LOG_I("[DISC] attempts=%u reconnects=%u qioopen_fail=%u resets=%u", |
|
|
|
lte_diag.connect_attempts, lte_diag.reconnect_count, |
|
|
|
lte_diag.qioopen_failures, lte_diag.reset_count); |
|
|
|
LOG_I("[DISC] csq=%d cereg=%u pdp=%u heap=%u/%u min_free=%u", |
|
|
|
lte_dev.csq, lte_dev.eps_sta, lte_dev.reset_flag == DTU_CF_NO_NEED_RESET, |
|
|
|
heap_used, heap_total, heap_total - heap_max); |
|
|
|
LOG_I("[DISC] heap=%u/%u min_free=%u", heap_used, heap_total, |
|
|
|
heap_total - heap_max); |
|
|
|
|
|
|
|
if (reason == LTE_DISC_AT_TIMEOUT || reason == LTE_DISC_QIOPEN_FAILED || |
|
|
|
reason == LTE_DISC_MODULE_RESET) { |
|
|
|
const char *classification = reason == LTE_DISC_QIOPEN_FAILED |
|
|
|
? "SOCKET_OPEN" |
|
|
|
: "MODEM_OR_DEVICE"; |
|
|
|
LOG_I("[CLASS] class=%s confidence=MEDIUM net_snapshot=unavailable", |
|
|
|
classification); |
|
|
|
lte_diag.disconnect_report_pending = false; |
|
|
|
} |
|
|
|
|
|
|
|
lte_dev.client1->connect_sta = false; |
|
|
|
} |
|
|
|
|
|
|
|
static const char *diag_text_or_unknown(const char *text) { |
|
|
|
return text[0] == '\0' ? "?" : text; |
|
|
|
} |
|
|
|
|
|
|
|
static void lte_diag_finish_disconnect(void) { |
|
|
|
const lte_network_snapshot_t *network = <e_diag.network; |
|
|
|
rt_tick_t now = lte_diag.last_disconnect_tick; |
|
|
|
rt_uint32_t connected_ms = now - lte_diag.connect_tick; |
|
|
|
rt_uint32_t fmu_hb = |
|
|
|
lte_diag.fmu_heartbeats - lte_diag.conn_fmu_heartbeat_base; |
|
|
|
rt_uint32_t server_hb = |
|
|
|
lte_diag.server_heartbeats - lte_diag.conn_server_heartbeat_base; |
|
|
|
rt_uint32_t ack_queries = |
|
|
|
lte_diag.socket_ack_queries - lte_diag.conn_ack_queries_base; |
|
|
|
const char *classification = "UNKNOWN"; |
|
|
|
const char *confidence = "LOW"; |
|
|
|
const char *evidence = "insufficient"; |
|
|
|
bool registration_bad = network->cereg >= 0 && network->cereg != 1 && |
|
|
|
network->cereg != 5; |
|
|
|
|
|
|
|
LOG_I("[NET] oper=%s rat=%s band=%s channel=%u tac=%s cell=%s", |
|
|
|
diag_text_or_unknown(network->oper), |
|
|
|
diag_text_or_unknown(network->rat), |
|
|
|
diag_text_or_unknown(network->band), network->channel, |
|
|
|
diag_text_or_unknown(network->tac), |
|
|
|
diag_text_or_unknown(network->cell)); |
|
|
|
LOG_I("[NET] cereg=%d cgatt=%d pdp=%d csq=%d pdpdeact=%u", |
|
|
|
network->cereg, network->cgatt, network->pdp, network->csq, |
|
|
|
lte_dev.socket_pdpdeact_pending ? 1 : 0); |
|
|
|
LOG_I("[PATH] acked=%u unacked=%u ack_queries=%u last_ack_age_ms=%u queue_drops=%u", |
|
|
|
lte_diag.socket_acked_bytes, lte_diag.socket_unacked_bytes, |
|
|
|
ack_queries, diag_age(now, lte_diag.last_socket_ack_tick), |
|
|
|
lte_diag.tx_queue_drops - lte_diag.conn_queue_drops_base); |
|
|
|
|
|
|
|
if (lte_dev.socket_pdpdeact_pending || registration_bad || |
|
|
|
network->cgatt == 0 || network->pdp == 0) { |
|
|
|
classification = "CELLULAR"; |
|
|
|
confidence = "HIGH"; |
|
|
|
evidence = lte_dev.socket_pdpdeact_pending ? "pdpdeact" : "registration"; |
|
|
|
} else if (connected_ms >= 25000 && connected_ms <= 40000 && |
|
|
|
fmu_hb == 0 && server_hb >= 5 && |
|
|
|
lte_diag.socket_unacked_bytes == 0) { |
|
|
|
classification = "SERVER_POLICY"; |
|
|
|
confidence = "HIGH"; |
|
|
|
evidence = "no_fmu_hb_30s"; |
|
|
|
} else if (lte_diag.socket_unacked_bytes > 0) { |
|
|
|
classification = "IP_PATH"; |
|
|
|
confidence = "MEDIUM"; |
|
|
|
evidence = "tcp_unacked"; |
|
|
|
} else if (lte_diag.last_disconnect_reason == LTE_DISC_SERVER_SILENCE) { |
|
|
|
classification = "SERVER_OR_DOWNLINK"; |
|
|
|
confidence = "MEDIUM"; |
|
|
|
evidence = "server_silence"; |
|
|
|
} else if (lte_diag.last_disconnect_reason == LTE_DISC_SOCKET_SEND) { |
|
|
|
classification = "MODEM_OR_SOCKET"; |
|
|
|
confidence = "MEDIUM"; |
|
|
|
evidence = "socket_send_fail"; |
|
|
|
} else if (ack_queries > 0 && lte_diag.socket_unacked_bytes == 0 && |
|
|
|
diag_age(now, lte_diag.last_server_rx_tick) <= 5000) { |
|
|
|
classification = "REMOTE_CLOSE"; |
|
|
|
confidence = "MEDIUM"; |
|
|
|
evidence = "recent_rx_all_acked"; |
|
|
|
} |
|
|
|
|
|
|
|
LOG_I("[CLASS] class=%s confidence=%s evidence=%s", classification, |
|
|
|
confidence, evidence); |
|
|
|
lte_diag.disconnect_report_pending = false; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*将EC800K软件复位*/ |
|
|
|
int16_t EC800K_Reset(void) { |
|
|
|
@ -211,11 +376,7 @@ int16_t EC800K_Reset(void) { |
|
|
|
lte_dev.client1->connect_sta = false; |
|
|
|
//lte_dev.client2->connect_sta = false;
|
|
|
|
|
|
|
|
rt_thread_mdelay(3000); |
|
|
|
BSP_LTE_SendData((uint8_t *)"+++", 3); |
|
|
|
rt_thread_mdelay(2000); |
|
|
|
BSP_LTE_SendData((uint8_t *)"+++", 3); |
|
|
|
rt_thread_mdelay(2000); |
|
|
|
rt_thread_mdelay(1000); |
|
|
|
|
|
|
|
uint8_t try_count = 5; |
|
|
|
|
|
|
|
@ -261,9 +422,9 @@ int16_t client_tcp_connect(Cclient_t *client) { |
|
|
|
BSP_LTE_InitLogClock(); |
|
|
|
|
|
|
|
//
|
|
|
|
BSP_LTE_SendCmd(AT_CFG_TRANS_SIZE, DEFAULT_EXPECT, DEFAULT_ERROR, |
|
|
|
BSP_LTE_SendCmd(AT_CFG_RECV_IND, DEFAULT_EXPECT, DEFAULT_ERROR, |
|
|
|
LTE_CMD_WAIT_NORMAL); |
|
|
|
BSP_LTE_SendCmd(AT_CFG_TRANS_WAITTM, DEFAULT_EXPECT, DEFAULT_ERROR, |
|
|
|
BSP_LTE_SendCmd(AT_QISDE0, DEFAULT_EXPECT, DEFAULT_ERROR, |
|
|
|
LTE_CMD_WAIT_NORMAL); |
|
|
|
BSP_LTE_SendCmd(AT_CFG_PASSIVE_CLOSED, DEFAULT_EXPECT, DEFAULT_ERROR, |
|
|
|
LTE_CMD_WAIT_NORMAL); |
|
|
|
@ -276,7 +437,7 @@ int16_t client_tcp_connect(Cclient_t *client) { |
|
|
|
|
|
|
|
// 2, 打开链接
|
|
|
|
memset(cmd_cmd, 0, sizeof(cmd_cmd)); |
|
|
|
cmd_len = rt_snprintf(cmd_cmd, sizeof(cmd_cmd), AT_QIOPEN_TRANS, |
|
|
|
cmd_len = rt_snprintf(cmd_cmd, sizeof(cmd_cmd), AT_QIOPEN_BUFFER, |
|
|
|
client->connect_ID, client->mode, client->ip, |
|
|
|
client->port); |
|
|
|
if (cmd_len < 0 || cmd_len >= (int)sizeof(cmd_cmd)) { |
|
|
|
@ -285,8 +446,7 @@ int16_t client_tcp_connect(Cclient_t *client) { |
|
|
|
return -1; |
|
|
|
} |
|
|
|
/* 透传模式成功返回 CONNECT;一次尝试只发送一次 QIOPEN。 */ |
|
|
|
while (0 != BSP_LTE_SendCmd(cmd_cmd, CONNECTE_OK, DEFAULT_ERROR, |
|
|
|
LTE_CMD_WAIT_QIOPEN)) { |
|
|
|
while (0 != BSP_LTE_OpenSocket(cmd_cmd, client->connect_ID)) { |
|
|
|
lte_diag.qioopen_failures++; |
|
|
|
client_tcp_close(client); |
|
|
|
#ifdef debug_mode |
|
|
|
@ -305,8 +465,15 @@ int16_t client_tcp_connect(Cclient_t *client) { |
|
|
|
#endif |
|
|
|
} |
|
|
|
client->connect_sta = true; |
|
|
|
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; |
|
|
|
|
|
|
|
@ -323,7 +490,7 @@ int16_t client_tcp_connect(Cclient_t *client) { |
|
|
|
mav_len = mavlink_msg_to_send_buffer(mav_buf, &msg); |
|
|
|
|
|
|
|
for (int i = 0; i < 3; i++) { |
|
|
|
BSP_LTE_SendData(mav_buf, mav_len); |
|
|
|
BSP_LTE_SendSocketData(client->connect_ID, mav_buf, mav_len); |
|
|
|
} |
|
|
|
rt_device_t fmu_com = fmu_com_get(); |
|
|
|
if (fmu_com != RT_NULL) { |
|
|
|
@ -334,11 +501,11 @@ int16_t client_tcp_connect(Cclient_t *client) { |
|
|
|
rt_sprintf(buf, "{\"sn\":\"%s\",\"client_id\":\"%s\",\"csq\":\"%d\"}\r\n", |
|
|
|
lte_dev.iccid, lte_dev.imei, lte_dev.csq); |
|
|
|
|
|
|
|
BSP_LTE_SendData((uint8_t *)buf, sizeof(buf)); |
|
|
|
BSP_LTE_SendSocketData(client->connect_ID, (uint8_t *)buf, sizeof(buf)); |
|
|
|
|
|
|
|
BSP_LTE_SendData((uint8_t *)buf, sizeof(buf)); |
|
|
|
BSP_LTE_SendSocketData(client->connect_ID, (uint8_t *)buf, sizeof(buf)); |
|
|
|
|
|
|
|
BSP_LTE_SendData((uint8_t *)buf, sizeof(buf)); |
|
|
|
BSP_LTE_SendSocketData(client->connect_ID, (uint8_t *)buf, sizeof(buf)); |
|
|
|
|
|
|
|
//hw_printf(buf);
|
|
|
|
#endif |
|
|
|
@ -350,37 +517,7 @@ int16_t client_tcp_connect(Cclient_t *client) { |
|
|
|
static rt_tick_t last_rx_tick = 0; |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Leave transparent mode only after the UART has been quiet for the
|
|
|
|
* required guard time. The caller keeps data_tx_paused asserted until the |
|
|
|
* next successful QIOPEN. */ |
|
|
|
static bool client_exit_transparent_mode(CLte_dev_t *pLte_dev) { |
|
|
|
rt_tick_t deadline; |
|
|
|
rt_ssize_t len; |
|
|
|
|
|
|
|
BSP_LTE_SetDataTxPaused(true); |
|
|
|
rt_thread_mdelay(1000); |
|
|
|
BSP_LTE_SendData((uint8_t *)"+++", 3); |
|
|
|
rt_thread_mdelay(1000); |
|
|
|
|
|
|
|
deadline = rt_tick_get() + 2000; |
|
|
|
while ((rt_int32_t)(rt_tick_get() - deadline) < 0) { |
|
|
|
if (pLte_dev->com_dev_rx_sem != RT_NULL) { |
|
|
|
rt_sem_take(pLte_dev->com_dev_rx_sem, 100); |
|
|
|
} |
|
|
|
rt_memset(pLte_dev->at_buf, 0, sizeof(pLte_dev->at_buf)); |
|
|
|
len = rt_device_read(pLte_dev->com_dev, 0, pLte_dev->at_buf, |
|
|
|
sizeof(pLte_dev->at_buf) - 1); |
|
|
|
if (len > 0) { |
|
|
|
lte_diag_uart2_rx((rt_size_t)len); |
|
|
|
pLte_dev->at_buf[len] = '\0'; |
|
|
|
if (rt_strstr((const char *)pLte_dev->at_buf, DEFAULT_EXPECT) != RT_NULL) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
#if 0 |
|
|
|
void client_yield(CLte_dev_t *pLte_dev) { |
|
|
|
while (1) { |
|
|
|
if (pLte_dev->client1->connect_sta == true) { |
|
|
|
@ -437,9 +574,7 @@ void client_yield(CLte_dev_t *pLte_dev) { |
|
|
|
} |
|
|
|
|
|
|
|
rt_device_t fmu_com = fmu_com_get(); |
|
|
|
lte_diag.server_rx_bytes += len; |
|
|
|
lte_diag.server_rx_read_events++; |
|
|
|
lte_diag.last_server_rx_tick = rt_tick_get(); |
|
|
|
lte_diag_server_data(pLte_dev->at_buf, len); |
|
|
|
if (fmu_com) { |
|
|
|
rt_ssize_t written = rt_device_write(fmu_com, 0, |
|
|
|
pLte_dev->at_buf, len); |
|
|
|
@ -468,6 +603,110 @@ void client_yield(CLte_dev_t *pLte_dev) { |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
void client_yield(CLte_dev_t *pLte_dev) { |
|
|
|
while (1) { |
|
|
|
if (pLte_dev->client1->connect_sta == true) { |
|
|
|
int16_t socket_result; |
|
|
|
|
|
|
|
BSP_LTE_PollSocketUrc(20); |
|
|
|
if (pLte_dev->socket_closed_pending) { |
|
|
|
LOG_W("[URC] socket closed received"); |
|
|
|
lte_diag_disconnect(LTE_DISC_CLOSED); |
|
|
|
client_tcp_close(pLte_dev->client1); |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
while (pLte_dev->socket_recv_pending && |
|
|
|
pLte_dev->client1->connect_sta) { |
|
|
|
rt_device_t fmu_com; |
|
|
|
int16_t read_length = BSP_LTE_ReadSocketData( |
|
|
|
pLte_dev->client1->connect_ID, socket_rx_buffer, |
|
|
|
sizeof(socket_rx_buffer)); |
|
|
|
if (read_length < 0) { |
|
|
|
lte_diag_disconnect(pLte_dev->socket_closed_pending |
|
|
|
? LTE_DISC_CLOSED |
|
|
|
: LTE_DISC_AT_TIMEOUT); |
|
|
|
client_tcp_close(pLte_dev->client1); |
|
|
|
break; |
|
|
|
} |
|
|
|
if (read_length == 0) break; |
|
|
|
|
|
|
|
lte_diag_server_data(socket_rx_buffer, read_length); |
|
|
|
#if LTE_SERVER_SILENCE_TIMEOUT_SEC > 0 |
|
|
|
last_rx_tick = lte_diag.last_server_rx_tick; |
|
|
|
#endif |
|
|
|
fmu_com = fmu_com_get(); |
|
|
|
if (fmu_com != RT_NULL) { |
|
|
|
rt_ssize_t written = rt_device_write(fmu_com, 0, socket_rx_buffer, |
|
|
|
read_length); |
|
|
|
if (written > 0) lte_diag_fmu_tx((rt_size_t)written); |
|
|
|
} |
|
|
|
if (read_length == sizeof(socket_rx_buffer)) |
|
|
|
pLte_dev->socket_recv_pending = true; |
|
|
|
} |
|
|
|
if (!pLte_dev->client1->connect_sta) continue; |
|
|
|
|
|
|
|
if (socket_tx_pending == 0) { |
|
|
|
socket_tx_pending = fmu_net_queue_get(socket_tx_buffer, |
|
|
|
sizeof(socket_tx_buffer)); |
|
|
|
} |
|
|
|
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_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 (!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 (!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"); |
|
|
|
lte_diag_disconnect(LTE_DISC_SERVER_SILENCE); |
|
|
|
client_tcp_close(pLte_dev->client1); |
|
|
|
continue; |
|
|
|
} |
|
|
|
#endif |
|
|
|
} else { |
|
|
|
if (pLte_dev->reset_flag == DTU_CF_NEED_RESET) BSP_LTE_Config(); |
|
|
|
client_tcp_connect(pLte_dev->client1); |
|
|
|
#if LTE_SERVER_SILENCE_TIMEOUT_SEC > 0 |
|
|
|
last_rx_tick = rt_tick_get(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void client_task(void) { |
|
|
|
client_yield(<e_dev); |
|
|
|
|