优化了断网重连
This commit is contained in:
parent
6c735b637d
commit
f4faea4749
|
@ -2,7 +2,7 @@
|
|||
* @Author : stark1898y 1658608470@qq.com
|
||||
* @Date : 2024-09-04 13:33:49
|
||||
* @LastEditors: mbw && 1600520629@qq.com
|
||||
* @LastEditTime: 2025-01-17 10:22:34
|
||||
* @LastEditTime: 2025-01-17 13:21:08
|
||||
* @FilePath: \JT-DT-YD4N02A_RTT_MRS-NT26K\bsp\src\at_device_nt26k.c
|
||||
* @Description :
|
||||
*
|
||||
|
@ -114,11 +114,14 @@ static rt_err_t nt26k_Close_Rf (struct at_device *device)
|
|||
return (-RT_ERROR);
|
||||
}
|
||||
if (at_obj_exec_cmd(device->client, resp, "AT+QPOWD=1") == RT_EOK)
|
||||
{
|
||||
if (at_resp_get_line_by_kw(resp, "POWERED DOWN") != RT_NULL)
|
||||
{
|
||||
at_delete_resp(resp);
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
}
|
||||
at_delete_resp(resp);
|
||||
return (-RT_ERROR);
|
||||
}
|
||||
#ifdef TEST_ENABLE
|
||||
|
@ -223,14 +226,16 @@ static void urc_tcp_recv (struct at_client *client, const char *data, rt_size_t
|
|||
{
|
||||
rt_memset(nt26k_ops.recv, 0, sizeof(struct Nt26kRecvData)); // 清空结构体
|
||||
rt_memcpy(nt26k_ops.recv, recv_byte_buf, sizeof(struct Nt26kRecvData));
|
||||
if (nt26k_ops.recv->recv_data.event_type != INSTRUCTION_HEART_BEAT) // 加这个的原因就是如果有指令下发,会出现两个信号量,指令会执行两次,所以排除心跳包才释放信号量
|
||||
if ((nt26k_ops.recv->recv_data.event_type == INSTRUCTION_HEART_BEAT) ||
|
||||
(nt26k_ops.recv->recv_data.event_type == EVENT_TYPE_POWER_ON))
|
||||
// 加这个的原因就是如果有指令下发,会出现两个信号量,指令会执行两次,所以排除心跳包才释放信号量
|
||||
{
|
||||
rt_sem_release (nt26k_recv_sem);
|
||||
rt_sem_release(nt26k_recv_heart_sem);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 接收到的是心跳包
|
||||
rt_sem_release (nt26k_recv_heart_sem);
|
||||
rt_sem_release(nt26k_recv_sem);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -792,10 +797,9 @@ static void nt26k_init_thread_entry (void *parameter)
|
|||
{
|
||||
/* power on the nt26k device */
|
||||
device->class->device_ops->control(device, AT_DEVICE_CTRL_POWER_ON, RT_NULL);
|
||||
rt_thread_mdelay (100);
|
||||
/* wait nt26k startup finish, send AT every 500ms, if recei
|
||||
ve OK, SYNC success*/
|
||||
if (at_client_obj_wait_connect (client, NT26K_WAIT_CONNECT_TIME))
|
||||
if (at_client_obj_wait_connect(client, RT_WAITING_FOREVER))
|
||||
{
|
||||
result = -RT_ETIMEOUT;
|
||||
goto __exit;
|
||||
|
@ -829,7 +833,7 @@ static void nt26k_init_thread_entry (void *parameter)
|
|||
goto __exit;
|
||||
}
|
||||
/*设置保活信息*/
|
||||
if (at_obj_exec_cmd (device->client, resp, "AT+QICFG=\"tcp/keepalive\",1,10000,100,10") != RT_EOK)
|
||||
if (at_obj_exec_cmd(device->client, resp, "AT+QICFG=\"tcp/keepalive\",1,1000,100,10") != RT_EOK)
|
||||
{
|
||||
result = -RT_ERROR;
|
||||
goto __exit;
|
||||
|
@ -884,7 +888,7 @@ static void nt26k_init_thread_entry (void *parameter)
|
|||
rt_memset((char *)nt26k.imei, 0, NT26K_IMEI_LEN);
|
||||
Get_IotImei((char *)&nt26k.imei[0], NT26K_IMEI_LEN);
|
||||
}
|
||||
rt_thread_mdelay (10);
|
||||
rt_thread_mdelay(1);
|
||||
/* set network interface device hardware iccid */
|
||||
if ((*(rt_uint16_t *)FLASH_IOT_ICCID_ADDR == 0xE339) || (*(rt_uint16_t *)FLASH_IOT_ICCID_ADDR == 0x39E3)) // 未写入
|
||||
{
|
||||
|
@ -916,7 +920,7 @@ static void nt26k_init_thread_entry (void *parameter)
|
|||
rt_memset((char *)nt26k.iccid, 0, NT26K_ICCID_LEN);
|
||||
Get_IotIccid((char *)&nt26k.iccid[0], NT26K_ICCID_LEN);
|
||||
}
|
||||
rt_thread_mdelay (10);
|
||||
rt_thread_mdelay(100);
|
||||
/* set network interface device hardware imsi */
|
||||
if ((*(rt_uint16_t *)FLASH_IOT_IMSI_ADDR == 0xE339) || (*(rt_uint16_t *)FLASH_IOT_IMSI_ADDR == 0x39E3)) // 未写入
|
||||
{
|
||||
|
@ -948,9 +952,8 @@ static void nt26k_init_thread_entry (void *parameter)
|
|||
// 已经写入了,将其赋值给结构体
|
||||
rt_memset((char *)nt26k.imsi, 0, NT26K_IMSI_LEN);
|
||||
Get_IotImei((char *)&nt26k.imsi[0], NT26K_IMSI_LEN);
|
||||
|
||||
}
|
||||
rt_thread_mdelay (10);
|
||||
rt_thread_mdelay(1000);
|
||||
/* check signal strength */
|
||||
for (i = 0; i < CSQ_RETRY; i++)
|
||||
{
|
||||
|
@ -995,7 +998,6 @@ static void nt26k_init_thread_entry (void *parameter)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
rt_thread_mdelay(1000);
|
||||
}
|
||||
|
@ -1025,12 +1027,12 @@ static void nt26k_init_thread_entry (void *parameter)
|
|||
LOG_D("pdp激活成功");
|
||||
break;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
// AT+CGACT=0,1 //去激活 PDP
|
||||
if (at_obj_exec_cmd(device->client, resp, "AT+CGACT=0,1") == RT_EOK)
|
||||
{
|
||||
LOG_D("pdp去激活成功");
|
||||
|
||||
}
|
||||
}
|
||||
rt_thread_mdelay(5000);
|
||||
|
@ -1094,7 +1096,6 @@ __exit:
|
|||
{
|
||||
LOG_E("%s device network initialize failed(%d).", device->name, result);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* nt26k device network initialize */
|
||||
|
@ -1143,7 +1144,7 @@ void remove_crlf (char *str)
|
|||
rt_err_t Nt26k_Get_Signal_Info(struct at_device *device)
|
||||
{
|
||||
|
||||
#define RETRY 20
|
||||
#define RETRY 10
|
||||
|
||||
rt_err_t result = RT_EOK;
|
||||
at_response_t resp = RT_NULL;
|
||||
|
@ -1181,6 +1182,8 @@ rt_err_t Nt26k_Get_Signal_Info (struct at_device *device)
|
|||
{
|
||||
LOG_E("%s device signal strength check failed", device->name);
|
||||
result = -RT_ERROR;
|
||||
at_delete_resp(resp);
|
||||
return result;
|
||||
}
|
||||
/* check signal strength */
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* @Author: mbw
|
||||
* @Date: 2024-10-09 08:42:14
|
||||
* @LastEditors: mbw && 1600520629@qq.com
|
||||
* @LastEditTime: 2025-01-17 10:37:54
|
||||
* @LastEditTime: 2025-01-17 11:22:04
|
||||
* @FilePath: \JT-DT-YD4N02A_RTT_MRS-NT26K\bsp\src\bsp_nt26k.c
|
||||
* @Description:
|
||||
*
|
||||
|
@ -68,7 +68,7 @@ static rt_timer_t nt26k_power_error_timer; // 上电失败情况下启动定时
|
|||
|
||||
rt_uint8_t nt26k_conncet_tcp_flag;
|
||||
rt_uint8_t nt26k_disconnect_pdp_flag; // PDP断开连接标志
|
||||
|
||||
rt_uint8_t nt26k_disconnect_retry_flag = 0; // 用于判断是否已经启动了重连,如果启动,不需要每次都进入
|
||||
Nt26kEventIndex nt26k_event_index;
|
||||
|
||||
rt_uint8_t power_on_send_flag = 0;
|
||||
|
@ -753,8 +753,7 @@ const Nt26kEventInfo nt26k_event_info[] = {
|
|||
{kNt26kExceptionEvent, NT26K_PRIORITY_LOWEST, "异常事件", Nt26k_Send_Exception},
|
||||
{kNt26kValveStatusEvent, NT26K_PRIORITY_LOWEST, "电磁阀状态改变事件", Nt26k_Send_Valve_Status},
|
||||
{kNt26kFanStatusEvent, NT26K_PRIORITY_LOWEST, "风机状态改变事件", Nt26k_Send_Fan_Status},
|
||||
{kNt26kDeviceFailureEvent, NT26K_PRIORITY_LOWEST, "设备失效事件", Nt26k_Send_Device_Failure }
|
||||
};
|
||||
{kNt26kDeviceFailureEvent, NT26K_PRIORITY_LOWEST, "设备失效事件", Nt26k_Send_Device_Failure}};
|
||||
|
||||
/**
|
||||
* 处理NT26K设备的事件
|
||||
|
@ -796,10 +795,18 @@ int Nt26k_Process_Events (Nt26kEvent nt26k_recv_event, struct at_device *device,
|
|||
if (result != RT_EOK)
|
||||
{
|
||||
LOG_E("nt26k send cmd failed\n");
|
||||
nt26k_conncet_tcp_flag = 0;
|
||||
if (!nt26k_disconnect_retry_flag)
|
||||
{
|
||||
LOG_D("断网,启动重连\n");
|
||||
rt_sem_release(nt26k_disconnect_sem);
|
||||
}
|
||||
rt_thread_mdelay(5000);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (rt_strcmp (event->event_name, "定时心跳事件") == RT_EOK)//定时心跳是有回应的
|
||||
if ((rt_strcmp(event->event_name, "定时心跳事件") == RT_EOK) || (rt_strcmp(event->event_name, "上电心跳事件") == RT_EOK)) // 定时心跳是有回应的
|
||||
{
|
||||
if (rt_sem_take(nt26k_recv_heart_sem, 5000) == RT_EOK)
|
||||
{
|
||||
|
@ -809,7 +816,9 @@ int Nt26k_Process_Events (Nt26kEvent nt26k_recv_event, struct at_device *device,
|
|||
else
|
||||
{
|
||||
LOG_E("nt26k send cmd failed\n"); // 收不到说明断网了,重连下10s后再发送
|
||||
LOG_D("rt_sem_release (nt26k_disconnect_sem)");
|
||||
nt26k_conncet_tcp_flag = 0;
|
||||
rt_thread_mdelay(1);
|
||||
rt_sem_release(nt26k_disconnect_sem);
|
||||
rt_thread_mdelay(5000);
|
||||
continue;
|
||||
|
@ -817,7 +826,7 @@ int Nt26k_Process_Events (Nt26kEvent nt26k_recv_event, struct at_device *device,
|
|||
}
|
||||
else if (rt_strcmp(event->event_name, "掉电事件") == RT_EOK) // 定时心跳是有回应的
|
||||
{
|
||||
if (device->class->device_ops->control (device, AT_DEVICE_RF_CLOSE, RT_NULL) == RT_EOK)
|
||||
if (device->class->device_ops->control(device, AT_DEVICE_CTRL_POWER_OFF, RT_NULL) == RT_EOK)
|
||||
{
|
||||
LOG_D("关闭模组");
|
||||
}
|
||||
|
@ -831,9 +840,14 @@ int Nt26k_Process_Events (Nt26kEvent nt26k_recv_event, struct at_device *device,
|
|||
}
|
||||
else
|
||||
{
|
||||
LOG_D ("断网\n");
|
||||
|
||||
if (!nt26k_disconnect_retry_flag)
|
||||
{
|
||||
LOG_D("断网,启动重连\n");
|
||||
rt_sem_release(nt26k_disconnect_sem);
|
||||
}
|
||||
LOG_D("断网,等待连接中......\n");
|
||||
}
|
||||
rt_thread_mdelay(5000);
|
||||
}
|
||||
}
|
||||
|
@ -1421,16 +1435,15 @@ static void Nt26k_Life_Thread_Entry (void *parameter)
|
|||
struct at_device_nt26k *nt26k = &_dev;
|
||||
struct at_device *device = at_device_get_by_name(AT_DEVICE_NAMETYPE_NETDEV, nt26k->device_name);
|
||||
RT_ASSERT(device);
|
||||
rt_err_t ret;
|
||||
rt_err_t result = RT_EOK;
|
||||
rt_uint32_t delay_n = 1;
|
||||
rt_uint32_t delay_t = 80000;
|
||||
|
||||
LOG_D("nt26k_life_thread entry\n");
|
||||
|
||||
while (1)
|
||||
{
|
||||
ret = rt_sem_take (nt26k_disconnect_sem, RT_WAITING_FOREVER);
|
||||
if (ret == RT_EOK)
|
||||
result = rt_sem_take(nt26k_disconnect_sem, RT_WAITING_FOREVER);
|
||||
if (result == RT_EOK)
|
||||
{
|
||||
if (!nt26k_conncet_tcp_flag)
|
||||
{
|
||||
|
@ -1440,52 +1453,58 @@ static void Nt26k_Life_Thread_Entry (void *parameter)
|
|||
{
|
||||
LOG_E("No memory for response structure!");
|
||||
at_delete_resp(resp);
|
||||
result = -RT_ETIMEOUT;
|
||||
}
|
||||
if (device->class->device_ops->control (device, AT_DEVICE_CTRL_POWER_OFF, RT_NULL) == RT_EOK)
|
||||
{
|
||||
LOG_D("AT device power off success");
|
||||
rt_thread_mdelay(1000);
|
||||
if (device->class->device_ops->control(device, AT_DEVICE_CTRL_POWER_ON, RT_NULL) == RT_EOK)
|
||||
{
|
||||
LOG_D("AT device power on success");
|
||||
rt_thread_mdelay(1000);
|
||||
/* disable echo */
|
||||
at_obj_exec_cmd(device->client, resp, "ATE0");
|
||||
/*AT+QICFG="dataformat" 设置收发模式*/
|
||||
if (at_obj_exec_cmd(device->client, resp, "AT+QICFG=\"dataformat\",%d,%d", AT_NSONMI_MODE_DEFAULT, AT_NSONMI_MODE_DEFAULT) != RT_EOK)
|
||||
{
|
||||
LOG_E("AT+QICFG=\"dataformat\" error\n");
|
||||
result = -RT_ETIMEOUT;
|
||||
goto __exit;
|
||||
}
|
||||
/*设置显示模式*/
|
||||
if (at_obj_exec_cmd(device->client, resp, "AT+QICFG=\"viewmode\",1") != RT_EOK)
|
||||
{
|
||||
LOG_E("AT+QICFG=\"viewmode\" error\n");
|
||||
result = -RT_ETIMEOUT;
|
||||
goto __exit;
|
||||
}
|
||||
/*设置保活信息*/
|
||||
if (at_obj_exec_cmd (device->client, resp, "AT+QICFG=\"tcp/keepalive\",1,10000,100,10") != RT_EOK)
|
||||
if (at_obj_exec_cmd(device->client, resp, "AT+QICFG=\"tcp/keepalive\",1,1000,100,10") != RT_EOK)
|
||||
{
|
||||
LOG_E("AT+QICFG=\"tcp/keepalive\" error\n");
|
||||
result = -RT_ETIMEOUT;
|
||||
goto __exit;
|
||||
}
|
||||
if (at_obj_exec_cmd(device->client, resp, "AT+QICFG=\"passiveclosed\",1") != RT_EOK)
|
||||
{
|
||||
LOG_E("AT+QICFG=\"passiveclosed\" error\n");
|
||||
result = -RT_ETIMEOUT;
|
||||
goto __exit;
|
||||
}
|
||||
if (at_obj_exec_cmd(device->client, resp, "AT+CGACT=1,1") != RT_EOK)
|
||||
{
|
||||
LOG_E("AT+CGACT=1,1 error\n");
|
||||
result = -RT_ETIMEOUT;
|
||||
goto __exit;
|
||||
}
|
||||
if (device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL) == RT_EOK)
|
||||
{
|
||||
LOG_D("重连网络成功\n");
|
||||
nt26k_conncet_tcp_flag = RT_TRUE;
|
||||
delay_n = 0;
|
||||
nt26k_disconnect_retry_flag = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
delay_t = (rt_uint32_t)(2^(delay_n - 1) * delay_t);
|
||||
LOG_D ("重连网络失败,等待%d s后重连\n", delay_t);
|
||||
rt_thread_mdelay (delay_t);
|
||||
delay_n++;
|
||||
rt_sem_release (nt26k_disconnect_sem);
|
||||
result = -RT_ETIMEOUT;
|
||||
goto __exit;
|
||||
}
|
||||
at_delete_resp(resp);
|
||||
}
|
||||
|
@ -1494,11 +1513,25 @@ static void Nt26k_Life_Thread_Entry (void *parameter)
|
|||
else
|
||||
{
|
||||
delay_n = 0;
|
||||
goto __exit;
|
||||
}
|
||||
__exit:
|
||||
if (result != RT_EOK)
|
||||
{
|
||||
LOG_D("重连网络失败,等待10s后重连\n");
|
||||
rt_thread_mdelay(delay_n * 5000);
|
||||
delay_n++;
|
||||
if (delay_n >= 360)
|
||||
{
|
||||
Flash_Set_WorkDuration(work_duration);
|
||||
delay_n = 0;
|
||||
reboot();
|
||||
}
|
||||
rt_sem_release(nt26k_disconnect_sem);
|
||||
nt26k_disconnect_retry_flag = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 定时器回调函数,当1分钟内没有数据交互时,关闭tcp连接
|
||||
static void Nt26k_Upload_Timer_Cb(void *parameter)
|
||||
|
|
|
@ -15,11 +15,11 @@
|
|||
|
||||
/*使用动态日志及密码功能时,需开启宏 FINSH_USING_AUTH ULOG_USING_FILTER ENABLE_LOG_ALL ULOG_OUTPUT_LVL = 7 以及设置ulog.c 1522行 输出等级为0*/
|
||||
/**/
|
||||
#define FINSH_USING_AUTH //开启终端密码登录功能
|
||||
#define ULOG_USING_FILTER //开启动态修改日志等级 默认修改在ulog.c 1522行
|
||||
// #define FINSH_USING_AUTH //开启终端密码登录功能
|
||||
// #define ULOG_USING_FILTER //开启动态修改日志等级 默认修改在ulog.c 1522行
|
||||
|
||||
#define ENABLE_LOG_ALL
|
||||
// #define TEST_ENABLE //打开所有的终端测试程序
|
||||
#define TEST_ENABLE //打开所有的终端测试程序
|
||||
#define ULOG_OUTPUT_LVL 7 // 生产时将其设为0
|
||||
#define IOT_MODULE_SWITCH 1 //开启物联网功能
|
||||
|
||||
|
|
Loading…
Reference in New Issue