Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
O
onile_selfconteol
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
957dd
onile_selfconteol
Commits
f49f554e
Commit
f49f554e
authored
Sep 27, 2025
by
957dd
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'feature/add_mqtt_10s_send_1s' into 'master'
加入了开启发送自控,还需优化 See merge request
!1
parents
bdf222a9
8d9070e2
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
110 additions
and
22 deletions
+110
-22
.gitignore
.gitignore
+1
-1
main
build/main
+0
-0
device_linked_list.hpp
include/device_linked_list.hpp
+7
-0
device_linked_list.cc
src/device_linked_list.cc
+1
-1
main.cc
src/main.cc
+83
-7
mqtt_controller.cc
src/mqtt_controller.cc
+1
-1
mqtt_used.cc
src/mqtt_used.cc
+6
-6
taskrunner.cc
src/taskrunner.cc
+11
-6
No files found.
.gitignore
View file @
f49f554e
log/
log.log
log/
build/CMakeFiles/
build/cmake_install.cmake
build/CMakeCache.txt
...
...
build/main
View file @
f49f554e
No preview for this file type
include/device_linked_list.hpp
View file @
f49f554e
...
...
@@ -37,6 +37,12 @@ public:
// 显示所有设备信息 (const 关键字表示该函数不会修改类成员变量)
void
displayAllDevices
()
const
;
const
DeviceNode
*
getHead
()
const
{
return
head
;
}
// 根据设备ID查找并显示设备信息 (const)
bool
findDevice
(
const
std
::
string
&
id
)
const
;
};
\ No newline at end of file
src/device_linked_list.cc
View file @
f49f554e
...
...
@@ -140,7 +140,7 @@ bool DeviceList::findDevice(const std::string& id) const {
DeviceNode
*
current
=
head
;
while
(
current
!=
nullptr
)
{
if
(
current
->
deviceId
==
id
)
{
std
::
string
header
=
"
\n
>> 找到设备 "
+
id
+
" 的信息:"
;
std
::
string
header
=
">> 找到设备 "
+
id
+
" 的信息:"
;
mylog_info
(
header
.
c_str
());
std
::
stringstream
ss
;
...
...
src/main.cc
View file @
f49f554e
...
...
@@ -7,9 +7,12 @@
#include <iomanip>
#include <string>
#include <cstdlib>
#include "device_linked_list.hpp"// devicelist.cc
#include "networkInfo.hpp"
#include "mqtt_used.hpp" // 注意:这里应该是 MqttTopicsHandler.hpp
#include "mylog.hpp"
#include "nlohmann/json.hpp"
#include "taskrunner.hpp"
// --- 配置信息 ---
const
std
::
string
BROKER_ADDRESS
=
"tcp://119.45.167.177:1883"
;
...
...
@@ -25,8 +28,11 @@ std::string final_publish_topic;
std
::
string
g_device_id
;
std
::
shared_ptr
<
MqttTopicsHandler
>
g_mqtt_handler
;
// 改为 shared_ptr 并使用 MqttTopicsHandler 类型
NetworkInfo
g_network_addr
;
//网络ip和mac地址获取的
DeviceList
deviceTree
;
//设备排列和查找的
TaskRunner
runner
;
NetworkInfo
g_network_addr
;
auto
g_mqtt_send_count
=
0
;
//发送时间计数,100毫秒计数一次
// 信号处理函数,用于优雅地退出
void
signalHandler
(
int
signum
)
{
...
...
@@ -77,16 +83,25 @@ std::shared_ptr<MqttTopicsHandler> mqtt_init_and_connect() {
auto
run_t
=
json
.
at
(
"body"
).
at
(
"run_t"
).
get
<
std
::
string
>
();
auto
device_status
=
json
.
at
(
"body"
).
at
(
"status"
).
get
<
int
>
();
if
(
run_t
.
empty
()
||
interval_t
.
empty
())
return
;
auto
msg_device
=
"app2dev/"
+
dev_id
;
mylog_info
(
"dev_id:{}"
,
msg_device
);
mylog_info
(
"interval_t:{}"
,
interval_t
);
mylog_info
(
"run_t:{}"
,
run_t
);
mylog_info
(
"device_status:{}"
,
device_status
);
//g_mqtt_handler->publish( data_topic[topic_index], transfor_json(g_positioning_data_t));
}
catch
(
const
nlohmann
::
json
::
exception
&
e
)
{
if
(
device_status
==
1
){
int
interval_t_num
=
std
::
stoi
(
interval_t
);
int
run_t_num
=
std
::
stoi
(
run_t
);
deviceTree
.
addDevice
(
msg_device
,
interval_t_num
,
run_t_num
);
}
else
if
(
device_status
==
0
){
deviceTree
.
findDevice
(
msg_device
);
deviceTree
.
deleteDevice
(
msg_device
);
}
}
catch
(
const
nlohmann
::
json
::
exception
&
e
)
{
mylog_error
(
"处理指令时JSON解析出错:"
,
e
.
what
());
}
});
...
...
@@ -95,6 +110,64 @@ std::shared_ptr<MqttTopicsHandler> mqtt_init_and_connect() {
return
handler
;
// 返回成功创建并配置好的客户端实例
}
auto
json_send_mqtt
(
int
message_type
,
int
pin
,
int
pwm_mode
,
int
val
){
// 构造 JSON 对象
nlohmann
::
json
j
;
j
[
"head"
][
"message_type"
]
=
message_type
;
j
[
"body"
][
"pin_setctrl"
][
"pin"
]
=
pin
;
j
[
"body"
][
"pin_setctrl"
][
"val"
]
=
val
;
j
[
"body"
][
"pwm_ctrl"
][
"mode"
]
=
pwm_mode
;
j
[
"body"
][
"pwm_ctrl"
][
"type"
]
=
1
;
j
[
"body"
][
"pwm_ctrl"
][
"val"
]
=
val
;
// 转换成字符串(默认紧凑格式,适合网络传输)
std
::
string
payload
=
j
.
dump
();
return
payload
;
}
void
longRunningTask1
()
{
mylog_info
(
"[Task 1] Starting a long task..."
);
// ... 在这里填充 myList 的数据 ...
// 例如: myList.addDevice(...);
const
DeviceNode
*
traverser
=
deviceTree
.
getHead
();
while
(
!
g_quit
)
{
if
(
g_mqtt_send_count
>
100
)
{
//mylog_info("Starting to send MQTT messages for all devices...");
// 每次需要遍历时,都从 myList 获取头节点
traverser
=
deviceTree
.
getHead
();
while
(
traverser
!=
nullptr
)
{
// 在循环中,你可以访问当前节点的任何数据
std
::
string
currentId
=
traverser
->
deviceId
;
g_mqtt_handler
->
publish
(
currentId
,
json_send_mqtt
(
3
,
26
,
1
,
80
));
mylog_info
(
"已发送设备号:{}"
,
currentId
);
// 移动到下一个节点
traverser
=
traverser
->
next
;
//std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
//mylog_info("Finished sending MQTT messages for all devices.");
// 重要的逻辑:重置计数器,否则这个if会一直满足,导致CPU空转和消息风暴
if
(
g_mqtt_send_count
>
102
)
g_mqtt_send_count
=
0
;
// 或者设置为一个不会立即触发下一次发送的值
}
std
::
this_thread
::
sleep_for
(
std
::
chrono
::
milliseconds
(
100
));
g_mqtt_send_count
++
;
// if(g_mqtt_send_count > 110) g_mqtt_send_count = 0; // 这行逻辑可以和上面的重置合并
}
}
int
main
()
{
signal
(
SIGINT
,
signalHandler
);
...
...
@@ -103,14 +176,17 @@ int main() {
g_client_id
=
g_network_addr
.
getip
();
g_mqtt_handler
=
mqtt_init_and_connect
();
if
(
!
g_mqtt_handler
)
{
return
1
;
// 如果 MQTT 连接失败,则退出
}
runner
.
addTask
(
longRunningTask1
);
while
(
!
g_quit
){
std
::
this_thread
::
sleep_for
(
std
::
chrono
::
milliseconds
(
300
));
std
::
this_thread
::
sleep_for
(
std
::
chrono
::
milliseconds
(
300
));
}
return
0
;
}
src/mqtt_controller.cc
View file @
f49f554e
...
...
@@ -160,7 +160,7 @@ void MqttController::publish(const std::string& topic, const std::string& payloa
// --- 内部回调处理类的实现 ---
void
MqttController
::
CallbackHandler
::
connected
(
const
std
::
string
&
/*cause*/
)
{
std
::
cout
<<
"连接成功!"
<<
std
::
endl
;
mylog_info
(
"连接成功!"
)
;
controller_
.
is_connected_
=
true
;
if
(
controller_
.
on_connect_success_cb_
)
{
controller_
.
on_connect_success_cb_
();
...
...
src/mqtt_used.cc
View file @
f49f554e
...
...
@@ -70,7 +70,7 @@ void MqttTopicsHandler::AddSubscription(const std::string& topic, JsonCallback c
// 将真正的 subscribe 调用封装成一个任务,交给工作线程执行
post_task
([
this
,
topic
,
wrapped_callback
]()
{
std
::
cout
<<
"工作线程:正在执行订阅主题: "
<<
topic
<<
std
::
endl
;
mylog_info
(
"工作线程:正在执行订阅主题: {}"
,
topic
)
;
// 假设 QoS 为 1
subscribe
(
topic
,
1
,
wrapped_callback
);
});
...
...
@@ -86,10 +86,10 @@ void MqttTopicsHandler::RemoveSubscription(const std::string& topic) {
if
(
active_subscriptions_
.
erase
(
topic
)
>
0
)
{
post_task
([
this
,
topic
]()
{
unsubscribe
(
topic
);
std
::
cout
<<
"工作线程:已取消订阅主题: "
<<
topic
<<
std
::
endl
;
mylog_info
(
"工作线程:已取消订阅主题: {}"
,
topic
)
;
});
}
else
{
std
::
cerr
<<
"无法移除订阅:主题
\"
"
<<
topic
<<
"
\"
未被订阅。"
<<
std
::
endl
;
mylog_warn
(
"无法移除订阅:主题 {} 未被订阅。"
,
topic
)
;
}
}
...
...
@@ -97,9 +97,9 @@ void MqttTopicsHandler::RemoveSubscription(const std::string& topic) {
void
MqttTopicsHandler
::
InitBaseSubscription
()
{
AddSubscription
(
"ser/dev"
,
[](
const
nlohmann
::
json
&
json
)
{
try
{
std
::
cout
<<
"[收到系统状态] "
<<
json
.
dump
(
2
)
<<
std
::
endl
;
mylog_info
(
"[收到系统状态] {}"
,
json
.
dump
(
2
)
)
;
}
catch
(
const
std
::
exception
&
e
)
{
std
::
cerr
<<
"处理系统状态时出错: "
<<
e
.
what
()
<<
std
::
endl
;
mylog_warn
(
"处理系统状态时出错: {}"
,
e
.
what
()
)
;
}
});
}
...
...
@@ -112,7 +112,7 @@ void MqttTopicsHandler::PublishJson(
try
{
publish
(
topic
,
json_payload
.
dump
(),
qos
,
retained
);
}
catch
(
const
std
::
exception
&
e
)
{
std
::
cerr
<<
"向主题
\"
"
<<
topic
<<
"
\"
发布 JSON 失败: "
<<
e
.
what
()
<<
std
::
endl
;
mylog_warn
(
"向主题 {} 发布 JSON 失败: {}"
,
topic
,
e
.
what
()
)
;
}
}
void
MqttTopicsHandler
::
AddSubscription
(
const
std
::
string
&
topic
,
SimpleJsonCallback
callback
)
{
...
...
src/taskrunner.cc
View file @
f49f554e
...
...
@@ -32,7 +32,7 @@ void TaskRunner::addTask(const std::function<void()>& task) {
void
TaskRunner
::
run
()
{
while
(
true
)
{
std
::
function
<
void
()
>
task
;
std
::
function
<
void
()
>
current_task
;
// 使用不会引起宏冲突的变量名
{
std
::
unique_lock
<
std
::
mutex
>
lock
(
mtx
);
...
...
@@ -42,11 +42,17 @@ void TaskRunner::run() {
break
;
// 退出线程
}
task
=
tasks
.
front
();
// 从队列中取出任务
current_task
=
std
::
move
(
tasks
.
front
());
tasks
.
pop
();
}
// 执行任务
task
();
// --- 这是关键的修改部分 ---
// 使用 if 语句来检查任务是否有效,并在有效时执行它。
// 这一个代码块就替代了原来简单的 "task();"
if
(
current_task
)
{
current_task
();
// 在 if 内部调用,确保 current_task 不是空的
}
// -------------------------
}
}
\ No newline at end of file
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment