diff --git a/.template b/.template index cb569de..b0cd872 100644 --- a/.template +++ b/.template @@ -4,8 +4,8 @@ Series=CH32V307 RTOS=NoneOS MCU=CH32V307RVT6 Link=WCH-Link -PeripheralVersion==========1.4 -Description==========ROM(byte): 256K, SRAM(byte): 64K, CHIP PINS: 64, GPIO PORTS: 51.\nWCH CH32V3 series of mainstream MCUs covers the needs of a large variety of applications in the industrial,medical and consumer markets. High performance with first-class peripherals and low-power,low-voltage operation is paired with a high level of integration at accessible prices with a simple architecture and easy-to-use tools. +PeripheralVersion============1.4 +Description============ROM(byte): 256K, SRAM(byte): 64K, CHIP PINS: 64, GPIO PORTS: 51.\nWCH CH32V3 series of mainstream MCUs covers the needs of a large variety of applications in the industrial,medical and consumer markets. High performance with first-class peripherals and low-power,low-voltage operation is paired with a high level of integration at accessible prices with a simple architecture and easy-to-use tools. Mcu Type=CH32V30x Address=0x08000000 Target Path=obj\JT-DT-YD4N02A_RTT_MRS-4G.hex diff --git a/applications/main.c b/applications/main.c index d2a2a2a..b948047 100644 --- a/applications/main.c +++ b/applications/main.c @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-10-23 17:14:16 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-30 10:50:46 + * @LastEditTime: 2024-12-31 14:10:16 * @FilePath: \JT-DT-YD4N02A_RTT_MRS-4G\applications\main.c * @Descrt_thread_ * @@ -91,8 +91,8 @@ void Send_Laser_Alarm_Event(AlarmEvent event_type) if (is_event_initialized == RT_TRUE) { + LOG_I("Send_Laser_Alarm_Event = %d", SysControl.status); rt_event_send(&alarm_event, Get_Sys_Event_Flag(event_type)); - LOG_D("Send_Laser_Alarm_Event = %d", SysControl.status); } else { @@ -183,7 +183,6 @@ int main(void) rt_err_t result = RT_EINVAL; rt_uint32_t received_event; - rt_kprintf("JT-DT-YD4N02A Software version: %02X", (uint8_t)Flash_Get_SysCfg(kSwVerId)); BSP_ADC_Init(); BSP_VIN_Detection_Init(); @@ -394,7 +393,7 @@ int main(void) else if (received_event & Get_Sys_Event_Flag(kPowerDownEvent)) // 掉电 { LOG_D("掉电模式"); - + H308_PWR_OFF; SysControl.last_status = SysControl.status; SysControl.status = kPowerDownEvent; @@ -405,9 +404,8 @@ int main(void) #if (IOT_MODULE_SWITCH == 1) Nt26k_Send_Event(kNt26kPowerDownEvent); #endif - LOG_D("Enter AnalogWatchdog Interrupt"); - // 等待180s,要是还没断电就重启 - for (uint8_t i = 0; i < 30; i++) + // 等待30s,要是还没断电就重启 + for (uint8_t i = 0; i < 20; i++) { rt_thread_mdelay(1000); LOG_D(" %d s", i); @@ -439,7 +437,7 @@ int main(void) { Flash_Write_Record(kRecordSensoEndOfLife); } - BEEP_END_OF_LIFE; +// BEEP_END_OF_LIFE; LED_Y_END_OF_LIFE; } } @@ -480,4 +478,10 @@ static void SYS_Set_RtcProductTime(int argc, char **argv) } MSH_CMD_EXPORT(SYS_Set_RtcProductTime, "SYS_Set_RtcProductTime"); +static void SYS_SW_Version(void) +{ + rt_kprintf("JT-DT-YD4N02A Software version: V%02X\r\n", (uint8_t)Flash_Get_SysCfg(kSwVerId)); +} +MSH_CMD_EXPORT(SYS_SW_Version, "软件版本"); + #endif diff --git a/applications/user_sys.c b/applications/user_sys.c index 27eda69..1d53927 100644 --- a/applications/user_sys.c +++ b/applications/user_sys.c @@ -30,6 +30,8 @@ #include "bsp_rng.h" #include "at_device_nt26k.h" +#define K 3 * 1000 + volatile rt_uint16_t work_duration = 1; // 工作时长 volatile rt_uint8_t device_life_check = 0; volatile rt_uint8_t device_state_flag = 0; // 设备失效标志 @@ -225,6 +227,25 @@ int Convert_To_Hex(const struct flash_sever_info *sever_info, uint8_t *hex_array return RT_EOK; } +//利用IMEI号进行错峰延时计算 +rt_uint32_t IMEI_Delay(void) +{ + char imei_str[16]; + char randon_char[8] = {0}; + rt_uint32_t imei_delay = 0; + unsigned int random_number = 0; + + Get_Nb_Imei(imei_str, FLASH_NB_IMEI_LEN); + // 提取 IMEI 的最后 5 位作为种子 + rt_strncpy(randon_char, &imei_str[0] + FLASH_NB_IMEI_LEN - 5, 5); + random_number = atoi(randon_char); + imei_delay = (random_number + Get_RandomNumber()) % (K); + // rt_kprintf("IMEI_Delay:%d\r\n", imei_delay); + return (rt_uint32_t)imei_delay; + +} + + int BSP_SYS_Init(void) { BSP_Flash_Init(); diff --git a/applications/user_sys.h b/applications/user_sys.h index bdffde2..f801251 100644 --- a/applications/user_sys.h +++ b/applications/user_sys.h @@ -1,12 +1,12 @@ -/*** +/*** * @Author: mbw * @Date: 2024-10-09 08:42:14 * @LastEditors: mbw && 1600520629@qq.com * @LastEditTime: 2024-11-12 14:19:50 * @FilePath: \JT-DT-YD4N02A_RTT_MRS-4G\applications\user_sys.h - * @Description: + * @Description: * @ - * @Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. + * @Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. */ #ifndef __USER_SYS_H__ #define __USER_SYS_H__ @@ -14,82 +14,84 @@ #include "rtdef.h" #include "bsp_flash.h" +#define SYS_PREHEAT_TIME_S (10U) +#define SYS_MUTE_TIME_S (uint8_t)(10 * 3) -#define SYS_PREHEAT_TIME_S (10U) -#define SYS_MUTE_TIME_S (uint8_t)(10 * 3) - -#define MAX_EXPIRATION_DAYS (uint16_t)(365 * 10 + 30 * 3) +#define MAX_EXPIRATION_DAYS (uint16_t)(365 * 10 + 30 * 3) +#define SYS_HW_VERSION 0X10 +#define SYS_SW_VERSION 0X13 +#define SYS_IOT_UPLOAD_CYCLE_MIN (0X3C00) // 高位在前,低位在后 +#define SYS_ALARM_VALVE 0X0A +#define SYS_IOT_URL "8.130.117.149" +#define SYS_IOT_PORT "7137" typedef enum { - kPowerOnEvent, - kPreheatingEvent, + kPowerOnEvent, + kPreheatingEvent, kNormalDetectionEvents, - kAlarmEvent, - kAlarmRcyEvent, - kFaultEvent, - kFaultRcyEvent, - kSensorFailureEvent, - kPowerDownEvent, - kSelfCheckEvent, - KMuteEvent, + kAlarmEvent, + kAlarmRcyEvent, + kFaultEvent, + kFaultRcyEvent, + kSensorFailureEvent, + kPowerDownEvent, + kSelfCheckEvent, + KMuteEvent, kAlarmExceptionEvent, // alarm_exception - kMaxEventcnt, -} AlarmEvent; - + kMaxEventcnt, +} AlarmEvent; // 定义开关状态枚举类型 typedef enum { - kStatusOff = 0, // 关闭状态 - kStatusOn // 打开状态 + kStatusOff = 0, // 关闭状态 + kStatusOn // 打开状态 } TeStatus; // 定义系统标志位结构体 typedef struct { - TeStatus valve_status; // 阀门状态 - TeStatus relay_status; // 继电器状态 + TeStatus valve_status; // 阀门状态 + TeStatus relay_status; // 继电器状态 } TsDeviceStatus; - // 定义系统状态枚举类型 typedef enum { - kSysToBeCalibStatus = 0, // 系统待校准状态 - kSysGasCalibStatus, // 气体校准状态 - KSysTestStatus, // 测试状态 + kSysToBeCalibStatus = 0, // 系统待校准状态 + kSysGasCalibStatus, // 气体校准状态 + KSysTestStatus, // 测试状态 - kSysSelfCheckingStatus, // 自检状态 + kSysSelfCheckingStatus, // 自检状态 - kSysPowerUpStatus, // 上电状态 - kSysPowerDownStatus, // 下电状态 + kSysPowerUpStatus, // 上电状态 + kSysPowerDownStatus, // 下电状态 - kSysStartupPreheatingStatus, // 启动预热状态 - kSysRuningStatus, // 运行中状态 + kSysStartupPreheatingStatus, // 启动预热状态 + kSysRuningStatus, // 运行中状态 - kSysAlarmStatus, // 报警状态 - kSysMuteStatus, // 消音状态 + kSysAlarmStatus, // 报警状态 + kSysMuteStatus, // 消音状态 - kSysFaultStatus, // 故障状态 - kSysSensorEndOfLifeStatus, // 传感器寿命结束状态 + kSysFaultStatus, // 故障状态 + kSysSensorEndOfLifeStatus, // 传感器寿命结束状态 - kSysRestoreFactoryStatus, // 恢复出厂设置状态 -}TeSysStatus; + kSysRestoreFactoryStatus, // 恢复出厂设置状态 +} TeSysStatus; // 定义系统控制结构体 typedef struct { - AlarmEvent status; // 当前状态 - AlarmEvent last_status; // 上一次状态 + AlarmEvent status; // 当前状态 + AlarmEvent last_status; // 上一次状态 } TsSysControl; -extern volatile rt_uint16_t work_duration;//工作天数 +extern volatile rt_uint16_t work_duration; // 工作天数 extern volatile rt_uint8_t device_state_flag; extern struct rt_event alarm_event; extern TsSysControl SysControl; -void Send_Laser_Alarm_Event(AlarmEvent event); - +void Send_Laser_Alarm_Event(AlarmEvent event); unsigned short crc1021(const char *data, unsigned int length); void HexStrToBytes(const char *hexString, unsigned char *byteArray, size_t byteCount); @@ -99,7 +101,5 @@ int Extract_Value(const char *str, const char *key); int _Self_Check_Mode(void); int Convert_To_Hex(const struct flash_sever_info *sever_info, uint8_t *hex_array); int BSP_SYS_Init(void); - +rt_uint32_t IMEI_Delay(void); #endif //!__USER_SYS_H__ - - diff --git a/bsp/inc/at_device_nt26k.h b/bsp/inc/at_device_nt26k.h index 4d2ce03..15329b1 100644 --- a/bsp/inc/at_device_nt26k.h +++ b/bsp/inc/at_device_nt26k.h @@ -60,7 +60,7 @@ struct at_device_nt26k int pwr_en_pin; int rst_pin; - int wkp_pin; + int pwr_key_pin; size_t recv_line_num; struct at_device device; diff --git a/bsp/inc/bsp_nt26k.h b/bsp/inc/bsp_nt26k.h index 304c024..3dc332f 100644 --- a/bsp/inc/bsp_nt26k.h +++ b/bsp/inc/bsp_nt26k.h @@ -13,8 +13,7 @@ #define NT26K_PWR_EN_PIN GET_PIN(B, 3) #define NT26K_RST_PIN GET_PIN(A, 11) -#define NT26K_WKP_PIN GET_PIN(C, 7) - +#define NT26K_PWR_KEY_PIN GET_PIN(C, 7) #define NT26K_SAMPLE_DEIVCE_NAME "nt26k" @@ -203,6 +202,7 @@ struct Nt26k_Ops extern struct Nt26k_Ops nt26k_ops; extern rt_sem_t nt26k_recv_sem; +extern rt_sem_t nt26k_disconnect_sem; extern rt_uint8_t nt26k_conncet_tcp_flag; extern rt_uint8_t power_on_send_flag; int nt26k_device_register(void); diff --git a/bsp/src/at_device_nt26k.c b/bsp/src/at_device_nt26k.c index 07c67af..ff3cdc2 100644 --- a/bsp/src/at_device_nt26k.c +++ b/bsp/src/at_device_nt26k.c @@ -2,7 +2,7 @@ * @Author : stark1898y 1658608470@qq.com * @Date : 2024-09-04 13:33:49 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-30 17:19:08 + * @LastEditTime: 2024-12-31 14:13:51 * @FilePath: \JT-DT-YD4N02A_RTT_MRS-4G\bsp\src\at_device_nt26k.c * @Description : * @@ -46,7 +46,7 @@ #define NT26K_THREAD_PRIORITY (RT_THREAD_PRIORITY_MAX / 2) char data_buf[AT_CLIENT_RECV_BUFF_LEN] = {0}; -rt_uint8_t recv_byte_buf[AT_CLIENT_RECV_BUFF_LEN] = {0}; + nt26k_sys_info nt26k = {0}; struct rt_completion nt26k_init_complate; @@ -54,7 +54,6 @@ volatile rt_uint8_t socket_id = 0; rt_err_t Nt26k_Reset(struct at_device *device) { - // at_client_send("AT+NRB\r\n", rt_strlen("AT+NRB\r\n")); LOG_I("NT26K Reset"); rt_pin_mode(NT26K_RST_PIN, PIN_MODE_OUTPUT); rt_pin_write(NT26K_RST_PIN, PIN_LOW); @@ -157,56 +156,16 @@ static int nt26k_sleep(struct at_device *device) static int nt26k_wakeup(struct at_device *device) { - at_response_t resp = RT_NULL; struct at_device_nt26k *nt26k = RT_NULL; nt26k = (struct at_device_nt26k *)device->user_data; - if (!nt26k->power_status) // power off + if (nt26k->pwr_key_pin != -1) { - LOG_E("the power is off and the wake-up cannot be performed"); - return (-RT_ERROR); - } - if (!nt26k->sleep_status) // no sleep status - { - return (RT_EOK); - } - - resp = at_create_resp(64, 0, rt_tick_from_millisecond(300)); - if (resp == RT_NULL) - { - LOG_D("no memory for resp create."); - at_delete_resp(resp); - return (-RT_ERROR); - } - - if (nt26k->wkp_pin != -1) - { - rt_pin_write(nt26k->wkp_pin, PIN_LOW); + rt_pin_write(nt26k->pwr_key_pin, PIN_LOW); rt_thread_mdelay(100); - rt_pin_write(nt26k->wkp_pin, PIN_HIGH); - rt_thread_mdelay(100); - rt_pin_write(nt26k->wkp_pin, PIN_LOW); + rt_pin_write(nt26k->pwr_key_pin, PIN_HIGH); + nt26k->sleep_status = RT_TRUE; } - - /* disable sleep mode */ - if (at_obj_exec_cmd(device->client, resp, "AT+ECPMUCFG=1,0") != RT_EOK) - { - LOG_D("wake up fail. \"AT+ECPMUCFG=1,0\" execute fail."); - at_delete_resp(resp); - return (-RT_ERROR); - } - - /* disable PSM mode */ - if (at_obj_exec_cmd(device->client, resp, "AT+CPSMS=0") != RT_EOK) - { - LOG_D("wake up fail.\"AT+CPSMS=0\" execute fail."); - at_delete_resp(resp); - return (-RT_ERROR); - } - - nt26k->sleep_status = RT_FALSE; - - at_delete_resp(resp); return (RT_EOK); } @@ -216,7 +175,8 @@ static void urc_tcp_recv(struct at_client *client, const char *data, rt_size_t s rt_uint16_t crc16 = 0; rt_uint16_t rec_crc16 = 0; char crc16_buf[6] = {0}; - + rt_uint8_t recv_byte_buf[AT_CLIENT_RECV_BUFF_LEN] = {0}; + rt_memset(data_buf, 0, sizeof(data_buf)); if (sscanf(data, "+QIURC: \"recv\",%*d,%d,%s", &len, data_buf) == 2) @@ -239,8 +199,10 @@ static void urc_tcp_recv(struct at_client *client, const char *data, rt_size_t s { rt_memset(nt26k_ops.recv, 0, sizeof(struct Nt26kRecvData)); // 清空结构体 rt_memcpy(nt26k_ops.recv, recv_byte_buf, sizeof(struct Nt26kRecvData)); - rt_sem_release(nt26k_recv_sem); - rt_memset(recv_byte_buf, 0, sizeof(recv_byte_buf)); + if (nt26k_ops.recv->recv_data.event_type != INSTRUCTION_HEART_BEAT)//加这个的原因就是如果有指令下发,会出现两个信号量,指令会执行两次,所以排除心跳包才释放信号量 + { + rt_sem_release(nt26k_recv_sem); + } } else { @@ -248,24 +210,27 @@ static void urc_tcp_recv(struct at_client *client, const char *data, rt_size_t s } } } + rt_memset(recv_byte_buf, 0, sizeof(recv_byte_buf)); } static void urc_device_reset(struct at_client *client, const char *data, rt_size_t size) { LOG_D("device reset"); nt26k_conncet_tcp_flag = 0; + rt_sem_release(nt26k_disconnect_sem); } static void urc_tcp_disconnect(struct at_client *client, const char *data, rt_size_t size) { - size_t err_code = 0, id; + size_t id; - if (sscanf(data, "+NSOCLI:%d,%d", &id, &err_code) == 2) + if (sscanf(data, "+QIURC: \"closed\",%d", &id) == 1) { - if ((id == socket_id) && (err_code == 107)) // 107错误一般是服务器没加这个IMEI + if (id == socket_id) { - LOG_W("socket %d disconnect, error code: %d", id, err_code); + LOG_W("socket %d disconnect", id); nt26k_conncet_tcp_flag = 0; + rt_sem_release(nt26k_disconnect_sem); } } } @@ -274,7 +239,7 @@ static const struct at_urc urc_table[] = { {"+QIURC: \"recv\"", "\r\n", urc_tcp_recv}, {"boot.rom", "\r\n", urc_device_reset}, // 这个是软件复位时, {"Lierda", "\r\n", urc_device_reset}, // 这个时硬件复位时回复 - {"+NSOCLI:", "\r\n", urc_tcp_disconnect}, // 这个时硬件复位时回复 + {"+QIURC: \"closed\"", "\r\n", urc_tcp_disconnect}, // tcp连接断开 }; void show_resp_info(at_response_t resp) { @@ -311,48 +276,12 @@ int at_device_nt26k_disconnect_tcp(struct at_device *device) return -RT_ERROR; } nt26k_conncet_tcp_flag = 0; + rt_sem_release(nt26k_disconnect_sem); at_delete_resp(resp); } return RT_EOK; } -#if 0 -int at_device_nt26k_socket_creat(struct at_device *device) -{ - at_response_t resp = at_create_resp(AT_CLIENT_RECV_BUFF_LEN, 4, AT_DEFAULT_TIMEOUT); - rt_uint8_t retry = (rt_uint8_t)Flash_Get_SysCfg(kNbRetryId); - if (resp == RT_NULL) - { - LOG_E("No memory for response structure!"); - at_delete_resp(resp); - return -RT_ENOMEM; - } - while (retry--) - { - if (at_obj_exec_cmd(device->client, resp, TCP_SOCKET_CREAT) == RT_EOK) - { - if (at_resp_parse_line_args_by_kw(resp, "+SKTCREATE:", "+SKTCREATE:%d", &socket_id) > 0) - { - if (socket_id >= 0) - { - LOG_I("nt26k create tcp socket success. socket id: %d", socket_id); - at_delete_resp(resp); - return RT_EOK; - } - } - else - { - at_device_nt26k_disconnect_tcp(device);//这里失败的原因有两种,一种是没有ID返回,一种是返回比较慢,导致错误出现 - LOG_E("nt26k create tcp socket failed. retry %d", retry); - } - } - rt_thread_mdelay(5000); - } - at_delete_resp(resp); - return RT_ERROR; -} -#endif - static int at_device_nt26k_connect_tcp(struct at_device *device) { int err_code = 0; @@ -360,7 +289,7 @@ static int at_device_nt26k_connect_tcp(struct at_device *device) return RT_EOK; ASSERT(device); rt_uint8_t retry = (rt_uint8_t)Flash_Get_SysCfg(kNbRetryId); - at_response_t resp = at_create_resp(64, 0, AT_DEFAULT_TIMEOUT); + at_response_t resp = at_create_resp(64, 4, AT_DEFAULT_TIMEOUT); if (resp == RT_NULL) { LOG_E("No memory for response structure!"); @@ -373,13 +302,11 @@ static int at_device_nt26k_connect_tcp(struct at_device *device) at_delete_resp(resp); return RT_ERROR; } - at_delete_resp(resp); - resp = at_create_resp(32, 4, AT_DEFAULT_TIMEOUT); for (size_t i = 0; i < retry; i++) { if (at_obj_exec_cmd(device->client, resp, TCP_CONNECT_CMD, sever_info.server_url, sever_info.server_port) == RT_EOK) { - if (at_resp_parse_line_args_by_kw(resp, "+QIOPEN:", "+QIOPEN:%d,%d", socket_id, err_code) > 0) + if (at_resp_parse_line_args_by_kw(resp, "+QIOPEN:", "+QIOPEN:%d,%d", &socket_id, &err_code) > 0) { if (err_code == 0) { @@ -390,18 +317,14 @@ static int at_device_nt26k_connect_tcp(struct at_device *device) } else { - at_device_nt26k_disconnect_tcp(device); LOG_E("nt26k connect to tcp server failed. error code: %d",err_code); } } - else - { - nt26k_conncet_tcp_flag = 0; - LOG_E("nt26k connect to tcp server failed."); - } } rt_thread_mdelay(5000); } + at_device_nt26k_disconnect_tcp(device); + rt_sem_release(nt26k_disconnect_sem); at_delete_resp(resp); return RT_ERROR; } @@ -410,7 +333,6 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t size) { #define NT26K_SEND_RESP_TIME (3000) const char *line_buffer = RT_NULL; - int len = 0; rt_uint8_t retry = 0; at_response_t resp = at_create_resp(AT_CLIENT_RECV_BUFF_LEN / 4, 2, NT26K_SEND_RESP_TIME); rt_uint8_t max_retry_count = (rt_uint8_t)Flash_Get_SysCfg(kNbRetryId); @@ -423,7 +345,7 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t size) while (retry < max_retry_count) { - rt_thread_mdelay(Get_RandomNumber());//获取一个随机延时 + rt_thread_mdelay(IMEI_Delay());//获取一个随机延时 if (at_obj_exec_cmd(device->client, resp, TCP_SEND_DATA, socket_id, data) == RT_EOK) { if ((line_buffer = at_resp_get_line(resp, 2)) != RT_NULL) @@ -444,7 +366,7 @@ int at_send_data(struct at_device *device, const char *data, rt_size_t size) return -RT_ERROR; } -static int nt26k_check_link_status(struct at_device *device) +int nt26k_check_link_status(struct at_device *device) { at_response_t resp = RT_NULL; struct at_device_nt26k *nt26k = RT_NULL; @@ -458,14 +380,14 @@ static int nt26k_check_link_status(struct at_device *device) } if (nt26k->sleep_status) // is sleep status { - if (nt26k->wkp_pin != -1) + if (nt26k->pwr_key_pin != -1) { - rt_pin_write(nt26k->wkp_pin, PIN_LOW); + rt_pin_write(nt26k->pwr_key_pin, PIN_LOW); rt_thread_mdelay(100); - rt_pin_write(nt26k->wkp_pin, PIN_HIGH); + rt_pin_write(nt26k->pwr_key_pin, PIN_HIGH); rt_thread_mdelay(100); - rt_pin_write(nt26k->wkp_pin, PIN_LOW); + rt_pin_write(nt26k->pwr_key_pin, PIN_LOW); } } @@ -505,7 +427,7 @@ static int nt26k_check_link_status(struct at_device *device) /* ============================= nt26k network interface operations ============================= */ /* set nt26k network interface device status and address information */ -static int nt26k_netdev_set_info(struct netdev *netdev) +int nt26k_netdev_set_info(struct netdev *netdev) { #define NT26K_INFO_RESP_SIZE 128 #define NT26K_INFO_RESP_TIMO rt_tick_from_millisecond(1000) @@ -617,7 +539,7 @@ static void nt26k_check_link_status_entry(void *parameter) } } -static int nt26k_netdev_check_link_status(struct netdev *netdev) +int nt26k_netdev_check_link_status(struct netdev *netdev) { #define NT26K_LINK_THREAD_TICK 20 #define NT26K_LINK_THREAD_STACK_SIZE (1024 + 512) @@ -947,6 +869,18 @@ static void nt26k_init_thread_entry(void *parameter) result = -RT_ERROR; goto __exit; } + /*设置保活信息*/ + if ( at_obj_exec_cmd(device->client, resp, "AT+QICFG=\"tcp/keepalive\",1,1800,100,3") != RT_EOK) + { + result = -RT_ERROR; + goto __exit; + } + /*设置保活信息*/ + if ( at_obj_exec_cmd(device->client, resp, "AT+QICFG=\"passiveclosed\",1") != RT_EOK) + { + result = -RT_ERROR; + goto __exit; + } /* get module version */ if (at_obj_exec_cmd(device->client, resp, "AT+CGMR") != RT_EOK) { @@ -984,13 +918,12 @@ static void nt26k_init_thread_entry(void *parameter) /* check SIM card */ for (i = 0; i < CPIN_RETRY; i++) { - if (at_obj_exec_cmd(device->client, resp, "AT+CPIN?") == RT_EOK) { - if (at_resp_get_line_by_kw(resp, "READY") != RT_NULL) + if (at_resp_get_line_by_kw(resp, "+CPIN: READY") != RT_NULL) break; } - rt_thread_mdelay(1000); + rt_thread_mdelay(2000); } if (i == CPIN_RETRY) { @@ -1002,7 +935,7 @@ static void nt26k_init_thread_entry(void *parameter) for (i = 0; i < CSQ_RETRY; i++) { - if (at_obj_exec_cmd(device->client, resp, "AT+CREG=3") == RT_EOK) + if (at_obj_exec_cmd(device->client, resp, "AT+CREG=2") == RT_EOK) { if (at_resp_get_line_by_kw(resp, "OK") > 0) { @@ -1026,12 +959,12 @@ static void nt26k_init_thread_entry(void *parameter) char iccid[NT26K_ICCID_LEN] = {0}; /* send "AT+ECICCID" commond to get device iccid */ - if (at_obj_exec_cmd(device->client, resp, "AT+ECICCID") != RT_EOK) + if (at_obj_exec_cmd(device->client, resp, "AT+QCCID") != RT_EOK) { result = -RT_ERROR; goto __exit; } - if (at_resp_parse_line_args_by_kw(resp, "+ECICCID:", "+ECICCID:%s", iccid) <= 0) + if (at_resp_parse_line_args_by_kw(resp, "+QCCID:", "+QCCID:%s", iccid) <= 0) { LOG_E("%s device prase \"AT+ECICCID\" cmd error.", device->name); result = -RT_ERROR; @@ -1273,52 +1206,52 @@ rt_err_t Nt26k_Get_Signal_Info(struct at_device *device) LOG_E("%s device signal data failed", device->name); result = -RT_ERROR; } - /* get signal snr, pci */ - for (int i = 0; i < RETRY; i++) - { - if (at_obj_exec_cmd(device->client, resp, "AT+NUESTATS") == RT_EOK) - { - const char *key1 = "SNR:"; - const char *key2 = "PCI:"; - int pci = 0, snr = 0; - // show_resp_info(resp); + // /* get signal snr, pci */ + // for (int i = 0; i < RETRY; i++) + // { + // if (at_obj_exec_cmd(device->client, resp, "AT+NUESTATS") == RT_EOK) + // { + // const char *key1 = "SNR:"; + // const char *key2 = "PCI:"; + // int pci = 0, snr = 0; + // // show_resp_info(resp); - // 获取第 2 行的响应 - const char *line = at_resp_get_line(resp, 2); + // // 获取第 2 行的响应 + // const char *line = at_resp_get_line(resp, 2); - if (line != NULL) - { - snr = Extract_Value(line, key1); - pci = Extract_Value(line, key2); + // if (line != NULL) + // { + // snr = Extract_Value(line, key1); + // pci = Extract_Value(line, key2); - if (snr != 0 && pci != 0) - { - nt26k.pci = pci; - nt26k.snr = snr; - LOG_D("pci:%d,snr:%d", nt26k.pci, nt26k.snr); - break; - } - else - { - LOG_D("Extracted values are invalid: SNR=%d, PCI=%d", snr, pci); - } - } - else - { - LOG_D("Failed to get line 2 from response"); - } - } - else - { - LOG_D("Failed to execute AT command"); - } - rt_thread_mdelay(2000); - } - if (i == RETRY) - { - LOG_E("%s device signal data failed", device->name); - result = -RT_ERROR; - } + // if (snr != 0 && pci != 0) + // { + // nt26k.pci = pci; + // nt26k.snr = snr; + // LOG_D("pci:%d,snr:%d", nt26k.pci, nt26k.snr); + // break; + // } + // else + // { + // LOG_D("Extracted values are invalid: SNR=%d, PCI=%d", snr, pci); + // } + // } + // else + // { + // LOG_D("Failed to get line 2 from response"); + // } + // } + // else + // { + // LOG_D("Failed to execute AT command"); + // } + // rt_thread_mdelay(2000); + // } + // if (i == RETRY) + // { + // LOG_E("%s device signal data failed", device->name); + // result = -RT_ERROR; + // } at_delete_resp(resp); return result; @@ -1376,9 +1309,10 @@ static int nt26k_init(struct at_device *device) { rt_pin_mode(nt26k->rst_pin, PIN_MODE_OUTPUT); } - if (nt26k->wkp_pin != -1) + if (nt26k->pwr_key_pin != -1) { - rt_pin_mode(nt26k->wkp_pin, PIN_MODE_OUTPUT); + rt_pin_mode(nt26k->pwr_key_pin, PIN_MODE_OUTPUT); + device->class->device_ops->control(device, AT_DEVICE_CTRL_WAKEUP, RT_NULL); } /* initialize nt26k device network */ return nt26k_netdev_set_up(device->netdev); diff --git a/bsp/src/bsp_flash.c b/bsp/src/bsp_flash.c index 3a8f08b..67781f7 100644 --- a/bsp/src/bsp_flash.c +++ b/bsp/src/bsp_flash.c @@ -80,21 +80,19 @@ const rt_uint32_t hr_sys_cfg_info_len[kCnt] = { static rt_base_t interrupt_value; /*默认的系统配置*/ -rt_uint8_t sys_hw_ver = 0x10; -rt_uint8_t sys_sw_ver = 0x12; +rt_uint8_t sys_hw_ver = SYS_HW_VERSION; +rt_uint8_t sys_sw_ver = SYS_SW_VERSION; rt_uint8_t sys_nb_retry = 0x03; // 重试次数3次 -rt_uint16_t sys_nb_upload_cycle = 0x3C00; // 60分钟一次 ,低位在前,高为在后,为了和服务器下发时保持一致,有利于读取 +rt_uint16_t sys_nb_upload_cycle = SYS_IOT_UPLOAD_CYCLE_MIN; // 60分钟一次 ,低位在前,高为在后,为了和服务器下发时保持一致,有利于读取 rt_uint8_t sys_alarm_h_value = 0x32; // 50 -rt_uint8_t sys_alarm_l_value = 0x0A; // 10 +rt_uint8_t sys_alarm_l_value = SYS_ALARM_VALVE; // 10 rt_uint8_t sys_temp_alarm_threshold = 0x32; rt_uint8_t sys_emagnetic_switch = 0x04; // 具备阀门功能 rt_uint8_t sys_relay_switch = 0x04; // 具备继电器功能 struct flash_sever_info sever_info = { - .server_url = "8.130.117.149", - .server_port = "7137", - // .server_url = "8.135.10.183", - // .server_port = "36125," + .server_url = SYS_IOT_URL, + .server_port = SYS_IOT_PORT, }; diff --git a/bsp/src/bsp_nt26k.c b/bsp/src/bsp_nt26k.c index 6386342..3d77631 100644 --- a/bsp/src/bsp_nt26k.c +++ b/bsp/src/bsp_nt26k.c @@ -2,7 +2,7 @@ * @Author: mbw * @Date: 2024-10-09 08:42:14 * @LastEditors: mbw && 1600520629@qq.com - * @LastEditTime: 2024-12-30 17:33:50 + * @LastEditTime: 2024-12-31 11:01:49 * @FilePath: \JT-DT-YD4N02A_RTT_MRS-4G\bsp\src\bsp_nt26k.c * @Description: * @@ -60,12 +60,11 @@ static struct rt_thread nt26k_life_thread; struct rt_event at_device_event; rt_sem_t nt26k_recv_sem; -rt_sem_t nt26k_life_sem; +rt_sem_t nt26k_disconnect_sem; static rt_timer_t nt26k_timer; // 上报心跳 static rt_timer_t nt26k_upload_timer; // 更新本地时间定时器 static rt_timer_t nt26k_power_error_timer; // 上电失败情况下启动定时器 -/*生命周期窗口定时器,用于管理tcp连接的断开*/ -static rt_timer_t nt26k_life_timer; + rt_uint8_t nt26k_conncet_tcp_flag; Nt26kEventIndex nt26k_event_index; @@ -99,7 +98,7 @@ static struct at_device_nt26k _dev = NT26K_PWR_EN_PIN, NT26K_RST_PIN, - NT26K_WKP_PIN, + NT26K_PWR_KEY_PIN, NT26K_SAMPLE_RECV_BUFF_LEN, }; @@ -179,11 +178,6 @@ static void Nt26k_Ht_Timer_Cb(void *parameter) Nt26k_Send_Event(kNt26kHeartbeatEvent); } -// 定时器回调函数,当1分钟内没有数据交互时,关闭tcp连接 -static void Nt26k_Life_Timer_Cb(void *parameter) -{ - rt_sem_release(nt26k_life_sem); -} // 定时器回调函数,当1分钟内没有数据交互时,关闭tcp连接 static void Nt26k_Error_Timer_Cb(void *parameter) @@ -198,16 +192,6 @@ static void Nt26k_Error_Timer_Cb(void *parameter) } } -// 重置定时器 -void Reset_Nt26k_Life_Timer(void) -{ - if (nt26k_life_timer != RT_NULL) - { - // rt_timer_stop(nt26k_life_timer);//启动这个时,他会自动清除以前的定时器,所以不必担心是否已经启动的问题,困扰我不少时间,点进去第一二句就是 - rt_timer_start(nt26k_life_timer); - } -} - int _Pack_Send(struct Nt26k_Ops *ops, char *buf) { char nt26k_send_buf[512] = {0}; // 发送缓冲区,用于存储最终发送的数据 @@ -807,7 +791,6 @@ int Nt26k_Process_Events(Nt26kEvent nt26k_recv_event, struct at_device *device, if (device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL) == RT_EOK) // 打开连接 { LOG_D("nt26k connect tcp success\n"); - Reset_Nt26k_Life_Timer(); // 重启后重新尝试发送 result = event->send_func(device, nt26k_ops); if (result != RT_EOK) @@ -927,12 +910,7 @@ void Handle_Close_Valve(struct Nt26k_Ops *ops) Get_Nb_Imei(imei, FLASH_NB_IMEI_LEN); char temp[32] = "0"; String2Hex(temp, imei); // 将字符串转为十六进制字符串 - - // emv_state_flag = 1; - // rt_thread_mdelay(20); - // emv_state_flag = 0; EMV_CLOSE_VALVE; - // rt_uint8_t ret = BSP_Set_Emv_Status(0); ops->Resp(ops, DATA_SERIAL_NUM, CMD_TYPE_INSTRUCTION_REPLY, DEVICE_TYPE_NT26K, INSTRUCTION_DOWN_CLOSE_VALVE, temp, RESPONSE_CODE_SUCCESS); } @@ -1213,7 +1191,6 @@ void Handle_Cmd_Type(struct Nt26k_Ops *ops) void Analyze_Recv_Frame(struct at_device *device, struct Nt26k_Ops *ops) { rt_err_t ret = RT_EOK; - Reset_Nt26k_Life_Timer(); // 只要数据,则重置定时器,不管数据是否正确 ret = Compare_HeaderToTail(ops); if (ret == RT_EOK) @@ -1282,7 +1259,6 @@ static void Nt26k_Send_Thread_Entry(void *param) if (device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_CONN, RT_NULL) == RT_EOK) // 打开连接 { LOG_D("nt26k connect tcp success\n"); - rt_timer_start(nt26k_life_timer); } else { @@ -1291,7 +1267,6 @@ static void Nt26k_Send_Thread_Entry(void *param) } if (nt26k_conncet_tcp_flag) { - Reset_Nt26k_Life_Timer(); if (nt26k_recv_event & Nt26k_Get_Event_Flag(kNt26kPowerOnEvent)) { result = Nt26k_Process_Events(kNt26kPowerOnEvent, device, ops); // 当上电心跳包发送不成功时,其他事件不启动 @@ -1436,19 +1411,14 @@ static void Nt26k_Recv_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; LOG_D("nt26k recv thread entry\n"); while (1) { - ret = rt_sem_take(nt26k_recv_sem, RT_WAITING_FOREVER); // 这个主要用来处理的数据 - if (ret == RT_EOK) - { - rt_timer_start(nt26k_life_timer); - /*对数据帧进行分析,判断所处的是对服务器响应还是指令下发*/ - Analyze_Recv_Frame(device, ops); - } + rt_sem_take(nt26k_recv_sem, RT_WAITING_FOREVER); // 这个主要用来处理的数据 + /*对数据帧进行分析,判断所处的是对服务器响应还是指令下发*/ + Analyze_Recv_Frame(device, ops); } } @@ -1464,13 +1434,24 @@ static void Nt26k_Life_Thread_Entry(void *parameter) while (1) { - ret = rt_sem_take(nt26k_life_sem, RT_WAITING_FOREVER); + ret = rt_sem_take(nt26k_disconnect_sem, RT_WAITING_FOREVER); if (ret == RT_EOK) { - if (nt26k_conncet_tcp_flag) + if (!nt26k_conncet_tcp_flag) { - device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_DISCONN, RT_NULL); - LOG_D("close nt26k tcp connect\n "); + LOG_D("重连网络中...\n"); + device->class->device_ops->control(device, AT_DEVICE_CTRL_NET_DISCONN, RT_NULL);//先关闭,再处理 + 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; + } + else + { + LOG_D("重连网络失败\n"); + rt_thread_mdelay(10000); + rt_sem_release(nt26k_disconnect_sem); + } } } } @@ -1490,21 +1471,21 @@ int BSP_Nt26k_Thread_Init(void) rt_uint32_t nb_upload_time = (uint16_t)Flash_Get_SysCfg(kNbUploadCycleId); unsigned long timeout = nb_upload_time * 60 * RT_TICK_PER_SECOND; LOG_I("上报服务器周期:%d分钟", nb_upload_time); - nt26k_mutex = rt_mutex_create("nt26k_mutex", RT_IPC_FLAG_FIFO); + nt26k_mutex = rt_mutex_create("nt26k_mutex", RT_IPC_FLAG_PRIO); if (nt26k_mutex == RT_NULL) { LOG_E("nt26k_mutex create failed"); } - nt26k_recv_sem = rt_sem_create("nt26k_recv", 0, RT_IPC_FLAG_FIFO); + nt26k_recv_sem = rt_sem_create("nt26k_recv", 0, RT_IPC_FLAG_PRIO); if (nt26k_recv_sem == RT_NULL) { LOG_E("nt26k_recv_sem create failed"); } - nt26k_life_sem = rt_sem_create("nt26k_life", 0, RT_IPC_FLAG_FIFO); - if (nt26k_life_sem == RT_NULL) + nt26k_disconnect_sem = rt_sem_create("nt26k_life", 0, RT_IPC_FLAG_PRIO); + if (nt26k_disconnect_sem == RT_NULL) { - LOG_E("nt26k_life_sem create failed"); + LOG_E("nt26k_disconnect_sem create failed"); } // 创建定时器 nt26k_timer = rt_timer_create("heartbeat", @@ -1518,16 +1499,6 @@ int BSP_Nt26k_Thread_Init(void) rt_kprintf("创建定时器失败\n"); return -1; } - nt26k_life_timer = rt_timer_create("nt26k_life", - Nt26k_Life_Timer_Cb, - RT_NULL, - 30 * RT_TICK_PER_SECOND, - RT_TIMER_FLAG_ONE_SHOT); - if (nt26k_life_timer == RT_NULL) - { - rt_kprintf("创建定时器失败\n"); - return -1; - } nt26k_power_error_timer = rt_timer_create("nt26k_error_timer", Nt26k_Error_Timer_Cb, RT_NULL,