Commit 05e5f38d authored by 957dd's avatar 957dd

优化了mqtt的问题,使用了异步检查重连机制

parent 76c2df7b
cmake_minimum_required(VERSION 3.10)
project(car
VERSION 1.2.16
VERSION 1.2.17
LANGUAGES C
)
......
......@@ -120,6 +120,7 @@ void *thread_mqtt_reconnect(void *arg) {
my_zlog_warn("mqtt success");
break;
}else {
my_zlog_warn("wait... mqtt reconect");
delay_ms(300);
continue;
}
......
#define PROJECT_VERSION_MAJOR 1
#define PROJECT_VERSION_MINOR 2
#define PROJECT_VERSION_PATCH 16
#define PROJECT_VERSION_PATCH 17
#define GIT_HASH ""
#define BUILD_TIMESTAMP ""
#define BUILD_USER ""
No preview for this file type
......@@ -2,6 +2,10 @@
#include "common.h"
#include "ads1115.h"
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
double tank_angle(){
double angle=0;
float angle_shot=ads1115_read_channel(2);
......@@ -26,16 +30,46 @@ int angle_limit(){
}
// double angle_ema_filter(double filtered, double raw, double alpha, double deadband) {
// filtered = wrap_deg(filtered);
// raw = wrap_deg(raw);
/*
角度 EMA 滤波
- filter : 上次滤波值(度)
- raw : 当前原始角度(度)
- alpha : 衰减因子(0..1),越大越跟随原始值(推荐 0.05~0.5)
- deadband : 死区(度),小于该值认为是抖动
*/
// EN滤波结构体
// typedef struct {
// double alpha; // 滤波系数 (0~1)
// double filtered; // 上一次滤波角度
// } ENFilter;
// static ENFilter filter = {.alpha = 0.5, .filtered = 0.05};
// // 支持360°→0°跳变的滤波函数
// double en_filter_update(double new_angle)
// {
// double diff = new_angle - filter.filtered;
// // 处理角度环绕(支持359→0或0→359平滑过渡)
// if (diff > 180.0)
// diff -= 360.0;
// else if (diff < -180.0)
// diff += 360.0;
// // 一阶低通滤波
// filter.filtered += filter.alpha * diff;
// double diff = shortest_angle_diff(filtered, raw); // 从 filtered 指向 raw 的差
// if (fabs(diff) <= deadband) {
// // 抖动范围内,不更新
// return filtered;
// }
// // 角度版 EMA:沿最短方向移动 alpha * diff
// double new_filtered = filtered + alpha * diff;
// return wrap_deg(new_filtered);
// // 结果保持在[0, 360)
// if (filter.filtered < 0)
// filter.filtered += 360.0;
// else if (filter.filtered >= 360.0)
// filter.filtered -= 360.0;
// return filter.filtered;
// }
// //上次的角度滤波后的值
// double return_en_filter_last_angle(){
// return filter.filtered;
// }
......@@ -11,4 +11,9 @@ double tank_angle();
int angle_limit();
// //角度滤波
// double en_filter_update(double new_angle);
// //上次角度滤波
// double return_en_filter_last_angle();
#endif
\ No newline at end of file
......@@ -128,6 +128,7 @@ int add_mqtt_create(const char *host, int port, int clients_count){
}
my_zlog_info("add %s mqttserver success",host);
mosquitto_loop_start(client_t->mosq);
return 0;
}
......@@ -144,17 +145,36 @@ void mqtt_clean(){
}
int mqtt_cycle() {//非阻塞型
while (1) {
for(int i=0;i<g_mqtt_cam_config_t->mqtt_count;i++){
int rc= mosquitto_loop(g_clients_t[i].mosq, 17, 1); // 每秒检查一次
if(rc != MOSQ_ERR_SUCCESS){
my_zlog_warn("服务器 %s:%d 断开,尝试重连...",
g_clients_t[i].host, g_clients_t[i].port);
mosquitto_reconnect(g_clients_t[i].mosq);
}
bool all_connected = true;
for (int i = 0; i < g_mqtt_cam_config_t->mqtt_count; i++) {
if (!g_clients_t[i].mosq) continue;
int state = mosquitto_socket(g_clients_t[i].mosq);
if (state == -1) {
all_connected = false;
my_zlog_warn("检测到 MQTT [%s:%d] 已断开,尝试重连...",
g_clients_t[i].host, g_clients_t[i].port);
mosquitto_reconnect_async(g_clients_t[i].mosq);
}
}
delay_us(50);
delay_ms(1000); // 每 1 秒检测一次连接状态
}
// while (1) {
// for(int i=0;i<g_mqtt_cam_config_t->mqtt_count;i++){
// int rc= mosquitto_loop(g_clients_t[i].mosq, 17, 1); // 每秒检查一次
// if(rc != MOSQ_ERR_SUCCESS){
// my_zlog_warn("服务器 %s:%d 断开,尝试重连...",
// g_clients_t[i].host, g_clients_t[i].port);
// mosquitto_reconnect(g_clients_t[i].mosq);
// }
// }
// delay_us(50);
// }
return 0;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment