代码暂存 优化4G模组上报数据逻辑

This commit is contained in:
常正强 2025-06-04 09:42:05 +08:00
parent 7603947fd1
commit bcd00dd9b4
6 changed files with 179 additions and 264 deletions

View File

@ -443,7 +443,7 @@ static void Peripheral_ProcessGAPMsg(gapRoleEvent_t *pEvent)
LED_ALARM_Flag++;
if(LED_ALARM_Flag > 2)
{
LED_ALARM_OPEN;
LED_VALVE_OPEN;
DelayMs(5);
LED_ALARM_Flag = 0;
}

View File

@ -110,8 +110,8 @@ int main(void)
BSP_VBAT_Init();
logDebug("VBAT init ok\n");
// BSP_Ml307r_Init();
// logDebug("BSP_M1307r ok\n");
BSP_Ml307r_Init();
logDebug("BSP_M1307r ok\n");
ShowRestartReason();
IWDG_Init(5000);

View File

@ -15,7 +15,6 @@
extern tmosTaskID vavle_task_id;
#define VAVLE_RX_DATA_EVT (0x0001 << 0)
#define VAVLE_TX_DATA_EVT (0x0001 << 1)
@ -131,6 +130,8 @@ typedef struct __attribute__((packed))
} TsTimerCloseState;
extern TsTimerCloseState gTimerCloseState;
extern TeFrameCmd gValveCloseReason;
extern TeFrameCmd gValveOpenReason;
uint8_t CheckSum(const uint8_t *data, size_t len);

View File

@ -433,12 +433,12 @@ void Lower_IO_Deinit(void)
GPIOB_ModeCfg(USIM_DECT_PIN, GPIO_ModeIN_PD);
// motor
// GPIOA_ResetBits(COIL_ADC);
// GPIOA_ModeCfg(COIL_ADC, GPIO_ModeIN_PD);
GPIOA_ResetBits(COIL_ADC);
GPIOA_ModeCfg(COIL_ADC, GPIO_ModeIN_PD);
// IN1 + ; IN2 +
// GPIOB_SetBits(COIL_A);
// GPIOB_SetBits(COIL_B);
// GPIOB_ModeCfg(COIL_A | COIL_B, GPIO_ModeIN_PD);
GPIOB_SetBits(COIL_A);
GPIOB_SetBits(COIL_B);
GPIOB_ModeCfg(COIL_A | COIL_B, GPIO_ModeIN_PD);
// UART3
// GPIOB_ModeCfg(GPIO_Pin_21 | GPIO_Pin_20, GPIO_ModeIN_PD);
@ -957,16 +957,16 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
stopAutoCloseTimer();
}
// 欠压检测
else if (ValveRawData.in_press <= ValveInfo.low_press)
{
BSP_VALVE_Close(kValveCmdUnderPressure); // 使用欠压关阀原因
// else if (ValveRawData.in_press <= ValveInfo.low_press)
// {
// BSP_VALVE_Close(kValveCmdUnderPressure); // 使用欠压关阀原因
fault_state = 2;
// 欠压关阀时停止延时关阀功能
stopAutoCloseTimer();
logError("******************************");
logError("欠压关阀");
}
// fault_state = 2;
// // 欠压关阀时停止延时关阀功能
// stopAutoCloseTimer();
// logError("******************************");
// logError("欠压关阀");
// }
#if 1
// 1、过流自动关闭
// 进气端压力2kpa时额定流量调到0.9
@ -1093,19 +1093,6 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
tmos_start_task(check_task_id, CHECK_EVT_START, MS1_TO_SYSTEM_TIME(200)); // 100
return (events ^ CHECK_EVT_START);
}
if (events & MOTOR_STOP_EVT)
{
VALVE_STOP();
logDebug("motor STOP");
// DelayMs(1500);
// if(fault_state == 4)
// {
// IotFlag_t.Valve_Close_flag = 1;
// Iot_Send_Data();
// }
return (events ^ MOTOR_STOP_EVT);
}
// 延时关阀检测事件处理
if (events & AUTO_CLOSE_CHECK_EVT)

View File

@ -12,6 +12,8 @@
#include "time.h"
#include <stdlib.h>
#include "cJSON.h"
#include "bsp_valve.h"
#include "bsp_adc.h"
#undef LOG_ENABLE
#define LOG_ENABLE 1
@ -95,7 +97,7 @@ static uint8_t state = 0;
#define CPIN_RETRY_INTERVAL_TIME (20*1000UL)
#define CONNECT_RETRY_INTERVAL_TIME (20*1000UL)
#define SEND_RETRY_INTERVAL_TIME (30*1000UL)
#define STOP_TASK_INTERVAL_TIME (15*1000UL)
#define STOP_TASK_INTERVAL_TIME (10*1000UL)
#define LOOP_INTERVAL_TIME (30*1000UL)
#define GETINFO_INTERVAL_TIME (20*1000UL)
@ -135,32 +137,32 @@ void Send_CallBack(MultiTimer* timer, void* userData)
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;
}
// //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超时回调
void StopTask_CallBack(MultiTimer* timer, void* userData)
{
logDebug("BSP_Ml307_Power_Off\r\n");
IotFlag_t.Loop_count_flag = 0;
if(IotFlag_t.PowerOn_error_flag == 1)
{
// IotFlag_t.Loop_count_flag = 0;
// if(IotFlag_t.PowerOn_error_flag == 1)
// {
IotFlag_t.PowerOn_error_flag = 0;
tmos_stop_task(ml307_task_id, ML307_PERIODIC_EVT);
PFIC_DisableIRQ(UART1_IRQn);
BSP_RequestSleep();
}else{
// 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);
PFIC_DisableIRQ(UART1_IRQn);
BSP_RequestSleep();
}
// }
IotFlag_t.Date_Sending_flag = 0;
}
@ -521,7 +523,7 @@ static int BSP_Module_Connect_CtWing_Handle(at_env_t *e)
{
case 0:
logDebug("create device...\r\n");
e->println(e, "AT+MIPOPEN=0,\"TCP\",\"112.125.89.8\",42519,,1"); // 8.135.10.183,32994
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;
@ -570,55 +572,41 @@ typedef enum {
DEVICE_STATUS_LOW_BATTERY // 低电量状态
} device_status_t;
// 创建基础JSON对象
static cJSON* Create_Base_Json(void)
{
cJSON *root = cJSON_CreateObject();
if (root == NULL) {
logDebug("创建JSON对象失败\r\n");
return NULL;
}
// 定义JSON缓冲区大小
#define JSON_BUFFER_SIZE 512
// 创建设备信息对象
cJSON *device = cJSON_CreateObject();
if (device == NULL) {
cJSON_Delete(root);
return NULL;
}
// 添加设备基本信息
cJSON_AddStringToObject(device, "id", "SCV001");
// 获取当前时间
char time_str[20];
sprintf(time_str, "%04d-%02d-%02d %02d:%02d:%02d",
Network_Time_t.tm_year, Network_Time_t.tm_mon, Network_Time_t.tm_mday,
Network_Time_t.tm_hour, Network_Time_t.tm_min, Network_Time_t.tm_sec);
cJSON_AddStringToObject(device, "time", time_str);
// 将设备信息添加到根对象
cJSON_AddItemToObject(root, "device", device);
// 添加标准信息
cJSON *standards = cJSON_CreateObject();
if (standards) {
char iot_id[32];
sprintf(iot_id, "IoT-SCV-%s", Module_Info_t.imei);
cJSON_AddStringToObject(standards, "iotId", iot_id);
cJSON_AddItemToObject(root, "standards", standards);
}
return root;
}
// 定义4G上报数据结构体
typedef struct {
char json_buffer[JSON_BUFFER_SIZE]; // JSON字符串缓冲区
uint16_t length; // JSON字符串长度
} Ts4GJsonData;
// 添加网络信息到JSON对象
static void Add_Network_Info(cJSON *root)
/**
* @brief 4G模组上报的JSON数据
*
* @param p4GData JSON数据结构体指针
* @param cmd
* @return uint8_t 0
*/
uint8_t BSP_4G_Generate_JsonData(Ts4GJsonData *p4GData, TeFrameCmd cmd)
{
if (root == NULL) return;
cJSON *network = cJSON_CreateObject();
if (network == NULL) return;
// 首先清零JSON缓冲区
memset(p4GData->json_buffer, 0, JSON_BUFFER_SIZE);
// 获取阀门数据
TsValveData ValveData;
// 填充阀门数据,与蓝牙上报相同
ValveData.switch_status = gValveData.switch_status;
ValveData.temp = ValveRawData.atom_temp;
ValveData.in_pressure = ValveRawData.in_press_raw;
ValveData.out_pressure = ValveRawData.out_press_raw;
ValveData.atm_pressure = ValveRawData.atom_press;
ValveData.type = kZbf;
ValveData.bat = BSP_ReadVbat();
ValveData.humi = 50;
ValveData.rssi = gValveData.rssi;
// 解析信号强度这里简单处理为0-5的整数值
int signal_strength = 0;
long rssi = strtol(Service_Info_t.rssi, NULL, 16);
@ -627,144 +615,73 @@ static void Add_Network_Info(cJSON *root)
else if (rssi > -110) signal_strength = 3;
else if (rssi > -120) signal_strength = 2;
else if (rssi > -130) signal_strength = 1;
// 解析信噪比
float sinr = strtol(Service_Info_t.last_sinr, NULL, 16) / 10.0f;
cJSON_AddNumberToObject(network, "sinr", sinr);
cJSON_AddNumberToObject(network, "signal", signal_strength);
cJSON_AddItemToObject(root, "network", network);
// 生成JSON字符串
p4GData->length = snprintf(p4GData->json_buffer, JSON_BUFFER_SIZE,
"{"
"\"cmd\":%d,"
"\"data\":{"
"\"switch_status\":%d,"
"\"temp\":%d,"
"\"in_pressure\":%d,"
"\"out_pressure\":%d,"
"\"atm_pressure\":%d,"
"\"type\":%d,"
"\"bat\":%d,"
"\"humi\":%d,"
"\"rssi\":%d,"
"\"signal\":%d"
"}"
"}",
cmd,
ValveData.switch_status,
ValveData.temp,
ValveData.in_pressure,
ValveData.out_pressure,
ValveData.atm_pressure,
ValveData.type,
ValveData.bat,
ValveData.humi,
ValveData.rssi,
signal_strength
);
// 打印JSON数据信息
logDebug("4G JSON数据 (cmd=%d):\r\n%s", cmd, p4GData->json_buffer);
return 0;
}
// 添加常规状态信息到JSON对象
static void Add_Normal_Status(cJSON *root)
/**
* @brief 4G模组响应JSON数据
*
* @param p4GData JSON数据结构体指针
* @param responseCmd
* @param result 00
* @return uint8_t 0
*/
uint8_t BSP_4G_Generate_Response(Ts4GJsonData *p4GData, TeFrameCmd responseCmd, uint8_t result)
{
if (root == NULL) return;
p4GData->length = snprintf(p4GData->json_buffer, JSON_BUFFER_SIZE,
"{"
"\"cmd\":%d,"
"\"data\":{"
"\"response_cmd\":%d,"
"\"result\":%d"
"}"
"}",
kCmdData, // 使用数据命令作为响应命令
responseCmd,
result
);
logDebug("4G响应JSON数据:\r\n%s", p4GData->json_buffer);
// 添加状态信息
cJSON_AddStringToObject(root, "status", "normal");
// 添加监控信息
cJSON *monitor = cJSON_CreateObject();
if (monitor) {
// 这里添加传感器数据,如压力值等
float pressure = 0.75; // 示例值,应从传感器获取
cJSON_AddNumberToObject(monitor, "pressure", pressure);
cJSON_AddBoolToObject(monitor, "lowVoltage", false);
cJSON_AddItemToObject(root, "monitor", monitor);
}
}
// 添加关闭状态信息到JSON对象
static void Add_Closed_Status(cJSON *root)
{
if (root == NULL) return;
// 添加状态信息
cJSON_AddStringToObject(root, "status", "closed");
// 添加监控信息
cJSON *monitor = cJSON_CreateObject();
if (monitor) {
float pressure = 0.0; // 阀门关闭时压力为0
cJSON_AddNumberToObject(monitor, "pressure", pressure);
cJSON_AddBoolToObject(monitor, "lowVoltage", false);
cJSON_AddItemToObject(root, "monitor", monitor);
}
}
// 添加故障状态信息到JSON对象
static void Add_Fault_Status(cJSON *root)
{
if (root == NULL) return;
// 添加状态信息
cJSON_AddStringToObject(root, "status", "fault");
// 添加故障信息
cJSON *fault = cJSON_CreateObject();
if (fault) {
cJSON_AddBoolToObject(fault, "lowBattery", false);
cJSON_AddNumberToObject(fault, "code", 1); // 故障代码
cJSON_AddItemToObject(root, "fault", fault);
}
// 添加监控信息
cJSON *monitor = cJSON_CreateObject();
if (monitor) {
float pressure = 0.8; // 示例值
cJSON_AddNumberToObject(monitor, "pressure", pressure);
cJSON_AddBoolToObject(monitor, "lowVoltage", false);
cJSON_AddItemToObject(root, "monitor", monitor);
}
}
// 添加低电量状态信息到JSON对象
static void Add_Low_Battery_Status(cJSON *root)
{
if (root == NULL) return;
// 添加状态信息
cJSON_AddStringToObject(root, "status", "warning");
// 添加故障信息
cJSON *fault = cJSON_CreateObject();
if (fault) {
cJSON_AddBoolToObject(fault, "lowBattery", true);
cJSON_AddNumberToObject(fault, "code", 2); // 低电量代码
cJSON_AddItemToObject(root, "fault", fault);
}
// 添加监控信息
cJSON *monitor = cJSON_CreateObject();
if (monitor) {
float pressure = 0.78; // 示例值
cJSON_AddNumberToObject(monitor, "pressure", pressure);
cJSON_AddBoolToObject(monitor, "lowVoltage", true);
cJSON_AddItemToObject(root, "monitor", monitor);
}
}
// 根据设备状态构建JSON数据
static char* Build_Status_Json(device_status_t status)
{
// 创建基础JSON结构
cJSON *root = Create_Base_Json();
if (root == NULL) {
return NULL;
}
// 根据状态添加不同的信息
switch (status) {
case DEVICE_STATUS_NORMAL:
Add_Normal_Status(root);
break;
case DEVICE_STATUS_CLOSED:
Add_Closed_Status(root);
break;
case DEVICE_STATUS_FAULT:
Add_Fault_Status(root);
break;
case DEVICE_STATUS_LOW_BATTERY:
Add_Low_Battery_Status(root);
break;
default:
Add_Normal_Status(root);
break;
}
// 添加网络信息
Add_Network_Info(root);
// 将JSON转换为字符串
char *json_string = cJSON_PrintUnformatted(root);
// 释放JSON对象
cJSON_Delete(root);
return json_string;
return 0;
}
// 全局JSON数据结构体
Ts4GJsonData g4GJsonData;
char *json_data;
static int SendMessage(at_env_t *e)
@ -773,7 +690,7 @@ static int SendMessage(at_env_t *e)
{
case 0:
logDebug("SendMessage start!\r\n");
e->println(e, "AT+MIPSEND=0,%d,\"%s\"",strlen(json_data),json_data);
e->println(e, "AT+MIPSEND=0,%d,\"%s\"", strlen(json_data), json_data);
e->reset_timer(e);
e->state++;
break;
@ -782,6 +699,9 @@ static int SendMessage(at_env_t *e)
{
logDebug("SendMessage end!\r\n");
IotFlag_t.send_complete_flag = 1;
// 发送完成后释放json_data内存
tmos_msg_deallocate((uint8_t *)json_data);
json_data = NULL;
e->finish(e, AT_RESP_OK);
}
if (e->is_timeout(e, 5000))
@ -791,6 +711,9 @@ static int SendMessage(at_env_t *e)
{
logDebug("SendMessage error!\r\n");
IotFlag_t.send_complete_flag = 1;
// 发送失败也需要释放json_data内存
tmos_msg_deallocate((uint8_t *)json_data);
json_data = NULL;
e->finish(e, AT_RESP_ERROR);
}
}
@ -807,34 +730,29 @@ static void BSP_SendMessage(void)
void BSP_ML307_SendMessage(void)
{
// 根据系统状态确定设备状态
device_status_t device_status;
// // 这里根据实际系统状态判断逻辑进行修改
// if (fault_state) {
// device_status = DEVICE_STATUS_FAULT;
// } else {
// // 检查其他状态,例如电池电量等
// // 这里可以添加更多状态检测逻辑
// device_status = DEVICE_STATUS_NORMAL;
// }
// 根据系统状态确定命令类型
TeFrameCmd cmd = kCmdData; // 默认为数据命令
if(IotFlag_t.Valve_Close_flag)
if (gValveData.switch_status == kClosed)
{
IotFlag_t.Valve_Close_flag = 0;
device_status = DEVICE_STATUS_CLOSED;
cmd = gValveCloseReason;
}else
{
cmd = gValveOpenReason;
}
// 生成JSON数据
BSP_4G_Generate_JsonData(&g4GJsonData, cmd);
// 构建JSON数据
json_data = Build_Status_Json(device_status);
// 分配内存并复制JSON字符串
json_data = (char *)tmos_msg_allocate(g4GJsonData.length + 1);
if (json_data != NULL) {
logDebug("json_data len %d\r\n",strlen(json_data));
strcpy(json_data, g4GJsonData.json_buffer);
logDebug("json_data len %d\r\n", strlen(json_data));
BSP_SendMessage();
} else {
logDebug("Build_Status_Json error!\n");
logDebug("JSON数据内存分配失败!\n");
IotFlag_t.send_error_flag = 1;
}
}
@ -922,7 +840,7 @@ static int Module_Restart_Work(at_env_t *e)
e->reset_timer(e);
e->state++;
}
if (e->is_timeout(e, 5000))
if (e->is_timeout(e, 1500))
{
e->state--;
if (++e->i > 3)
@ -986,7 +904,7 @@ static int simcom_init(at_env_t *e)
logDebug("simcom CPIN READY!\r\n");
e->finish(e, AT_RESP_OK);
}
if (e->is_timeout(e, 5000))
if (e->is_timeout(e, 3000))
{
e->state--;
if (++e->i > 3)
@ -1142,26 +1060,30 @@ static void BSP_Iot_Loop(void)
logDebug("send_complete_into_stop\r\n");
IotFlag_t.send_complete_flag = 0;
state = 0;
tmos_msg_deallocate((uint8_t *)json_data);
// 检查指针是否为NULL后再释放避免重复释放
if(json_data != NULL) {
tmos_msg_deallocate((uint8_t *)json_data);
json_data = NULL;
}
MultiTimerStart(&Multi_StopTask_t, STOP_TASK_INTERVAL_TIME, StopTask_CallBack, NULL); //关闭
}else
{
if (IotFlag_t.Loop_count_flag > 2)
{
logDebug("Loop_count_flag_end %d\r\n",IotFlag_t.Loop_count_flag);
// if (IotFlag_t.Loop_count_flag > 2)
// {
// logDebug("Loop_count_flag_end %d\r\n",IotFlag_t.Loop_count_flag);
state = 0;
IotFlag_t.Iot_Retry_flag = 0;
IotFlag_t.module_init_flag = 0;
MultiTimerStart(&Multi_StopTask_t, STOP_TASK_INTERVAL_TIME, StopTask_CallBack, NULL);
}
if((IotFlag_t.Iot_Retry_flag == 0)&&(IotFlag_t.Loop_count_flag < 3))
{
logDebug("error_into_loop\r\n");
logDebug("Loop_count_flag %d\r\n",IotFlag_t.Loop_count_flag);
BSP_Ml307_Power_Off(); //关机
MultiTimerStart(&Multi_Loop_t, LOOP_INTERVAL_TIME, Loop_CallBack, NULL);
IotFlag_t.Iot_Retry_flag = 1;
}
// }
// if((IotFlag_t.Iot_Retry_flag == 0)&&(IotFlag_t.Loop_count_flag < 3))
// {
// logDebug("error_into_loop\r\n");
// logDebug("Loop_count_flag %d\r\n",IotFlag_t.Loop_count_flag);
// BSP_Ml307_Power_Off(); //关机
// MultiTimerStart(&Multi_Loop_t, LOOP_INTERVAL_TIME, Loop_CallBack, NULL);
// IotFlag_t.Iot_Retry_flag = 1;
// }
}
break;
}

View File

@ -20,6 +20,7 @@
#include "bsp_led.h"
#include "bsp_bmp390.h"
#include "bsp_tim.h"
#include "bsp_ml307r.h"
#undef LOG_ENABLE
#define LOG_ENABLE 1
@ -30,8 +31,8 @@
TsValveData gValveData = {0};
TsRawFrameData RelyData;
TsTimerCloseState gTimerCloseState = {0};
static TeFrameCmd gValveCloseReason = kCmdCloseVavle; // 默认为普通关阀命令
static TeFrameCmd gValveOpenReason = kCmdOpenVavle; // 默认为普通开阀命令
TeFrameCmd gValveCloseReason = kCmdCloseVavle; // 默认为普通关阀命令
TeFrameCmd gValveOpenReason = kCmdOpenVavle; // 默认为普通开阀命令
tmosTaskID vavle_task_id = INVALID_TASK_ID;
@ -325,6 +326,7 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀
logDebug("VAVLE_CLOSE_START_EVT");
BSP_BlockSleep();
BSP_MOTOR_Init();
LED_VALVE_CLOSE;
// DelayUs(200);
@ -365,6 +367,7 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀
BSP_RequestSleep();
logDebug("VAVLE_CLOSE_END_EVT");
Iot_Send_Data();
return (events ^ VAVLE_CLOSE_END_EVT);
}
@ -373,6 +376,7 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀
logDebug("VAVLE_OPEN_START_EVT");
BSP_BlockSleep();
BSP_MOTOR_Init();
LED_VALVE_OPEN;
// DelayUs(200);
@ -416,6 +420,7 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀
tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT);
BSP_RequestSleep();
Iot_Send_Data();
// 启动微泄漏检测
startMicroLeakDetection();