暂存 添加4G定时开阀功能

This commit is contained in:
常正强 2025-06-13 15:45:48 +08:00
parent ef7ced3cad
commit 01f1c30aae
4 changed files with 16 additions and 108 deletions

View File

@ -139,22 +139,14 @@ typedef struct {
extern IotFlagStruct IotFlag_t; extern IotFlagStruct IotFlag_t;
extern struct tm Network_Time_t; extern struct tm Network_Time_t;
static void BSP_Ml307_Power_Off(void);
void BSP_Ml307r_Init(void); void BSP_Ml307r_Init(void);
void Iot_Send_Data(TeFrameCmd cmd); void Iot_Send_Data(TeFrameCmd cmd);
void Ml307r_Loop(void); void Ml307r_Loop(void);
void BSP_Module_Emergency_Send(uint8_t* data, uint8_t len);
void BSP_ML307_StartTimeoutTimer(void);
void BSP_ML307_SetActive(void);
void BSP_ML307_SendMessage(void); void BSP_ML307_SendMessage(void);
static void BSP_Read_Module(void);
static void BSP_simcom_init(void); static void BSP_simcom_init(void);
static void BSP_Get_Module_Info(void); static void BSP_Get_Module_Info(void);
static void BSP_Module_Connect_CtWing(void);
static void BSP_SendMessage(void); static void BSP_SendMessage(void);
static void BSP_Ml307_Power_Off(void);
uint8_t BSP_4G_Generate_Response(Ts4GJsonData *p4GData, uint32_t timestamp, TeFrameCmd responseCmd); uint8_t BSP_4G_Generate_Response(Ts4GJsonData *p4GData, uint32_t timestamp, TeFrameCmd responseCmd);
// 状态上报请求结构体 // 状态上报请求结构体

View File

@ -67,7 +67,7 @@ typedef enum
kValveCmdOpenWithStove, // 开灶开阀 kValveCmdOpenWithStove, // 开灶开阀
kValveCmdCloseWithStove, // 关灶关阀 kValveCmdCloseWithStove, // 关灶关阀
kValveCmdOverTemperature, // 超温关阀 kValveCmdOverTemperature, // 超温关阀
kValveCmdDelayClose, // 时关阀 kValveCmdDelayClose, // 恒流超时关阀
kValveCmdManualClose, // 手动关阀 kValveCmdManualClose, // 手动关阀
KValveCmdTimeSet, // 设置定时关阀时间 KValveCmdTimeSet, // 设置定时关阀时间
kValveCmdTimeResp, // 设置定时关阀时间响应 kValveCmdTimeResp, // 设置定时关阀时间响应
@ -159,7 +159,7 @@ uint8_t BSP_VALVE_Open(TeFrameCmd open_reason);
uint8_t BSP_VALVE_Lock(TeFrameCmd lock_reason); // 锁定阀门 uint8_t BSP_VALVE_Lock(TeFrameCmd lock_reason); // 锁定阀门
uint8_t BSP_VALVE_Unlock(void); // 解锁阀门 uint8_t BSP_VALVE_Unlock(void); // 解锁阀门
uint8_t BSP_VALVE_CheckHazardCleared(void); // 检查隐患是否已排除 uint8_t BSP_VALVE_CheckHazardCleared(void); // 检查隐患是否已排除
static uint8_t BSP_VALVE_SetTimerClose(uint32_t minutes); uint8_t BSP_VALVE_SetTimerClose(uint32_t minutes);
static uint8_t BSP_VALVE_CancelTimerClose(void); static uint8_t BSP_VALVE_CancelTimerClose(void);
static uint32_t BSP_VALVE_GetRemainingMinutes(void); static uint32_t BSP_VALVE_GetRemainingMinutes(void);
#endif // ! __BSP_VALVE_H__ #endif // ! __BSP_VALVE_H__

View File

@ -136,32 +136,14 @@ void Send_CallBack(MultiTimer* timer, void* userData)
IotFlag_t.send_error_flag = 1; IotFlag_t.send_error_flag = 1;
} }
// //Loop回调
// void Loop_CallBack(MultiTimer* timer, void* userData)
// {
// state = 0;
// IotFlag_t.Loop_count_flag++;
// IotFlag_t.module_init_flag = 1;
// IotFlag_t.Iot_Retry_flag = 0;
// }
//StopTask超时回调 //StopTask超时回调
void StopTask_CallBack(MultiTimer* timer, void* userData) void StopTask_CallBack(MultiTimer* timer, void* userData)
{ {
logDebug("BSP_Ml307_Power_Off\r\n"); logDebug("BSP_Ml307_Power_Off\r\n");
// IotFlag_t.Loop_count_flag = 0;
// if(IotFlag_t.PowerOn_error_flag == 1)
// {
IotFlag_t.PowerOn_error_flag = 0; IotFlag_t.PowerOn_error_flag = 0;
// tmos_stop_task(ml307_task_id, ML307_PERIODIC_EVT);
// PFIC_DisableIRQ(UART1_IRQn);
// BSP_RequestSleep();
// }else{
// BSP_Ml307_Power_Off(); //关机
tmos_stop_task(ml307_task_id, ML307_PERIODIC_EVT); tmos_stop_task(ml307_task_id, ML307_PERIODIC_EVT);
PFIC_DisableIRQ(UART1_IRQn); PFIC_DisableIRQ(UART1_IRQn);
BSP_RequestSleep(); BSP_RequestSleep();
// }
IotFlag_t.Date_Sending_flag = 0; IotFlag_t.Date_Sending_flag = 0;
} }
@ -177,13 +159,11 @@ static int _parse_server_json_data(const char* json_str)
lwjson_token_t tokens[64]; lwjson_token_t tokens[64];
const lwjson_token_t* token; const lwjson_token_t* token;
// 初始化lwjson
if (lwjson_init(&lwjson, tokens, LWJSON_ARRAYSIZE(tokens)) != lwjsonOK) { if (lwjson_init(&lwjson, tokens, LWJSON_ARRAYSIZE(tokens)) != lwjsonOK) {
logDebug("lwjson init failed\r\n"); logDebug("lwjson init failed\r\n");
return -1; return -1;
} }
// 解析JSON字符串
if (lwjson_parse(&lwjson, json_str) != lwjsonOK) { if (lwjson_parse(&lwjson, json_str) != lwjsonOK) {
logDebug("JSON parse failed\r\n"); logDebug("JSON parse failed\r\n");
lwjson_free(&lwjson); lwjson_free(&lwjson);
@ -191,7 +171,6 @@ static int _parse_server_json_data(const char* json_str)
} }
logDebug("JSON parse success\r\n"); logDebug("JSON parse success\r\n");
// 解析设备序列号
token = lwjson_find(&lwjson, "sn"); token = lwjson_find(&lwjson, "sn");
if (token != NULL && token->type == LWJSON_TYPE_STRING) { if (token != NULL && token->type == LWJSON_TYPE_STRING) {
char sn_str[32] = {0}; char sn_str[32] = {0};
@ -202,7 +181,6 @@ static int _parse_server_json_data(const char* json_str)
} }
} }
// 解析时间戳
uint32_t timestamp = 0; uint32_t timestamp = 0;
token = lwjson_find(&lwjson, "time"); token = lwjson_find(&lwjson, "time");
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) { if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
@ -210,7 +188,6 @@ static int _parse_server_json_data(const char* json_str)
logDebug("Timestamp: %u\r\n", timestamp); logDebug("Timestamp: %u\r\n", timestamp);
} }
// 解析类型
TeFrameCmd msg_cmd = kCmdCfg; TeFrameCmd msg_cmd = kCmdCfg;
token = lwjson_find(&lwjson, "cmd"); token = lwjson_find(&lwjson, "cmd");
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) { if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
@ -218,7 +195,6 @@ static int _parse_server_json_data(const char* json_str)
logDebug("Message cmd: %d\r\n", msg_cmd); logDebug("Message cmd: %d\r\n", msg_cmd);
} }
// 根据不同的命令类型解析特定数据
switch (msg_cmd) { switch (msg_cmd) {
case kCmdCfg: case kCmdCfg:
logDebug("Data response %d\r\n", msg_cmd); logDebug("Data response %d\r\n", msg_cmd);
@ -230,7 +206,7 @@ static int _parse_server_json_data(const char* json_str)
logDebug("Switch status: %d\r\n", switch_status); logDebug("Switch status: %d\r\n", switch_status);
if (switch_status == 0) { if (switch_status == 0) {
logDebug("Command: Close valve\r\n"); logDebug("Command: Close valve\r\n");
// BSP_VALVE_Close(); // 取消注释以执行实际操作 // BSP_VALVE_Close();
IotFlag_t.Valve_Close_flag = 1; IotFlag_t.Valve_Close_flag = 1;
} }
} }
@ -242,7 +218,7 @@ static int _parse_server_json_data(const char* json_str)
logDebug("Switch status: %d\r\n", switch_status); logDebug("Switch status: %d\r\n", switch_status);
if (switch_status == 1) { if (switch_status == 1) {
logDebug("Command: Open valve\r\n"); logDebug("Command: Open valve\r\n");
// BSP_VALVE_Open(); // 取消注释以执行实际操作 // BSP_VALVE_Open();
IotFlag_t.Valve_Open_flag = 1; IotFlag_t.Valve_Open_flag = 1;
} }
} }
@ -252,6 +228,7 @@ static int _parse_server_json_data(const char* json_str)
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) { if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
uint32_t timer_minutes = (uint32_t)token->u.num_int; uint32_t timer_minutes = (uint32_t)token->u.num_int;
logDebug("Delay close time: %d minutes\r\n", timer_minutes); logDebug("Delay close time: %d minutes\r\n", timer_minutes);
BSP_VALVE_SetTimerClose(timer_minutes);
} }
break; break;
case kValveCmdOverPressure: case kValveCmdOverPressure:
@ -259,7 +236,6 @@ static int _parse_server_json_data(const char* json_str)
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) { if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
uint16_t over_press = (uint16_t)token->u.num_int; uint16_t over_press = (uint16_t)token->u.num_int;
logDebug("Over pressure threshold: %d Pa\r\n", over_press); logDebug("Over pressure threshold: %d Pa\r\n", over_press);
// 更新阀门超压阈值
ValveInfo.over_press = over_press; ValveInfo.over_press = over_press;
} }
break; break;
@ -268,7 +244,6 @@ static int _parse_server_json_data(const char* json_str)
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) { if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
uint16_t low_press = (uint16_t)token->u.num_int; uint16_t low_press = (uint16_t)token->u.num_int;
logDebug("Low pressure threshold: %d Pa\r\n", low_press); logDebug("Low pressure threshold: %d Pa\r\n", low_press);
// 更新阀门欠压阈值
ValveInfo.low_press = low_press; ValveInfo.low_press = low_press;
} }
break; break;
@ -277,7 +252,6 @@ static int _parse_server_json_data(const char* json_str)
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) { if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
uint32_t delay_close_time = (uint32_t)token->u.num_int; uint32_t delay_close_time = (uint32_t)token->u.num_int;
logDebug("Delay close time: %d minutes\r\n", delay_close_time); logDebug("Delay close time: %d minutes\r\n", delay_close_time);
// 更新阀门延时次数
ValveInfo.delay_close_count = delay_close_time/5; ValveInfo.delay_close_count = delay_close_time/5;
logDebug("delay_close_count: %d \r\n", ValveInfo.delay_close_count); logDebug("delay_close_count: %d \r\n", ValveInfo.delay_close_count);
} }
@ -287,27 +261,20 @@ static int _parse_server_json_data(const char* json_str)
if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) { if (token != NULL && token->type == LWJSON_TYPE_NUM_INT) {
uint8_t over_temp = (uint8_t)token->u.num_int; uint8_t over_temp = (uint8_t)token->u.num_int;
logDebug("Over temperature threshold: %d°C\r\n", over_temp); logDebug("Over temperature threshold: %d°C\r\n", over_temp);
// 更新阀门超温阈值
ValveInfo.over_temp = over_temp; ValveInfo.over_temp = over_temp;
} }
break; break;
default: default:
// 处理其他命令类型 logDebug("Unhandled command: %d\r\n", msg_cmd);
logDebug("Unhandled command type: %d\r\n", msg_cmd);
break; break;
} }
if (msg_cmd != kCmdCfg) { if (msg_cmd != kCmdCfg) {
// 生成响应并发送
Ts4GJsonData responseData; Ts4GJsonData responseData;
BSP_4G_Generate_Response(&responseData, timestamp, msg_cmd); BSP_4G_Generate_Response(&responseData, timestamp, msg_cmd);
// 分配内存并复制JSON字符串
char* response_json = (char *)tmos_msg_allocate(responseData.length + 1); char* response_json = (char *)tmos_msg_allocate(responseData.length + 1);
if (response_json != NULL) { if (response_json != NULL) {
strcpy(response_json, responseData.json_buffer); strcpy(response_json, responseData.json_buffer);
logDebug("Response JSON: %s\r\n", response_json); logDebug("Response JSON: %s\r\n", response_json);
// 保存到全局变量以便发送
json_data = response_json; json_data = response_json;
BSP_SendMessage(); BSP_SendMessage();
} else { } else {
@ -813,7 +780,7 @@ static int MQTT_CfgConnSub(at_env_t *e)
e->reset_timer(e); e->reset_timer(e);
e->state++; e->state++;
} }
if (e->is_timeout(e, 3000)) if (e->is_timeout(e, 6000))
{ {
e->state--; e->state--;
if (++e->i > 3) if (++e->i > 3)
@ -851,53 +818,6 @@ static void BSP_MQTT_CfgConnSub(void)
at_do_work(ml307r_obj, NULL, MQTT_CfgConnSub); at_do_work(ml307r_obj, NULL, MQTT_CfgConnSub);
} }
/*
* @brief
* @return
*/
static int BSP_Module_Connect_CtWing_Handle(at_env_t *e)
{
switch (e->state)
{
case 0:
logDebug("create device...\r\n");
e->println(e, "AT+MIPOPEN=0,\"TCP\",\"112.125.89.8\",46696,,1"); // 8.135.10.183,32994
e->reset_timer(e);
e->state++;
break;
case 1:
if (e->contains(e, "CONNECT"))
{
IotFlag_t.Connect_success_flag = 1;
logDebug("create device complete\r\n");
e->finish(e, AT_RESP_OK);
}
else if (e->is_timeout(e, 5000))
{
e->state--;
if (++e->i > 3)
{
logDebug("create device error\r\n");
IotFlag_t.Connect_error_flag = 1;
e->finish(e, AT_RESP_ERROR);
}
}
break;
default:
break;
}
return 0;
}
//连接服务器
static void BSP_Module_Connect_CtWing(void)
{
BSP_MQTT_CfgConnSub();
// at_do_work(ml307r_obj, NULL, BSP_Module_Connect_CtWing_Handle);//创建设备
}
//向服务器发送数据 //向服务器发送数据
void BSP_Module_Send_Data(uint8_t* data, uint8_t len) void BSP_Module_Send_Data(uint8_t* data, uint8_t len)
{ {
@ -1030,13 +950,11 @@ uint8_t BSP_4G_Generate_Response(Ts4GJsonData *p4GData, uint32_t timestamp, TeFr
gValveData.switch_status gValveData.switch_status
); );
logDebug("4G响应JSON数据:\r\n%s", p4GData->json_buffer); logDebug("4G Response JSON data:\r\n%s", p4GData->json_buffer);
return 0; return 0;
} }
static int SendMessage(at_env_t *e) static int SendMessage(at_env_t *e)
{ {
switch (e->state) switch (e->state)
@ -1107,7 +1025,6 @@ void BSP_ML307_SendMessage(void)
// 生成JSON数据 // 生成JSON数据
BSP_4G_Generate_JsonData(&g4GJsonData, cmd); BSP_4G_Generate_JsonData(&g4GJsonData, cmd);
// 分配内存并复制JSON字符串
json_data = (char *)tmos_msg_allocate(g4GJsonData.length + 1); json_data = (char *)tmos_msg_allocate(g4GJsonData.length + 1);
if (json_data != NULL) { if (json_data != NULL) {
@ -1410,7 +1327,7 @@ static void BSP_Iot_Loop(void)
{ {
IotFlag_t.ModInfo_success_flag = 0; IotFlag_t.ModInfo_success_flag = 0;
MultiTimerStart(&Multi_Connect_t, CONNECT_RETRY_INTERVAL_TIME, Connect_CallBack, NULL); MultiTimerStart(&Multi_Connect_t, CONNECT_RETRY_INTERVAL_TIME, Connect_CallBack, NULL);
BSP_Module_Connect_CtWing(); BSP_MQTT_CfgConnSub();
} }
if (IotFlag_t.Connect_success_flag) // 连接成功 if (IotFlag_t.Connect_success_flag) // 连接成功
{ {
@ -1476,8 +1393,7 @@ static void BSP_Iot_Loop(void)
tmos_msg_deallocate((uint8_t *)json_data); tmos_msg_deallocate((uint8_t *)json_data);
json_data = NULL; json_data = NULL;
} }
//TODO:使用AT Command机制优化
// 检查队列中是否还有待发送的请求
if (lwrb_get_full(&iot_send_queue) >= sizeof(TsIotSendRequest)) { if (lwrb_get_full(&iot_send_queue) >= sizeof(TsIotSendRequest)) {
logDebug("The queue has data to be sent, continue\r\n"); logDebug("The queue has data to be sent, continue\r\n");
IotFlag_t.Connect_success_flag = 1; IotFlag_t.Connect_success_flag = 1;

View File

@ -567,7 +567,7 @@ void BSP_VAVLE_Init(void) // 阀门初始化函数
gValveData.switch_status = kClosed; // 初始化阀门状态为关闭 gValveData.switch_status = kClosed; // 初始化阀门状态为关闭
} }
static uint8_t BSP_VALVE_SetTimerClose(uint32_t minutes) uint8_t BSP_VALVE_SetTimerClose(uint32_t minutes)
{ {
// 参数验证 // 参数验证
if (minutes == 0 || minutes > 1440) { // 1分钟到24小时 if (minutes == 0 || minutes > 1440) { // 1分钟到24小时